diff --git a/.github/workflows/test-with-quickstart.yml b/.github/workflows/test-with-quickstart.yml new file mode 100644 index 000000000..e520e17ba --- /dev/null +++ b/.github/workflows/test-with-quickstart.yml @@ -0,0 +1,88 @@ +name: Test with quickstart + +on: + push: + branches: [main, release/**] + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_protected == 'true' && github.sha || github.ref }}-${{ github.event_name }} + cancel-in-progress: true + +# No permissions. This workflow runs a network from an image built outside this +# repository. No permissions ensures that any exploit in that image does not +# gain access to anything in this repo. +permissions: {} + +defaults: + run: + shell: bash + +jobs: + # Fork a local network, reading the ledger meta store and history archive + # that quickstart runs alongside its core and rpc. + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + # Log which of the data sources every ledger entry is found in, so a run + # shows what was read from the ledger meta store and what from the + # history archive, rather than only that the balances came out right. + RUST_LOG: soroban_ledger_snapshot_source_tx=debug + steps: + - uses: actions/checkout@v5 + + # Set in an env file rather than in the job's env, because the runner + # context those paths come from is not available there. + - name: Set the fixture and cache paths + run: | + echo "TEST_FORK_QUICKSTART_FIXTURE=$RUNNER_TEMP/quickstart-fixture.json" >> "$GITHUB_ENV" + # Where the snapshot source writes its machine-local cache of + # downloaded files and found entries, set so the runs below can clear + # it. + echo "XDG_CACHE_HOME=$RUNNER_TEMP/cache" >> "$GITHUB_ENV" + + - name: Install Rust + run: rustup update + + - uses: stellar/actions/rust-cache@main + + - uses: stellar/stellar-cli@v27.1.0 + + - name: Start quickstart + run: | + docker run --detach --name quickstart --publish 8000:8000 \ + stellar/quickstart:testing \ + --local \ + --enable rpc,galexie \ + --limits unlimited + + # Build ahead of the runs below, both so that they compile nothing and + # their durations are the time spent forking alone, and so that the + # compile happens while quickstart is still starting up. + - name: Build the test + run: cargo test -p test_fork --lib --no-run + + - name: Submit transactions to fork from + run: tests/fork/quickstart-setup.sh "$TEST_FORK_QUICKSTART_FIXTURE" + + # Fork three times, once per layer of caching, so that a cache that stores + # or replays entries wrongly fails as loudly as collecting them wrongly + # does. Every run asserts the same balances. + + - name: Fork the transactions, with no cache + run: | + rm -rf tests-snapshot-source/local "$XDG_CACHE_HOME/soroban-sdk" + cargo test -p test_fork --lib -- --ignored --nocapture quickstart + + - name: Fork the transactions, with only the system cache + run: | + rm -rf tests-snapshot-source/local + cargo test -p test_fork --lib -- --ignored --nocapture quickstart + + - name: Fork the transactions, with the system and workspace caches + run: cargo test -p test_fork --lib -- --ignored --nocapture quickstart + + - name: Quickstart logs + if: always() + run: docker logs quickstart diff --git a/.gitignore b/.gitignore index b0e593750..af38c7371 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ target-tiny/ lcov.info *.profraw .soroban/ +tests-snapshot-source/**/*.lock +tests-snapshot-source/**/*.dl # Ignore snapshots generated by tests that use random data as input or import # .wasm files as input which change frequently in this repository. @@ -11,3 +13,6 @@ soroban-sdk/test_snapshots/tests/contractimport/ soroban-sdk/test_snapshots/tests/contractimport_with_error/ soroban-sdk/test_snapshots/tests/proptest_scval_cmp tests/import_contract/test_snapshots/ + +# Snapshots of the ephemeral local network forked by the quickstart test. +tests-snapshot-source/local/ diff --git a/Cargo.lock b/Cargo.lock index 37a1e14aa..83fbf461a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "ahash" version = "0.8.11" @@ -14,6 +20,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -177,7 +192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -186,6 +201,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -252,6 +273,24 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "bytes-lit" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adabf37211a5276e46335feabcbb1530c95eb3fdf85f324c7db942770aa025d" +dependencies = [ + "num-bigint", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "bytes-lit" version = "0.0.6" @@ -264,12 +303,45 @@ dependencies = [ "syn", ] +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + [[package]] name = "cc" -version = "1.1.21" +version = "1.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -281,6 +353,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "cfg_eval" version = "0.1.2" @@ -311,6 +389,16 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -348,6 +436,15 @@ dependencies = [ "serde_json", ] +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -355,7 +452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -503,6 +600,38 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dissimilar" version = "1.0.9" @@ -567,7 +696,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core", + "rand_core 0.6.4", "serde", "sha2", "subtle", @@ -604,12 +733,21 @@ dependencies = [ "ff", "generic-array", "group", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "enum-ordinalize" version = "4.3.2" @@ -680,7 +818,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -690,12 +828,101 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -720,6 +947,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + [[package]] name = "glob" version = "0.3.3" @@ -733,10 +974,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash32" version = "0.3.1" @@ -807,6 +1067,123 @@ dependencies = [ "digest", ] +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -830,12 +1207,114 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -864,6 +1343,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + [[package]] name = "itertools" version = "0.13.0" @@ -890,10 +1375,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" dependencies = [ + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -926,9 +1413,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" @@ -948,17 +1435,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "libredox" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "macro-string" version = "0.1.4" @@ -970,12 +1478,74 @@ dependencies = [ "syn", ] +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -1028,6 +1598,55 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "p256" version = "0.13.2" @@ -1046,6 +1665,18 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "pkcs8" version = "0.10.2" @@ -1056,6 +1687,21 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1128,8 +1774,8 @@ dependencies = [ "bitflags", "lazy_static", "num-traits", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -1153,6 +1799,61 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -1162,6 +1863,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1169,8 +1876,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", ] [[package]] @@ -1180,7 +1897,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] @@ -1189,7 +1916,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", ] [[package]] @@ -1198,7 +1934,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] @@ -1207,6 +1965,52 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1217,6 +2021,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1239,6 +2063,47 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "rusty-fork" version = "0.3.0" @@ -1257,6 +2122,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "schemars" version = "0.8.22" @@ -1281,11 +2155,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -1328,6 +2228,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_with" version = "3.12.0" @@ -1380,11 +2292,20 @@ dependencies = [ "keccak", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signature" @@ -1393,15 +2314,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "soroban-builtin-sdk-macros" version = "28.0.1" @@ -1459,7 +2402,7 @@ dependencies = [ "ed25519-dalek", "elliptic-curve", "generic-array", - "getrandom", + "getrandom 0.2.15", "hex-literal", "hmac", "k256", @@ -1467,8 +2410,8 @@ dependencies = [ "num-integer", "num-traits", "p256", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "sec1", "sha2", "sha3", @@ -1505,16 +2448,36 @@ dependencies = [ "serde_with", "soroban-env-common", "soroban-env-host", - "thiserror", + "thiserror 1.0.63", ] [[package]] -name = "soroban-meta" +name = "soroban-ledger-snapshot-source-tx" version = "27.0.5" dependencies = [ - "stellar-xdr", - "thiserror", - "wasmparser", + "cargo_metadata", + "directories", + "flate2", + "hex", + "reqwest", + "serde", + "serde_json", + "sha2", + "soroban-sdk", + "stellar-xdr", + "thiserror 2.0.18", + "tracing", + "tracing-subscriber", + "zstd", +] + +[[package]] +name = "soroban-meta" +version = "27.0.5" +dependencies = [ + "stellar-xdr", + "thiserror 1.0.63", + "wasmparser", ] [[package]] @@ -1525,7 +2488,7 @@ dependencies = [ "ark-bls12-381", "ark-bn254", "ark-ff", - "bytes-lit", + "bytes-lit 0.0.6", "crate-git-revision 0.0.9", "ctor", "curve25519-dalek", @@ -1536,7 +2499,7 @@ dependencies = [ "libfuzzer-sys", "proptest", "proptest-arbitrary-interop", - "rand", + "rand 0.8.5", "rustc_version", "serde", "serde_json", @@ -1578,7 +2541,7 @@ dependencies = [ "pretty_assertions", "sha2", "stellar-xdr", - "thiserror", + "thiserror 1.0.63", "wasmparser", ] @@ -1594,7 +2557,7 @@ dependencies = [ "soroban-spec", "stellar-xdr", "syn", - "thiserror", + "thiserror 1.0.63", ] [[package]] @@ -1725,6 +2688,47 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "target-triple" version = "1.0.0" @@ -1955,6 +2959,24 @@ dependencies = [ "soroban-sdk", ] +[[package]] +name = "test_fork" +version = "27.0.5" +dependencies = [ + "bytes-lit 0.0.5", + "ed25519-dalek", + "hex", + "rand 0.8.5", + "reqwest", + "serde_json", + "sha2", + "soroban-ledger-snapshot-source-tx", + "soroban-sdk", + "stellar-strkey 0.0.16", + "stellar-xdr", + "url", +] + [[package]] name = "test_fuzz" version = "27.0.5" @@ -2085,7 +3107,16 @@ version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.63", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", ] [[package]] @@ -2099,6 +3130,26 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "time" version = "0.3.36" @@ -2130,6 +3181,78 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.9.5" @@ -2169,6 +3292,118 @@ version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "trybuild" version = "1.0.115" @@ -2202,6 +3437,42 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -2228,43 +3499,58 @@ dependencies = [ "libc", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" +name = "wasm-bindgen-futures" +version = "0.4.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", + "js-sys", + "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2272,22 +3558,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasmi_arena" @@ -2326,6 +3615,35 @@ dependencies = [ "indexmap-nostd", ] +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi-util" version = "0.1.11" @@ -2344,6 +3662,41 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2362,6 +3715,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2438,12 +3800,47 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2465,6 +3862,27 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -2484,3 +3902,64 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 2a9a2f056..9ab3ad55f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,9 @@ members = [ "soroban-token-sdk", "soroban-token-spec", "stellar-asset-spec", + + "soroban-ledger-snapshot-source-tx", + "tests/*", ] @@ -29,6 +32,8 @@ soroban-token-sdk = { version = "27.0.5", path = "soroban-token-sdk" } soroban-token-spec = { version = "27.0.5", path = "soroban-token-spec" } stellar-asset-spec = { version = "27.0.5", path = "stellar-asset-spec" } +soroban-ledger-snapshot-source-tx = { version = "27.0.5", path = "soroban-ledger-snapshot-source-tx" } + [workspace.dependencies.soroban-env-common] version = "=28.0.1" #git = "https://github.com/stellar/rs-soroban-env" diff --git a/deny.toml b/deny.toml index d56915ecf..2706da861 100644 --- a/deny.toml +++ b/deny.toml @@ -108,7 +108,16 @@ allow = [ "BSD-3-Clause", "Apache-2.0 WITH LLVM-exception", "Unicode-DFS-2016", - # "MPL-2.0" + # Required by dependencies of soroban-ledger-snapshot-source-tx: + # Unicode-3.0: icu_* crates via url/idna (reqwest). Successor to Unicode-DFS-2016. + "Unicode-3.0", + # ISC: ring/untrusted (reqwest rustls-tls). Also satisfies the "Apache-2.0 AND + # ISC" expression together with the Apache-2.0 entry above. + "ISC", + # CDLA-Permissive-2.0: webpki-roots (reqwest rustls-tls). + "CDLA-Permissive-2.0", + # MPL-2.0: option-ext via the directories crate. + "MPL-2.0", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the @@ -221,6 +230,11 @@ deny = [ skip = [ { name = "hashbrown", version = "=0.14.5" }, { name = "stellar-strkey", version = "=0.0.13" }, + # thiserror 1.x is pulled in transitively (e.g. via soroban-ledger-snapshot), + # while soroban-ledger-snapshot-source-tx and cargo_metadata 0.19 use + # thiserror 2.x. No single shared version exists yet. + { name = "thiserror", version = "=1.0.63" }, + { name = "thiserror-impl", version = "=1.0.63" }, { name = "crate-git-revision", version = "=0.0.6" }, ] # Similarly to `skip` allows you to skip certain crates during duplicate diff --git a/soroban-ledger-snapshot-source-tx/Cargo.toml b/soroban-ledger-snapshot-source-tx/Cargo.toml new file mode 100644 index 000000000..ce325c3d0 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "soroban-ledger-snapshot-source-tx" +description = "SnapshotSource implementation that downloads ledger meta and searches for ledger entries" +homepage = "https://github.com/stellar/rs-soroban-sdk" +repository = "https://github.com/stellar/rs-soroban-sdk" +authors = ["Stellar Development Foundation "] +readme = "../README.md" +license = "Apache-2.0" +version.workspace = true +edition = "2021" +rust-version.workspace = true + +[dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } +stellar-xdr = { workspace = true, features = ["std", "base64", "serde"] } +cargo_metadata = "0.19" +directories = "6.0" +sha2 = "0.10" +hex = "0.4" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +thiserror = "2.0" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "rustls-tls"] } +flate2 = { version = "1.0", features = ["rust_backend"] } +zstd = "0.13" diff --git a/soroban-ledger-snapshot-source-tx/README.md b/soroban-ledger-snapshot-source-tx/README.md new file mode 100644 index 000000000..912f6967c --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/README.md @@ -0,0 +1,58 @@ +# soroban-ledger-snapshot-source-tx + +A `SnapshotSource` implementation for the Soroban SDK that fetches ledger entries by downloading and searching ledger meta from multiple sources: SEP-54 meta storage, RPC, and history archives. + +## Usage + +Add the dependency: + +```toml +[dependencies] +soroban-ledger-snapshot-source-tx = "27" +``` + +Use it in tests: + +```rust +use bytes_lit::bytes; +use soroban_ledger_snapshot_source_tx::{Network, TxSnapshotSource}; +use soroban_sdk::Env; + +let tx_hash = bytes!(0x6fc2e483896276816b6d3b8d1df778bc978521f51561faa407ab8bb1949e6a1b); + +// Use mainnet with default URLs +let source = TxSnapshotSource::new( + Network::mainnet(None), + 59914751, // Ledger sequence + Some(tx_hash), +); + +let env = Env::from_ledger_snapshot(source); +``` + +Or with custom network configuration: + +```rust +use bytes_lit::bytes; +use soroban_ledger_snapshot_source_tx::{Network, TxSnapshotSource}; +use soroban_sdk::Env; + +let tx_hash = bytes!(0x6fc2e483896276816b6d3b8d1df778bc978521f51561faa407ab8bb1949e6a1b); + +let network = Network { + name: "mainnet".to_string(), + passphrase: "Public Global Stellar Network ; September 2015".to_string(), + meta_url: "https://aws-public-blockchain.s3.us-east-2.amazonaws.com/v1.1/stellar/ledgers/pubnet".to_string(), + rpc_url: Some("https://mainnet.sorobanrpc.com".to_string()), + archive_url: "https://history.stellar.org/prd/core-live/core_live_001".to_string(), + archive_checkpoint_ledger_count: 64, +}; + +let source = TxSnapshotSource::new( + network, + 59914751, // Ledger sequence + Some(tx_hash), +); + +let env = Env::from_ledger_snapshot(source); +``` diff --git a/soroban-ledger-snapshot-source-tx/src/cache.rs b/soroban-ledger-snapshot-source-tx/src/cache.rs new file mode 100644 index 000000000..a029da1a6 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/cache.rs @@ -0,0 +1,142 @@ +use std::fs::{self, File}; +use std::io::{Read, Write}; +use std::path::Path; + +/// Cache a file, collecting bytes if not present, and return a reader +pub fn cache(path: P, collect: C) -> Result> +where + P: AsRef, + C: FnOnce(&mut dyn Write) -> Result<(), CE>, +{ + let path = path.as_ref(); + if let Some(parent) = path.parent().filter(|p| !p.as_os_str().is_empty()) { + fs::create_dir_all(parent).map_err(CacheError::Io)?; + } + + // Fast path: if file already exists, just read it (no lock needed). + // Slow path: acquire lock, check again, collect and write if needed. + if !path.exists() { + let lock_path = path.with_extension("lock"); + let lock_file = File::create(&lock_path).map_err(CacheError::Io)?; + // Acquire an exclusive advisory lock using std's native file locking, + // released automatically when `lock_file` is dropped at the end of this + // scope. + File::lock(&lock_file).map_err(CacheError::Io)?; + + if !path.exists() { + // Write atomically via temp file and rename. + let temp_path = path.with_extension("dl"); + let write_result = (|| { + let mut temp = File::create(&temp_path).map_err(CacheError::Io)?; + collect(&mut temp).map_err(CacheError::Collector)?; + temp.sync_all().map_err(CacheError::Io)?; + Ok(()) + })(); + if let Err(e) = write_result { + // Don't leave a partial temp file behind on failure; otherwise a + // transient collector/IO error would litter the cache directory + // (and potentially the committed fixtures) with stray `.dl` files. + let _ = fs::remove_file(&temp_path); + return Err(e); + } + fs::rename(&temp_path, path).map_err(CacheError::Io)?; + } + } + + // Open data file for reading. + let file = File::open(path).map_err(CacheError::Io)?; + Ok(file) +} + +/// Error type for cache operations +#[derive(Debug, thiserror::Error)] +pub enum CacheError { + #[error("collector error: {0}")] + Collector(CE), + #[error("io error: {0}")] + #[allow(dead_code)] + Io(#[from] std::io::Error), +} + +#[cfg(test)] +mod test { + use super::{cache, CacheError}; + use std::io::Read; + use std::path::PathBuf; + use std::sync::atomic::{AtomicU32, Ordering}; + + // Unique temp path per test invocation to avoid cross-test interference. + fn unique_path(name: &str) -> PathBuf { + static COUNTER: AtomicU32 = AtomicU32::new(0); + let n = COUNTER.fetch_add(1, Ordering::Relaxed); + let dir = std::env::temp_dir().join(format!( + "soroban-cache-test-{}-{}-{}", + std::process::id(), + name, + n + )); + std::fs::create_dir_all(&dir).unwrap(); + dir.join("entry.json") + } + + fn read_all(mut r: impl Read) -> Vec { + let mut buf = Vec::new(); + r.read_to_end(&mut buf).unwrap(); + buf + } + + #[test] + fn miss_then_write_collects_and_returns_bytes() { + let path = unique_path("miss"); + let reader = cache(&path, |w| { + w.write_all(b"hello")?; + Ok::<(), std::io::Error>(()) + }) + .unwrap(); + assert_eq!(read_all(reader), b"hello"); + assert!(path.exists()); + // The atomic-write temp file must not be left behind. + assert!(!path.with_extension("dl").exists()); + } + + #[test] + fn hit_uses_fast_path_without_invoking_collector() { + let path = unique_path("hit"); + std::fs::write(&path, b"cached").unwrap(); + // Collector must not run when the file already exists. + let reader = cache(&path, |_w| -> Result<(), std::io::Error> { + panic!("collector should not be called on cache hit"); + }) + .unwrap(); + assert_eq!(read_all(reader), b"cached"); + } + + #[test] + fn collector_error_is_propagated_and_no_data_file_written() { + let path = unique_path("err"); + let result = cache(&path, |_w| { + Err::<(), std::io::Error>(std::io::Error::other("nope")) + }); + match result { + Err(CacheError::Collector(e)) => assert_eq!(e.to_string(), "nope"), + _ => panic!("expected Collector error"), + } + // On collector failure the data file must not be created (the rename + // only happens after a successful collect). + assert!(!path.exists()); + // The partial temp file must be cleaned up rather than left behind. + assert!(!path.with_extension("dl").exists()); + } + + #[test] + fn miss_creates_parent_directories() { + let path = unique_path("parent").join("nested").join("entry.json"); + let reader = cache(&path, |w| { + w.write_all(b"created")?; + Ok::<(), std::io::Error>(()) + }) + .unwrap(); + assert_eq!(read_all(reader), b"created"); + assert!(path.exists()); + } +} diff --git a/soroban-ledger-snapshot-source-tx/src/fetch/from_history_archive.rs b/soroban-ledger-snapshot-source-tx/src/fetch/from_history_archive.rs new file mode 100644 index 000000000..2f7992574 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/fetch/from_history_archive.rs @@ -0,0 +1,130 @@ +use flate2::read::GzDecoder; +use std::io::{self, copy, Cursor, Write}; +use stellar_xdr::{self as xdr, Frame, Limited, ReadXdr}; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("downloading history: {0}")] + DownloadingHistory(reqwest::Error), + + #[error("downloading history: got status code {0}")] + DownloadingHistoryGotStatusCode(reqwest::StatusCode), + + #[error("json decoding history: {0}")] + JsonDecodingHistory(serde_json::Error), + + #[error("getting bucket: {0}")] + GettingBucket(reqwest::Error), + + #[error("getting bucket: got status code {0}")] + GettingBucketGotStatusCode(reqwest::StatusCode), + + #[error("streaming bucket: {0}")] + StreamingBucket(io::Error), + + #[error("streaming history: {0}")] + StreamingHistory(io::Error), + + #[error("xdr parsing error: {0}")] + Xdr(#[from] xdr::Error), + + #[error("invalid ledger hex {0:?}: expected at least 6 hex characters")] + InvalidLedgerHex(String), + + #[error("invalid bucket hash {0:?}: expected at least 6 hex characters")] + InvalidBucketHash(String), +} + +/// Split the first six characters of a hex string into the three two-character +/// directory prefixes used by the history archive's nested layout. Returns +/// `None` if the string is shorter than six bytes or a split would fall on a +/// non-char boundary, so callers can surface a typed error instead of panicking +/// on a malformed/truncated value. +fn hash_prefixes(hex: &str) -> Option<(&str, &str, &str)> { + Some((hex.get(0..2)?, hex.get(2..4)?, hex.get(4..6)?)) +} + +#[allow(dead_code)] +pub(crate) fn history(archive_url: &str, ledger: u32) -> Result { + let mut bytes = Vec::new(); + get_history(archive_url, ledger, &mut bytes)?; + parse_history(Cursor::new(bytes)) +} + +pub fn get_history( + archive_url: &str, + ledger: u32, + writer: &mut W, +) -> Result<(), Error> { + let history_url = { + let ledger_hex = format!("{ledger:08x}"); + let (ledger_hex_0, ledger_hex_1, ledger_hex_2) = hash_prefixes(&ledger_hex) + .ok_or_else(|| Error::InvalidLedgerHex(ledger_hex.clone()))?; + format!("{archive_url}/history/{ledger_hex_0}/{ledger_hex_1}/{ledger_hex_2}/history-{ledger_hex}.json") + }; + + let mut response = reqwest::blocking::Client::new() + .get(&history_url) + .send() + .map_err(Error::DownloadingHistory)?; + + if !response.status().is_success() { + return Err(Error::DownloadingHistoryGotStatusCode(response.status())); + } + + copy(&mut response, writer).map_err(Error::StreamingHistory)?; + Ok(()) +} + +pub fn parse_history(reader: R) -> Result { + let history: History = serde_json::from_reader(reader).map_err(Error::JsonDecodingHistory)?; + Ok(history) +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct History { + pub current_ledger: u32, + pub current_buckets: Vec, + pub hot_archive_buckets: Option>, + pub network_passphrase: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryBucket { + pub curr: String, + pub snap: String, +} + +pub fn get_bucket( + archive_url: &str, + bucket: &str, + writer: &mut W, +) -> Result, Error> { + let (bucket_0, bucket_1, bucket_2) = + hash_prefixes(bucket).ok_or_else(|| Error::InvalidBucketHash(bucket.to_string()))?; + let bucket_url = + format!("{archive_url}/bucket/{bucket_0}/{bucket_1}/{bucket_2}/bucket-{bucket}.xdr.gz"); + + let response = reqwest::blocking::Client::new() + .get(&bucket_url) + .send() + .map_err(Error::GettingBucket)?; + + if !response.status().is_success() { + return Err(Error::GettingBucketGotStatusCode(response.status())); + } + + let content_length = response.content_length(); + + let mut decoder = GzDecoder::new(response); + copy(&mut decoder, writer).map_err(Error::StreamingBucket)?; + Ok(content_length) +} + +pub fn parse_bucket<'a, R: std::io::Read + 'a>( + reader: &'a mut Limited, +) -> impl Iterator, xdr::Error>> + 'a { + Frame::::read_xdr_iter(reader) +} diff --git a/soroban-ledger-snapshot-source-tx/src/fetch/from_meta_storage.rs b/soroban-ledger-snapshot-source-tx/src/fetch/from_meta_storage.rs new file mode 100644 index 000000000..8269fa767 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/fetch/from_meta_storage.rs @@ -0,0 +1,239 @@ +//! Implements SEP-54 + +use std::io::{copy, Cursor, Write}; + +use stellar_xdr::{LedgerCloseMeta, LedgerCloseMetaBatch, Limits, ReadXdr}; +use thiserror::Error; + +/// Error type for ledger meta downloader operations +#[derive(Error, Debug)] +pub enum Error { + #[error("HTTP request failed: {0}")] + Http(#[from] reqwest::Error), + #[error("I/O error: {0}")] + Io(#[from] std::io::Error), + #[error("XDR parsing error: {0}")] + Xdr(#[from] stellar_xdr::Error), + #[error("JSON parsing error: {0}")] + Json(#[from] serde_json::Error), + #[error("Ledger sequence {0} not found")] + LedgerNotFound(u32), + #[error("SEP-54 storage config (.config.json) not found")] + ConfigNotFound, +} + +/// SEP-54 storage configuration, read from `/.config.json`. +/// +/// Describes how ledgers are grouped into batch files and partitions for this +/// deployment, so object paths can be derived from the actual layout rather +/// than hardcoded constants. Only the fields needed to derive paths are read; +/// other documented fields (`version`, `compression`, `networkPassphrase`) are +/// ignored. +#[derive(Debug, Clone, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Config { + /// Number of ledgers bundled into each batch (file). + pub ledgers_per_batch: u32, + /// Number of batches in a partition (directory). + pub batches_per_partition: u32, +} + +/// Download LedgerCloseMeta for a specific ledger sequence from S3-compatible storage +/// +/// # Arguments +/// * `meta_url` - URL to the SEP-54 compatible ledger meta storage +/// * `sequence` - The ledger sequence number to download +/// +/// # Returns +/// The uncompressed LedgerCloseMeta for the specified ledger +#[allow(dead_code)] +pub(crate) fn ledger(meta_url: &str, sequence: u32) -> Result { + let mut config_bytes = Vec::new(); + get_config(meta_url, &mut config_bytes)?; + let config = parse_config(Cursor::new(config_bytes))?; + let mut ledger = Vec::new(); + get_ledger( + meta_url, + sequence, + config.ledgers_per_batch, + config.batches_per_partition, + &mut ledger, + )?; + parse_ledger(sequence, Cursor::new(ledger)) +} + +/// Download compressed LedgerCloseMeta bytes for a specific ledger sequence from S3-compatible storage +/// +/// # Arguments +/// * `meta_url` - URL to the SEP-54 compatible ledger meta storage +/// * `sequence` - The ledger sequence number to download +/// * `write` - Writer to write the decompressed data to +/// +/// # Returns +/// The compressed bytes for the specified ledger +pub fn get_ledger( + meta_url: &str, + sequence: u32, + ledgers_per_batch: u32, + batches_per_partition: u32, + write: &mut W, +) -> Result<(), Error> { + let client = reqwest::blocking::Client::new(); + + // Construct S3 REST API URL for GET object + let key = path_for_ledger(sequence, ledgers_per_batch, batches_per_partition); + let url = format!("{meta_url}/{key}"); + + // Make HTTP GET request + let response = client.get(&url).send()?; + if !response.status().is_success() { + return Err(Error::LedgerNotFound(sequence)); + } + + // Get the response body and decompress directly to writer + let mut decoder = zstd::stream::Decoder::new(response)?; + copy(&mut decoder, write)?; + Ok(()) +} + +/// Download the SEP-54 storage configuration (`/.config.json`). +/// +/// Unlike the ledger objects this is plain (uncompressed) JSON, so the response +/// body is written through verbatim. +pub fn get_config(meta_url: &str, write: &mut W) -> Result<(), Error> { + let client = reqwest::blocking::Client::new(); + let url = format!("{meta_url}/.config.json"); + let mut response = client.get(&url).send()?; + if !response.status().is_success() { + return Err(Error::ConfigNotFound); + } + copy(&mut response, write)?; + Ok(()) +} + +/// Parse the SEP-54 [`Config`] from a JSON reader. +pub fn parse_config(reader: R) -> Result { + Ok(serde_json::from_reader(reader)?) +} + +/// Parse LedgerCloseMeta from compressed bytes reader +/// +/// # Arguments +/// * `sequence` - The ledger sequence being parsed, used only to produce a +/// meaningful `LedgerNotFound` error when the batch is empty +/// * `reader` - Reader for the compressed bytes +/// +/// # Returns +/// The uncompressed LedgerCloseMeta +pub fn parse_ledger(sequence: u32, reader: R) -> Result { + // Parse as LedgerCloseMetaBatch first, then extract the single ledger + let mut limited_reader = stellar_xdr::Limited::new(reader, Limits::none()); + let batch: LedgerCloseMetaBatch = ReadXdr::read_xdr(&mut limited_reader)?; + + // Return the first (and assumed only) ledger from the batch + batch + .ledger_close_metas + .into_iter() + .next() + .ok_or(Error::LedgerNotFound(sequence)) +} + +/// Calculate the S3 path for a given ledger sequence +/// +/// This implements the SEP-54 path structure for ledger metadata. The partition +/// and batch sizes come from the storage's `.config.json` (see [`Config`]): +/// `partition_size = ledgers_per_batch * batches_per_partition` and +/// `batch_size = ledgers_per_batch`. +fn path_for_ledger( + ledger_sequence: u32, + ledgers_per_batch: u32, + batches_per_partition: u32, +) -> String { + let partition_size = ledgers_per_batch * batches_per_partition; + let batch_size = ledgers_per_batch; + + // Calculate partition boundaries + let partition_start = (ledger_sequence / partition_size) * partition_size; + let partition_end = partition_start + partition_size - 1; + + // Calculate batch boundaries + let ledgers_into_partition = ledger_sequence % partition_size; + let batch_start = partition_start + (ledgers_into_partition / batch_size) * batch_size; + + // Calculate hex prefixes using inverted sequence numbers + let partition_prefix_hex = format!("{:08X}", u32::MAX - partition_start); + let batch_prefix_hex = format!("{:08X}", u32::MAX - batch_start); + + // Assemble path components + let partition_dir = format!( + "{}--{}-{}", + partition_prefix_hex, partition_start, partition_end + ); + let batch_file = format!("{}--{}.xdr.zst", batch_prefix_hex, batch_start); + + format!("{}/{}", partition_dir, batch_file) +} + +#[cfg(test)] +mod test { + use super::path_for_ledger; + + // The mainnet deployment's SEP-54 config: one ledger per batch file, 64000 + // batches per partition (partition_size = 1 * 64000 = 64000). + const LEDGERS_PER_BATCH: u32 = 1; + const BATCHES_PER_PARTITION: u32 = 64000; + + // SEP-54 object paths use inverted (descending) hex prefixes so that the + // newest ledgers sort first. These are pinned against values computed from + // the documented partition (64000) and batch (1) sizes, and the 61292152 + // case anchors the path actually fetched by the mainnet fork tests. + #[test] + fn path_for_ledger_known_values() { + assert_eq!( + path_for_ledger(0, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION), + "FFFFFFFF--0-63999/FFFFFFFF--0.xdr.zst", + ); + assert_eq!( + path_for_ledger(128, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION), + "FFFFFFFF--0-63999/FFFFFF7F--128.xdr.zst", + ); + assert_eq!( + path_for_ledger(63999, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION), + "FFFFFFFF--0-63999/FFFF0600--63999.xdr.zst", + ); + // Crossing the partition boundary moves into the next partition dir. + assert_eq!( + path_for_ledger(64000, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION), + "FFFF05FF--64000-127999/FFFF05FF--64000.xdr.zst", + ); + assert_eq!( + path_for_ledger(61292152, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION), + "FC596DFF--61248000-61311999/FC58C187--61292152.xdr.zst", + ); + } + + #[test] + fn path_for_ledger_partition_alignment() { + // First ledger of a partition: the batch prefix equals the partition + // prefix and the batch number equals the partition start. + for partition in 0u32..3 { + let start = partition * 64000; + let path = path_for_ledger(start, LEDGERS_PER_BATCH, BATCHES_PER_PARTITION); + let (dir, file) = path.split_once('/').unwrap(); + assert!(dir.ends_with(&format!("--{}-{}", start, start + 63999))); + assert!(file.ends_with(&format!("--{}.xdr.zst", start))); + } + } + + // A non-trivial batch size (e.g. ledgers_per_batch = 2) groups multiple + // ledgers into one file: the batch start is rounded down to the batch + // boundary and the filename reflects that batch start, not the ledger. + #[test] + fn path_for_ledger_multi_ledger_batches() { + // ledgers_per_batch = 2, batches_per_partition = 8 -> partition_size 16. + assert_eq!( + path_for_ledger(5, 2, 8), + "FFFFFFFF--0-15/FFFFFFFB--4.xdr.zst", + ); + } +} diff --git a/soroban-ledger-snapshot-source-tx/src/fetch/from_rpc.rs b/soroban-ledger-snapshot-source-tx/src/fetch/from_rpc.rs new file mode 100644 index 000000000..072f1899a --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/fetch/from_rpc.rs @@ -0,0 +1,200 @@ +use serde_json::json; +use std::io::{copy, Write}; +use stellar_xdr::{ + Error as XdrError, LedgerEntry, LedgerEntryData, LedgerEntryExt, LedgerKey, Limits, ReadXdr, + WriteXdr, +}; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("http")] + Http(#[from] reqwest::Error), + #[error("serde")] + Serde(#[from] serde_json::Error), + #[error("io")] + Io(#[from] std::io::Error), + #[error("xdr")] + Xdr(#[from] XdrError), + #[error("rpc error: {0}")] + Rpc(String), +} + +pub fn get_ledger_entry( + rpc_url: &str, + key: &LedgerKey, + write: &mut W, +) -> Result<(), Error> { + let key_xdr = key.to_xdr_base64(Limits::none()).map_err(Error::Xdr)?; + + let request = RpcRequest { + jsonrpc: "2.0".to_string(), + id: 1, + method: "getLedgerEntries".to_string(), + params: json!({ + "keys": [key_xdr] + }), + }; + + let client = reqwest::blocking::Client::new(); + let response = client.post(rpc_url).json(&request).send()?; + + // Reject non-success responses before writing, so a transient error body + // (e.g. a 429/5xx error page) is never persisted into the cache and then + // replayed as a permanent parse failure on every subsequent run. + let response = response.error_for_status()?; + + copy(&mut response.bytes()?.as_ref(), write)?; + + Ok(()) +} + +/// Parse a `getLedgerEntries` response. +/// +/// Returns the entry (when present), its optional live-until ledger, and the +/// `latestLedger` the RPC node reports having observed. The caller needs +/// `latest_ledger` to decide whether the node is current enough for the answer +/// to be trusted (see `LedgerEntryFetcher::fetch_from_rpc`). +pub fn parse_ledger_entry( + reader: R, +) -> Result, u32)>, Error> { + let response: RpcResponse = serde_json::from_reader(reader)?; + + let result = match response { + RpcResponse::Result { result } => result, + RpcResponse::Error { error } => return Err(Error::Rpc(error.message)), + }; + + let latest_ledger = result.latest_ledger; + + let Some(entry) = result.entries.first() else { + return Ok(None); + }; + + let data = LedgerEntryData::from_xdr_base64(&entry.xdr, Limits::none()).map_err(Error::Xdr)?; + + let ledger_entry = LedgerEntry { + data, + last_modified_ledger_seq: entry.last_modified_ledger_seq, + // The RPC does not expose the extension information, so setting this to v0 and for + // contract tests this should have no material impact. + ext: LedgerEntryExt::V0, + }; + + Ok(Some(( + ledger_entry, + entry.live_until_ledger_seq, + latest_ledger, + ))) +} + +#[derive(serde::Serialize)] +struct RpcRequest { + jsonrpc: String, + id: u32, + method: String, + params: serde_json::Value, +} + +#[derive(serde::Deserialize)] +#[serde(untagged)] +enum RpcResponse { + Result { result: T }, + Error { error: RpcError }, +} + +#[derive(serde::Deserialize)] +struct RpcError { + message: String, +} + +/// Response from getLedgerEntries +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct GetLedgerEntriesResponse { + entries: Vec, + // The latest ledger the node has observed. Defaults to 0 when absent (e.g. + // an older cached response), which conservatively makes any entry look like + // it came from a lagging node and is therefore treated as not usable. + #[serde(default)] + latest_ledger: u32, +} + +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct GetLedgerEntriesResponseEntry { + xdr: String, + last_modified_ledger_seq: u32, + live_until_ledger_seq: Option, +} + +#[cfg(test)] +mod test { + use super::{parse_ledger_entry, Error}; + use std::io::Cursor; + use stellar_xdr::{Hash, LedgerEntryData, LedgerEntryExt, Limits, TtlEntry, WriteXdr}; + + fn sample_entry_xdr() -> String { + // A small, fully-deterministic LedgerEntryData to base64-encode into a + // simulated RPC response. + LedgerEntryData::Ttl(TtlEntry { + key_hash: Hash([7u8; 32]), + live_until_ledger_seq: 123, + }) + .to_xdr_base64(Limits::none()) + .unwrap() + } + + #[test] + fn parses_entry_with_ttl() { + let xdr = sample_entry_xdr(); + let body = format!( + r#"{{"jsonrpc":"2.0","id":1,"result":{{"latestLedger":1000,"entries":[{{"xdr":"{xdr}","lastModifiedLedgerSeq":42,"liveUntilLedgerSeq":99}}]}}}}"#, + ); + let (entry, ttl, latest_ledger) = parse_ledger_entry(Cursor::new(body)).unwrap().unwrap(); + assert_eq!(entry.last_modified_ledger_seq, 42); + assert_eq!(ttl, Some(99)); + assert_eq!(latest_ledger, 1000); + // The RPC does not expose extension info, so it is always V0. + assert!(matches!(entry.ext, LedgerEntryExt::V0)); + assert!(matches!(entry.data, LedgerEntryData::Ttl(_))); + } + + #[test] + fn missing_live_until_yields_none_ttl() { + let xdr = sample_entry_xdr(); + let body = format!( + r#"{{"result":{{"latestLedger":50,"entries":[{{"xdr":"{xdr}","lastModifiedLedgerSeq":7}}]}}}}"#, + ); + let (_, ttl, latest_ledger) = parse_ledger_entry(Cursor::new(body)).unwrap().unwrap(); + assert_eq!(ttl, None); + assert_eq!(latest_ledger, 50); + } + + #[test] + fn missing_latest_ledger_defaults_to_zero() { + // An older cached response may omit latestLedger; it must default to 0 + // so the usability gate treats it as a lagging node rather than failing + // to parse. + let xdr = sample_entry_xdr(); + let body = + format!(r#"{{"result":{{"entries":[{{"xdr":"{xdr}","lastModifiedLedgerSeq":7}}]}}}}"#,); + let (_, _, latest_ledger) = parse_ledger_entry(Cursor::new(body)).unwrap().unwrap(); + assert_eq!(latest_ledger, 0); + } + + #[test] + fn empty_entries_yields_none() { + let body = r#"{"result":{"entries":[]}}"#; + assert!(parse_ledger_entry(Cursor::new(body)).unwrap().is_none()); + } + + #[test] + fn rpc_error_is_surfaced() { + let body = r#"{"error":{"message":"boom"}}"#; + let err = parse_ledger_entry(Cursor::new(body)).unwrap_err(); + match err { + Error::Rpc(msg) => assert_eq!(msg, "boom"), + other => panic!("expected Rpc error, got {other:?}"), + } + } +} diff --git a/soroban-ledger-snapshot-source-tx/src/fetch/iter.rs b/soroban-ledger-snapshot-source-tx/src/fetch/iter.rs new file mode 100644 index 000000000..8d4f18fd8 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/fetch/iter.rs @@ -0,0 +1,472 @@ +use soroban_sdk::xdr::{ + LedgerCloseMeta, LedgerEntry, LedgerEntryChange, LedgerEntryChanges, LedgerKey, + TransactionMeta, TransactionResultMeta, TransactionResultMetaV1, +}; + +/// Iterator over ledger entry changes in reverse order from a LedgerCloseMeta. +/// Within each phase, non-State changes are yielded first, then State changes. +pub struct LedgerEntryChangesIterator<'a> { + tx_result_meta: TransactionResultMetasNormalized<'a>, + /// Current iteration position, or None if done + position: Option, +} + +/// Current position within the iteration +#[derive(Clone, Copy, Debug)] +struct IteratorPosition { + phase: ProcessingPhase, + change_idx: usize, +} + +#[derive(Clone, Copy, Debug)] +pub enum ProcessingPhase { + /// Special phase for boundary tx: TxChangesBefore with State group only, in forward order + BoundaryTxChangesBefore { + tx_idx: usize, + }, + /// Special phase for boundary tx: OperationsChanges with State group only, in forward order + BoundaryOperationsChanges { + tx_idx: usize, + op_idx: usize, + }, + // Normal phases work backwards and only yield Mutation changes. + // Since we iterate in reverse, we see the final state first, making State entries redundant. + PostTxApplyFeeProcessing { + tx_idx: usize, + }, + TxChangesAfter { + tx_idx: usize, + }, + OperationsChanges { + tx_idx: usize, + op_idx: usize, + }, + TxChangesBefore { + tx_idx: usize, + }, + FeeProcessing { + tx_idx: usize, + }, + /// Terminal phase indicating iteration is complete + Done, +} + +impl ProcessingPhase { + /// Start iterating from the end of the ledger (after all txs have been applied). + fn starting_from_end(tx_count: usize) -> Self { + if tx_count == 0 { + Self::Done + } else { + Self::PostTxApplyFeeProcessing { + tx_idx: tx_count - 1, + } + } + } + + /// Start iterating from just before a specific transaction was applied. + /// This starts at the tx's TxChangesBefore with only the Before group, + /// then proceeds to OperationsChanges Before group, both in forward order. + /// This captures the state of entries just before the tx modified them. + fn starting_from_tx(boundary_tx_idx: usize) -> Self { + Self::BoundaryTxChangesBefore { + tx_idx: boundary_tx_idx, + } + } + + fn tx_idx(&self) -> Option { + match self { + Self::BoundaryTxChangesBefore { tx_idx } + | Self::BoundaryOperationsChanges { tx_idx, .. } + | Self::PostTxApplyFeeProcessing { tx_idx } + | Self::TxChangesAfter { tx_idx } + | Self::OperationsChanges { tx_idx, .. } + | Self::TxChangesBefore { tx_idx } + | Self::FeeProcessing { tx_idx } => Some(*tx_idx), + Self::Done => None, + } + } + + /// Get the iteration direction for this phase + fn direction(&self) -> IterDirection { + match self { + Self::BoundaryTxChangesBefore { .. } | Self::BoundaryOperationsChanges { .. } => { + IterDirection::Forward + } + _ => IterDirection::Reverse, + } + } + + /// Check if a change should be yielded by the iterator in this phase. + /// Boundary phases only yield State entries, normal phases only yield mutations. + fn should_yield(&self, change: &LedgerEntryChange) -> bool { + match self { + // Boundary phases only yield State entries + Self::BoundaryTxChangesBefore { .. } | Self::BoundaryOperationsChanges { .. } => { + matches!(change, LedgerEntryChange::State(_)) + } + // Normal phases yield on mutations (non-State) + Self::PostTxApplyFeeProcessing { .. } + | Self::TxChangesAfter { .. } + | Self::OperationsChanges { .. } + | Self::TxChangesBefore { .. } + | Self::FeeProcessing { .. } => !matches!(change, LedgerEntryChange::State(_)), + // Done phase yields nothing + Self::Done => false, + } + } + + fn get_changes<'a>( + &self, + components: &'a TransactionResultMetasNormalized<'a>, + ) -> Option<&'a LedgerEntryChanges> { + match self { + Self::BoundaryTxChangesBefore { tx_idx } => components.tx_changes_before(*tx_idx), + Self::BoundaryOperationsChanges { tx_idx, op_idx } => { + Some(components.operation_changes(*tx_idx, *op_idx)) + } + Self::PostTxApplyFeeProcessing { tx_idx } => { + components.post_tx_apply_fee_processing(*tx_idx) + } + Self::TxChangesAfter { tx_idx } => components.tx_changes_after(*tx_idx), + Self::OperationsChanges { tx_idx, op_idx } => { + Some(components.operation_changes(*tx_idx, *op_idx)) + } + Self::TxChangesBefore { tx_idx } => components.tx_changes_before(*tx_idx), + Self::FeeProcessing { tx_idx } => Some(components.fee_processing(*tx_idx)), + Self::Done => None, + } + } + + fn advance(&self, components: &TransactionResultMetasNormalized) -> ProcessingPhase { + let tx_count = components.len(); + match self { + // Boundary phases: iterate forward through Before snapshots, then switch to normal flow. + Self::BoundaryTxChangesBefore { tx_idx } => { + let op_count = components.operation_count(*tx_idx); + if op_count > 0 { + Self::BoundaryOperationsChanges { + tx_idx: *tx_idx, + op_idx: 0, + } + } else { + // No ops, go to previous tx with normal flow + tx_idx.checked_sub(1).map_or( + Self::FeeProcessing { + tx_idx: tx_count - 1, + }, + |i| Self::TxChangesAfter { tx_idx: i }, + ) + } + } + Self::BoundaryOperationsChanges { tx_idx, op_idx } => { + let op_count = components.operation_count(*tx_idx); + if *op_idx + 1 < op_count { + // More ops to process in forward order + Self::BoundaryOperationsChanges { + tx_idx: *tx_idx, + op_idx: op_idx + 1, + } + } else { + // Done with boundary tx, go to previous tx with normal flow + tx_idx.checked_sub(1).map_or( + Self::FeeProcessing { + tx_idx: tx_count - 1, + }, + |i| Self::TxChangesAfter { tx_idx: i }, + ) + } + } + // Normal phases: iterate backwards, only yielding After (mutation) changes. + Self::PostTxApplyFeeProcessing { tx_idx } => tx_idx.checked_sub(1).map_or( + Self::TxChangesAfter { + tx_idx: tx_count - 1, + }, + |i| Self::PostTxApplyFeeProcessing { tx_idx: i }, + ), + Self::TxChangesAfter { tx_idx } => { + let op_count = components.operation_count(*tx_idx); + if op_count > 0 { + Self::OperationsChanges { + tx_idx: *tx_idx, + op_idx: op_count - 1, + } + } else { + Self::TxChangesBefore { tx_idx: *tx_idx } + } + } + Self::OperationsChanges { tx_idx, op_idx } => { + op_idx + .checked_sub(1) + .map_or(Self::TxChangesBefore { tx_idx: *tx_idx }, |i| { + Self::OperationsChanges { + tx_idx: *tx_idx, + op_idx: i, + } + }) + } + Self::TxChangesBefore { tx_idx } => tx_idx.checked_sub(1).map_or( + Self::FeeProcessing { + tx_idx: tx_count - 1, + }, + |i| Self::TxChangesAfter { tx_idx: i }, + ), + Self::FeeProcessing { tx_idx } => tx_idx + .checked_sub(1) + .map_or(Self::Done, |i| Self::FeeProcessing { tx_idx: i }), + Self::Done => Self::Done, + } + } +} + +/// Extract the key and entry from a ledger entry change +fn extract_key_entry(change: &LedgerEntryChange) -> (LedgerKey, Option) { + match change { + LedgerEntryChange::Created(ledger_entry) + | LedgerEntryChange::Updated(ledger_entry) + | LedgerEntryChange::State(ledger_entry) + | LedgerEntryChange::Restored(ledger_entry) => { + (ledger_entry.to_key(), Some(ledger_entry.clone())) + } + LedgerEntryChange::Removed(ledger_key) => (ledger_key.clone(), None), + } +} + +/// Direction of iteration through changes +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum IterDirection { + Forward, + Reverse, +} + +impl IterDirection { + /// Get the element at the given logical index from changes + fn get(self, changes: &LedgerEntryChanges, idx: usize) -> &LedgerEntryChange { + match self { + Self::Forward => &changes[idx], + Self::Reverse => &changes[changes.len() - 1 - idx], + } + } +} + +impl<'a> LedgerEntryChangesIterator<'a> { + /// Create a new iterator over ledger entry changes + /// + /// # Arguments + /// * `meta` - The ledger close meta to iterate over + /// * `tx_hash` - Optional transaction hash to start from. When set, the iterator + /// starts from just before that transaction was applied (at the tx's "Before" + /// changes), skipping the post-fee processing and all changes that occur after + /// the transaction executes including the changes produced from that tx. + pub fn new(meta: &'a LedgerCloseMeta, tx_hash: Option<[u8; 32]>) -> Self { + let tx_result_meta = TransactionResultMetasNormalized::from(meta); + + let position = if let Some(ref hash) = tx_hash { + // Find the transaction and start from its State group + tx_result_meta + .find_tx_by_hash(hash) + .map(|tx_idx| IteratorPosition { + phase: ProcessingPhase::starting_from_tx(tx_idx), + change_idx: 0, + }) + } else { + Some(IteratorPosition { + phase: ProcessingPhase::starting_from_end(tx_result_meta.len()), + change_idx: 0, + }) + }; + + Self { + tx_result_meta, + position, + } + } +} + +impl<'a> Iterator for LedgerEntryChangesIterator<'a> { + type Item = (ProcessingPhase, [u8; 32], LedgerKey, Option); + + fn next(&mut self) -> Option { + loop { + let pos = self.position.as_mut()?; + + // Check if iteration is complete + if matches!(pos.phase, ProcessingPhase::Done) { + return None; + } + + // Get tx_idx and changes, advancing if either is not available + let (Some(tx_idx), Some(changes)) = ( + pos.phase.tx_idx(), + pos.phase.get_changes(&self.tx_result_meta), + ) else { + pos.phase = pos.phase.advance(&self.tx_result_meta); + pos.change_idx = 0; + continue; + }; + + // If we've processed all changes in this phase for current group + if pos.change_idx >= changes.len() { + // Advance to next phase (which handles After -> Before transition) + pos.phase = pos.phase.advance(&self.tx_result_meta); + pos.change_idx = 0; + continue; + } + + let change = pos.phase.direction().get(changes, pos.change_idx); + + if !pos.phase.should_yield(change) { + // Skip this change, it belongs to the other group + pos.change_idx += 1; + continue; + } + + let phase = pos.phase; + pos.change_idx += 1; + let hash = *self.tx_result_meta.tx_hash(tx_idx); + let (key, entry) = extract_key_entry(change); + return Some((phase, hash, key, entry)); + } + } +} + +/// Extracted transaction processing components from LedgerCloseMeta +enum TransactionResultMetasNormalized<'a> { + V0(&'a [TransactionResultMeta]), + V1(&'a [TransactionResultMetaV1]), +} + +impl<'a> From<&'a LedgerCloseMeta> for TransactionResultMetasNormalized<'a> { + fn from(meta: &'a LedgerCloseMeta) -> Self { + match meta { + LedgerCloseMeta::V0(meta_v0) => Self::V0(&meta_v0.tx_processing), + // LedgerCloseMetaV1.tx_processing is itself a slice of the V0-shaped + // `TransactionResultMeta` (only LedgerCloseMetaV2 carries the newer + // `TransactionResultMetaV1`), so mapping it to the V0 variant here is + // by type, not a lossy downcast. + LedgerCloseMeta::V1(meta_v1) => Self::V0(&meta_v1.tx_processing), + LedgerCloseMeta::V2(meta_v2) => Self::V1(&meta_v2.tx_processing), + } + } +} + +impl<'a> TransactionResultMetasNormalized<'a> { + pub fn len(&self) -> usize { + match self { + TransactionResultMetasNormalized::V0(slice) => slice.len(), + TransactionResultMetasNormalized::V1(slice) => slice.len(), + } + } + + #[allow(dead_code)] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + pub fn fee_processing(&self, index: usize) -> &'a LedgerEntryChanges { + match self { + Self::V0(slice) => &slice[index].fee_processing, + Self::V1(slice) => &slice[index].fee_processing, + } + } + + pub fn tx_changes_before(&self, index: usize) -> Option<&'a LedgerEntryChanges> { + self.tx_apply_processing(index).tx_changes_before() + } + + pub fn operation_count(&self, tx_index: usize) -> usize { + self.tx_apply_processing(tx_index).operation_count() + } + + pub fn operation_changes(&self, tx_index: usize, op_index: usize) -> &'a LedgerEntryChanges { + self.tx_apply_processing(tx_index) + .operation_changes(op_index) + } + + pub fn tx_changes_after(&self, index: usize) -> Option<&'a LedgerEntryChanges> { + self.tx_apply_processing(index).tx_changes_after() + } + + fn tx_apply_processing(&self, index: usize) -> TransactionMetaNormalized<'a> { + let meta = match self { + Self::V0(s) => &s[index].tx_apply_processing, + Self::V1(s) => &s[index].tx_apply_processing, + }; + TransactionMetaNormalized(meta) + } + + pub fn post_tx_apply_fee_processing(&self, index: usize) -> Option<&'a LedgerEntryChanges> { + match self { + Self::V0(_) => None, + Self::V1(slice) => Some(&slice[index].post_tx_apply_fee_processing), + } + } + + pub fn tx_hash(&self, index: usize) -> &[u8; 32] { + match self { + Self::V0(slice) => &slice[index].result.transaction_hash.0, + Self::V1(slice) => &slice[index].result.transaction_hash.0, + } + } + + /// Find the index of a transaction by its hash + pub fn find_tx_by_hash(&self, hash: &[u8; 32]) -> Option { + for i in 0..self.len() { + if self.tx_hash(i) == hash { + return Some(i); + } + } + None + } +} + +/// Normalized view of TransactionMeta across all versions +struct TransactionMetaNormalized<'a>(&'a TransactionMeta); + +impl<'a> TransactionMetaNormalized<'a> { + fn tx_changes_before(&self) -> Option<&'a LedgerEntryChanges> { + match self.0 { + TransactionMeta::V0(_) => None, + // V1 carries both the pre-tx `State` snapshots and the post-tx + // mutations in a single `tx_changes` list. The iterator's + // `should_yield` keeps only `State` changes during "before" phases, + // so returning the whole list yields the correct before-changes. + TransactionMeta::V1(m) => Some(&m.tx_changes), + TransactionMeta::V2(m) => Some(&m.tx_changes_before), + TransactionMeta::V3(m) => Some(&m.tx_changes_before), + TransactionMeta::V4(m) => Some(&m.tx_changes_before), + } + } + + fn tx_changes_after(&self) -> Option<&'a LedgerEntryChanges> { + match self.0 { + TransactionMeta::V0(_) => None, + // The same V1 `tx_changes` list also holds the post-tx mutations; + // `should_yield` keeps only the non-`State` changes during "after" + // phases, so the same list yields the correct after-changes. + TransactionMeta::V1(m) => Some(&m.tx_changes), + TransactionMeta::V2(m) => Some(&m.tx_changes_after), + TransactionMeta::V3(m) => Some(&m.tx_changes_after), + TransactionMeta::V4(m) => Some(&m.tx_changes_after), + } + } + + fn operation_count(&self) -> usize { + match self.0 { + TransactionMeta::V0(ops) => ops.len(), + TransactionMeta::V1(m) => m.operations.len(), + TransactionMeta::V2(m) => m.operations.len(), + TransactionMeta::V3(m) => m.operations.len(), + TransactionMeta::V4(m) => m.operations.len(), + } + } + + fn operation_changes(&self, index: usize) -> &'a LedgerEntryChanges { + match self.0 { + TransactionMeta::V0(ops) => &ops[index].changes, + TransactionMeta::V1(m) => &m.operations[index].changes, + TransactionMeta::V2(m) => &m.operations[index].changes, + TransactionMeta::V3(m) => &m.operations[index].changes, + TransactionMeta::V4(m) => &m.operations[index].changes, + } + } +} diff --git a/soroban-ledger-snapshot-source-tx/src/fetch/mod.rs b/soroban-ledger-snapshot-source-tx/src/fetch/mod.rs new file mode 100644 index 000000000..27c97c438 --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/fetch/mod.rs @@ -0,0 +1,1130 @@ +use crate::cache::{cache, CacheError}; +use crate::xdr_schema_version; +use from_history_archive::{get_bucket, get_history, parse_bucket, parse_history}; +use from_meta_storage::{get_config, get_ledger, parse_config, parse_ledger}; +use from_rpc::{get_ledger_entry, parse_ledger_entry}; +use sha2::{Digest, Sha256}; +use soroban_sdk::xdr::{BucketEntry, LedgerEntry, LedgerKey, Limited, Limits, WriteXdr}; +use std::io::Cursor; +use std::path::{Path, PathBuf}; +use std::sync::Mutex; +use std::thread::JoinHandle; + +mod iter; +pub use iter::LedgerEntryChangesIterator; + +pub(crate) mod from_history_archive; +pub(crate) mod from_meta_storage; +pub(crate) mod from_rpc; + +/// Error type for LedgerEntryFetcher operations +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("cache error: {0}")] + Cache(#[from] CacheError>), + #[error("io error: {0}")] + Io(#[from] std::io::Error), + #[error("xdr error: {0}")] + Xdr(#[from] soroban_sdk::xdr::Error), + #[error("json error: {0}")] + Json(#[from] serde_json::Error), + #[error("meta storage error: {0}")] + MetaStorage(#[from] from_meta_storage::Error), + #[error("rpc error: {0}")] + Rpc(#[from] from_rpc::Error), + #[error("history archive error: {0}")] + HistoryArchive(#[from] from_history_archive::Error), +} + +/// Network configuration for fetching ledger data +/// +/// Contains URLs for SEP-54 meta storage, RPC, and history archive, +/// as well as the checkpoint frequency for the network. +#[derive(Debug, Clone)] +pub struct Network { + /// Human-readable name used to namespace caches. + /// + /// Should uniquely identify the network epoch. See [`Network::name`] for + /// how this value is made filesystem-safe. + pub name: String, + /// Network passphrase (e.g., "Public Global Stellar Network ; September 2015") + pub passphrase: String, + /// URL to the SEP-54 ledger meta storage + pub meta_url: String, + /// URL to the RPC (optional, used as optimization to skip searching meta/archive) + pub rpc_url: Option, + /// URL to the History Archive storage + pub archive_url: String, + /// Number of ledgers between checkpoints + pub archive_checkpoint_ledger_count: u32, +} + +impl Network { + /// Create a Network configuration for Stellar mainnet with default URLs + /// + /// Uses default mainnet URLs: + /// - SEP-54 meta storage: AWS public blockchain + /// - History archive: history.stellar.org + /// + /// # Arguments + /// * `rpc_url` - Optional RPC URL, used as an optimization to skip searching meta/archive + pub fn mainnet(rpc_url: Option) -> Self { + Self { + name: "mainnet".to_string(), + passphrase: "Public Global Stellar Network ; September 2015".to_string(), + meta_url: "https://aws-public-blockchain.s3.us-east-2.amazonaws.com/v1.1/stellar/ledgers/pubnet".to_string(), + rpc_url, + archive_url: "https://history.stellar.org/prd/core-live/core_live_001".to_string(), + archive_checkpoint_ledger_count: 64, + } + } + + /// Create a Network configuration for Stellar testnet with default URLs + /// + /// Uses default testnet URLs: + /// - RPC: soroban-testnet.stellar.org + /// - History archive: history.stellar.org + /// + /// # Arguments + /// * `testnet_start_date` - The reset-epoch start date, formatted + /// `YYYY-MM-DD`, identifying the testnet meta partition on the AWS public + /// dataset (e.g. `2025-12-17`). Testnet is periodically reset and the meta + /// is partitioned by epoch, so there is no stable default; the caller must + /// supply the start date for the epoch containing the ledgers under test. + pub fn testnet(testnet_start_date: String) -> Self { + Self { + name: format!("testnet-{testnet_start_date}"), + passphrase: "Test SDF Network ; September 2015".to_string(), + meta_url: format!( + "https://aws-public-blockchain.s3.us-east-2.amazonaws.com/v1.1/stellar/ledgers/testnet/{testnet_start_date}" + ), + rpc_url: Some("https://soroban-testnet.stellar.org".to_string()), + archive_url: "https://history.stellar.org/prd/core-testnet/core_testnet_001" + .to_string(), + archive_checkpoint_ledger_count: 64, + } + } + + /// Create a Network configuration for local Stellar Quickstart + /// + /// Uses default quickstart URLs: + /// - SEP-54 meta storage: localhost:8000/ledger-meta + /// - RPC: localhost:8000/rpc + /// - History archive: localhost:8000/archive + pub fn local() -> Self { + Self { + name: "local".to_string(), + passphrase: "Standalone Network ; February 2017".to_string(), + meta_url: "http://localhost:8000/ledger-meta".to_string(), + rpc_url: Some("http://localhost:8000/rpc".to_string()), + archive_url: "http://localhost:8000/archive".to_string(), + archive_checkpoint_ledger_count: 8, + } + } + + /// Returns a filesystem-safe network name for cache paths. + /// + /// Characters other than ASCII letters, digits, `-`, and `_` are removed. + /// If no characters remain, the network ID is returned instead. + pub fn name(&self) -> String { + let name: String = self + .name + .chars() + .filter(|c| c.is_ascii_alphanumeric() || matches!(*c, '-' | '_')) + .collect(); + if name.is_empty() { + self.network_id_hex() + } else { + name + } + } + + /// Returns the network ID, which is the SHA256 hash of the network passphrase. + pub fn network_id(&self) -> [u8; 32] { + Sha256::digest(self.passphrase.as_bytes()).into() + } + + /// Returns the network ID as a hex-encoded string. + pub fn network_id_hex(&self) -> String { + hex::encode(self.network_id()) + } +} + +/// Compute the bounds of the per-ledger meta search for a target ledger. +/// +/// Returns `(prev_checkpoint, ledgers_to_checkpoint)` where `prev_checkpoint` +/// is the checkpoint ledger at or below `ledger` (checkpoints fall on +/// `k * count - 1`), and `ledgers_to_checkpoint` is how many ledgers back the +/// meta search walks before falling back to the history archive. +/// +/// Saturating arithmetic is used so that ledgers in the first checkpoint +/// window (`ledger < count`), where no previous checkpoint exists, degrade to +/// a search down to ledger 0 instead of underflowing `u32` (which would panic +/// under the crate's `overflow-checks = true`). +fn checkpoint_search_bounds(ledger: u32, count: u32) -> (u32, u32) { + let prev_checkpoint = ((ledger / count) * count).saturating_sub(1); + let ledgers_to_checkpoint = ledger.saturating_sub(prev_checkpoint); + (prev_checkpoint, ledgers_to_checkpoint) +} + +/// Version of the on-disk history-result cache's format/semantics. +/// +/// This is independent of [`xdr_schema_version`]: it exists to invalidate +/// cached results when what gets *computed and stored* under a given +/// `(checkpoint, key)` changes, even though the XDR encoding of a +/// `LedgerEntry` did not. For example, adding the planned hot-archive +/// fallback (see the TODO in `fetch_from_archive_uncached`) would change the +/// meaning of a cached `None`: today it means "not found in the live +/// history-archive buckets", but once evicted entries are also consulted, a +/// stale `None` from before that change would be silently wrong. Bump this +/// constant whenever such a semantic change is made; because it is part of +/// the cache path (see [`history_result_cache_path`]), older cache entries +/// are simply orphaned under their old path rather than misread as if they +/// were produced by the new logic. +const HISTORY_RESULT_CACHE_VERSION: u32 = 1; + +/// Compute the machine-local cache path for a resolved history-archive +/// result, keyed by the history checkpoint sequence and the ledger-key hash. +/// +/// Deliberately excludes the target ledger and tx hash from the key: two +/// fetches whose search bottoms out at the same checkpoint (see +/// [`checkpoint_search_bounds`]) always resolve to the same archive result for +/// a given key, regardless of which target ledger or transaction triggered +/// the search, so keying on the checkpoint lets them share one cached result +/// instead of each re-decoding the checkpoint's buckets from scratch. +/// +/// The path is additionally namespaced by [`HISTORY_RESULT_CACHE_VERSION`] +/// and [`xdr_schema_version`], so a bump to either one changes the path +/// itself rather than requiring an in-payload version check: old cache files +/// are simply missed (and left behind, harmlessly orphaned) instead of being +/// read and silently misinterpreted. +fn history_result_cache_path( + cache_path: &Path, + checkpoint: u32, + key: &LedgerKey, +) -> Result { + let key_xdr = key.to_xdr(Limits::none())?; + let key_hash = Sha256::digest(&key_xdr); + Ok(cache_path + .join(format!( + "history-result-v{HISTORY_RESULT_CACHE_VERSION}-xdr-{}", + xdr_schema_version(), + )) + .join(format!("{checkpoint}-{key_hash:x}.json"))) +} + +/// Cache wrapper around a history-archive lookup for `key` at `checkpoint`, +/// invoking `uncached` only on a cache miss. +/// +/// Factored out of [`LedgerEntryFetcher::fetch_from_archive`] (which supplies +/// `uncached` as a closure over `self.fetch_from_archive_uncached(..)`) so the +/// caching behavior — hit/miss, `Some`/`None` round-tripping, and how a +/// failed collection is handled — can be exercised directly in tests without +/// a real `LedgerEntryFetcher` or any network access. +fn fetch_from_archive_cached( + cache_path: &Path, + checkpoint: u32, + key: &LedgerKey, + uncached: impl FnOnce() -> Result, Error>, +) -> Result, Error> { + let result_path = history_result_cache_path(cache_path, checkpoint, key)?; + let result_read = cache(result_path, |write| { + let result = uncached()?; + serde_json::to_writer_pretty(write, &result)?; + Ok(()) + })?; + Ok(serde_json::from_reader(result_read)?) +} + +fn write_usable_rpc_response( + response: &[u8], + ledger: u32, + write: &mut W, +) -> Result<(), Box> { + let usable = match parse_ledger_entry(Cursor::new(response))? { + Some((entry, _ttl, latest_ledger)) => { + entry.last_modified_ledger_seq < ledger && latest_ledger >= ledger + } + None => false, + }; + if !usable { + return Err("rpc response not usable for this ledger".into()); + } + write.write_all(response)?; + Ok(()) +} + +/// Fetcher for ledger entries that downloads ledger meta and searches for entries +pub struct LedgerEntryFetcher { + network: Network, + ledger: u32, + tx_hash: Option<[u8; 32]>, + cache_path: PathBuf, + prefetch_handle: Mutex>>, +} + +impl LedgerEntryFetcher { + /// Create a new LedgerEntryFetcher + /// + /// # Arguments + /// * `network` - Network configuration with URLs for meta storage, RPC, and history archive + /// * `ledger` - Ledger sequence number + /// * `tx_hash` - Optional transaction hash + /// * `cache_path` - Path to store cache files + pub fn new( + network: Network, + ledger: u32, + tx_hash: Option<[u8; 32]>, + cache_path: PathBuf, + ) -> Self { + Self { + network, + ledger, + tx_hash, + cache_path, + prefetch_handle: Mutex::new(None), + } + } + + /// Returns the ledger sequence number this fetcher is configured for. + pub fn ledger(&self) -> u32 { + self.ledger + } + + /// Fetch a ledger entry by key + /// + /// This method uses several layers of caching to the system cache directory to avoid refetching entries. + pub fn fetch(&self, key: &LedgerKey) -> Result, Error> { + // Serialization here is purely for logging; never let a logging failure + // change the outcome of the fetch, so use `unwrap_or_default` (which + // yields JSON null) rather than `?`. + tracing::info!(key = %serde_json::to_value(key).unwrap_or_default(), "fetch"); + let result = self.fetch_with_entry_cache(key); + if let Ok(entry) = &result { + match entry { + Some(_) => { + tracing::info!(entry = %serde_json::to_value(entry).unwrap_or_default(), "found") + } + None => tracing::info!("not found"), + } + } + result + } + + fn fetch_with_entry_cache(&self, key: &LedgerKey) -> Result, Error> { + let cache_path = &self.cache_path; + + // Compute cache file path: /--after/.json + // or /-after/.json if no tx_hash + let key_xdr = key.to_xdr(Limits::none())?; + let key_hash = Sha256::digest(&key_xdr); + let ledger_cache_dir = cache_path.join( + self.tx_hash + .map(|h| { + let tx_hash_str: String = h.iter().map(|b| format!("{b:02x}")).collect(); + format!("{}-{}-before", self.ledger, tx_hash_str) + }) + .unwrap_or_else(|| format!("{}-after", self.ledger)), + ); + + // Use cache function to handle reading/writing cache file + let fetch_read = cache( + ledger_cache_dir.join(format!("{:x}.json", key_hash)), + |write| { + // Fetch the data + let result = self.fetch_with_dl_cache(key, &cache_path)?; + + // Serialize to JSON + serde_json::to_writer_pretty(write, &result)?; + + Ok(()) + }, + )?; + + // Parse the cached result + Ok(serde_json::from_reader(fetch_read)?) + } + + fn fetch_with_dl_cache( + &self, + key: &LedgerKey, + cache_path: &Path, + ) -> Result, Error> { + // Optimization: Try RPC for contract code entries only (before prefetch) + if matches!(key, LedgerKey::ContractCode(_)) { + if let Some(result) = self.fetch_from_rpc(cache_path, self.ledger, key)? { + return Ok(result); + } + } + + // Read the SEP-54 storage layout (cached) so meta object paths are + // derived from the deployment's actual partition/batch sizes rather than + // hardcoded constants. + let (ledgers_per_batch, batches_per_partition) = self.meta_config(cache_path)?; + + // Calculate checkpoint boundaries + let checkpoint_count = self.network.archive_checkpoint_ledger_count; + let (prev_checkpoint, ledgers_to_checkpoint) = + checkpoint_search_bounds(self.ledger, checkpoint_count); + + // Prefetch all meta for ledgers from starting ledger down to the checkpoint. + let prefetch_ledgers: Vec = (0..ledgers_to_checkpoint) + .filter_map(|i| self.ledger.checked_sub(i)) + .collect(); + tracing::debug!( + count = prefetch_ledgers.len(), + first = prefetch_ledgers.first(), + last = prefetch_ledgers.last(), + "fetch from meta range" + ); + self.start_meta_prefetch( + cache_path, + prefetch_ledgers, + ledgers_per_batch, + batches_per_partition, + ); + + // Phase 1: Check the starting ledger + if let Some(result) = self.fetch_from_meta( + cache_path, + self.ledger, + key, + ledgers_per_batch, + batches_per_partition, + )? { + return Ok(result); + } + + // Optimization: Try RPC for all ledger entries + if let Some(result) = self.fetch_from_rpc(cache_path, self.ledger, key)? { + return Ok(result); + } + + // Phase 2: Search through previous ledgers down to the previous checkpoint + for ledger in (prev_checkpoint + 1..self.ledger).rev() { + if let Some(result) = self.fetch_from_meta( + cache_path, + ledger, + key, + ledgers_per_batch, + batches_per_partition, + )? { + return Ok(result); + } + } + + // Phase 3: Fetch from history archive at the previous checkpoint + self.fetch_from_archive(&cache_path, prev_checkpoint, key) + } + + fn start_meta_prefetch( + &self, + cache_path: &Path, + ledgers: Vec, + ledgers_per_batch: u32, + batches_per_partition: u32, + ) { + let mut prefetch_handle = match self.prefetch_handle.lock() { + Ok(handle) => handle, + Err(poisoned) => { + tracing::warn!("meta prefetch handle mutex was poisoned; recovering"); + poisoned.into_inner() + } + }; + if prefetch_handle.is_some() { + return; + } + + let meta_url = self.network.meta_url.clone(); + let cache_path = cache_path.to_path_buf(); + match std::thread::Builder::new() + .name("snapshot-source-prefetch-meta".to_string()) + .spawn(move || { + Self::prefetch_meta( + &meta_url, + &cache_path, + &ledgers, + ledgers_per_batch, + batches_per_partition, + ); + }) { + Ok(handle) => *prefetch_handle = Some(handle), + Err(e) => tracing::warn!(error = %e, "failed to spawn meta prefetch thread"), + } + } + + /// Fetch (and cache) the SEP-54 storage configuration, returning the + /// `(ledgers_per_batch, batches_per_partition)` used to derive meta object + /// paths. The config is small and constant for a network, so it is cached + /// like any other fetched artifact and read from disk on subsequent calls. + fn meta_config(&self, cache_path: &Path) -> Result<(u32, u32), Error> { + let read = cache(cache_path.join("meta-config.json"), |write| { + get_config(&self.network.meta_url, write) + .map_err(|e| Box::new(e) as Box) + })?; + let config = parse_config(read)?; + Ok((config.ledgers_per_batch, config.batches_per_partition)) + } + + fn prefetch_meta( + meta_url: &str, + cache_path: &Path, + ledgers: &[u32], + ledgers_per_batch: u32, + batches_per_partition: u32, + ) { + // Process in chunks of 10 to avoid too many open files + const MAX_CONCURRENT_DOWNLOADS: usize = 10; + for chunk in ledgers.chunks(MAX_CONCURRENT_DOWNLOADS) { + let handles: Vec<_> = chunk + .iter() + .map(|&l| { + let meta_url = meta_url.to_string(); + let path = cache_path.join(format!("ledger-{l}.xdr")); + std::thread::spawn(move || { + let _ = cache(path, |write| { + get_ledger( + &meta_url, + l, + ledgers_per_batch, + batches_per_partition, + write, + ) + .map_err(|e| Box::new(e) as Box) + }); + }) + }) + .collect(); + + for handle in handles { + let _ = handle.join(); + } + } + } + + fn fetch_from_meta( + &self, + cache_path: &Path, + ledger: u32, + key: &LedgerKey, + ledgers_per_batch: u32, + batches_per_partition: u32, + ) -> Result>, Error> { + tracing::debug!(ledger, "fetch from meta"); + let meta_read = cache(cache_path.join(format!("ledger-{ledger}.xdr")), |write| { + get_ledger( + &self.network.meta_url, + ledger, + ledgers_per_batch, + batches_per_partition, + write, + ) + .map_err(|e| Box::new(e) as Box) + })?; + let meta = parse_ledger(ledger, meta_read)?; + + // Only pass tx_hash for the starting ledger; for earlier ledgers, iterate fully + let tx_hash_filter = if ledger == self.ledger { + self.tx_hash + } else { + None + }; + let changes = LedgerEntryChangesIterator::new(&meta, tx_hash_filter); + for (_phase, _tx_hash, change_key, change_entry) in changes { + if &change_key == key { + if let Some(entry) = change_entry { + return Ok(Some(Some(entry))); + } else { + return Ok(Some(None)); + } + } + } + + Ok(None) + } + + fn fetch_from_rpc( + &self, + cache_path: &Path, + ledger: u32, + key: &LedgerKey, + ) -> Result>, Error> { + let Some(rpc_url) = &self.network.rpc_url else { + return Ok(None); + }; + tracing::debug!(ledger, "fetch from rpc"); + let key_xdr = key.to_xdr(Limits::none())?; + let key_hash = Sha256::digest(&key_xdr); + let rpc_cache_path = cache_path.join(format!("rpc-{ledger}-{key_hash:x}.json")); + let rpc_read = match cache(rpc_cache_path, |write| { + // Fetch the raw RPC response into memory first, so its usability can + // be checked before it is committed to the cache. + let mut buf = Vec::new(); + get_ledger_entry(rpc_url, key, &mut buf) + .map_err(|e| Box::new(e) as Box)?; + // Only trust (and therefore cache) the RPC answer when the node has + // actually observed the target ledger (latest_ledger >= ledger). If + // the node is lagging, an entry whose last_modified is below `ledger` + // might still be modified at or after `ledger` once the node catches + // up, so the response could be stale. Doing this check here, inside + // the cache collector, means a non-usable response is never written: + // `cache()` discards the temp file when the collector errors, rather + // than persisting a potentially-wrong answer that would be replayed + // on every later run (permanently disabling the RPC fast path for + // this (ledger, key) even after the node catches up). + write_usable_rpc_response(&buf, ledger, write) + }) { + Ok(rpc_read) => rpc_read, + // Not usable, not found, or a transient RPC error: fall back to the + // authoritative meta/archive search below. + Err(_) => return Ok(None), + }; + // The cached response is known-usable (only usable responses are + // persisted above), so return its entry. + if let Some((entry, _ttl, _latest_ledger)) = parse_ledger_entry(rpc_read)? { + tracing::debug!( + last_modified = entry.last_modified_ledger_seq, + "found from rpc" + ); + return Ok(Some(Some(entry))); + } + + Ok(None) + } + + /// Fetch (and cache) the history-archive result for `key` at the + /// checkpoint `ledger`. + /// + /// This is the entry point called after phases 1 and 2 (per-ledger meta + /// search) have exhausted the range down to the previous checkpoint, so + /// `ledger` here is always a checkpoint sequence, not an arbitrary target + /// ledger. The result is cached keyed by `(checkpoint, key_hash)` rather + /// than by the target ledger: fetch logic always first replays ledger-close + /// meta from the target ledger back to immediately after the previous + /// checkpoint (phases 1-2), then falls back to the immutable state + /// represented by that checkpoint (this phase). That means the resolved + /// archive result for a given key is identical for every target ledger + /// (and every transaction within it) that shares the same checkpoint. + /// Keying by the target ledger instead would prevent that reuse without + /// improving correctness, forcing every fork snapshot in a checkpoint + /// interval to re-decode the full (potentially many-GB) bucket set from + /// scratch. Both `Some(LedgerEntry)` and `None` are cached, since a miss + /// is just as expensive to determine as a hit. + fn fetch_from_archive( + &self, + cache_path: &Path, + checkpoint: u32, + key: &LedgerKey, + ) -> Result, Error> { + fetch_from_archive_cached(cache_path, checkpoint, key, || { + self.fetch_from_archive_uncached(cache_path, checkpoint, key) + }) + } + + fn fetch_from_archive_uncached( + &self, + cache_path: &Path, + ledger: u32, + key: &LedgerKey, + ) -> Result, Error> { + tracing::debug!(ledger, "fetch from archive"); + // TODO: Fetching from archives should be replaced with a historical data source supporting + // random access. But for now history archives will do, albeit slow. + let history_read = cache( + cache_path.join(format!("history-{}.json", ledger)), + |write| { + get_history(&self.network.archive_url, ledger, write) + .map_err(|e| Box::new(e) as Box) + }, + )?; + let history = parse_history(history_read)?; + let buckets = history + .current_buckets + .iter() + .flat_map(|b| [&b.curr, &b.snap]) + .filter(|b| *b != "0000000000000000000000000000000000000000000000000000000000000000"); + for bucket in buckets { + let bucket_path = cache_path.join(format!("bucket-{bucket}.xdr")); + tracing::debug!(bucket, "fetch bucket"); + let bucket_read = cache(bucket_path.clone(), |write| { + let compressed_size = get_bucket(&self.network.archive_url, bucket, write) + .map_err(|e| Box::new(e) as Box)?; + if let Some(compressed_size) = compressed_size { + tracing::debug!(bucket, compressed_size, "fetch bucket (downloaded)"); + } + Ok(()) + })?; + let size = std::fs::metadata(&bucket_path) + .map(|m| m.len()) + .unwrap_or(0); + tracing::debug!(bucket, size, "fetch bucket (decompressed)"); + let mut limited_reader = Limited::new(bucket_read, Limits::none()); + let bucket_entries_iter = parse_bucket(&mut limited_reader); + for entry_result in bucket_entries_iter { + let entry = entry_result?.0; + match entry { + BucketEntry::Liveentry(ledger_entry) | BucketEntry::Initentry(ledger_entry) => { + if ledger_entry.to_key() == *key { + return Ok(Some(ledger_entry)); + } + } + BucketEntry::Deadentry(dead_entry) => { + if dead_entry == *key { + return Ok(None); + } + } + BucketEntry::Metaentry(_) => {} + } + } + } + + // TODO: If the entry isn't found by here, and the entry is an entry + // that can be evicted to the hot archive (contract data that is persisted + // only, or contract code), then get the hot archive buckets. It is already + // expensive to download the live history archives, so we haven't + // implemented also downloading the hot archives that could be much larger + // over time. + + Ok(None) + } +} + +impl Drop for LedgerEntryFetcher { + fn drop(&mut self) { + let handle = match self.prefetch_handle.get_mut() { + Ok(handle) => handle.take(), + Err(poisoned) => { + tracing::warn!("meta prefetch handle mutex was poisoned during drop; recovering"); + poisoned.into_inner().take() + } + }; + if handle.is_some_and(|handle| handle.join().is_err()) { + tracing::warn!("meta prefetch thread panicked"); + } + } +} + +#[cfg(test)] +mod test_network { + use super::{checkpoint_search_bounds, write_usable_rpc_response, Network}; + use soroban_sdk::xdr::{Hash, LedgerEntryData, Limits, TtlEntry, WriteXdr}; + + #[test] + fn checkpoint_bounds_typical() { + // Mainnet checkpoint frequency is 64; checkpoints fall on k*64 - 1. + // For 61292152 the enclosing checkpoint is 61292096 - 1 = 61292095. + assert_eq!(checkpoint_search_bounds(61292152, 64), (61292095, 57)); + // A ledger exactly on a 64-aligned boundary. + assert_eq!(checkpoint_search_bounds(128, 64), (127, 1)); + // Local network uses a checkpoint frequency of 8. + assert_eq!(checkpoint_search_bounds(1845, 8), (1839, 6)); + } + + #[test] + fn checkpoint_bounds_first_window_does_not_underflow() { + // Ledgers below the checkpoint count have no previous checkpoint; the + // bounds must degrade to a search down to ledger 0 rather than + // panicking on u32 underflow (overflow-checks is on for this crate). + assert_eq!(checkpoint_search_bounds(10, 64), (0, 10)); + assert_eq!(checkpoint_search_bounds(63, 64), (0, 63)); + assert_eq!(checkpoint_search_bounds(0, 64), (0, 0)); + assert_eq!(checkpoint_search_bounds(7, 8), (0, 7)); + } + + // The network id is the SHA-256 of the network passphrase. These values are + // pinned because the IDs are part of Stellar's protocol-level network + // identity. + #[test] + fn network_id_hex_is_stable() { + assert_eq!( + Network::mainnet(None).network_id_hex(), + "7ac33997544e3175d266bd022439b22cdb16508c01163f26e5cb2a3e1045a979", + ); + assert_eq!( + // network_id depends only on the passphrase, so the start date here + // is irrelevant to the hash. + Network::testnet("2025-12-17".to_string()).network_id_hex(), + "cee0302d59844d32bdca915c8203dd44b33fbb7edc19051ea37abedf28ecd472", + ); + assert_eq!( + Network::local().network_id_hex(), + "baefd734b8d3e48472cff83912375fedbc7573701912fe308af730180f97d74a", + ); + } + + #[test] + fn network_id_hex_matches_network_id_bytes() { + let n = Network::mainnet(None); + assert_eq!(hex::encode(n.network_id()), n.network_id_hex()); + assert_eq!(n.network_id().len(), 32); + } + + #[test] + fn mainnet_defaults() { + let n = Network::mainnet(None); + assert_eq!(n.name, "mainnet"); + assert_eq!( + n.passphrase, + "Public Global Stellar Network ; September 2015" + ); + assert_eq!(n.rpc_url, None); + assert_eq!(n.archive_checkpoint_ledger_count, 64); + assert!(n.meta_url.starts_with("https://")); + assert!(n.archive_url.starts_with("https://history.stellar.org")); + } + + #[test] + fn mainnet_rpc_url_is_passed_through() { + let n = Network::mainnet(Some("https://example.com/rpc".to_string())); + assert_eq!(n.rpc_url.as_deref(), Some("https://example.com/rpc")); + } + + #[test] + fn name_is_filesystem_safe() { + let mut n = Network::mainnet(None); + n.name = "../my testnet: 2025/12/17".to_string(); + assert_eq!(n.name(), "mytestnet20251217"); + + n.name = "../".to_string(); + assert_eq!(n.name(), n.network_id_hex()); + } + + #[test] + fn testnet_defaults() { + let n = Network::testnet("2025-12-17".to_string()); + assert_eq!(n.name, "testnet-2025-12-17"); + assert_eq!(n.passphrase, "Test SDF Network ; September 2015"); + // The start date is appended to the AWS testnet meta partition path. + assert_eq!( + n.meta_url, + "https://aws-public-blockchain.s3.us-east-2.amazonaws.com/v1.1/stellar/ledgers/testnet/2025-12-17", + ); + assert_eq!( + n.rpc_url.as_deref(), + Some("https://soroban-testnet.stellar.org"), + ); + assert_eq!(n.archive_checkpoint_ledger_count, 64); + } + + #[test] + fn local_defaults() { + let n = Network::local(); + assert_eq!(n.name, "local"); + assert_eq!(n.passphrase, "Standalone Network ; February 2017"); + assert_eq!(n.rpc_url.as_deref(), Some("http://localhost:8000/rpc")); + assert_eq!(n.meta_url, "http://localhost:8000/ledger-meta"); + assert_eq!(n.archive_url, "http://localhost:8000/archive"); + assert_eq!(n.archive_checkpoint_ledger_count, 8); + } + + #[test] + fn lagging_rpc_response_is_rejected_before_write() { + let xdr = LedgerEntryData::Ttl(TtlEntry { + key_hash: Hash([7u8; 32]), + live_until_ledger_seq: 123, + }) + .to_xdr_base64(Limits::none()) + .unwrap(); + let lagging = format!( + r#"{{"result":{{"latestLedger":99,"entries":[{{"xdr":"{xdr}","lastModifiedLedgerSeq":42}}]}}}}"# + ); + let mut written = Vec::new(); + assert!( + write_usable_rpc_response(lagging.as_bytes(), 100, &mut written).is_err(), + "lagging RPC response must be rejected" + ); + assert!( + written.is_empty(), + "lagging RPC response must be rejected before any cache bytes are written" + ); + + let usable = lagging.replace(r#""latestLedger":99"#, r#""latestLedger":100"#); + write_usable_rpc_response(usable.as_bytes(), 100, &mut written).unwrap(); + assert_eq!(written, usable.as_bytes()); + } +} + +#[cfg(test)] +mod test_history_result_cache { + use super::{checkpoint_search_bounds, history_result_cache_path}; + use soroban_sdk::xdr::{ + AccountId, Hash, LedgerKey, LedgerKeyAccount, LedgerKeyContractCode, PublicKey, Uint256, + }; + use std::path::Path; + + fn account_key(byte: u8) -> LedgerKey { + LedgerKey::Account(LedgerKeyAccount { + account_id: AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([byte; 32]))), + }) + } + + #[test] + fn distinct_target_ledgers_in_same_checkpoint_interval_reuse_the_same_key() { + // Mainnet checkpoint frequency is 64; ledgers 61292100 and 61292152 + // both fall within the checkpoint interval enclosed by checkpoint + // 61292095 (see checkpoint_bounds_typical in test_network above). + let (checkpoint_a, _) = checkpoint_search_bounds(61292100, 64); + let (checkpoint_b, _) = checkpoint_search_bounds(61292152, 64); + assert_eq!( + checkpoint_a, checkpoint_b, + "both target ledgers should resolve to the same checkpoint" + ); + + let key = account_key(1); + let cache_path = Path::new("/cache/mainnet"); + let path_a = history_result_cache_path(cache_path, checkpoint_a, &key).unwrap(); + let path_b = history_result_cache_path(cache_path, checkpoint_b, &key).unwrap(); + assert_eq!( + path_a, path_b, + "distinct target ledgers sharing a checkpoint must reuse the same history-result cache key" + ); + } + + #[test] + fn distinct_checkpoints_do_not_collide() { + let key = account_key(1); + let cache_path = Path::new("/cache/mainnet"); + let path_a = history_result_cache_path(cache_path, 127, &key).unwrap(); + let path_b = history_result_cache_path(cache_path, 191, &key).unwrap(); + assert_ne!( + path_a, path_b, + "different checkpoints must not collide on the same cache key" + ); + } + + #[test] + fn distinct_keys_do_not_collide() { + let cache_path = Path::new("/cache/mainnet"); + let path_a = history_result_cache_path(cache_path, 127, &account_key(1)).unwrap(); + let path_b = history_result_cache_path(cache_path, 127, &account_key(2)).unwrap(); + assert_ne!( + path_a, path_b, + "different ledger keys must not collide on the same cache key" + ); + + let contract_code_key = LedgerKey::ContractCode(LedgerKeyContractCode { + hash: Hash([1u8; 32]), + }); + let path_c = history_result_cache_path(cache_path, 127, &contract_code_key).unwrap(); + assert_ne!( + path_a, path_c, + "different ledger key variants must not collide on the same cache key" + ); + } + + #[test] + fn cache_path_is_namespaced_under_the_provided_cache_dir() { + let key = account_key(1); + let mainnet_path = + history_result_cache_path(Path::new("/cache/mainnet"), 127, &key).unwrap(); + let testnet_path = + history_result_cache_path(Path::new("/cache/testnet"), 127, &key).unwrap(); + assert!(mainnet_path.starts_with("/cache/mainnet")); + assert!(testnet_path.starts_with("/cache/testnet")); + assert_ne!( + mainnet_path, testnet_path, + "cache paths under different network directories must not collide" + ); + } +} + +#[cfg(test)] +mod test_fetch_from_archive_cached { + use super::{fetch_from_archive_cached, Error}; + use soroban_sdk::xdr::{ + AccountId, Hash, LedgerEntry, LedgerEntryData, LedgerEntryExt, LedgerKey, LedgerKeyAccount, + PublicKey, TtlEntry, Uint256, + }; + use std::cell::Cell; + use std::path::{Path, PathBuf}; + use std::sync::atomic::{AtomicU32, Ordering}; + + /// A unique, self-cleaning scratch directory for a single test, so tests + /// exercising the real on-disk cache don't interfere with each other or + /// leave files behind. + struct TempDir(PathBuf); + + impl TempDir { + fn new(name: &str) -> Self { + static COUNTER: AtomicU32 = AtomicU32::new(0); + let n = COUNTER.fetch_add(1, Ordering::Relaxed); + let dir = std::env::temp_dir().join(format!( + "soroban-fetch-from-archive-cached-test-{}-{name}-{n}", + std::process::id(), + )); + std::fs::create_dir_all(&dir).unwrap(); + Self(dir) + } + + fn path(&self) -> &Path { + &self.0 + } + } + + impl Drop for TempDir { + fn drop(&mut self) { + let _ = std::fs::remove_dir_all(&self.0); + } + } + + fn account_key(byte: u8) -> LedgerKey { + LedgerKey::Account(LedgerKeyAccount { + account_id: AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([byte; 32]))), + }) + } + + /// A minimal, cheap-to-construct `LedgerEntry` for round-trip assertions. + fn entry(byte: u8) -> LedgerEntry { + LedgerEntry { + last_modified_ledger_seq: 0, + data: LedgerEntryData::Ttl(TtlEntry { + key_hash: Hash([byte; 32]), + live_until_ledger_seq: 100, + }), + ext: LedgerEntryExt::V0, + } + } + + #[test] + fn cached_some_round_trips_and_bypasses_collector_on_second_lookup() { + let dir = TempDir::new("some"); + let key = account_key(1); + let calls = Cell::new(0u32); + let want = entry(9); + + let first = fetch_from_archive_cached(dir.path(), 127, &key, || { + calls.set(calls.get() + 1); + Ok(Some(want.clone())) + }) + .unwrap(); + assert_eq!(first, Some(want.clone())); + assert_eq!(calls.get(), 1); + + let second = fetch_from_archive_cached(dir.path(), 127, &key, || { + calls.set(calls.get() + 1); + panic!("collector must not be called on a cache hit"); + }) + .unwrap(); + assert_eq!(second, Some(want)); + assert_eq!( + calls.get(), + 1, + "collector must not be invoked again once a Some(..) result is cached" + ); + } + + #[test] + fn cached_none_reuses_result_and_bypasses_collector() { + let dir = TempDir::new("none"); + let key = account_key(2); + let calls = Cell::new(0u32); + + let first = fetch_from_archive_cached(dir.path(), 127, &key, || { + calls.set(calls.get() + 1); + Ok(None) + }) + .unwrap(); + assert_eq!(first, None); + assert_eq!(calls.get(), 1); + + let second = fetch_from_archive_cached(dir.path(), 127, &key, || { + calls.set(calls.get() + 1); + panic!("collector must not be called on a cache hit for a cached None"); + }) + .unwrap(); + assert_eq!(second, None); + assert_eq!( + calls.get(), + 1, + "a cached None must be reused without recomputation, just like a cached Some" + ); + } + + #[test] + fn collector_error_does_not_poison_cache_and_a_later_retry_can_succeed() { + let dir = TempDir::new("err"); + let key = account_key(3); + let want = entry(4); + + let failed = fetch_from_archive_cached(dir.path(), 127, &key, || { + Err(Error::Io(std::io::Error::other("boom"))) + }); + assert!(failed.is_err(), "a collector error must propagate"); + + // The failed attempt above must not have left behind a partial or + // poisoned cache entry: a later, successful collection for the same + // (checkpoint, key) must be free to run and its result must be + // returned (and itself cached) normally. + let retried = + fetch_from_archive_cached(dir.path(), 127, &key, || Ok(Some(want.clone()))).unwrap(); + assert_eq!(retried, Some(want.clone())); + + // And that successful result is now the one that's cached. + let cached = fetch_from_archive_cached(dir.path(), 127, &key, || { + panic!("collector must not be called once a successful result is cached"); + }) + .unwrap(); + assert_eq!(cached, Some(want)); + } + + #[test] + fn same_checkpoint_and_key_share_one_cache_entry() { + let dir = TempDir::new("share"); + let key = account_key(5); + let calls = Cell::new(0u32); + let want = entry(6); + + // Simulates two different target ledgers whose search both bottom + // out at checkpoint 200 for the same key: the second call must reuse + // the first call's cached result rather than recomputing it. + let a = fetch_from_archive_cached(dir.path(), 200, &key, || { + calls.set(calls.get() + 1); + Ok(Some(want.clone())) + }) + .unwrap(); + let b = fetch_from_archive_cached(dir.path(), 200, &key, || { + calls.set(calls.get() + 1); + panic!("second lookup for the same checkpoint/key must hit the cache"); + }) + .unwrap(); + + assert_eq!(a, Some(want.clone())); + assert_eq!(b, Some(want)); + assert_eq!(calls.get(), 1); + } + + #[test] + fn different_checkpoints_or_keys_do_not_share_cache_entries() { + let dir = TempDir::new("no-collide"); + let calls = Cell::new(0u32); + let entry_a = entry(7); + let entry_b = entry(8); + let entry_c = entry(9); + let key = account_key(6); + + let by_checkpoint_a = fetch_from_archive_cached(dir.path(), 300, &key, || { + calls.set(calls.get() + 1); + Ok(Some(entry_a.clone())) + }) + .unwrap(); + let by_checkpoint_b = fetch_from_archive_cached(dir.path(), 301, &key, || { + calls.set(calls.get() + 1); + Ok(Some(entry_b.clone())) + }) + .unwrap(); + let by_key = fetch_from_archive_cached(dir.path(), 300, &account_key(7), || { + calls.set(calls.get() + 1); + Ok(Some(entry_c.clone())) + }) + .unwrap(); + + assert_eq!(by_checkpoint_a, Some(entry_a)); + assert_eq!(by_checkpoint_b, Some(entry_b)); + assert_eq!(by_key, Some(entry_c)); + assert_eq!( + calls.get(), + 3, + "different checkpoints and different keys must each get their own cache entry" + ); + } +} diff --git a/soroban-ledger-snapshot-source-tx/src/lib.rs b/soroban-ledger-snapshot-source-tx/src/lib.rs new file mode 100644 index 000000000..37ce3c9ed --- /dev/null +++ b/soroban-ledger-snapshot-source-tx/src/lib.rs @@ -0,0 +1,284 @@ +mod cache; +mod fetch; + +use cache::cache; +use cargo_metadata::MetadataCommand; +use directories::ProjectDirs; +use fetch::LedgerEntryFetcher; +pub use fetch::Network; +use sha2::{Digest, Sha256}; +use soroban_sdk::testutils::SnapshotSourceInput; +use soroban_sdk::testutils::{HostError, SnapshotSource}; +use soroban_sdk::xdr::{LedgerEntry, LedgerKey, Limits, WriteXdr}; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use std::sync::{Once, OnceLock}; + +static TRACING_INIT: Once = Once::new(); +static WORKSPACE_ROOT: OnceLock = OnceLock::new(); + +/// Initialize tracing subscriber if RUST_LOG environment variable is set. +/// This is called automatically when creating a TxSnapshotSource. +fn init_tracing() { + TRACING_INIT.call_once(|| { + if std::env::var("RUST_LOG").is_ok() { + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .with_writer(std::io::stderr) + .fmt_fields(tracing_subscriber::fmt::format::PrettyFields::new()) + .init(); + } + }); +} + +/// The stellar-xdr schema version that cached fixtures are serialized against. +/// +/// Committed snapshot fixtures store ledger entries using stellar-xdr's serde +/// JSON representation. If that representation ever changes (a field rename, +/// add/remove, or enum-variant shift), fixtures produced by an older schema +/// would silently deserialize into wrong data — or panic — with no indication +/// of why. Embedding this fingerprint and rejecting mismatches turns that into +/// a clear, actionable failure instead. +/// +/// Also reused by the machine-local history-result cache in the `fetch` +/// module, so both caches invalidate together on an XDR schema change. +pub(crate) fn xdr_schema_version() -> &'static str { + stellar_xdr::VERSION.xdr +} + +/// On-disk wrapper for a cached ledger-entry fixture, tagging the serialized +/// entry with the XDR schema version it was produced with. +#[derive(serde::Serialize, serde::Deserialize)] +struct CachedEntry { + /// stellar-xdr schema version (see [`xdr_schema_version`]). + xdr_schema_version: String, + /// The cached ledger entry, or `None` if the entry was absent/removed. + entry: Option, +} + +fn cache_paths( + workspace_root: &Path, + system_cache_root: &Path, + network: &Network, +) -> (PathBuf, PathBuf) { + let network_name = network.name(); + ( + workspace_root + .join("tests-snapshot-source") + .join(&network_name), + system_cache_root + .join("snapshot-source-tx") + .join(network_name), + ) +} + +/// Snapshot source that downloads ledger meta and searches for ledger entries +/// based on a specific transaction context. +pub struct TxSnapshotSource { + fetcher: LedgerEntryFetcher, + tx_hash: Option<[u8; 32]>, + cache_path: PathBuf, +} + +impl TxSnapshotSource { + /// Create a new TxSnapshotSource + /// + /// The cache path is automatically computed as + /// `/tests-snapshot-source/` + /// using cargo metadata to find the workspace root. + /// + /// # Arguments + /// * `network` - Network configuration with URLs for meta storage, RPC, and history archive + /// * `ledger` - Ledger sequence number + /// * `tx_hash` - Optional transaction hash + /// + /// # Panics + /// Panics if the workspace root cannot be determined via cargo metadata. + pub fn new(network: Network, ledger: u32, tx_hash: Option<[u8; 32]>) -> Self { + init_tracing(); + let workspace_root = WORKSPACE_ROOT.get_or_init(|| { + MetadataCommand::new() + .exec() + .expect("failed to get cargo metadata") + .workspace_root + .into() + }); + let project_dirs = ProjectDirs::from("org", "stellar", "soroban-sdk") + .expect("failed to get project directories") + .cache_dir() + .to_path_buf(); + let (cache_path, fetcher_cache_path) = cache_paths(workspace_root, &project_dirs, &network); + Self { + fetcher: LedgerEntryFetcher::new(network, ledger, tx_hash, fetcher_cache_path), + tx_hash, + cache_path, + } + } + + /// Fetch a ledger entry, using workspace-level caching + fn fetch(&self, key: &LedgerKey) -> Option { + // Compute cache file path: ///.json + let key_xdr = key.to_xdr(Limits::none()).expect("failed to encode key"); + let key_hash = Sha256::digest(&key_xdr); + let ledger_cache_dir = self.cache_path.join( + self.tx_hash + .map(|h| { + let tx_hash_str: String = h.iter().map(|b| format!("{b:02x}")).collect(); + format!("{}-{}-before", self.fetcher.ledger(), tx_hash_str) + }) + .unwrap_or_else(|| format!("{}-after", self.fetcher.ledger())), + ); + + // Use cache function to handle reading/writing cache file + let fetch_read = cache( + ledger_cache_dir.join(format!("{:x}.json", key_hash)), + |write| -> Result<(), Box> { + // Fetch the data from the underlying fetcher + let entry = self.fetcher.fetch(key)?; + + // Serialize to JSON, tagged with the XDR schema version. + let cached = CachedEntry { + xdr_schema_version: xdr_schema_version().to_string(), + entry, + }; + serde_json::to_writer_pretty(write, &cached)?; + + Ok(()) + }, + ) + .expect("failed to cache entry"); + + // Parse the cached result, rejecting fixtures produced by a different + // XDR schema (which would otherwise deserialize into wrong data). + let cached: CachedEntry = + serde_json::from_reader(fetch_read).expect("failed to parse cached entry"); + assert_eq!( + cached.xdr_schema_version, + xdr_schema_version(), + "cached snapshot {:x}.json was produced with stellar-xdr schema {} \ + but this build uses {}; delete the tests-snapshot-source directory \ + and re-run to regenerate the fixtures", + key_hash, + cached.xdr_schema_version, + xdr_schema_version(), + ); + cached.entry + } +} + +impl From for SnapshotSourceInput { + fn from(source: TxSnapshotSource) -> Self { + Self { + source: Rc::new(source), + ledger_info: None, + snapshot: None, + } + } +} + +impl SnapshotSource for TxSnapshotSource { + fn get( + &self, + key: &Rc, + ) -> Result, Option)>, HostError> { + Ok(self.fetch(key).map(|e| (Rc::new(e), ttl_for_key(key)))) + } +} + +/// Returns a TTL to use for a ledger entry in tests based on its key type. +/// +/// Contract code and contract data entries get `u32::MAX` TTL (effectively +/// never expire), while other entry types get `None` because they do not +/// support TTLs. +fn ttl_for_key(key: &LedgerKey) -> Option { + match key { + LedgerKey::ContractCode(_) | LedgerKey::ContractData(_) => Some(u32::MAX), + _ => None, + } +} + +#[cfg(test)] +mod test_ttl { + use super::{cache_paths, ttl_for_key, Network}; + use soroban_sdk::xdr::{ + AccountId, ContractDataDurability, ContractId, Hash, LedgerKey, LedgerKeyAccount, + LedgerKeyContractCode, LedgerKeyContractData, LedgerKeyTtl, PublicKey, ScAddress, ScVal, + Uint256, + }; + + #[test] + fn contract_code_and_data_get_max_ttl() { + let code = LedgerKey::ContractCode(LedgerKeyContractCode { + hash: Hash([0u8; 32]), + }); + assert_eq!(ttl_for_key(&code), Some(u32::MAX)); + + let data = LedgerKey::ContractData(LedgerKeyContractData { + contract: ScAddress::Contract(ContractId(Hash([0u8; 32]))), + key: ScVal::I32(0), + durability: ContractDataDurability::Persistent, + }); + assert_eq!(ttl_for_key(&data), Some(u32::MAX)); + } + + #[test] + fn non_contract_keys_have_no_ttl() { + let account = LedgerKey::Account(LedgerKeyAccount { + account_id: AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([0u8; 32]))), + }); + assert_eq!(ttl_for_key(&account), None); + + let ttl = LedgerKey::Ttl(LedgerKeyTtl { + key_hash: Hash([0u8; 32]), + }); + assert_eq!(ttl_for_key(&ttl), None); + } + + #[test] + fn cache_paths_are_namespaced_by_network_name() { + let workspace = std::path::Path::new("/workspace"); + let system_cache = std::path::Path::new("/cache"); + let mainnet = Network::mainnet(None); + let testnet = Network::testnet("2025-12-17".to_string()); + + let mainnet_paths = cache_paths(workspace, system_cache, &mainnet); + let testnet_paths = cache_paths(workspace, system_cache, &testnet); + + assert_ne!(mainnet_paths, testnet_paths); + assert_eq!( + mainnet_paths.0, + workspace.join("tests-snapshot-source/mainnet") + ); + assert_eq!( + mainnet_paths.1, + system_cache.join("snapshot-source-tx/mainnet") + ); + assert_eq!( + testnet_paths.0, + workspace.join("tests-snapshot-source/testnet-2025-12-17") + ); + assert_eq!( + testnet_paths.1, + system_cache.join("snapshot-source-tx/testnet-2025-12-17") + ); + } + + #[test] + fn cache_paths_use_safe_network_name() { + let mut network = Network::mainnet(None); + network.name = "../my mainnet!".to_string(); + let paths = cache_paths( + std::path::Path::new("/workspace"), + std::path::Path::new("/cache"), + &network, + ); + assert_eq!( + paths.0, + std::path::Path::new("/workspace/tests-snapshot-source/mymainnet") + ); + assert_eq!( + paths.1, + std::path::Path::new("/cache/snapshot-source-tx/mymainnet") + ); + } +} diff --git a/tests-expanded/test_fork_tests.rs b/tests-expanded/test_fork_tests.rs new file mode 100644 index 000000000..19f6ca9ae --- /dev/null +++ b/tests-expanded/test_fork_tests.rs @@ -0,0 +1,1669 @@ +#![feature(prelude_import)] +#![no_std] +#[macro_use] +extern crate core; +#[prelude_import] +use core::prelude::rust_2021::*; +use soroban_sdk::contract; +pub struct Contract; +///ContractArgs is a type for building arg lists for functions defined in "Contract". +pub struct ContractArgs; +///ContractClient is a client for calling the contract defined in "Contract". +pub struct ContractClient<'a> { + pub env: soroban_sdk::Env, + pub address: soroban_sdk::Address, + #[doc(hidden)] + set_auths: Option<&'a [soroban_sdk::xdr::SorobanAuthorizationEntry]>, + #[doc(hidden)] + mock_auths: Option<&'a [soroban_sdk::testutils::MockAuth<'a>]>, + #[doc(hidden)] + mock_all_auths: bool, + #[doc(hidden)] + allow_non_root_auth: bool, +} +impl<'a> ContractClient<'a> { + pub fn new(env: &soroban_sdk::Env, address: &soroban_sdk::Address) -> Self { + Self { + env: env.clone(), + address: address.clone(), + set_auths: None, + mock_auths: None, + mock_all_auths: false, + allow_non_root_auth: false, + } + } + /// Set authorizations in the environment which will be consumed by + /// contracts when they invoke `Address::require_auth` or + /// `Address::require_auth_for_args` functions. + /// + /// Requires valid signatures for the authorization to be successful. + /// To mock auth without requiring valid signatures, use `mock_auths`. + /// + /// See `soroban_sdk::Env::set_auths` for more details and examples. + pub fn set_auths(&self, auths: &'a [soroban_sdk::xdr::SorobanAuthorizationEntry]) -> Self { + Self { + env: self.env.clone(), + address: self.address.clone(), + set_auths: Some(auths), + mock_auths: self.mock_auths.clone(), + mock_all_auths: false, + allow_non_root_auth: false, + } + } + /// Mock authorizations in the environment which will cause matching invokes + /// of `Address::require_auth` and `Address::require_auth_for_args` to + /// pass. + /// + /// See `soroban_sdk::Env::set_auths` for more details and examples. + pub fn mock_auths(&self, mock_auths: &'a [soroban_sdk::testutils::MockAuth<'a>]) -> Self { + Self { + env: self.env.clone(), + address: self.address.clone(), + set_auths: self.set_auths.clone(), + mock_auths: Some(mock_auths), + mock_all_auths: false, + allow_non_root_auth: false, + } + } + /// Mock all calls to the `Address::require_auth` and + /// `Address::require_auth_for_args` functions in invoked contracts, + /// having them succeed as if authorization was provided. + /// + /// See `soroban_sdk::Env::mock_all_auths` for more details and + /// examples. + pub fn mock_all_auths(&self) -> Self { + Self { + env: self.env.clone(), + address: self.address.clone(), + set_auths: None, + mock_auths: None, + mock_all_auths: true, + allow_non_root_auth: false, + } + } + /// A version of `mock_all_auths` that allows authorizations that + /// are not present in the root invocation. + /// + /// Refer to `mock_all_auths` documentation for details and + /// prefer using `mock_all_auths` unless non-root authorization is + /// required. + /// + /// See `soroban_sdk::Env::mock_all_auths_allowing_non_root_auth` + /// for more details and examples. + pub fn mock_all_auths_allowing_non_root_auth(&self) -> Self { + Self { + env: self.env.clone(), + address: self.address.clone(), + set_auths: None, + mock_auths: None, + mock_all_auths: true, + allow_non_root_auth: true, + } + } +} +mod __contract_fn_set_registry { + use super::*; + extern crate std; + use std::collections::BTreeMap; + use std::sync::Mutex; + pub type F = soroban_sdk::testutils::ContractFunctionF; + static FUNCS: Mutex> = Mutex::new(BTreeMap::new()); + pub fn register(name: &'static str, func: &'static F) { + FUNCS.lock().unwrap().insert(name, func); + } + pub fn call( + name: &str, + env: soroban_sdk::Env, + args: &[soroban_sdk::Val], + ) -> Option { + let fopt: Option<&'static F> = FUNCS.lock().unwrap().get(name).map(|f| f.clone()); + fopt.map(|f| f(env, args)) + } +} +impl soroban_sdk::testutils::ContractFunctionRegister for Contract { + fn register(name: &'static str, func: &'static __contract_fn_set_registry::F) { + __contract_fn_set_registry::register(name, func); + } +} +#[doc(hidden)] +impl soroban_sdk::testutils::ContractFunctionSet for Contract { + fn call( + &self, + func: &str, + env: soroban_sdk::Env, + args: &[soroban_sdk::Val], + ) -> Option { + __contract_fn_set_registry::call(func, env, args) + } +} +mod example { + extern crate std; + use bytes_lit::bytes; + use soroban_ledger_snapshot_source_tx::Network; + use soroban_ledger_snapshot_source_tx::TxSnapshotSource; + use soroban_sdk::{token::TokenClient, Address, Env}; + extern crate test; + #[rustc_test_marker = "example::test"] + #[doc(hidden)] + pub const test: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("example::test"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/fork/src/lib.rs", + start_line: 16usize, + start_col: 8usize, + end_line: 16usize, + end_col: 12usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::UnitTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(test()), + ), + }; + fn test() { + const NATIVE_ADDRESS: &str = "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA"; + let source = TxSnapshotSource::new( + Network::mainnet(None), + 61340000, + Some([ + 32u8, 26u8, 30u8, 156u8, 208u8, 212u8, 142u8, 213u8, 231u8, 250u8, 204u8, 118u8, + 66u8, 120u8, 90u8, 6u8, 33u8, 247u8, 90u8, 80u8, 194u8, 200u8, 252u8, 6u8, 209u8, + 233u8, 54u8, 168u8, 43u8, 100u8, 35u8, 18u8, + ]), + ); + let env = Env::from_ledger_snapshot(source); + let contract = Address::from_str(&env, NATIVE_ADDRESS); + let client = TokenClient::new(&env, &contract); + let addr = Address::from_str( + &env, + "GCO45COWIBDZEGJ3DRGDGCCCJXK777F2S6D6HXQKXVB3EKQVCQU7B2WA", + ); + let bal = client.balance(&addr); + match (&bal, &827726773) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + } +} +mod mainnet { + extern crate std; + use soroban_ledger_snapshot_source_tx::Network; + use soroban_ledger_snapshot_source_tx::TxSnapshotSource; + use soroban_sdk::{token::TokenClient, Address, Env}; + #[rustfmt::skip] + fn test() { + match (&test_internal(61292151, None), &28640019212) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292152, + Some( + hex_hash( + "2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9", + ), + ), + ), + &28640019112, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292153, + Some( + hex_hash( + "93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566", + ), + ), + ), + &26640019125, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292155, + Some( + hex_hash( + "2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb", + ), + ), + ), + &24640019136, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292156, + Some( + hex_hash( + "32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3", + ), + ), + ), + &24634416302, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292157, + Some( + hex_hash( + "fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52", + ), + ), + ), + &24134416305, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292159, + Some( + hex_hash( + "a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d", + ), + ), + ), + &24128733912, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292161, + Some( + hex_hash( + "1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623", + ), + ), + ), + &24121908843, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292163, + Some( + hex_hash( + "fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d", + ), + ), + ), + &24114311687, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292165, + Some( + hex_hash( + "b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb", + ), + ), + ), + &24112182156, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292168, + Some( + hex_hash( + "4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463", + ), + ), + ), + &24110475788, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292169, + Some( + hex_hash( + "94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34", + ), + ), + ), + &24079646158, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292170, + Some( + hex_hash( + "777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac", + ), + ), + ), + &24072910038, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292171, + Some( + hex_hash( + "8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77", + ), + ), + ), + &21572910052, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292171, + Some( + hex_hash( + "b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f", + ), + ), + ), + &22072910049, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292173, + Some( + hex_hash( + "9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021", + ), + ), + ), + &21571672284, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292173, + Some( + hex_hash( + "20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f", + ), + ), + ), + &21569563764, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292174, + Some( + hex_hash( + "d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231", + ), + ), + ), + &21069563767, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292175, + Some( + hex_hash( + "388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685", + ), + ), + ), + &20713716699, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292175, + Some( + hex_hash( + "27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6", + ), + ), + ), + &21066642483, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292176, + Some( + hex_hash( + "d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a", + ), + ), + ), + &20712900251, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292177, + Some( + hex_hash( + "1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6", + ), + ), + ), + &20673806969, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292177, + Some( + hex_hash( + "e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a", + ), + ), + ), + &20677374810, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292178, + Some( + hex_hash( + "a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5", + ), + ), + ), + &20668813924, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292179, + Some( + hex_hash( + "aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7", + ), + ), + ), + &20668456579, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292179, + Some( + hex_hash( + "bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04", + ), + ), + ), + &20667200123, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292180, + Some( + hex_hash( + "de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2", + ), + ), + ), + &20667164303, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292181, + Some( + hex_hash( + "2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97", + ), + ), + ), + &20447168649, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292181, + Some( + hex_hash( + "86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776", + ), + ), + ), + &20442139665, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292181, + Some( + hex_hash( + "afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9", + ), + ), + ), + &20667160725, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292181, + Some( + hex_hash( + "13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245", + ), + ), + ), + &20416854956, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292182, + Some( + hex_hash( + "8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c", + ), + ), + ), + &20416854592, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292182, + Some( + hex_hash( + "d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963", + ), + ), + ), + &20416854592, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292183, + Some( + hex_hash( + "dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863", + ), + ), + ), + &20414752362, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292184, + Some( + hex_hash( + "8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1", + ), + ), + ), + &20414752362, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292184, + Some( + hex_hash( + "edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415", + ), + ), + ), + &19172679311, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292185, + Some( + hex_hash( + "54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1", + ), + ), + ), + &19172679311, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292186, + Some( + hex_hash( + "93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721", + ), + ), + ), + &19163487111, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292187, + Some( + hex_hash( + "59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d", + ), + ), + ), + &19163487111, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292188, + Some( + hex_hash( + "9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3", + ), + ), + ), + &19154858911, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292189, + Some( + hex_hash( + "b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e", + ), + ), + ), + &19152544114, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292189, + Some( + hex_hash( + "5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908", + ), + ), + ), + &19154858911, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292191, + Some( + hex_hash( + "d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b", + ), + ), + ), + &19152544114, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292197, + Some( + hex_hash( + "1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64", + ), + ), + ), + &18710779602, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292204, + Some( + hex_hash( + "7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1", + ), + ), + ), + &18665585699, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292208, + Some( + hex_hash( + "1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9", + ), + ), + ), + &18665085382, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292212, + Some( + hex_hash( + "25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722", + ), + ), + ), + &18663714838, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292214, + Some( + hex_hash( + "d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff", + ), + ), + ), + &18662250331, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292214, + Some( + hex_hash( + "8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b", + ), + ), + ), + &18661077898, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292220, + Some( + hex_hash( + "45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3", + ), + ), + ), + &18660765200, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292220, + Some( + hex_hash( + "12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4", + ), + ), + ), + &18649217174, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292222, + Some( + hex_hash( + "8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496", + ), + ), + ), + &18648151686, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292225, + Some( + hex_hash( + "7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288", + ), + ), + ), + &18645351502, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292227, + Some( + hex_hash( + "e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708", + ), + ), + ), + &18642134811, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + match ( + &test_internal( + 61292232, + Some( + hex_hash( + "221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b", + ), + ), + ), + &18640441226, + ) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + } + fn hex_hash(s: &str) -> [u8; 32] { + hex::decode(s).unwrap().try_into().unwrap() + } + #[rustfmt::skip] + fn test_internal(ledger: u32, tx: Option<[u8; 32]>) -> i128 { + use std::time::Instant; + let t0 = Instant::now(); + let s = TxSnapshotSource::new(Network::mainnet(None), ledger, tx); + let e = Env::from_ledger_snapshot(s); + let contract = Address::from_str( + &e, + "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + ); + let client = TokenClient::new(&e, &contract); + let addr = Address::from_str( + &e, + "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + ); + let res = client.balance(&addr); + let t1 = Instant::now(); + { + ::std::io::_print( + format_args!( + "\u{1b}[32m{2} {0} bal = {3} (t={1:?})\u{1b}[0m\n", + tx.map(|t| hex::encode(t)).unwrap_or_default(), + t1 - t0, + ledger, + res, + ), + ); + }; + res + } + #[rustfmt::skip] + mod tests { + use super::test; + extern crate test; + #[rustc_test_marker = "mainnet::tests::test_1"] + #[doc(hidden)] + pub const test_1: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("mainnet::tests::test_1"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/fork/src/lib.rs", + start_line: 142usize, + start_col: 20usize, + end_line: 142usize, + end_col: 26usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::UnitTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(test_1()), + ), + }; + fn test_1() { + test() + } + } +} +/// Forks a local stellar/quickstart network, reading state from the ledger +/// meta store and the history archive it runs. +/// +/// The transactions forked from are submitted by `quickstart-setup.sh`, which +/// writes a fixture describing them that this test reads the path of from +/// `TEST_FORK_QUICKSTART_FIXTURE`. See that script for how to run the test. +mod quickstart { + extern crate std; + use soroban_ledger_snapshot_source_tx::{Network, TxSnapshotSource}; + use soroban_sdk::{testutils::EnvTestConfig, token::TokenClient, Address, Env}; + use std::{env, fs}; + /// The quickstart network, with the RPC disabled so that entries are only + /// ever found in the ledger meta store or the history archive. A working + /// RPC would otherwise be able to answer lookups that a broken meta store + /// or history archive should fail. + fn network() -> Network { + Network { + rpc_url: None, + ..Network::local() + } + } + /// The balance of the fixture's target address, as of `ledger`, and just + /// before `tx` if given. + fn balance_at(sac: &str, target: &str, ledger: u32, tx: Option<[u8; 32]>) -> i128 { + let source = TxSnapshotSource::new(network(), ledger, tx); + let mut env = Env::from_ledger_snapshot(source); + env.set_config(EnvTestConfig { + capture_snapshot_at_drop: false, + }); + let client = TokenClient::new(&env, &Address::from_str(&env, sac)); + client.balance(&Address::from_str(&env, target)) + } + fn tx_hash(s: &str) -> [u8; 32] { + hex::decode(s).unwrap().try_into().unwrap() + } + extern crate test; + #[rustc_test_marker = "quickstart::test"] + #[doc(hidden)] + pub const test: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("quickstart::test"), + ignore: true, + ignore_message: ::core::option::Option::Some( + "requires a local stellar/quickstart network, see quickstart-setup.sh", + ), + source_file: "tests/fork/src/lib.rs", + start_line: 190usize, + start_col: 8usize, + end_line: 190usize, + end_col: 12usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::UnitTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(test()), + ), + }; + #[ignore = "requires a local stellar/quickstart network, see quickstart-setup.sh"] + fn test() { + let path = env::var("TEST_FORK_QUICKSTART_FIXTURE") + .expect( + "TEST_FORK_QUICKSTART_FIXTURE must be set to the path of a fixture written by quickstart-setup.sh", + ); + let fixture: serde_json::Value = + serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); + let sac = fixture["sac"].as_str().unwrap(); + let target = fixture["target"].as_str().unwrap(); + let transfers = fixture["transfers"].as_array().unwrap(); + let mut expected: i128 = 0; + for transfer in transfers { + let ledger = transfer["ledger"].as_u64().unwrap() as u32; + let tx = tx_hash(transfer["tx"].as_str().unwrap()); + { + ::std::io::_print(format_args!( + "balance before tx {0} in ledger {1}\n", + transfer["tx"], ledger, + )); + }; + match (&balance_at(sac, target, ledger, Some(tx)), &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + expected += transfer["amount"].as_i64().unwrap() as i128; + { + ::std::io::_print(format_args!("balance at end of ledger {0}\n", ledger)); + }; + match (&balance_at(sac, target, ledger, None), &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + let archive_ledger = transfer["archive_ledger"].as_u64().unwrap() as u32; + { + ::std::io::_print(format_args!( + "balance at ledger {0}, from the history archive\n", + archive_ledger, + )); + }; + match (&balance_at(sac, target, archive_ledger, None), &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::None, + ); + } + } + }; + } + } +} +#[rustc_main] +#[coverage(off)] +#[doc(hidden)] +pub fn main() -> () { + extern crate test; + test::test_main_static(&[&test, &test_1, &test]) +} diff --git a/tests-expanded/test_fork_wasm32v1-none.rs b/tests-expanded/test_fork_wasm32v1-none.rs new file mode 100644 index 000000000..f77b0f7cf --- /dev/null +++ b/tests-expanded/test_fork_wasm32v1-none.rs @@ -0,0 +1,26 @@ +#![feature(prelude_import)] +#![no_std] +#[macro_use] +extern crate core; +#[prelude_import] +use core::prelude::rust_2021::*; +use soroban_sdk::contract; +pub struct Contract; +///ContractArgs is a type for building arg lists for functions defined in "Contract". +pub struct ContractArgs; +///ContractClient is a client for calling the contract defined in "Contract". +pub struct ContractClient<'a> { + pub env: soroban_sdk::Env, + pub address: soroban_sdk::Address, + #[doc(hidden)] + _phantom: core::marker::PhantomData<&'a ()>, +} +impl<'a> ContractClient<'a> { + pub fn new(env: &soroban_sdk::Env, address: &soroban_sdk::Address) -> Self { + Self { + env: env.clone(), + address: address.clone(), + _phantom: core::marker::PhantomData, + } + } +} diff --git a/tests-snapshot-source/mainnet/61292151-after/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292151-after/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292151-after/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292151-after/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292151-after/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..9e0f3209f --- /dev/null +++ b/tests-snapshot-source/mainnet/61292151-after/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292135, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "28640019212", + "seq_num": "233832081317167158", + "num_sub_entries": 49, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "0" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 55395889, + "seq_time": "1737571986" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..e37b80af6 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292152-2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292152, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "28640019112", + "seq_num": "233832081317167158", + "num_sub_entries": 49, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "0" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 55395889, + "seq_time": "1737571986" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..8dc2c002b --- /dev/null +++ b/tests-snapshot-source/mainnet/61292153-93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292152, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "26640019125", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "7999663396" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..0d64a67ce --- /dev/null +++ b/tests-snapshot-source/mainnet/61292155-2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292153, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24640019136", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5999663405" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..56a29d735 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292156-32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292155, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24634416302", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5994060570" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..24b4c0d99 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292157-fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292156, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24134416305", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5494060573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..25d79ed6f --- /dev/null +++ b/tests-snapshot-source/mainnet/61292159-a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292157, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24128733912", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5488378176" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..164c5aab1 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292161-1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292159, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24121908843", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5481553105" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..41f9d13d0 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292163-fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292161, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24114311687", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5473955945" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..51d4204a3 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292165-b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292163, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24112182156", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5471826409" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..92c51d929 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292168-4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292165, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24110475788", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5470120035" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..4a43dbd91 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292169-94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292168, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24079646158", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5439290404" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..68246bace --- /dev/null +++ b/tests-snapshot-source/mainnet/61292170-777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292169, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24072910038", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5432554281" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..8dcc0bfa0 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292171-8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292171, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21572910052", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2932554293" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..e31ef490a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292171-b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292170, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "22072910049", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "3432554291" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..a6b059927 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292173-20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292173, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21569563764", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2929207991" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..fad907512 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292173-9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292171, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21571672284", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2931316518" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..e73116735 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292174-d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292173, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21069563767", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2429207994" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..be10515e4 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292175-27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292174, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21066642483", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2426286709" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..fe17d37f8 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292175-388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292175, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20713716699", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2073360924" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..647bdd62a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292176-d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292175, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20712900251", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2072544473" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..2282b0bf0 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292177-1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292177, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20673806969", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2033451190" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..c5b4b180a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292177-e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292176, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20677374810", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2037019031" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..24e72417a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292178-a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292177, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20668813924", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2028458141" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..fb370171e --- /dev/null +++ b/tests-snapshot-source/mainnet/61292179-aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292178, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20668456579", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2028100796" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..f1109ece3 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292179-bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292179, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667200123", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026844338" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..6f5271f70 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292180-de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292179, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667164303", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026808517" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..0f6ac8c25 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854956", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776499168" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..7274d56dd --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20447168649", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1806812862" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..aa6609f97 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20442139665", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1801783877" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..22d47acf9 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292181-afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292180, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667160725", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026804939" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..aa7c41b0a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292182-8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292182, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854592", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776498804" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..33108942a --- /dev/null +++ b/tests-snapshot-source/mainnet/61292182-d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854592", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776498804" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..138a4fea0 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292183-dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292182, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20414752362", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1774396573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..627e323e8 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292184-8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292183, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20414752362", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1774396573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..0b03f5c63 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292184-edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292184, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19172679311", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "532323521" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..0b03f5c63 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292185-54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292184, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19172679311", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "532323521" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..ede8d3dbd --- /dev/null +++ b/tests-snapshot-source/mainnet/61292186-93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292185, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19163487111", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "523131321" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..a5df2e53e --- /dev/null +++ b/tests-snapshot-source/mainnet/61292187-59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292186, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19163487111", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "523131321" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..205565c56 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292188-9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292187, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19154858911", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "514503114" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..c46f0eca6 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292189-5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292188, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19154858911", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "514503114" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..086ee80ac --- /dev/null +++ b/tests-snapshot-source/mainnet/61292189-b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292189, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19152544114", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "512188312" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..086ee80ac --- /dev/null +++ b/tests-snapshot-source/mainnet/61292191-d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292189, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19152544114", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "512188312" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..bd6b33f5d --- /dev/null +++ b/tests-snapshot-source/mainnet/61292197-1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292191, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18710779602", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "70423799" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..8ed7a584d --- /dev/null +++ b/tests-snapshot-source/mainnet/61292204-7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292197, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18665585699", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "25229896" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..06630ffbe --- /dev/null +++ b/tests-snapshot-source/mainnet/61292208-1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292204, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18665085382", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "24729578" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..db1667a11 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292212-25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292208, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18663714838", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "23359034" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..215a8c1c5 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292214-8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292214, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18661077898", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "20722086" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..53d0160e7 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292214-d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292212, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18662250331", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "21894525" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..f35e15e83 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292220-12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292220, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18649217174", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "8861362" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..85ff736b9 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292220-45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292214, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18660765200", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "20409388" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..ecc70cbc3 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292222-8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292220, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18648151686", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "7795870" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..1d48448cd --- /dev/null +++ b/tests-snapshot-source/mainnet/61292225-7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292222, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18645351502", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "4995678" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..a8ea7d6ab --- /dev/null +++ b/tests-snapshot-source/mainnet/61292227-e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292225, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18642134811", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1778984" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json b/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json new file mode 100644 index 000000000..f8200c408 --- /dev/null +++ b/tests-snapshot-source/mainnet/61292232-221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b-before/c6b8adfa4d0c767ea8906a3c7823b0d069ded9d5d8d71442f4e1f3e2b10f3ee8.json @@ -0,0 +1,42 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61292227, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18640441226", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "85396" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/7618f77c936cc68487523c3bf2a90ba224f18828beb831dd4a8a7cabd07389c8.json b/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/7618f77c936cc68487523c3bf2a90ba224f18828beb831dd4a8a7cabd07389c8.json new file mode 100644 index 000000000..b06fee2c4 --- /dev/null +++ b/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/7618f77c936cc68487523c3bf2a90ba224f18828beb831dd4a8a7cabd07389c8.json @@ -0,0 +1,47 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 61339998, + "data": { + "account": { + "account_id": "GCO45COWIBDZEGJ3DRGDGCCCJXK777F2S6D6HXQKXVB3EKQVCQU7B2WA", + "balance": "827726773", + "seq_num": "206881591031603723", + "num_sub_entries": 23, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "3370680361", + "selling": "190363081" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61191436, + "seq_time": "1770853357" + } + } + } + } + } + } + } + }, + "ext": { + "v1": { + "sponsoring_id": null, + "ext": "v0" + } + } + } +} \ No newline at end of file diff --git a/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json b/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json new file mode 100644 index 000000000..d736452ae --- /dev/null +++ b/tests-snapshot-source/mainnet/61340000-201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312-before/a63213d713efb243ba64897692d711ef088e5d5719b392ca68030f36bcecb1a4.json @@ -0,0 +1,71 @@ +{ + "xdr_schema_version": "9c9c145953e80990d6ff1ae3a6a973a0ce6d0694", + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + } +} \ No newline at end of file diff --git a/tests/fork/Cargo.toml b/tests/fork/Cargo.toml new file mode 100644 index 000000000..2314d4edd --- /dev/null +++ b/tests/fork/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "test_fork" +version.workspace = true +authors = ["Stellar Development Foundation "] +license = "Apache-2.0" +edition = "2021" +publish = false +rust-version.workspace = true + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +soroban-sdk = {path = "../../soroban-sdk"} + +[dev-dependencies] +soroban-ledger-snapshot-source-tx = {path = "../../soroban-ledger-snapshot-source-tx"} +soroban-sdk = {path = "../../soroban-sdk", features = ["testutils"]} +url = "2" +bytes-lit = "0.0.5" +serde_json = "1" +hex = "0.4" +stellar-xdr = { workspace = true, features = ["std"] } +stellar-strkey = { workspace = true } +ed25519-dalek = { version = "2", features = ["rand_core"] } +sha2 = "0.10" +rand = "0.8" +reqwest = "0.12" diff --git a/tests/fork/quickstart-setup.sh b/tests/fork/quickstart-setup.sh new file mode 100755 index 000000000..28c28f4ed --- /dev/null +++ b/tests/fork/quickstart-setup.sh @@ -0,0 +1,148 @@ +#!/usr/bin/env bash +# +# Submit transactions to a local stellar/quickstart network and write a fixture +# describing them, for the fork test in src/lib.rs (module `quickstart`) to fork +# from. +# +# Start quickstart with the ledger meta store and the history archive both +# running, then run this script: +# +# docker run --rm -p 8000:8000 stellar/quickstart:testing --local --enable rpc,galexie +# tests/fork/quickstart-setup.sh /tmp/quickstart-fixture.json +# TEST_FORK_QUICKSTART_FIXTURE=/tmp/quickstart-fixture.json \ +# cargo test -p test_fork --lib -- --ignored --nocapture quickstart +# +# The transfers are of the native asset's Stellar Asset Contract, to an address +# that no other transaction touches, so the balance of that address changes +# only by the transfers submitted here and the expected balance at each point +# is known. + +set -euo pipefail + +FIXTURE_PATH="${1:?usage: quickstart-setup.sh }" + +HOST="${QUICKSTART_HOST:-http://localhost:8000}" +export STELLAR_RPC_URL="$HOST/rpc" +export STELLAR_NETWORK_PASSPHRASE="${QUICKSTART_NETWORK_PASSPHRASE:-Standalone Network ; February 2017}" + +# Checkpoints are every 8 ledgers on quickstart's local network, matching +# Network::local()'s archive_checkpoint_ledger_count. +CHECKPOINT_FREQUENCY=8 + +# Amounts transferred, one transaction each. The balance the test expects +# before transfer N is the sum of the amounts before it. +AMOUNTS=(10 20 30) + +# Ledgers to wait between transfers. Spreads the transfers over more than 64 +# ledgers and several checkpoints, so that the transfers are not all reachable +# from the same place: the most recent is still in the ledger meta store, while +# the earlier ones have to be read out of the history archive, and out of +# different checkpoints of it rather than only the most recent one. +LEDGERS_BETWEEN_TRANSFERS=40 + +rpc() { + curl -sf "$STELLAR_RPC_URL" -H 'Content-Type: application/json' \ + -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"$1\",\"params\":${2:-null}}" +} + +# Create an account, retrying friendbot until it is up, because it takes a +# moment longer to come up than the rpc does. +account() { + stellar keys generate "$1" --overwrite + until curl -sf -o /dev/null "$HOST/friendbot?addr=$(stellar keys address "$1")"; do sleep 1; done +} + +echo "Waiting for rpc to be healthy ..." +until [ "$(rpc getHealth | jq -r '.result.status // empty')" = "healthy" ]; do sleep 2; done + +echo "Deploying the native asset contract ..." +account deployer +SAC=$(stellar contract id asset --asset native) +# Deploying fails if a previous run of this script against the same network +# already deployed it, which is only a problem if it is still not deployed. +stellar contract asset deploy --asset native --source-account deployer > /dev/null \ + || stellar contract info interface --id "$SAC" > /dev/null +echo "Native asset contract: $SAC" + +# The address the transfers are sent to, and whose balance the test checks. The +# contract ID of the asset contract of a randomly named asset, which is never +# deployed and so is an address that no other transaction has touched: its +# balance starts at zero and only the transfers below change it. +TARGET=$(stellar contract id asset \ + --asset "T$(od -An -tx1 -N4 /dev/urandom | tr -d ' \n' | tr 'a-f' 'A-F'):$(stellar keys address deployer)") +echo "Target address: $TARGET" + +transfers=() +for i in "${!AMOUNTS[@]}"; do + amount="${AMOUNTS[$i]}" + + if [ "$i" -gt 0 ]; then + next=$(( $(jq -r '.ledger' <<<"${transfers[-1]}") + LEDGERS_BETWEEN_TRANSFERS )) + echo "Waiting for ledger $next to close before the next transfer ..." + until [ "$(rpc getLatestLedger | jq -r '.result.sequence')" -ge "$next" ]; do sleep 1; done + fi + + # A separate source account per transfer, so the transactions do not depend + # on each other's sequence numbers and can land in the same ledger. + account "sender$i" + sender=$(stellar keys address "sender$i") + + signed=$( + stellar contract invoke --quiet --build-only --source-account "sender$i" --id "$SAC" \ + -- transfer --from "$sender" --to "$TARGET" --amount "$amount" \ + | stellar tx simulate --quiet --source-account "sender$i" \ + | stellar tx sign --quiet --sign-with-key "sender$i" + ) + hash=$(printf '%s' "$signed" | stellar tx hash) + printf '%s' "$signed" | stellar tx send > /dev/null + + echo "Waiting for transaction $hash ..." + result=$( + until r=$(rpc getTransaction "{\"hash\":\"$hash\"}") \ + && [ "$(jq -r '.result.status' <<<"$r")" != "NOT_FOUND" ]; do sleep 1; done + echo "$r" + ) + status=$(jq -r '.result.status' <<<"$result") + [ "$status" = "SUCCESS" ] || { echo "transaction $hash failed: $status"; exit 1; } + + ledger=$(jq -r '.result.ledger' <<<"$result") + + # A ledger far enough past this transfer that a search for the balance entry + # falls out of the ledger meta store, back past a checkpoint, and into the + # history archive. One per transfer, so that each lands in a different + # checkpoint: the test reads the earlier ones out of checkpoints that are no + # longer the archive's most recent. + archive_ledger=$(( (ledger / CHECKPOINT_FREQUENCY + 2) * CHECKPOINT_FREQUENCY )) + + echo "Transferred $amount in ledger $ledger, transaction $hash" + transfers+=( + "{\"ledger\":$ledger,\"tx\":\"$hash\",\"amount\":$amount,\"archive_ledger\":$archive_ledger}" + ) +done + +# The last transfer's archive ledger is the furthest ahead, so waiting for it +# waits for everything the test reads. +archive_checkpoint=$(( archive_ledger - 1 )) + +echo "Waiting for ledger $archive_ledger to close ..." +until [ "$(rpc getLatestLedger | jq -r '.result.sequence')" -ge "$archive_ledger" ]; do sleep 1; done + +echo "Waiting for ledger $archive_ledger in the ledger meta store ..." +# Galexie writes one ledger per file, 64000 files per partition, so on a fresh +# local network every ledger is in the first partition. +batch=$(printf '%08X--%d.xdr.zst' "$((0xFFFFFFFF - archive_ledger))" "$archive_ledger") +until curl -sf -o /dev/null "$HOST/ledger-meta/FFFFFFFF--0-63999/$batch"; do sleep 1; done + +echo "Waiting for checkpoint $archive_checkpoint in the history archive ..." +until [ "$(curl -sf "$HOST/archive/.well-known/stellar-history.json" | jq -r '.currentLedger')" \ + -ge "$archive_checkpoint" ]; do sleep 1; done + +jq -n \ + --arg sac "$SAC" \ + --arg target "$TARGET" \ + --argjson transfers "$(printf '%s\n' "${transfers[@]}" | jq -s .)" \ + '{sac: $sac, target: $target, transfers: $transfers}' \ + > "$FIXTURE_PATH" + +echo "Wrote $FIXTURE_PATH:" +cat "$FIXTURE_PATH" diff --git a/tests/fork/src/lib.rs b/tests/fork/src/lib.rs new file mode 100644 index 000000000..185efedcc --- /dev/null +++ b/tests/fork/src/lib.rs @@ -0,0 +1,228 @@ +#![no_std] +use soroban_sdk::contract; + +#[contract] +pub struct Contract; + +#[cfg(test)] +mod example { + extern crate std; + use bytes_lit::bytes; + use soroban_ledger_snapshot_source_tx::Network; + use soroban_ledger_snapshot_source_tx::TxSnapshotSource; + use soroban_sdk::{token::TokenClient, Address, Env}; + + #[test] + fn test() { + const NATIVE_ADDRESS: &str = "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA"; + let source = TxSnapshotSource::new( + Network::mainnet(None), + // Ledger. + 61340000, + // Tx to look at state just before. + Some(bytes!( + 0x201a1e9cd0d48ed5e7facc7642785a0621f75a50c2c8fc06d1e936a82b642312 + )), + ); + let env = Env::from_ledger_snapshot(source); + let contract = Address::from_str(&env, NATIVE_ADDRESS); + let client = TokenClient::new(&env, &contract); + + // Lookup balance of address at that ledger just before the given transaction. + let addr = Address::from_str( + &env, + "GCO45COWIBDZEGJ3DRGDGCCCJXK777F2S6D6HXQKXVB3EKQVCQU7B2WA", + ); + let bal = client.balance(&addr); + assert_eq!(bal, 827726773); + } +} + +#[cfg(test)] +mod mainnet { + extern crate std; + use soroban_ledger_snapshot_source_tx::Network; + use soroban_ledger_snapshot_source_tx::TxSnapshotSource; + use soroban_sdk::{token::TokenClient, Address, Env}; + + // Track the native XLM balance of an account that sends XLM transfers + // across 80 ledgers on mainnet (ledgers 61292152 to 61292232). + // + // Account: GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN + // Native SAC: CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA + // + // This account sends native XLM to various recipients. Each transaction + // changes the native XLM balance by the transfer amount plus the fee. + // + // 54 unique transactions across 37 ledgers in this range. + + #[rustfmt::skip] + fn test() { + // Before range. + assert_eq!(test_internal(61292151, None), 28640019212); + // All 54 transactions. + assert_eq!(test_internal(61292152, Some(hex_hash("2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9"))), 28640019112); + assert_eq!(test_internal(61292153, Some(hex_hash("93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566"))), 26640019125); + assert_eq!(test_internal(61292155, Some(hex_hash("2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb"))), 24640019136); + assert_eq!(test_internal(61292156, Some(hex_hash("32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3"))), 24634416302); + assert_eq!(test_internal(61292157, Some(hex_hash("fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52"))), 24134416305); + assert_eq!(test_internal(61292159, Some(hex_hash("a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d"))), 24128733912); + assert_eq!(test_internal(61292161, Some(hex_hash("1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623"))), 24121908843); + assert_eq!(test_internal(61292163, Some(hex_hash("fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d"))), 24114311687); + assert_eq!(test_internal(61292165, Some(hex_hash("b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb"))), 24112182156); + assert_eq!(test_internal(61292168, Some(hex_hash("4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463"))), 24110475788); + assert_eq!(test_internal(61292169, Some(hex_hash("94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34"))), 24079646158); + assert_eq!(test_internal(61292170, Some(hex_hash("777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac"))), 24072910038); + assert_eq!(test_internal(61292171, Some(hex_hash("8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77"))), 21572910052); + assert_eq!(test_internal(61292171, Some(hex_hash("b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f"))), 22072910049); + assert_eq!(test_internal(61292173, Some(hex_hash("9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021"))), 21571672284); + assert_eq!(test_internal(61292173, Some(hex_hash("20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f"))), 21569563764); + assert_eq!(test_internal(61292174, Some(hex_hash("d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231"))), 21069563767); + assert_eq!(test_internal(61292175, Some(hex_hash("388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685"))), 20713716699); + assert_eq!(test_internal(61292175, Some(hex_hash("27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6"))), 21066642483); + assert_eq!(test_internal(61292176, Some(hex_hash("d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a"))), 20712900251); + assert_eq!(test_internal(61292177, Some(hex_hash("1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6"))), 20673806969); + assert_eq!(test_internal(61292177, Some(hex_hash("e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a"))), 20677374810); + assert_eq!(test_internal(61292178, Some(hex_hash("a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5"))), 20668813924); + assert_eq!(test_internal(61292179, Some(hex_hash("aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7"))), 20668456579); + assert_eq!(test_internal(61292179, Some(hex_hash("bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04"))), 20667200123); + assert_eq!(test_internal(61292180, Some(hex_hash("de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2"))), 20667164303); + assert_eq!(test_internal(61292181, Some(hex_hash("2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97"))), 20447168649); + assert_eq!(test_internal(61292181, Some(hex_hash("86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776"))), 20442139665); + assert_eq!(test_internal(61292181, Some(hex_hash("afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9"))), 20667160725); + assert_eq!(test_internal(61292181, Some(hex_hash("13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245"))), 20416854956); + assert_eq!(test_internal(61292182, Some(hex_hash("8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c"))), 20416854592); + assert_eq!(test_internal(61292182, Some(hex_hash("d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963"))), 20416854592); + assert_eq!(test_internal(61292183, Some(hex_hash("dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863"))), 20414752362); + assert_eq!(test_internal(61292184, Some(hex_hash("8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1"))), 20414752362); + assert_eq!(test_internal(61292184, Some(hex_hash("edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415"))), 19172679311); + assert_eq!(test_internal(61292185, Some(hex_hash("54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1"))), 19172679311); + assert_eq!(test_internal(61292186, Some(hex_hash("93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721"))), 19163487111); + assert_eq!(test_internal(61292187, Some(hex_hash("59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d"))), 19163487111); + assert_eq!(test_internal(61292188, Some(hex_hash("9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3"))), 19154858911); + assert_eq!(test_internal(61292189, Some(hex_hash("b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e"))), 19152544114); + assert_eq!(test_internal(61292189, Some(hex_hash("5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908"))), 19154858911); + assert_eq!(test_internal(61292191, Some(hex_hash("d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b"))), 19152544114); + assert_eq!(test_internal(61292197, Some(hex_hash("1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64"))), 18710779602); + assert_eq!(test_internal(61292204, Some(hex_hash("7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1"))), 18665585699); + assert_eq!(test_internal(61292208, Some(hex_hash("1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9"))), 18665085382); + assert_eq!(test_internal(61292212, Some(hex_hash("25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722"))), 18663714838); + assert_eq!(test_internal(61292214, Some(hex_hash("d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff"))), 18662250331); + assert_eq!(test_internal(61292214, Some(hex_hash("8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b"))), 18661077898); + assert_eq!(test_internal(61292220, Some(hex_hash("45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3"))), 18660765200); + assert_eq!(test_internal(61292220, Some(hex_hash("12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4"))), 18649217174); + assert_eq!(test_internal(61292222, Some(hex_hash("8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496"))), 18648151686); + assert_eq!(test_internal(61292225, Some(hex_hash("7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288"))), 18645351502); + assert_eq!(test_internal(61292227, Some(hex_hash("e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708"))), 18642134811); + assert_eq!(test_internal(61292232, Some(hex_hash("221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b"))), 18640441226); + } + + fn hex_hash(s: &str) -> [u8; 32] { + hex::decode(s).unwrap().try_into().unwrap() + } + + #[rustfmt::skip] + fn test_internal(ledger: u32, tx: Option<[u8; 32]>) -> i128 { + use std::time::Instant; + let t0 = Instant::now(); + let s = TxSnapshotSource::new(Network::mainnet(None), ledger, tx); + let e = Env::from_ledger_snapshot(s); + let contract = Address::from_str(&e, "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA"); + let client = TokenClient::new(&e, &contract); + let addr = Address::from_str(&e, "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN"); + let res = client.balance(&addr); + let t1 = Instant::now(); + std::println!("\x1b[32m{ledger} {} bal = {res} (t={:?})\x1b[0m", tx.map(|t| hex::encode(t)).unwrap_or_default(), t1-t0); + res + } + + #[rustfmt::skip] + mod tests { + use super::test; + #[test] fn test_1() { test() } + } +} + +/// Forks a local stellar/quickstart network, reading state from the ledger +/// meta store and the history archive it runs. +/// +/// The transactions forked from are submitted by `quickstart-setup.sh`, which +/// writes a fixture describing them that this test reads the path of from +/// `TEST_FORK_QUICKSTART_FIXTURE`. See that script for how to run the test. +#[cfg(test)] +mod quickstart { + extern crate std; + use soroban_ledger_snapshot_source_tx::{Network, TxSnapshotSource}; + use soroban_sdk::{testutils::EnvTestConfig, token::TokenClient, Address, Env}; + use std::{env, fs}; + + /// The quickstart network, with the RPC disabled so that entries are only + /// ever found in the ledger meta store or the history archive. A working + /// RPC would otherwise be able to answer lookups that a broken meta store + /// or history archive should fail. + fn network() -> Network { + Network { + rpc_url: None, + ..Network::local() + } + } + + /// The balance of the fixture's target address, as of `ledger`, and just + /// before `tx` if given. + fn balance_at(sac: &str, target: &str, ledger: u32, tx: Option<[u8; 32]>) -> i128 { + let source = TxSnapshotSource::new(network(), ledger, tx); + let mut env = Env::from_ledger_snapshot(source); + // The snapshot is of a network that only exists while the test runs, + // so there's nothing to be gained by writing it out at drop. + env.set_config(EnvTestConfig { + capture_snapshot_at_drop: false, + }); + let client = TokenClient::new(&env, &Address::from_str(&env, sac)); + client.balance(&Address::from_str(&env, target)) + } + + fn tx_hash(s: &str) -> [u8; 32] { + hex::decode(s).unwrap().try_into().unwrap() + } + + #[test] + #[ignore = "requires a local stellar/quickstart network, see quickstart-setup.sh"] + fn test() { + let path = env::var("TEST_FORK_QUICKSTART_FIXTURE") + .expect("TEST_FORK_QUICKSTART_FIXTURE must be set to the path of a fixture written by quickstart-setup.sh"); + let fixture: serde_json::Value = + serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); + let sac = fixture["sac"].as_str().unwrap(); + let target = fixture["target"].as_str().unwrap(); + let transfers = fixture["transfers"].as_array().unwrap(); + + // Each transfer added its amount to the target's balance, so the + // balance just before each transfer is the sum of the amounts of the + // transfers before it, and the balance after it also includes its own. + let mut expected: i128 = 0; + for transfer in transfers { + let ledger = transfer["ledger"].as_u64().unwrap() as u32; + let tx = tx_hash(transfer["tx"].as_str().unwrap()); + + // Just before the transfer. Only the ledger meta store has the + // granularity to see state part way through a ledger, so this is + // always read from there. + std::println!("balance before tx {} in ledger {ledger}", transfer["tx"]); + assert_eq!(balance_at(sac, target, ledger, Some(tx)), expected); + + // At the end of the ledger the transfer was in. + expected += transfer["amount"].as_i64().unwrap() as i128; + std::println!("balance at end of ledger {ledger}"); + assert_eq!(balance_at(sac, target, ledger, None), expected); + + // Far enough past the transfer that the balance is no longer in + // the ledgers of meta searched, and is instead read out of the + // buckets of a history archive checkpoint. The transfers are far + // enough apart that each of these is a different checkpoint, so + // only the last is the archive's most recent. + let archive_ledger = transfer["archive_ledger"].as_u64().unwrap() as u32; + std::println!("balance at ledger {archive_ledger}, from the history archive"); + assert_eq!(balance_at(sac, target, archive_ledger, None), expected); + } + } +} diff --git a/tests/fork/test_snapshots/example/test.1.json b/tests/fork/test_snapshots/example/test.1.json new file mode 100644 index 000000000..02396dd5c --- /dev/null +++ b/tests/fork/test_snapshots/example/test.1.json @@ -0,0 +1,141 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61339998, + "data": { + "account": { + "account_id": "GCO45COWIBDZEGJ3DRGDGCCCJXK777F2S6D6HXQKXVB3EKQVCQU7B2WA", + "balance": "827726773", + "seq_num": "206881591031603723", + "num_sub_entries": 23, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "3370680361", + "selling": "190363081" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61191436, + "seq_time": "1770853357" + } + } + } + } + } + } + } + }, + "ext": { + "v1": { + "sponsoring_id": null, + "ext": "v0" + } + } + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.1.json b/tests/fork/test_snapshots/mainnet/tests/test_1.1.json new file mode 100644 index 000000000..40930e97c --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.1.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292135, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "28640019212", + "seq_num": "233832081317167158", + "num_sub_entries": 49, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "0" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 55395889, + "seq_time": "1737571986" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.10.json b/tests/fork/test_snapshots/mainnet/tests/test_1.10.json new file mode 100644 index 000000000..c328591c2 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.10.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292163, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24112182156", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5471826409" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.11.json b/tests/fork/test_snapshots/mainnet/tests/test_1.11.json new file mode 100644 index 000000000..35f3318cd --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.11.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292165, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24110475788", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5470120035" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.12.json b/tests/fork/test_snapshots/mainnet/tests/test_1.12.json new file mode 100644 index 000000000..29efa66d1 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.12.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292168, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24079646158", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5439290404" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.13.json b/tests/fork/test_snapshots/mainnet/tests/test_1.13.json new file mode 100644 index 000000000..543496ebb --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.13.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292169, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24072910038", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5432554281" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.14.json b/tests/fork/test_snapshots/mainnet/tests/test_1.14.json new file mode 100644 index 000000000..ba4e9f4bb --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.14.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292171, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21572910052", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2932554293" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.15.json b/tests/fork/test_snapshots/mainnet/tests/test_1.15.json new file mode 100644 index 000000000..90f338e50 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.15.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292170, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "22072910049", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "3432554291" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.16.json b/tests/fork/test_snapshots/mainnet/tests/test_1.16.json new file mode 100644 index 000000000..b4f148882 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.16.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292171, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21571672284", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2931316518" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.17.json b/tests/fork/test_snapshots/mainnet/tests/test_1.17.json new file mode 100644 index 000000000..0509a90c1 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.17.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292173, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21569563764", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2929207991" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.18.json b/tests/fork/test_snapshots/mainnet/tests/test_1.18.json new file mode 100644 index 000000000..d13141c69 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.18.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292173, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21069563767", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2429207994" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.19.json b/tests/fork/test_snapshots/mainnet/tests/test_1.19.json new file mode 100644 index 000000000..4968425ea --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.19.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292175, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20713716699", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2073360924" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.2.json b/tests/fork/test_snapshots/mainnet/tests/test_1.2.json new file mode 100644 index 000000000..01f35d2e8 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.2.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292152, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "28640019112", + "seq_num": "233832081317167158", + "num_sub_entries": 49, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "0" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 55395889, + "seq_time": "1737571986" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.20.json b/tests/fork/test_snapshots/mainnet/tests/test_1.20.json new file mode 100644 index 000000000..f94999cc1 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.20.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292174, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "21066642483", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2426286709" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.21.json b/tests/fork/test_snapshots/mainnet/tests/test_1.21.json new file mode 100644 index 000000000..d2e390ceb --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.21.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292175, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20712900251", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2072544473" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.22.json b/tests/fork/test_snapshots/mainnet/tests/test_1.22.json new file mode 100644 index 000000000..9a46d0915 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.22.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292177, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20673806969", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2033451190" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.23.json b/tests/fork/test_snapshots/mainnet/tests/test_1.23.json new file mode 100644 index 000000000..21e77277c --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.23.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292176, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20677374810", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2037019031" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.24.json b/tests/fork/test_snapshots/mainnet/tests/test_1.24.json new file mode 100644 index 000000000..458fb75e8 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.24.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292177, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20668813924", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2028458141" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.25.json b/tests/fork/test_snapshots/mainnet/tests/test_1.25.json new file mode 100644 index 000000000..5a5bbd3f5 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.25.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292178, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20668456579", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2028100796" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.26.json b/tests/fork/test_snapshots/mainnet/tests/test_1.26.json new file mode 100644 index 000000000..37024a1ce --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.26.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292179, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667200123", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026844338" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.27.json b/tests/fork/test_snapshots/mainnet/tests/test_1.27.json new file mode 100644 index 000000000..4c27944ee --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.27.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292179, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667164303", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026808517" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.28.json b/tests/fork/test_snapshots/mainnet/tests/test_1.28.json new file mode 100644 index 000000000..3c45a201b --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.28.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20447168649", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1806812862" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.29.json b/tests/fork/test_snapshots/mainnet/tests/test_1.29.json new file mode 100644 index 000000000..7f97f51df --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.29.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20442139665", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1801783877" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.3.json b/tests/fork/test_snapshots/mainnet/tests/test_1.3.json new file mode 100644 index 000000000..9fb5d499e --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.3.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292152, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "26640019125", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "7999663396" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.30.json b/tests/fork/test_snapshots/mainnet/tests/test_1.30.json new file mode 100644 index 000000000..0fd5a529d --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.30.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292180, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20667160725", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "2026804939" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.31.json b/tests/fork/test_snapshots/mainnet/tests/test_1.31.json new file mode 100644 index 000000000..2755579b3 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.31.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854956", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776499168" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.32.json b/tests/fork/test_snapshots/mainnet/tests/test_1.32.json new file mode 100644 index 000000000..5960aaf85 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.32.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292182, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854592", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776498804" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.33.json b/tests/fork/test_snapshots/mainnet/tests/test_1.33.json new file mode 100644 index 000000000..be84a54a0 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.33.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292181, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20416854592", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1776498804" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.34.json b/tests/fork/test_snapshots/mainnet/tests/test_1.34.json new file mode 100644 index 000000000..fe0ebc47d --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.34.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292182, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20414752362", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1774396573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.35.json b/tests/fork/test_snapshots/mainnet/tests/test_1.35.json new file mode 100644 index 000000000..f4b1623cd --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.35.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292183, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "20414752362", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1774396573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.36.json b/tests/fork/test_snapshots/mainnet/tests/test_1.36.json new file mode 100644 index 000000000..626b45164 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.36.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292184, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19172679311", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "532323521" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.37.json b/tests/fork/test_snapshots/mainnet/tests/test_1.37.json new file mode 100644 index 000000000..626b45164 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.37.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292184, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19172679311", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "532323521" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.38.json b/tests/fork/test_snapshots/mainnet/tests/test_1.38.json new file mode 100644 index 000000000..abcd771e7 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.38.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292185, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19163487111", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "523131321" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.39.json b/tests/fork/test_snapshots/mainnet/tests/test_1.39.json new file mode 100644 index 000000000..edd21648a --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.39.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292186, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19163487111", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "523131321" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.4.json b/tests/fork/test_snapshots/mainnet/tests/test_1.4.json new file mode 100644 index 000000000..91c5d6b85 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.4.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292153, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24640019136", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5999663405" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.40.json b/tests/fork/test_snapshots/mainnet/tests/test_1.40.json new file mode 100644 index 000000000..9d9c57290 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.40.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292187, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19154858911", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "514503114" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.41.json b/tests/fork/test_snapshots/mainnet/tests/test_1.41.json new file mode 100644 index 000000000..723bcfe09 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.41.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292189, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19152544114", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "512188312" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.42.json b/tests/fork/test_snapshots/mainnet/tests/test_1.42.json new file mode 100644 index 000000000..93ddcb96c --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.42.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292188, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19154858911", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "514503114" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.43.json b/tests/fork/test_snapshots/mainnet/tests/test_1.43.json new file mode 100644 index 000000000..723bcfe09 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.43.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292189, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "19152544114", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "512188312" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.44.json b/tests/fork/test_snapshots/mainnet/tests/test_1.44.json new file mode 100644 index 000000000..1f607d350 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.44.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292191, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18710779602", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "70423799" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.45.json b/tests/fork/test_snapshots/mainnet/tests/test_1.45.json new file mode 100644 index 000000000..9dec5741e --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.45.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292197, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18665585699", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "25229896" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.46.json b/tests/fork/test_snapshots/mainnet/tests/test_1.46.json new file mode 100644 index 000000000..924e0e509 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.46.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292204, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18665085382", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "24729578" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.47.json b/tests/fork/test_snapshots/mainnet/tests/test_1.47.json new file mode 100644 index 000000000..d5294bc5c --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.47.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292208, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18663714838", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "23359034" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.48.json b/tests/fork/test_snapshots/mainnet/tests/test_1.48.json new file mode 100644 index 000000000..da2d79458 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.48.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292212, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18662250331", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "21894525" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.49.json b/tests/fork/test_snapshots/mainnet/tests/test_1.49.json new file mode 100644 index 000000000..2d2900fea --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.49.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292214, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18661077898", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "20722086" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.5.json b/tests/fork/test_snapshots/mainnet/tests/test_1.5.json new file mode 100644 index 000000000..ace1c1472 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.5.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292155, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24634416302", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5994060570" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.50.json b/tests/fork/test_snapshots/mainnet/tests/test_1.50.json new file mode 100644 index 000000000..e7b93f0f7 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.50.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292214, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18660765200", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "20409388" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.51.json b/tests/fork/test_snapshots/mainnet/tests/test_1.51.json new file mode 100644 index 000000000..6add65601 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.51.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292220, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18649217174", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "8861362" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.52.json b/tests/fork/test_snapshots/mainnet/tests/test_1.52.json new file mode 100644 index 000000000..af2e6883a --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.52.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292220, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18648151686", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "7795870" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.53.json b/tests/fork/test_snapshots/mainnet/tests/test_1.53.json new file mode 100644 index 000000000..b2cfa4960 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.53.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292222, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18645351502", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "4995678" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.54.json b/tests/fork/test_snapshots/mainnet/tests/test_1.54.json new file mode 100644 index 000000000..79a2aa1e3 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.54.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292225, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18642134811", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "1778984" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.55.json b/tests/fork/test_snapshots/mainnet/tests/test_1.55.json new file mode 100644 index 000000000..105e75c30 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.55.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292227, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "18640441226", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "85396" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.6.json b/tests/fork/test_snapshots/mainnet/tests/test_1.6.json new file mode 100644 index 000000000..0ad526658 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.6.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292156, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24134416305", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5494060573" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.7.json b/tests/fork/test_snapshots/mainnet/tests/test_1.7.json new file mode 100644 index 000000000..f22ba1ad9 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.7.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292157, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24128733912", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5488378176" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.8.json b/tests/fork/test_snapshots/mainnet/tests/test_1.8.json new file mode 100644 index 000000000..4ef7d5a7d --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.8.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292159, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24121908843", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5481553105" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/test_snapshots/mainnet/tests/test_1.9.json b/tests/fork/test_snapshots/mainnet/tests/test_1.9.json new file mode 100644 index 000000000..2dff1f5c2 --- /dev/null +++ b/tests/fork/test_snapshots/mainnet/tests/test_1.9.json @@ -0,0 +1,136 @@ +{ + "generators": { + "address": 0, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 28, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 61292161, + "data": { + "account": { + "account_id": "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN", + "balance": "24114311687", + "seq_num": "233832081317167159", + "num_sub_entries": 50, + "inflation_dest": "GDCHDRSDOBRMSUDKRE2C4U4KDLNEATJPIHHR2ORFL5BSD56G4DQXL4VW", + "flags": 0, + "home_domain": "lobstr.co", + "thresholds": "01000000", + "signers": [], + "ext": { + "v1": { + "liabilities": { + "buying": "0", + "selling": "5473955945" + }, + "ext": { + "v2": { + "num_sponsored": 0, + "num_sponsoring": 0, + "signer_sponsoring_i_ds": [], + "ext": { + "v3": { + "ext": "v0", + "seq_ledger": 61292152, + "seq_time": "1771441174" + } + } + } + } + } + } + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 50463386, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "native" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "native" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "Native" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4294967295 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fork/verify_balances.csv b/tests/fork/verify_balances.csv new file mode 100644 index 000000000..9a3581d9d --- /dev/null +++ b/tests/fork/verify_balances.csv @@ -0,0 +1,55 @@ +ledger_sequence,transaction_hash,event_types,balance_before_tx +61292152,2bfec2fe0d0b33fcb0ebb37f838d3b964b8aed50977afb0b7195fe49dd536ec9,"fee,transfer",28640019212 +61292153,93028d85b1d5119df64ddb8f3130dc5411498193120f26ac65fef7609ec5b566,transfer,26640019125 +61292155,2e777e004e90fe2f0023d0a2d1879ac62118eb4a9cb5e02cad4f7776a84923bb,transfer,24640019136 +61292156,32879b7c7ea6a30584f36844f1d4cc3189d6c48839fc77bed2eb63487fae9ba3,transfer,24634416302 +61292157,fccf410decdeb4204809bc632e74e9730e936b000e9b603dfd18912f3e62dd52,transfer,24134416305 +61292159,a2c2e40030a56f6d016b34978a91ff8cc89d6e25adc8093c1061c59da90d0f4d,transfer,24128733912 +61292161,1c94a019ca0a6b4a54d15ec171c8f902d54f305145454b54173b7b31d2bd6623,transfer,24121908843 +61292163,fc9dbb4d7c71339267b857952e18f3a7cde1ba20c813dbca55e4849cd0f5f37d,transfer,24114311687 +61292165,b0cc4d5fe54d9a59c47395243b648a8c6415c0aa0b1807a33337460413774fbb,transfer,24112182156 +61292168,4df4a1257fcc05b631ae3b08d5118f8b6a7e297133e893a1f08b1bdc90efa463,transfer,24110475788 +61292169,94191e94402dcf319d35b75f923461c0b382304c73edd12848bbd3bb63a48a34,transfer,24079646158 +61292170,777a5c2cabd17ffda907dc44975c917a12e1f4e98946d58f055cef0c13a8c9ac,transfer,24072910038 +61292171,b4eb6dd6afab43a91d2e7acec26980b04e1d47477890313b214e9b1563747f3f,transfer,22072910049 +61292171,8027e372b1c324bff22907ef81830a9e58f316a1be202b34d3154ea4397fea77,transfer,21572910052 +61292173,9dc6aab3420066ea89a8098bb62f844ec796fed44a26336546f29333f0420021,transfer,21571672284 +61292173,20d8ee570fcc2064e5a6d3f1cf7cdace934707e47a43607ab564abb39417057f,transfer,21569563764 +61292174,d9012d0e40eee4e66b88a9197448b189fa95e139de2f0c4677aa065ad5100231,transfer,21069563767 +61292175,27002c56aa2ad3c4964af019da56c59cc2c84693446ab0f56f01e7fb9dd644f6,transfer,21066642483 +61292175,388a047b86ce015f74d82c881885eef51078325e11f0dc45cfbd3154e0489685,transfer,20713716699 +61292176,d22e7e7889053fe3de070c1610f40e113929090368e9df4e49e6743687a4323a,transfer,20712900251 +61292177,e5ad20075b7aad00711252306a5098ad472f444310d3526e54b31ffe3a5fb88a,transfer,20677374810 +61292177,1e94b58b93c7ed3f7f0c7e3cf044197216a103163ab1cc20cdd5a05ce6f14ff6,transfer,20673806969 +61292178,a370c2092e77bfac40e2c1ade271fcbd6cebb9b8430b0c06419296fea7beb3e5,transfer,20668813924 +61292179,aa7ccf318ee811240a6bdea16607dea0607baa1116561667de57aba3287c2cc7,transfer,20668456579 +61292179,bc96dbe783474d71aeea99dfba7aadaca5e76e29855c30eb0900e9c192cb2e04,transfer,20667200123 +61292180,de461160e3760ed2623282c14f884bc55b0db2e2608ed768cb1f189eca72b0f2,transfer,20667164303 +61292181,afc06a1b9051549b2a4593fa4472f05e00ed0a37297bf133e49dace3364312c9,transfer,20667160725 +61292181,2c3c62f80d006c0c76bf78b82bcd40d8b39606cfdb325739973af7eb0de4ad97,transfer,20447168649 +61292181,86837220b0dcdd52cfc97d52953ba3c39fd1ab91134fa5ec2c555625af4fd776,transfer,20442139665 +61292181,13517f66e83a8270e1ffe333a9eacb73768988ce7e24649fee1b6ea150674245,transfer,20416854956 +61292182,d8db89f42639b5bf788ab6ac6b7d2b6a4dedc76149ffdbcc417ea13bc7c8a963,transfer,20416854592 +61292182,8b7fef92629d12c4aac3b6a206e53c0f29d0536908353861ac4383ddab01a61c,transfer,20416854592 +61292183,dbca3f43511ff2c894e392c9e42e27d356604ca49e8f51ff10b8380e4a2c0863,transfer,20414752362 +61292184,8cd425ad71c81f5f4b5b68ccfc4a48cc0b8badff1daf30b93281365dce0d94a1,transfer,20414752362 +61292184,edb2139c974d22c73d2fced26922ded276aebd75a42488849d798cdbc32bf415,transfer,19172679311 +61292185,54be9cf57633cf04c85c0a558888e78e0ca3856cde3199f8708497e383346bb1,transfer,19172679311 +61292186,93d6ed4b9d82b35bc89b0666dc8e4bacf1c589074c45dec9c31af892f6eaa721,transfer,19163487111 +61292187,59898ca58428a19a2f2cc6a8ab7def4ec72c2ed16ffb44dd118598630b9e9b3d,transfer,19163487111 +61292188,9170bb7e95b0e378c28c03662ec1cdf4529dcfcc53dd7a89f2bd951130a909c3,transfer,19154858911 +61292189,5167b538dde5c47bbae712d4b47186e11936dcee00fe11249369fecea779b908,transfer,19154858911 +61292189,b9d3b96a4dcebb1493867fea89f4f6baf392cdf9598f489531d70880745d9a6e,transfer,19152544114 +61292191,d478ec95a68e1af912ed842d73a659715c2a24dff29d561a763802790be5c54b,transfer,19152544114 +61292197,1f4efe8404e6b421676d462852883d7ea5e602ecb9080daab38eb70779ef3a64,transfer,18710779602 +61292204,7e6190c9e46620a0859dcad113cdb1f8d5b98e9f35e999070970482d524406c1,transfer,18665585699 +61292208,1fba8adbb5255de150df3b195619d4a25ea2ccee465d417b8ab84d98adcff4a9,transfer,18665085382 +61292212,25974cdeffe0d1917935114bd1826dc51517ddf8f94d458c920d548e50950722,transfer,18663714838 +61292214,d2fbad2f8418706aadab192660ee04c1bf16c5300014a8219b97c12d0a3456ff,transfer,18662250331 +61292214,8e1c5b5a8d65b1a57312e77939e311705cb5e95d9b340dce9a1cf605dbd1ed8b,transfer,18661077898 +61292220,45a06ce004fc7e8aa80e7be5de59cae65dc599841e65b0c2f8f2e034fcf8f8f3,transfer,18660765200 +61292220,12a46b59c62fab061ae9b37be73c6f3658d109d826425b6c7e1d27562eca71c4,transfer,18649217174 +61292222,8d631a78cf6d41adc653dd55af4490ddb1f807747fb09efb106070cbd4122496,transfer,18648151686 +61292225,7748d2f83eb1eb6088ff81aafc6caab287aefeda0b833656b09041e6fb2e6288,transfer,18645351502 +61292227,e44ddb4445e82481d7a00545b61e6a5bc345694de84048f6c11f40d192c86708,transfer,18642134811 +61292232,221e786fd872913af3f23c809b39c022cf3404d90faed1f898342f689574a09b,transfer,18640441226 diff --git a/tests/fork/verify_balances.sql b/tests/fork/verify_balances.sql new file mode 100644 index 000000000..d766f719f --- /dev/null +++ b/tests/fork/verify_balances.sql @@ -0,0 +1,65 @@ +/* +Verify the native XLM balance of GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN +at each (ledger, tx) point tested in src/lib.rs mod mainnet. + +Reconstructs running balance from SAC contract events (transfers + fees) +using the known starting balance at ledger 61292151. + +Source: BigQuery Hubble dataset crypto-stellar.crypto_stellar + +Usage: + bq query --use_legacy_sql=false --format=csv --max_rows=200 \ + "$(cat verify_balances.sql)" > verify_balances.csv +*/ + +WITH +balance_changes AS ( + SELECT e.ledger_sequence, e.transaction_hash, + JSON_VALUE(e.topics_decoded, "$[0].symbol") as event_type, + CASE + WHEN JSON_VALUE(e.topics_decoded, "$[0].symbol") = "fee" + THEN -CAST(JSON_VALUE(e.data_decoded, "$.i128") AS INT64) + WHEN JSON_VALUE(e.topics_decoded, "$[1].address") = "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN" + THEN -CAST(JSON_VALUE(e.data_decoded, "$.i128") AS INT64) + WHEN JSON_VALUE(e.topics_decoded, "$[2].address") = "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN" + THEN CAST(JSON_VALUE(e.data_decoded, "$.i128") AS INT64) + END as amount_change + FROM `crypto-stellar.crypto_stellar.history_contract_events` e + WHERE e.ledger_sequence BETWEEN 61292152 AND 61292232 + AND e.contract_id = "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" + AND e.type_string = "ContractEventTypeContract" + AND JSON_VALUE(e.topics_decoded, "$[0].symbol") IN ("transfer", "fee") + AND ( + JSON_VALUE(e.topics_decoded, "$[1].address") = "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN" + OR JSON_VALUE(e.topics_decoded, "$[2].address") = "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN" + ) +), +tx_summary AS ( + SELECT + ledger_sequence, + transaction_hash, + SUM(amount_change) as net_change, + STRING_AGG(DISTINCT event_type ORDER BY event_type) as event_types + FROM balance_changes + GROUP BY ledger_sequence, transaction_hash +), +ordered AS ( + SELECT ts.ledger_sequence, ts.transaction_hash, ts.net_change, ts.event_types, t.id as tx_id + FROM tx_summary ts + JOIN `crypto-stellar.crypto_stellar.history_transactions` t + ON ts.transaction_hash = t.transaction_hash AND ts.ledger_sequence = t.ledger_sequence +), +running AS ( + SELECT + ledger_sequence, + transaction_hash, + event_types, + tx_id, + 28640019212 + COALESCE(SUM(net_change) OVER ( + ORDER BY tx_id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING + ), 0) as balance_before_tx + FROM ordered +) +SELECT ledger_sequence, transaction_hash, event_types, balance_before_tx +FROM running +ORDER BY tx_id diff --git a/tests/fork/verify_balances_accounts.csv b/tests/fork/verify_balances_accounts.csv new file mode 100644 index 000000000..7b8b419f0 --- /dev/null +++ b/tests/fork/verify_balances_accounts.csv @@ -0,0 +1,42 @@ +ledger_sequence,end_of_ledger_balance +61292152,26640019125 +61292153,24640019136 +61292155,24634416302 +61292156,24134416305 +61292157,24128733912 +61292159,24121908843 +61292161,24114311687 +61292163,24112182156 +61292165,24110475788 +61292168,24079646158 +61292169,24072910038 +61292170,22072910049 +61292171,21571672284 +61292173,21069563767 +61292174,21066642483 +61292175,20712900251 +61292176,20677374810 +61292177,20668813924 +61292178,20668456579 +61292179,20667164303 +61292180,20667160725 +61292181,20416854592 +61292182,20414752362 +61292183,20414752362 +61292184,19172679311 +61292185,19163487111 +61292186,19163487111 +61292187,19154858911 +61292188,19154858911 +61292189,19152544114 +61292191,18710779602 +61292197,18665585699 +61292204,18665085382 +61292208,18663714838 +61292212,18662250331 +61292214,18660765200 +61292220,18648151686 +61292222,18645351502 +61292225,18642134811 +61292227,18640441226 +61292232,18640355830 diff --git a/tests/fork/verify_balances_accounts.sql b/tests/fork/verify_balances_accounts.sql new file mode 100644 index 000000000..c8c496298 --- /dev/null +++ b/tests/fork/verify_balances_accounts.sql @@ -0,0 +1,22 @@ +/* +Verify the native XLM balance of GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN +using the accounts table which appends a row each time the account is modified. + +Each row represents the end-of-ledger balance after all transactions in that +ledger have been applied. This is compared against the test's balance_before_tx +for the first transaction in the next active ledger. + +Source: BigQuery Hubble dataset crypto-stellar.crypto_stellar.accounts + +Usage: + bq query --use_legacy_sql=false --format=csv --max_rows=200 \ + "$(cat verify_balances_accounts.sql)" > verify_balances_accounts.csv +*/ + +SELECT + ledger_sequence, + CAST(ROUND(balance * 10000000) AS INT64) as end_of_ledger_balance +FROM `crypto-stellar.crypto_stellar.accounts` +WHERE account_id = "GBLKX4UPDM7CC4UUG2FXBLOCXOTQ6ARHOQYVL4RD6A4AQVB6TPTLIUYN" + AND ledger_sequence BETWEEN 61292151 AND 61292232 +ORDER BY ledger_sequence