diff --git a/.github/attention.md b/.github/attention.md new file mode 100644 index 000000000..868d585c0 --- /dev/null +++ b/.github/attention.md @@ -0,0 +1,5 @@ +Hey 👋 You DID in fact read my fancy PR description BEFORE you started reviewing the code, right? Else switch back to description now and read it in full: + +https://github.com/radixdlt/sargon/pull/131 + +Thank you! Happy review! 🙏 \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f26b7721..f58421057 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: uses: RDXWorks-actions/cargo-install@main with: crate: typos-cli - locked: true + version: 1.22.7 - name: Check typos run: typos @@ -122,7 +122,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | rustup target add aarch64-apple-darwin - sh ./scripts/ios/test.sh --codecov ${{ env.SWIFT_CODE_COV_REPORT_PATH }} + sh ./scripts/ios/test.sh --build --codecov ${{ env.SWIFT_CODE_COV_REPORT_PATH }} - name: Upload to CodeCov.io uses: RDXWorks-actions/codecov-action@main @@ -204,7 +204,7 @@ jobs: uses: RDXWorks-actions/cargo-install@main with: crate: cargo-tarpaulin - tag: 0.27.3 + tag: 0.30.0 locked: true - name: Code Coverage - Generate diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9a1523cc6..259e41888 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ fail_fast: true repos: - repo: https://github.com/crate-ci/typos - rev: v1.20.1 + rev: v1.22.7 hooks: - id: typos - repo: local @@ -33,4 +33,4 @@ repos: language: system types: [file, rust] entry: cargo test --lib - pass_filenames: false \ No newline at end of file + pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index 8f9252915..8063e75c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -24,9 +24,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -69,7 +69,7 @@ dependencies = [ "ctr", "ghash", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -156,9 +156,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -175,9 +175,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "askama" @@ -202,7 +202,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -226,7 +226,7 @@ version = "2.0.2" source = "git+https://github.com/davidpdrsn/assert-json-diff/?rev=bca0d2c590808274298d939e0533da79cd09076d#bca0d2c590808274298d939e0533da79cd09076d" dependencies = [ "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", ] [[package]] @@ -236,7 +236,7 @@ source = "git+https://github.com/dtolnay/async-trait?rev=1eb21ed8bd87029bf4dcbea dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -247,9 +247,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -321,7 +321,7 @@ dependencies = [ "bitcoin_hashes", "serde", "unicode-normalization", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -338,9 +338,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blake2" @@ -371,14 +371,14 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" dependencies = [ "cc", "glob", "threadpool", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -448,7 +448,7 @@ dependencies = [ "cargo-platform", "semver", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", ] [[package]] @@ -461,8 +461,8 @@ dependencies = [ "cargo-platform", "semver", "serde", - "serde_json 1.0.117", - "thiserror 1.0.60", + "serde_json 1.0.118", + "thiserror 1.0.61", ] [[package]] @@ -486,9 +486,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.97" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" [[package]] name = "cesu8" @@ -538,12 +538,12 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ - "clap_builder 4.5.2", - "clap_derive 4.5.4", + "clap_builder 4.5.7", + "clap_derive 4.5.5", ] [[package]] @@ -552,18 +552,18 @@ version = "4.5.1" source = "git+https://github.com/clap-rs/clap/?rev=8a7a13a5618cfdc4ff328624a5266e7b4d88649a#8a7a13a5618cfdc4ff328624a5266e7b4d88649a" dependencies = [ "anstyle", - "clap_lex 0.7.0 (git+https://github.com/clap-rs/clap/?rev=8a7a13a5618cfdc4ff328624a5266e7b4d88649a)", + "clap_lex 0.7.0", ] [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clap_lex 0.7.1", "strsim", ] @@ -575,31 +575,31 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "clap_lex" version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +source = "git+https://github.com/clap-rs/clap/?rev=8a7a13a5618cfdc4ff328624a5266e7b4d88649a#8a7a13a5618cfdc4ff328624a5266e7b4d88649a" [[package]] name = "clap_lex" -version = "0.7.0" -source = "git+https://github.com/clap-rs/clap/?rev=8a7a13a5618cfdc4ff328624a5266e7b4d88649a#8a7a13a5618cfdc4ff328624a5266e7b4d88649a" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" @@ -666,9 +666,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -684,9 +684,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-bigint" @@ -697,7 +697,7 @@ dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -730,24 +730,23 @@ dependencies = [ "digest 0.9.0", "rand_core 0.5.1", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "platforms", "rustc_version", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -758,7 +757,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -782,7 +781,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -793,7 +792,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -803,7 +802,7 @@ source = "git+https://github.com/Kobzol/rust-delegate/?rev=ac852be64f3e4b5f9b58b dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -813,7 +812,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -841,7 +840,7 @@ source = "git+https://github.com/JelteF/derive_more?rev=1196b2dd7a366c06db621093 dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", "unicode-xid", ] @@ -927,7 +926,7 @@ dependencies = [ "rand 0.7.3", "serde", "sha2 0.9.9", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -936,20 +935,20 @@ version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek 4.1.3", "ed25519 2.2.3", "hashbrown 0.14.5", "hex 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.10.8", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -967,7 +966,7 @@ dependencies = [ "rand_core 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "sec1", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -978,7 +977,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -996,7 +995,7 @@ source = "git+https://github.com/stephaneyfx/enum-iterator/?rev=9d472a1237cfd03b dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -1045,7 +1044,7 @@ checksum = "311a6d2f1f9d60bff73d2c78a0af97ed27f79672f15c238192a5bbb64db56d00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -1156,7 +1155,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -1202,9 +1201,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1322,12 +1321,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -1335,9 +1334,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "humantime" @@ -1382,9 +1381,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -1489,7 +1488,7 @@ dependencies = [ "k256 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.10.8", "x25519-dalek", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -1559,7 +1558,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.60", + "thiserror 1.0.61", "walkdir", "windows-sys 0.45.0", ] @@ -1615,9 +1614,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128" @@ -1627,9 +1626,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -1639,9 +1638,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -1655,15 +1654,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1689,9 +1688,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -1724,18 +1723,17 @@ dependencies = [ "skeptic", "smallvec", "tagptr", - "thiserror 1.0.60", + "thiserror 1.0.61", "triomphe", - "uuid 1.8.0", + "uuid 1.9.1", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1759,9 +1757,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -1803,9 +1801,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -1828,7 +1826,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -1845,7 +1843,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -1856,9 +1854,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.2.3+3.2.1" +version = "300.3.1+3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" +checksum = "7259953d42a81bf137fbbd73bd30a8e1914d6dce43c2b90ed575783a22608b91" dependencies = [ "cc", ] @@ -1878,9 +1876,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1933,7 +1931,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -1970,12 +1968,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -[[package]] -name = "platforms" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" - [[package]] name = "polyval" version = "0.6.2" @@ -2020,9 +2012,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2033,7 +2025,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "memchr", "unicase", ] @@ -2081,7 +2073,7 @@ dependencies = [ "serde", "sha3", "strum 0.24.1", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -2121,7 +2113,7 @@ dependencies = [ "radix-wasm-instrument", "radix-wasmi", "sbor", - "serde_json 1.0.117", + "serde_json 1.0.118", "strum 0.24.1", "syn 1.0.109", "wasmparser 0.107.0", @@ -2144,7 +2136,7 @@ dependencies = [ "regex 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "sbor", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "strum 0.24.1", ] @@ -2188,7 +2180,7 @@ dependencies = [ "sbor", "sbor-json", "scrypto", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_with 3.8.1", ] @@ -2211,7 +2203,7 @@ dependencies = [ "schemars", "scrypto", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_with 3.8.1", "typeshare", "walkdir", @@ -2416,11 +2408,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -2503,7 +2495,7 @@ dependencies = [ "pin-project-lite", "rustls-pemfile", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_urlencoded", "sync_wrapper", "tokio", @@ -2547,7 +2539,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2593,7 +2585,7 @@ dependencies = [ [[package]] name = "sargon" -version = "1.0.31" +version = "1.1.0" dependencies = [ "actix-rt", "aes-gcm", @@ -2630,6 +2622,8 @@ dependencies = [ "regex 1.9.3 (git+https://github.com/rust-lang/regex/?rev=72f889ef3cca59ebac6a026f3646e8d92f056d88)", "reqwest", "sbor", + "security-framework", + "security-framework-sys", "serde", "serde_json 1.0.108", "serde_repr", @@ -2639,7 +2633,7 @@ dependencies = [ "uniffi", "url", "uuid 1.6.1", - "zeroize 1.7.0 (git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e2af55bacb41375)", + "zeroize 1.7.0", ] [[package]] @@ -2689,7 +2683,7 @@ dependencies = [ "regex 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "sbor", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_with 3.8.1", ] @@ -2713,27 +2707,27 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6e7ed6919cb46507fb01ff1654309219f62b4d603822501b0b80d42f6f21ef" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" dependencies = [ "dyn-clone", "indexmap 1.9.3", "schemars_derive", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", ] [[package]] name = "schemars_derive" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185f2b7aa7e02d418e453790dde16890256bbd2bcd04b7dc5348811052b53f49" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -2759,7 +2753,7 @@ checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -2795,7 +2789,7 @@ dependencies = [ "regex 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "sbor", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "syn 1.0.109", ] @@ -2810,7 +2804,7 @@ dependencies = [ "generic-array 0.14.7", "pkcs8", "subtle", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -2833,11 +2827,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ - "bitflags 2.5.0", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2846,9 +2840,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", @@ -2865,22 +2859,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -2891,7 +2885,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -2907,9 +2901,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "indexmap 2.2.6", "itoa", @@ -2924,14 +2918,14 @@ source = "git+https://github.com/dtolnay/serde-repr/?rev=94cce18a51bc169869f2cdc dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -2959,7 +2953,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.2.6", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_with_macros 3.4.0", "time", ] @@ -2977,7 +2971,7 @@ dependencies = [ "indexmap 2.2.6", "serde", "serde_derive", - "serde_json 1.0.117", + "serde_json 1.0.118", "serde_with_macros 3.8.1", "time", ] @@ -2990,7 +2984,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -3002,7 +2996,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -3174,14 +3168,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3196,9 +3190,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.63" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3257,11 +3251,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ - "thiserror-impl 1.0.60", + "thiserror-impl 1.0.61", ] [[package]] @@ -3271,18 +3265,18 @@ source = "git+https://github.com/dtolnay/thiserror/?rev=a7d220d7915fb888413aa797 dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -3327,9 +3321,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -3342,9 +3336,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3390,9 +3384,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -3423,7 +3417,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -3444,7 +3437,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-core", ] @@ -3460,9 +3452,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" [[package]] name = "try-lock" @@ -3484,7 +3476,7 @@ checksum = "04f17399b76c2e743d58eac0635d7686e9c00f48cd4776f00695d9882a7d3187" dependencies = [ "chrono", "serde", - "serde_json 1.0.117", + "serde_json 1.0.118", "typeshare-annotation", ] @@ -3495,7 +3487,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" dependencies = [ "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -3530,9 +3522,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -3547,7 +3539,7 @@ source = "git+https://github.com/mozilla/uniffi-rs/?rev=6f33088e8100a2ea9586c8c3 dependencies = [ "anyhow", "camino 1.1.7", - "clap 4.5.4", + "clap 4.5.7", "uniffi_bindgen", "uniffi_build", "uniffi_core", @@ -3563,7 +3555,7 @@ dependencies = [ "askama", "camino 1.1.7", "cargo_metadata 0.15.4", - "clap 4.5.4", + "clap 4.5.7", "fs-err", "glob", "goblin", @@ -3594,7 +3586,7 @@ version = "0.27.1" source = "git+https://github.com/mozilla/uniffi-rs/?rev=6f33088e8100a2ea9586c8c3ecf98ab51d5aba62#6f33088e8100a2ea9586c8c3ecf98ab51d5aba62" dependencies = [ "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -3623,7 +3615,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.63", + "syn 2.0.68", "toml 0.5.11", "uniffi_meta", ] @@ -3675,9 +3667,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -3687,9 +3679,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -3702,9 +3694,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom 0.2.15", ] @@ -3773,7 +3765,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -3807,7 +3799,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3855,7 +3847,7 @@ version = "0.121.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "indexmap 2.2.6", "semver", ] @@ -4147,7 +4139,7 @@ checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" dependencies = [ "curve25519-dalek 3.2.0", "rand_core 0.5.1", - "zeroize 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 1.8.1", ] [[package]] @@ -4173,24 +4165,24 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] name = "zeroize" version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +source = "git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e2af55bacb41375#df6d2f48a5e8afe8eef04ba32e2af55bacb41375" dependencies = [ - "zeroize_derive 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize_derive 1.4.2 (git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e2af55bacb41375)", ] [[package]] name = "zeroize" -version = "1.7.0" -source = "git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e2af55bacb41375#df6d2f48a5e8afe8eef04ba32e2af55bacb41375" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ - "zeroize_derive 1.4.2 (git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e2af55bacb41375)", + "zeroize_derive 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4201,7 +4193,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] [[package]] @@ -4211,5 +4203,5 @@ source = "git+https://github.com/RustCrypto/utils?rev=df6d2f48a5e8afe8eef04ba32e dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.68", ] diff --git a/Cargo.toml b/Cargo.toml index 593d05b0a..657b8270c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sargon" -version = "1.0.31" +version = "1.1.0" edition = "2021" build = "build.rs" @@ -175,17 +175,24 @@ hkdf = { git = "https://github.com/RustCrypto/KDFs/", rev = "1ac16e8b9d4ee7a6761 base64 = { git = "https://github.com/marshallpierce/rust-base64.git", rev = "e14400697453bcc85997119b874bc03d9601d0af" } +# reqwest = "0.12.3" +reqwest = { git = "https://github.com/seanmonstar/reqwest", rev = "0720159f6369f54e045a1fd315e0f24b7a0b4a39", default-features = false, features = [ + "native-tls-vendored", +] } +# Fixes nasty iOS bug "_kSecMatchSubjectWholeString", see https://github.com/kornelski/rust-security-framework/issues/203 +# This is a workaround to fix a bug with version 2.11.0 that added some symbols that are not available on iOS +# The bug is fixed already but the fix is not released yet. https://github.com/kornelski/rust-security-framework/pull/204 +[target.'cfg(target_os = "ios")'.dependencies] +security-framework = { version = "=2.10" } +security-framework-sys = "=2.10.0" + + [dev-dependencies] # uniffi = "0.27.1" uniffi = { git = "https://github.com/mozilla/uniffi-rs/", rev = "6f33088e8100a2ea9586c8c3ecf98ab51d5aba62", features = [ "bindgen-tests", ] } -# reqwest = "0.12.3" -reqwest = { git = "https://github.com/seanmonstar/reqwest", rev = "0720159f6369f54e045a1fd315e0f24b7a0b4a39", default-features = false, features = [ - "native-tls-vendored", -] } - # actix-rt = "3.3.0" actix-rt = { git = "https://github.com/actix/actix-net", rev = "57fd6ea8098d1f2d281c305fc331216c4fe1992e" } diff --git a/Package.resolved b/Package.resolved index e8e0b7b8e..c3493322e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,23 @@ { "pins" : [ + { + "identity" : "asyncextensions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sideeffect-io/AsyncExtensions", + "state" : { + "revision" : "1f0729e4f1f6c7166acfac3cec43b3cbe83be0e6", + "version" : "0.5.2" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, { "identity" : "swift-custom-dump", "kind" : "remoteSourceControl", @@ -23,8 +41,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "b13b1d1a8e787a5ffc71ac19dcaf52183ab27ba2", - "version" : "1.1.1" + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" } } ], diff --git a/Package.swift b/Package.swift index aa8541826..a360114cd 100644 --- a/Package.swift +++ b/Package.swift @@ -7,7 +7,6 @@ var swiftSettings: [SwiftSetting] = [ .enableExperimentalFeature("StrictConcurrency") ] - let sargonBinaryTargetName = "SargonCoreRS" let binaryTarget: Target let useLocalFramework = true @@ -42,8 +41,21 @@ let package = Package( ) ], dependencies: [ + // We use XCTestDynamicOverlay to have different `description` of e.g. Decimal192 + // for tests vs not tests (we use a .test `Locale`) + .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.1.2"), + + // `XCTAssertNoDifference` used in test .package(url: "https://github.com/pointfreeco/swift-custom-dump", from: "1.3.0"), + + // Hopefully only temporary! We use `SwiftJSON` to be able to mark some Sargon models + // as `Swift.Codable`. See the SargonObjectCodable protocol for details. + // In the future hopefully no JSON coding happens in wallets, + // i.e. Sargon does ALL JSON coding, then we can remove this. .package(url: "https://github.com/SwiftyJSON/SwiftyJSON", from: "5.0.2"), + + // Multicast / Share of notifications in EventBus + .package(url: "https://github.com/sideeffect-io/AsyncExtensions", exact: "0.5.2"), ], targets: [ binaryTarget, @@ -57,6 +69,8 @@ let package = Package( dependencies: [ .target(name: "SargonUniFFI"), "SwiftyJSON", + .product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"), + "AsyncExtensions" ], path: "apple/Sources/Sargon", swiftSettings: swiftSettings @@ -67,8 +81,7 @@ let package = Package( .target(name: "Sargon"), .product(name: "CustomDump", package: "swift-custom-dump"), ], - path: "apple/Tests", - swiftSettings: swiftSettings + path: "apple/Tests" ), ] ) diff --git a/README.md b/README.md index 1fcd5c9b2..68cdf19f9 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,10 @@ This repo contains a [`.pre-commit-config.yaml`](./.pre-commit-config.yaml) whic pre-commit install ``` +## `direnv` + +Install [`direnv`](https://direnv.net) to automatically load env variables when you change directory to Sargon dir. This repo contains an `.envrc` which exports `RUST_LOG=info` so that logs are shown when running unit tests. When you run `cargo test` those logs will show up. Prefer using `nextest` below if you dont wanna see logs, and want prettier test result output. + ### `nextest` [Nextest](https://nexte.st/index.html) is a nice test runner for Rust! diff --git a/_typos.toml b/_typos.toml index debd3019a..9a185423a 100644 --- a/_typos.toml +++ b/_typos.toml @@ -3,6 +3,7 @@ extend-exclude = [ "fixtures/**", "scripts/**", "apple/Sources/UniFFI/Sargon.swift", + "examples/iOS/Backend/Sources/Planbok/Features/DebugProfileFeature.swift", "tarpaulin-report.html", ] diff --git a/apple/Sources/Sargon/Antennas/Network/NetworkAntenna+URLSession.swift b/apple/Sources/Sargon/Antennas/Network/NetworkAntenna+URLSession.swift deleted file mode 100644 index 541ed8f10..000000000 --- a/apple/Sources/Sargon/Antennas/Network/NetworkAntenna+URLSession.swift +++ /dev/null @@ -1,48 +0,0 @@ -import Foundation -import SargonUniFFI - -extension URLRequest { - init(sargon: NetworkRequest) { - var request = URLRequest(url: sargon.url) - switch sargon.method { - case .post: - request.httpMethod = "POST" // FIXME: embed in sargon - case .get: - request.httpMethod = "GET" - } - - request.httpBody = sargon.body - request.allHTTPHeaderFields = sargon.headers - self = request - } -} - -extension NetworkResponse { - init(response: (Data, URLResponse)) throws { - guard let httpURLResponse = response.1 as? HTTPURLResponse else { - throw SargonError.NetworkRequestGenericFailure( - underlying: "Failed to cast to HTTPURLResponse") - } - self.init( - statusCode: UInt16(httpURLResponse.statusCode), - body: response.0 - ) - } -} - -extension URLSession: NetworkAntenna { - - public func executeNetworkRequest( - request sargonRequest: NetworkRequest - ) async throws -> NetworkResponse { - let request = URLRequest(sargon: sargonRequest) - let response: (Data, URLResponse) - do { - response = try await data(for: request) - } catch { - throw SargonError.NetworkRequestGenericFailure( - underlying: String(describing: error)) - } - return try NetworkResponse(response: response) - } -} diff --git a/apple/Sources/Sargon/Drivers/EntropyProvider/EntropyProvider+RandomData.swift b/apple/Sources/Sargon/Drivers/EntropyProvider/EntropyProvider+RandomData.swift new file mode 100644 index 000000000..5b109846f --- /dev/null +++ b/apple/Sources/Sargon/Drivers/EntropyProvider/EntropyProvider+RandomData.swift @@ -0,0 +1,34 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some EntropyProviderDriver` as parameter. +extension EntropyProviderDriver where Self == EntropyProvider { + /// Singleton `EntropyProviderDriver` of type `EntropyProvider`, + /// being an `actor` that uses CSRNG `SystemRandomNumberGenerator` + public static var shared: Self { Self.shared } +} + +/// An `EntropyProviderDriver` actor which uses CSRNG `SystemRandomNumberGenerator` +/// to generate 32 bytes. +public final actor EntropyProvider { + internal init() {} + + /// Singleton `EntropyProviderDriver` of type `EntropyProvider`, + /// being an `actor` that uses CSRNG `SystemRandomNumberGenerator` + public static let shared = EntropyProvider() +} + +extension EntropyProvider: EntropyProviderDriver { + /// Generates 32 bytes using CSRNG `SystemRandomNumberGenerator` + nonisolated public func generateSecureRandomBytes() -> Entropy32Bytes { + Entropy32Bytes.generate() + } +} diff --git a/apple/Sources/Sargon/Drivers/EventBus/EventBus.swift b/apple/Sources/Sargon/Drivers/EventBus/EventBus.swift new file mode 100644 index 000000000..cfb2c9e71 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/EventBus/EventBus.swift @@ -0,0 +1,67 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI +import AsyncExtensions + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some EventBusDriver` as parameter. +extension EventBusDriver where Self == EventBus { + + /// Singleton `EventBusDriver` of type `EventBus` being an `actor` which forwards `EventNotification`s + /// originally emitted by `SargonOS` (Rust side). + public static var shared: Self { Self.shared } +} + +/// An `EventBusDriver` actor which handles incoming +/// `EventNotifications` and forwards them to any +/// subscriber of `notifications()`, being a multicasted +/// async sequence. +public final actor EventBus { + /// A stream we multicast on. + private let stream = AsyncThrowingPassthroughSubject() + private let subject: Subject +#if DEBUG + public init() { + subject = .init() + } +#else + private init() { + subject = .init() + } +#endif +} + +extension EventBus { + + public typealias Element = EventNotification + public typealias Subject = AsyncPassthroughSubject + + /// Singleton `EventBusDriver` of type `EventBus` being an `actor` which forwards `EventNotification`s + /// originally emitted by `SargonOS` (Rust side). + public static let shared = EventBus() + + /// A multicasted async sequence of `EventNotification` values + /// over time, originally emitted by `SargonOS` (Rust side). + public func notifications() -> AsyncMulticastSequence> { + subject + .multicast(stream) + .autoconnect() + } +} + +extension EventBus: EventBusDriver { + /// This method is called by `SargonOS` (Rust side) and we should + /// "forward" the events to subscribers (Swift swide), i.e. `@SharedReader`s of profile values, + /// which uses `notifications()` to subscribe to these + /// values. + public func handleEventNotification(eventNotification: EventNotification) async { + log.debug("Handle event: \(String(describing: eventNotification.event))") + subject.send(eventNotification) + } +} diff --git a/apple/Sources/Sargon/Drivers/EventBus/EventNotification+Swiftified.swift b/apple/Sources/Sargon/Drivers/EventBus/EventNotification+Swiftified.swift new file mode 100644 index 000000000..7a33e85a6 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/EventBus/EventNotification+Swiftified.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-15. +// + +import Foundation +import SargonUniFFI + +extension EventProfileModified { + public var addedAccount: AccountAddress? { + guard case let .accountAdded(address) = self else { return nil } + return address + } +} + +extension Event { + public var profileModified: EventProfileModified? { + switch self { + case let .profileModified(change): return change + default: return nil + } + } + public var addressOfNewAccount: AccountAddress? { + profileModified?.addedAccount + } +} + +extension EventNotification: Comparable { + /// `EventNotification` are made `Comparable` by + /// sorting on `timestamp`. + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.timestamp < rhs.timestamp + } +} + +extension Event { + + /// Discriminant of the `Event`. + public var kind: EventKind { + eventKind(event: self) + } +} diff --git a/apple/Sources/Sargon/Drivers/FileSystem/FileSystemDriver+Data+ContentsOf+URL.swift b/apple/Sources/Sargon/Drivers/FileSystem/FileSystemDriver+Data+ContentsOf+URL.swift new file mode 100644 index 000000000..40d457f56 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/FileSystem/FileSystemDriver+Data+ContentsOf+URL.swift @@ -0,0 +1,74 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +extension FileManager: @unchecked Sendable {} + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some FileSystemDriver` as parameter. +extension FileSystemDriver where Self == FileSystem { + + /// Singleton `FileSystemDriver` of type `FileSystem`being an `actor` which + /// uses a `FileManager` for File I/O CRUD operations. + public static var shared: Self { Self.shared } +} + +/// `FileSystemDriver` being an `actor` which +/// uses a `FileManager` for File I/O CRUD operations. +public final actor FileSystem { + private let fileManager: FileManager + public init(fileManager: FileManager = .default) { + self.fileManager = fileManager + } + + /// Singleton `FileSystemDriver` of type `FileSystem`being an `actor` which + /// uses a `FileManager` for File I/O CRUD operations. + public static let shared = FileSystem(fileManager: .default) +} + +extension URL { + init(file string: String) { + self.init(filePath: string, directoryHint: .notDirectory) + } +} + +extension FileSystem { + private func with( + path: String, + _ io: @Sendable (URL) throws -> T + ) throws -> T { + let url = URL(file: path) + guard url.startAccessingSecurityScopedResource() else { + throw CommonError.NotPermissionToAccessFile(path: path) + } + defer { url.stopAccessingSecurityScopedResource() } + return try io(url) + } +} + +extension FileSystem: FileSystemDriver { + + public func loadFromFile(path: String) async throws -> BagOfBytes? { + try with(path: path) { + try Data(contentsOf: $0) + } + } + + public func saveToFile(path: String, data: BagOfBytes) async throws { + try with(path: path) { + try data.write(to: $0) + } + } + + public func deleteFile(path: String) async throws { + try with(path: path) { + try fileManager.removeItem(at: $0) + } + } +} diff --git a/apple/Sources/Sargon/Drivers/HostInfo/HostInfoDriver+DeviceInfo.swift b/apple/Sources/Sargon/Drivers/HostInfo/HostInfoDriver+DeviceInfo.swift new file mode 100644 index 000000000..66ab4bc84 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/HostInfo/HostInfoDriver+DeviceInfo.swift @@ -0,0 +1,82 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +/// An `HostInfoDriver` actor being able to read host info, i.e +/// details about the iPhone the app is running on. +public final actor AppleHostInfoDriver { + fileprivate var appVersion: String + public init(appVersion: String) { + self.appVersion = appVersion + } +} + +extension AppleHostInfoDriver { + nonisolated public func hostAppVersion() async -> String { + await self.appVersion + } +} + +#if canImport(UIKit) +import UIKit +extension AppleHostInfoDriver: HostInfoDriver { + + public func hostOs() async -> HostOs { + await .ios(version: UIDevice.current.systemVersion) + } + + nonisolated public func hostDeviceName() async -> String { + await UIDevice.current.name + } + + nonisolated public func hostDeviceSystemVersion() async -> String { + await UIDevice.current.systemVersion + } + + nonisolated public func hostDeviceModel() async -> String { + await UIDevice.current.model + } +} +#else + +extension AppleHostInfoDriver: HostInfoDriver { + public func hostOs() async -> HostOs { + let info = ProcessInfo.processInfo.operatingSystemVersion + let version = "\(info.majorVersion).\(info.minorVersion).\(info.patchVersion)" + return HostOs.ios(version: version) + } + + nonisolated public func hostDeviceModel() async -> String { + + let service = IOServiceGetMatchingService( + kIOMainPortDefault, + IOServiceMatching("IOPlatformExpertDevice") + ) + + guard + let modelData = IORegistryEntryCreateCFProperty( + service, + "model" as CFString, + kCFAllocatorDefault, + 0 + ) + .takeUnretainedValue() as? Data, + let modelString = String(data: modelData, encoding: .utf8) + else { + return "Unknown Model" + } + + return modelString.trimmingCharacters(in: .controlCharacters.union(.whitespaces)) + } + + nonisolated public func hostDeviceName() async -> String { + "Unknown Name" + } +} +#endif // canImport(UIKit) diff --git a/apple/Sources/Sargon/Drivers/Logging/LoggingDriver+SwiftLog.swift b/apple/Sources/Sargon/Drivers/Logging/LoggingDriver+SwiftLog.swift new file mode 100644 index 000000000..d20080b58 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/Logging/LoggingDriver+SwiftLog.swift @@ -0,0 +1,149 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI +import os + +/// A public globally accessible `Logger` with `category` "Swift" which +/// Swift Sargon uses, and which iOS wallet can use too, it uses the +/// `Log.shared.swiftLogger`. +public var log: Logger { + Log.shared.swiftLogger +} + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some LoggingDriver` as parameter. +extension LoggingDriver where Self == Log { + public static var shared: Self { Self.shared } +} + +/// A `LoggingDriver` actor capable of logging on behalf of +/// Rust Sargon core, that is, when we write e.g. `debug!("hey Swift from Rust");` +/// in Rust code, that message will in fact be logged by a `os.Logger` held by this `Log` +/// actor. +public final actor Log { + + /// The `Logger` to which Rust delegates logged messages. + nonisolated fileprivate let rustLogger: Logger + + ///The `Logger` Swift Sargon uses to log messages, accessed + ///using global variable `log` (aliasa for `Log.shared.swiftLogger`). + nonisolated internal let swiftLogger: Logger + + private init( + subsystem: String = "Sargon", + rustCategory: String = "Rust", + swiftCategory: String = "Swift" + ) { + self.rustLogger = Logger( + subsystem: subsystem, + category: rustCategory + ) + self.swiftLogger = Logger( + subsystem: subsystem, + category: swiftCategory + ) + } + + /// LoggingDriver singleton, a shared actor. + public static let shared = Log() + +} + +// MARK: `LoggingDriver` conformance. +extension Log: LoggingDriver { + nonisolated public func log( + level: LogLevel, + msg: String + ) { + rustLogger.log( + level: .init(sargonLogLevel: level), + "\(msg)" + ) + } +} + +/// Makes it possible for iOS Wallet to later change the log level in Rust land +/// (remember, the Rust logger **uses the Swift logger** +/// but might suppress logging invocation if its logging facade's log level is too low.) +public func setRustLogLevel(_ level: Sargon.LogFilter) { + rustLoggerSetLevel(level: level) +} + +/// Makes it possible for iOS Wallet to later change the log level in Rust land +/// (remember, the Rust logger **uses the Swift logger** +/// but might suppress logging invocation if its logging facade's log level is too low.) +public func getRustLogLevel() -> Sargon.LogFilter { + rustLoggerGetLevel() +} + +/// This logging diagnos will tell Rust to log messages at every log level, +/// then it will log at each level using the "Swift logger" (`log`) as well, +/// this is useful from DEBUG menus to ensure logging works properly. +/// +/// You can adjust the used Log Level in Rust by calling +/// `setRustLogLevel` and then call this method again. +public func logSystemDiagnosis() { + let levels = LogLevel.allCases + print("logSystemDiagnosis - RUST") + rustLoggerLogAtEveryLevel() + print("logSystemDiagnosis - Swift") + levels.forEach { level in + log.log(level: .init(sargonLogLevel: level), "Swift test: '\(String(describing: level))'") + } +} + +extension LogFilter: CaseIterable { + public static let allCases: [Self] = rustLoggerGetAllFilters() +} + +extension LogLevel: CaseIterable { + public static let allCases: [Self] = rustLoggerGetAllLevels() +} + +extension Logger: @unchecked Sendable {} + +extension OSLogType { + + /// Rust has 5 log levels, so does Swift. + /// + /// The mapping might look a bit strange since we do NOT map `error` -> `error`, + /// neither do we map `debug` -> `debug`, instead we map the most serious Rust + /// log level to the most serious Swift log level, and the least serious Rust to least + /// serious to Swift. + init(sargonLogLevel sargon: Sargon.LogLevel) { + switch sargon { + case .error: + // yes this is correct we dont map `error` -> `error`. + self = .fault + case .warn: + // Swift does not have warn, we use error, and we use Swifts fault for Rust error. + self = .error + case .info: self = .info + case .debug: + // yes this is correct we dont map `debug` -> `debug`. + self = .default + case .trace: + // debug is Swifts least serious, and `trace` is Rust least serious. + self = .debug + } + } +} + + +extension OSLogType { + + init(sargonFilterLevel sargon: Sargon.LogFilter) { + if let level = LogLevel(rawValue: sargon.rawValue) { + self.init(sargonLogLevel: level) + } else { + self = .fault + } + } +} + diff --git a/apple/Sources/Sargon/Drivers/Networking/NetworkingDriver+URLSession.swift b/apple/Sources/Sargon/Drivers/Networking/NetworkingDriver+URLSession.swift new file mode 100644 index 000000000..0c2154351 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/Networking/NetworkingDriver+URLSession.swift @@ -0,0 +1,30 @@ +import Foundation +import SargonUniFFI + + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some NetworkingDriver` as parameter. +extension NetworkingDriver where Self == URLSession { + + /// Singleton `NetworkingDriver` of type `URLSession`, which + /// uses `URLSession.shared`. + public static var shared: Self { Self.shared } +} + +// MARK: `NetworkingDriver` conformance +extension URLSession: NetworkingDriver { + + public func executeNetworkRequest( + request sargonRequest: NetworkRequest + ) async throws -> NetworkResponse { + let request = URLRequest(sargon: sargonRequest) + let response: (Data, URLResponse) + do { + response = try await data(for: request) + } catch { + throw SargonError.NetworkRequestGenericFailure( + underlying: String(describing: error)) + } + return try NetworkResponse(response: response) + } +} diff --git a/apple/Sources/Sargon/Drivers/TestDrivers/SecureStorage/SecureStorageDriver+InsecureTestOnlyEphemeral_SecureStorage.swift b/apple/Sources/Sargon/Drivers/TestDrivers/SecureStorage/SecureStorageDriver+InsecureTestOnlyEphemeral_SecureStorage.swift new file mode 100644 index 000000000..c588f3429 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/TestDrivers/SecureStorage/SecureStorageDriver+InsecureTestOnlyEphemeral_SecureStorage.swift @@ -0,0 +1,37 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +#if DEBUG + +/// ‼️ NEVER USE IN PRODUCTION ‼️ +/// An INSECURE ephemeral storage conforming to `SecureStorageDriver` meant +/// for testing purposes only. +public final actor Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage { + public typealias Key = SecureStorageKey + fileprivate var dictionary: [Key: Data] = [:] + public init(keychainService _: String) {} +} + +// MARK: `SecureStorageDriver` conformance +extension Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage: SecureStorageDriver { + public func loadData(key: SecureStorageKey) async throws -> Data? { + dictionary[key] + } + + public func saveData(key: SecureStorageKey, data: Data) async throws { + dictionary[key] = data + } + + public func deleteDataForKey(key: SecureStorageKey) async throws { + dictionary.removeValue(forKey: key) + } + +} +#endif diff --git a/apple/Sources/Sargon/Drivers/TestDrivers/TestDrivers.swift b/apple/Sources/Sargon/Drivers/TestDrivers/TestDrivers.swift new file mode 100644 index 000000000..f4ebb3c61 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/TestDrivers/TestDrivers.swift @@ -0,0 +1,30 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-13. +// + +import Foundation +import SargonUniFFI + +#if DEBUG + + +extension BIOS { + + public static func insecure( + bundle: Bundle = .main, + userDefaultsSuite: String = "test" + ) -> BIOS { + BIOS( + bundle: bundle, + userDefaultsSuite: userDefaultsSuite, + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage.init( + keychainService: "test" + ) + ) + } +} + +#endif diff --git a/apple/Sources/Sargon/Drivers/UnsafeStorage/UnsafeStorageDriver+UserDefaults.swift b/apple/Sources/Sargon/Drivers/UnsafeStorage/UnsafeStorageDriver+UserDefaults.swift new file mode 100644 index 000000000..546276c32 --- /dev/null +++ b/apple/Sources/Sargon/Drivers/UnsafeStorage/UnsafeStorageDriver+UserDefaults.swift @@ -0,0 +1,57 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +extension UserDefaults: @unchecked Sendable {} + +// Makes it possible to type `.shared` on an initalizer/func taking +// `some UnsafeStorageDriver` as parameter. +extension UnsafeStorageDriver where Self == UnsafeStorage { + + /// Singleton `UnsafeStorageDriver` of type `UnsafeStorage, + /// which uses `UserDefaults.standard` as storage + public static var shared: Self { Self.shared } +} + +/// An `UnsafeStorageDriver` implementation which +/// wraps `UserDefaults`. +public final class UnsafeStorage: Sendable { + public typealias Key = UnsafeStorageKey + fileprivate let userDefaults: UserDefaults + public init(userDefaults: UserDefaults = .standard) { + self.userDefaults = userDefaults + } + /// Singleton `UnsafeStorageDriver` of type `UnsafeStorage, + /// which uses `UserDefaults.standard` as storage + public static let shared = UnsafeStorage() +} + +extension UnsafeStorageKey { + /// Translates this `UnsafeStorageKey` into a String + /// identifier which we can use with `UserDefaults` + var identifier: String { + unsafeStorageKeyIdentifier(key: self) + } +} + +// MARK: `UnsafeStorageDriver` confirmance +extension UnsafeStorage: UnsafeStorageDriver { + public func loadData(key: Key) -> Data? { + userDefaults.data(forKey: key.identifier) + } + + public func saveData(key: Key, data: Data) { + userDefaults.setValue(data, forKey: key.identifier) + } + + public func deleteDataForKey(key: Key) { + userDefaults.removeObject(forKey: key.identifier) + } + +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Crypto/Keys/PrivateHD+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Crypto/Keys/PrivateHD+Wrap+Functions.swift index a5a424582..ff861c2c7 100644 --- a/apple/Sources/Sargon/Extensions/Methods/Crypto/Keys/PrivateHD+Wrap+Functions.swift +++ b/apple/Sources/Sargon/Extensions/Methods/Crypto/Keys/PrivateHD+Wrap+Functions.swift @@ -11,22 +11,24 @@ import SargonUniFFI extension PrivateHierarchicalDeterministicFactorSource { public static func olympia( - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) -> Self { newPrivateHdFactorSourceOlympiaFromMnemonicWithPassphrase( mnemonicWithPassphrase: mnemonicWithPassphrase, - walletClientModel: .iphone + hostInfo: hostInfo ) } public static func babylon( isMainBDFS: Bool, - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) -> Self { newPrivateHdFactorSourceBabylonFromMnemonicWithPassphrase( isMain: isMainBDFS, mnemonicWithPassphrase: mnemonicWithPassphrase, - walletClientModel: .iphone + hostInfo: hostInfo ) } } diff --git a/apple/Sources/Sargon/Extensions/Methods/Prelude/Decimal192+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Prelude/Decimal192+Wrap+Functions.swift index b14bbaad4..09f1bfb14 100644 --- a/apple/Sources/Sargon/Extensions/Methods/Prelude/Decimal192+Wrap+Functions.swift +++ b/apple/Sources/Sargon/Extensions/Methods/Prelude/Decimal192+Wrap+Functions.swift @@ -11,8 +11,8 @@ extension Decimal192 { self = try newDecimalFromString(string: string) } - public init(_ float32: Float32) throws { - self = try newDecimalFromF32(value: float32) + public init(_ float32: Float32) { + self = newDecimalFromF32(value: float32) } public init(_ double: Double) throws { diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile+Supporting+Types/AccountForDisplay+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile+Supporting+Types/AccountForDisplay+Wrap+Functions.swift new file mode 100644 index 000000000..ef0c061b0 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile+Supporting+Types/AccountForDisplay+Wrap+Functions.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-16. +// + +import Foundation +import SargonUniFFI + +extension AccountForDisplay { + + public init(_ account: Account) { + self = newAccountForDisplayFromAccount(account: account) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/DeviceInfo+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/DeviceInfo+Wrap+Functions.swift index 42ddfb163..2e3e56b3b 100644 --- a/apple/Sources/Sargon/Extensions/Methods/Profile/DeviceInfo+Wrap+Functions.swift +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/DeviceInfo+Wrap+Functions.swift @@ -9,9 +9,6 @@ import Foundation import SargonUniFFI extension DeviceInfo { - public static func iPhone() -> Self { - newDeviceInfoIphone() - } public init(jsonData: some DataProtocol) throws { self = try newDeviceInfoFromJsonBytes(jsonBytes: Data(jsonData)) diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardFactorSource+Wrap+Functions.swift new file mode 100644 index 000000000..b81d6d971 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardFactorSource+Wrap+Functions.swift @@ -0,0 +1,29 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension ArculusCardFactorSource { + + public init( + mnemonicWithPassphrase mwp: MnemonicWithPassphrase, + hint: ArculusCardHint + ) { + self = newArculusCardFactorSourceFromMnemonicWithPassphrase( + mwp: mwp, + hint: hint + ) + } + + public init( + mnemonicWithPassphrase mwp: MnemonicWithPassphrase, + name: String + ) { + self.init(mnemonicWithPassphrase: mwp, hint: .init(name: name, model: .arculusColdStorageWallet)) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardModel+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardModel+Wrap+Functions.swift new file mode 100644 index 000000000..7bb3a32f6 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/ArculusCardModel+Wrap+Functions.swift @@ -0,0 +1,15 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension ArculusCardModel { + public func toString() -> String { + arculusCardModelToString(model: self) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/DeviceFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/DeviceFactorSource+Wrap+Functions.swift index ab6f73997..c44598851 100644 --- a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/DeviceFactorSource+Wrap+Functions.swift +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/DeviceFactorSource+Wrap+Functions.swift @@ -11,22 +11,24 @@ import SargonUniFFI extension DeviceFactorSource { public static func olympia( - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) -> Self { newDeviceFactorSourceOlympia( mnemonicWithPassphrase: mnemonicWithPassphrase, - walletClientModel: .iphone + hostInfo: hostInfo ) } public static func babylon( mnemonicWithPassphrase: MnemonicWithPassphrase, - isMain: Bool + isMain: Bool, + hostInfo: HostInfo ) -> Self { newDeviceFactorSourceBabylon( isMain: isMain, mnemonicWithPassphrase: mnemonicWithPassphrase, - walletClientModel: .iphone + hostInfo: hostInfo ) } diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/FactorSourceCommon+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/FactorSourceCommon+Wrap+Functions.swift new file mode 100644 index 000000000..a5c017e53 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/FactorSourceCommon+Wrap+Functions.swift @@ -0,0 +1,25 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-22. +// + +import Foundation +import SargonUniFFI + +extension FactorSourceCommon { + + /// Creates a new `FactorSourceCommon` with crypto parameters + /// for "Babylon" + public static func babylon(isMain: Bool = false) -> Self { + newFactorSourceCommonBdfs(isMain: isMain) + } + + /// Creates a new `FactorSourceCommon` with crypto parameters + /// for "Olympia" + public static func olympia() -> Self { + newFactorSourceCommonOlympia() + } +} + diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/LedgerHardwareWalletFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/LedgerHardwareWalletFactorSource+Wrap+Functions.swift new file mode 100644 index 000000000..b4638cd77 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/LedgerHardwareWalletFactorSource+Wrap+Functions.swift @@ -0,0 +1,23 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension LedgerHardwareWalletFactorSource { + public init( + mnemonicWithPassphrase mwp: MnemonicWithPassphrase, + hint: LedgerHardwareWalletHint, + common: FactorSourceCommon + ) { + self = newLedgerHardwareWalletFromMnemonicWithPassphrase( + mwp: mwp, + hint: hint, + common: common + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/OffDeviceMnemonicFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/OffDeviceMnemonicFactorSource+Wrap+Functions.swift new file mode 100644 index 000000000..9574dd875 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/OffDeviceMnemonicFactorSource+Wrap+Functions.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension OffDeviceMnemonicFactorSource { + public init( + mnemonicWithPassphrase mwp: MnemonicWithPassphrase, + hint: OffDeviceMnemonicHint + ) { + self = newOffDeviceMnemonicFactorSourceFromMnemonicWithPassphrase( + mwp: mwp, + hint: hint + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/SecurityQuestionsFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/SecurityQuestionsFactorSource+Wrap+Functions.swift new file mode 100644 index 000000000..e7da24b60 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/SecurityQuestionsFactorSource+Wrap+Functions.swift @@ -0,0 +1,19 @@ +import Foundation +import SargonUniFFI + + +extension SecurityQuestionsNotProductionReadyFactorSource { + public init( + mnemonic: Mnemonic, + questionsAndAnswers: [SecurityNotProductionReadyQuestionAndAnswer] + ) throws { + self = try newSecurityQuestionsFactorSourceByEncryptingMnemonic( + mnemonic: mnemonic, + with: questionsAndAnswers + ) + } + + public func decrypt(questionsAndAnswers: [SecurityNotProductionReadyQuestionAndAnswer]) throws -> Mnemonic { + try securityQuestionsFactorSourceDecrypt(factorSource: self, with: questionsAndAnswers) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/TrustedContactFactorSource+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/TrustedContactFactorSource+Wrap+Functions.swift new file mode 100644 index 000000000..e3a201f24 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Factor/TrustedContactFactorSource+Wrap+Functions.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension TrustedContactFactorSource { + public init( + accountAddress: AccountAddress, + contact: TrustedContactFactorSourceContact + ) { + self = newTrustedContactFactorSourceFromAddressAndContact( + accountAddress: accountAddress, + contact: contact + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureMetadata+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureMetadata+Wrap+Functions.swift new file mode 100644 index 000000000..fff608417 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureMetadata+Wrap+Functions.swift @@ -0,0 +1,15 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import Foundation +import SargonUniFFI + +extension SecurityStructureMetadata { + public init(name: DisplayName) { + self = newSecurityStructureMetadataNamed(name: name) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureOfFactorSources+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureOfFactorSources+Wrap+Functions.swift new file mode 100644 index 000000000..c99f02e89 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/MFA/SecurityStructureOfFactorSources+Wrap+Functions.swift @@ -0,0 +1,19 @@ +import Foundation +import SargonUniFFI + +extension SecurityStructureOfFactorSources { + public init( + metadata: SecurityStructureMetadata, + numberOfDaysUntilAutoConfirmation: UInt16, + matrixOfFactors: MatrixOfFactorSources + ) { + assert(matrixOfFactors.primaryRole.thresholdFactors.count >= matrixOfFactors.primaryRole.threshold) + assert(matrixOfFactors.recoveryRole.thresholdFactors.count >= matrixOfFactors.recoveryRole.threshold) + assert(matrixOfFactors.confirmationRole.thresholdFactors.count >= matrixOfFactors.confirmationRole.threshold) + self = newSecurityStructureOfFactorSourcesAutoInDays( + metadata: metadata, + numberOfDaysUntilAutoConfirmation: numberOfDaysUntilAutoConfirmation, + matrixOfFactors: matrixOfFactors + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Wrap+Functions.swift index 1032fabe9..000dfbe12 100644 --- a/apple/Sources/Sargon/Extensions/Methods/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Wrap+Functions.swift +++ b/apple/Sources/Sargon/Extensions/Methods/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Wrap+Functions.swift @@ -9,7 +9,7 @@ import Foundation import SargonUniFFI // PersonaDataEntryEmailAddress -> SargonStringCodable -extension PersonaDataEntryEmailAddress { +extension EmailAddress { public init(jsonStringLiteral: String) throws { self = try newPersonaDataEntryEmailAddressFromJsonString(jsonString: jsonStringLiteral) } diff --git a/apple/Sources/Sargon/Extensions/Methods/RadixConnect/Mobile/RadixConnectMobile.swift b/apple/Sources/Sargon/Extensions/Methods/RadixConnect/Mobile/RadixConnectMobile.swift index fdceed4cd..8e0787542 100644 --- a/apple/Sources/Sargon/Extensions/Methods/RadixConnect/Mobile/RadixConnectMobile.swift +++ b/apple/Sources/Sargon/Extensions/Methods/RadixConnect/Mobile/RadixConnectMobile.swift @@ -3,6 +3,6 @@ import SargonUniFFI extension RadixConnectMobile { public static func live(sessionStorage: any RadixConnectMobileSessionStorage) -> RadixConnectMobile { - RadixConnectMobile(networkAntenna: URLSession.shared, sessionStorage: sessionStorage) + RadixConnectMobile(networkingDriver: URLSession.shared, sessionStorage: sessionStorage) } } diff --git a/apple/Sources/Sargon/Extensions/Methods/System/Drivers/NetworkMethod+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/System/Drivers/NetworkMethod+Wrap+Functions.swift new file mode 100644 index 000000000..d05aa8a6e --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/System/Drivers/NetworkMethod+Wrap+Functions.swift @@ -0,0 +1,8 @@ +import Foundation +import SargonUniFFI + +extension NetworkMethod { + public func toString() -> String { + networkMethodToString(method: self) + } +} diff --git a/apple/Sources/Sargon/Extensions/Methods/System/Event/EventKind+Wrap+Functions.swift b/apple/Sources/Sargon/Extensions/Methods/System/Event/EventKind+Wrap+Functions.swift new file mode 100644 index 000000000..2bc465cb1 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Methods/System/Event/EventKind+Wrap+Functions.swift @@ -0,0 +1,25 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-24. +// + +import Foundation +import SargonUniFFI + +extension EventKind { + public static let allCases: [Self] = eventKindAll() + + public var affectsCurrentAccounts: Bool { + eventKindAffectsCurrentAccounts(eventKind: self) + } + + public var affectsCurrentNetwork: Bool { + eventKindAffectsCurrentNetwork(eventKind: self) + } + + public var affectsSavedGateways: Bool { + eventKindAffectsSavedGateways(eventKind: self) + } +} diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Crypto/Derivation/BIP39/Mnemonic+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Crypto/Derivation/BIP39/Mnemonic+SampleValues.swift index 3ebf7ca3f..f97ea9d8d 100644 --- a/apple/Sources/Sargon/Extensions/SampleValues/Crypto/Derivation/BIP39/Mnemonic+SampleValues.swift +++ b/apple/Sources/Sargon/Extensions/SampleValues/Crypto/Derivation/BIP39/Mnemonic+SampleValues.swift @@ -4,7 +4,35 @@ import SargonUniFFI extension Mnemonic { public static let sample: Self = newMnemonicSample() public static let sampleOther: Self = newMnemonicSampleOther() - + + public static let sampleDevice: Self = newMnemonicSampleDevice() + public static let sampleDeviceOther: Self = newMnemonicSampleDeviceOther() + public static let sampleDevice12Words: Self = newMnemonicSampleDevice12Words() + public static let sampleDevice12WordsOther: Self = newMnemonicSampleDevice12WordsOther() + public static let sampleLedger: Self = newMnemonicSampleLedger() + public static let sampleLedgerOther: Self = newMnemonicSampleLedgerOther() + public static let sampleArculus: Self = newMnemonicSampleArculus() + public static let sampleArculusOther: Self = newMnemonicSampleArculusOther() + public static let sampleOffDeviceMnemonic: Self = newMnemonicSampleOffDevice() + public static let sampleOffDeviceMnemonicOther: Self = newMnemonicSampleOffDeviceOther() + public static let sampleSecurityQuestions: Self = newMnemonicSampleSecurityQuestions() + public static let sampleSecurityQuestionsOther: Self = newMnemonicSampleSecurityQuestionsOther() + public static let sample24ZooVote: Self = try! Self(phrase: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote") + + public static let sampleValues: [Self] = [ + .sampleDevice, + .sampleDeviceOther, + .sampleDevice12Words, + .sampleDevice12WordsOther, + .sampleLedger, + .sampleLedgerOther, + .sampleArculus, + .sampleArculusOther, + .sampleOffDeviceMnemonic, + .sampleOffDeviceMnemonicOther, + .sampleSecurityQuestions, + .sampleSecurityQuestionsOther + ] } #endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/ArculusCardFactorSource+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/ArculusCardFactorSource+SampleValues.swift new file mode 100644 index 000000000..125746699 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/ArculusCardFactorSource+SampleValues.swift @@ -0,0 +1,18 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-28. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension ArculusCardFactorSource { + public static let sample: Self = newArculusCardFactorSourceSample() + + public static let sampleOther: Self = newArculusCardFactorSourceSampleOther() +} + +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/FactorSourceCommon+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/FactorSourceCommon+SampleValues.swift new file mode 100644 index 000000000..c74c3c06b --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/FactorSourceCommon+SampleValues.swift @@ -0,0 +1,9 @@ +import Foundation +import SargonUniFFI + +#if DEBUG +extension FactorSourceCommon { + public static let sample: Self = newFactorSourceCommonSample() + public static let sampleOther: Self = newFactorSourceCommonSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+SampleValues.swift new file mode 100644 index 000000000..23237da18 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+SampleValues.swift @@ -0,0 +1,18 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-28. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension OffDeviceMnemonicFactorSource { + public static let sample: Self = newOffDeviceMnemonicFactorSourceSample() + + public static let sampleOther: Self = newOffDeviceMnemonicFactorSourceSampleOther() +} + +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+SampleValues.swift new file mode 100644 index 000000000..81ed6541f --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+SampleValues.swift @@ -0,0 +1,10 @@ +import Foundation +import SargonUniFFI + +#if DEBUG +extension SecurityQuestionsNotProductionReadyFactorSource { + public static let sample: Self = newSecurityQuestionsFactorSourceSample() + public static let sampleOther: Self = newSecurityQuestionsFactorSourceSampleOther() +} + +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSource+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSource+SampleValues.swift new file mode 100644 index 000000000..b510cbd6c --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSource+SampleValues.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-22. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension TrustedContactFactorSource { + public static let sample: Self = newTrustedContactFactorSourceSample() + public static let sampleOther: Self = newTrustedContactFactorSourceSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSourceContact+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSourceContact+SampleValues.swift new file mode 100644 index 000000000..52a5be388 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Factor/FactorSource/TrustedContactFactorSourceContact+SampleValues.swift @@ -0,0 +1,25 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-28. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension EmailAddress { + public static let sample: Self = newEmailAddressSample() + public static let sampleOther: Self = newEmailAddressSampleOther() +} +#endif // DEBUG + +#if DEBUG +extension TrustedContactFactorSourceContact { + // FIXME replace with Sargon ones + public static let sample: Self = newTrustedContactFactorSourceContactSample() + public static let sampleOther: Self = newTrustedContactFactorSourceContactSampleOther() +} + +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/MatrixOfFactorSources+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/MatrixOfFactorSources+SampleValues.swift new file mode 100644 index 000000000..d47e03ad1 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/MatrixOfFactorSources+SampleValues.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-19. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension MatrixOfFactorSources { + public static let sample: Self = newMatrixOfFactorSourcesSample() + public static let sampleOther: Self = newMatrixOfFactorSourcesSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureMetadata+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureMetadata+SampleValues.swift new file mode 100644 index 000000000..9641fc20e --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureMetadata+SampleValues.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-19. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension SecurityStructureMetadata { + public static let sample: Self = newSecurityStructureMetadataSample() + public static let sampleOther: Self = newSecurityStructureMetadataSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSourceIDs+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSourceIDs+SampleValues.swift new file mode 100644 index 000000000..7f6d0c093 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSourceIDs+SampleValues.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-19. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension SecurityStructureOfFactorSourceIDs { + public static let sample: Self = newSecurityStructureOfFactorSourceIdsSample() + public static let sampleOther: Self = newSecurityStructureOfFactorSourceIdsSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSources+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSources+SampleValues.swift new file mode 100644 index 000000000..bab636d5a --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/Profile/MFA/SecurityStructureOfFactorSources+SampleValues.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-19. +// + +import Foundation +import SargonUniFFI + +#if DEBUG +extension SecurityStructureOfFactorSources { + public static let sample: Self = newSecurityStructureOfFactorSourcesSample() + public static let sampleOther: Self = newSecurityStructureOfFactorSourcesSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+SampleValues.swift deleted file mode 100644 index f917a259e..000000000 --- a/apple/Sources/Sargon/Extensions/SampleValues/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+SampleValues.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation -import SargonUniFFI - -#if DEBUG -extension PersonaDataEntryEmailAddress { - public static let sample: Self = newPersonaDataEntryEmailAddressSample() - public static let sampleOther: Self = newPersonaDataEntryEmailAddressSampleOther() -} -#endif diff --git a/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostInfo+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostInfo+SampleValues.swift new file mode 100644 index 000000000..637647cd6 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostInfo+SampleValues.swift @@ -0,0 +1,9 @@ +import Foundation +import SargonUniFFI + +#if DEBUG +extension HostInfo { + public static let sample: Self = newHostInfoSample() + public static let sampleOther: Self = newHostInfoSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostOS+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostOS+SampleValues.swift new file mode 100644 index 000000000..fc26cd7e0 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/HostOS+SampleValues.swift @@ -0,0 +1,10 @@ +import Foundation +import SargonUniFFI + +#if DEBUG +extension HostOs { + public static let sample: Self = newHostOsSample() + public static let sampleOther: Self = newHostOsSampleOther() +} +#endif // DEBUG + diff --git a/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/NetworkMethod+SampleValues.swift b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/NetworkMethod+SampleValues.swift new file mode 100644 index 000000000..ac60a02f2 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/SampleValues/System/Drivers/NetworkMethod+SampleValues.swift @@ -0,0 +1,9 @@ +import Foundation +import SargonUniFFI + +#if DEBUG +extension NetworkMethod { + public static let sample: Self = newNetworkMethodSample() + public static let sampleOther: Self = newNetworkMethodSampleOther() +} +#endif // DEBUG diff --git a/apple/Sources/Sargon/Antennas/Network/GatewayClient+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Clients/GatewayClient+Swiftified.swift similarity index 62% rename from apple/Sources/Sargon/Antennas/Network/GatewayClient+Swiftified.swift rename to apple/Sources/Sargon/Extensions/Swiftified/Clients/GatewayClient+Swiftified.swift index 0448aee73..f78f5f5cc 100644 --- a/apple/Sources/Sargon/Antennas/Network/GatewayClient+Swiftified.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Clients/GatewayClient+Swiftified.swift @@ -3,6 +3,6 @@ import SargonUniFFI extension GatewayClient { public convenience init(networkID: NetworkID) { - self.init(networkAntenna: URLSession.shared, networkId: networkID) + self.init(networkingDriver: URLSession.shared, networkId: networkID) } } diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Prelude/SargonError+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Prelude/SargonError+Swiftified.swift index 52032f2d1..cca645422 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Prelude/SargonError+Swiftified.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Prelude/SargonError+Swiftified.swift @@ -21,16 +21,13 @@ extension SargonError: LocalizedError { public var errorDescription: String? { let errorCodeFormatted = "Error code: \(errorCode)" + var errorMessageFormatted: String? #if DEBUG - let isSafeToShowErrorMessage = true - #else - let isSafeToShowErrorMessage = isSafeToShowErrorMessageFromError(error: self) + errorMessageFormatted = "Error message: \(errorMessage)" #endif - let errorMessageFormatted: String? = isSafeToShowErrorMessage ? "Error message: \(errorMessage)" : nil - return [errorCodeFormatted, errorMessageFormatted] .compactMap { $0 } .joined(separator: "\n") } -} \ No newline at end of file +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile+Supporting+Types/AccountForDisplay+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile+Supporting+Types/AccountForDisplay+Swiftified.swift index fea5817d3..e26dd3693 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Profile+Supporting+Types/AccountForDisplay+Swiftified.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile+Supporting+Types/AccountForDisplay+Swiftified.swift @@ -15,4 +15,5 @@ extension AccountForDisplay: Identifiable { public var id: ID { address } + } diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/ArculusCardFactorSource+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/ArculusCardFactorSource+Swiftified.swift new file mode 100644 index 000000000..4670f1723 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/ArculusCardFactorSource+Swiftified.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-14. +// + +import Foundation +import SargonUniFFI + +extension ArculusCardModel: CustomStringConvertible { + public var description: String { + toString() + } +} + +extension ArculusCardFactorSource: SargonModel {} +extension ArculusCardFactorSource: Identifiable { + public typealias ID = FactorSourceIDFromHash +} + +extension ArculusCardFactorSource: FactorSourceProtocol { + public static let kind: FactorSourceKind = .arculusCard + + public static func extract(from someFactorSource: some BaseFactorSourceProtocol) -> Self? { + guard case let .arculusCard(factorSource) = someFactorSource.asGeneral else { return nil } + return factorSource + } + + public var asGeneral: FactorSource { + .arculusCard(value: self) + } + + public var factorSourceID: FactorSourceID { + id.asGeneral + } + + public var factorSourceKind: FactorSourceKind { + .arculusCard + } + + public var supportsOlympia: Bool { asGeneral.supportsOlympia } + public var supportsBabylon: Bool { asGeneral.supportsBabylon } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSource+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSource+Swiftified.swift index 02675a3c0..02ec0ced7 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSource+Swiftified.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSource+Swiftified.swift @@ -6,7 +6,6 @@ extension FactorSource: CustomStringConvertible { public var description: String { toString() } - } extension FactorSource: Identifiable { @@ -14,7 +13,11 @@ extension FactorSource: Identifiable { public var id: ID { switch self { case let .device(value): value.id.asGeneral + case let .arculusCard(value): value.id.asGeneral + case let .securityQuestions(value): value.id.asGeneral case let .ledger(value): value.id.asGeneral + case let .offDeviceMnemonic(value): value.id.asGeneral + case let .trustedContact(value): value.id.asGeneral } } } @@ -28,6 +31,10 @@ extension FactorSource: BaseFactorSourceProtocol { switch self { case let .device(value): value.factorSourceKind case let .ledger(value): value.factorSourceKind + case let .securityQuestions(value): value.factorSourceKind + case let .arculusCard(value): value.factorSourceKind + case let .offDeviceMnemonic(value): value.factorSourceKind + case let .trustedContact(value): value.factorSourceKind } } @@ -36,6 +43,10 @@ extension FactorSource: BaseFactorSourceProtocol { switch self { case let .device(value): value.common case let .ledger(value): value.common + case let .securityQuestions(value): value.common + case let .arculusCard(value): value.common + case let .offDeviceMnemonic(value): value.common + case let .trustedContact(value): value.common } } set { @@ -46,6 +57,18 @@ extension FactorSource: BaseFactorSourceProtocol { case var .ledger(source): source.common = newValue self = .ledger(value: source) + case var .offDeviceMnemonic(source): + source.common = newValue + self = .offDeviceMnemonic(value: source) + case var .arculusCard(source): + source.common = newValue + self = .arculusCard(value: source) + case var .securityQuestions(source): + source.common = newValue + self = .securityQuestions(value: source) + case var .trustedContact(source): + source.common = newValue + self = .trustedContact(value: source) } } } @@ -71,4 +94,22 @@ extension FactorSource: BaseFactorSourceProtocol { public let actualKind: FactorSourceKind } + public var asDevice: DeviceFactorSource? { + extract() + } + public var asLedger: LedgerHardwareWalletFactorSource? { + extract() + } + public var asArculus: ArculusCardFactorSource? { + extract() + } + public var asOffDeviceMnemonic: OffDeviceMnemonicFactorSource? { + extract() + } + public var asSecurityQuestions: SecurityQuestionsNotProductionReadyFactorSource? { + extract() + } + public var asTrustedContact: TrustedContactFactorSource? { + extract() + } } diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceCommon+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceCommon+Swiftified.swift new file mode 100644 index 000000000..da6fa2690 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceCommon+Swiftified.swift @@ -0,0 +1,11 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-02. +// + +import Foundation +import SargonUniFFI + +extension FactorSourceCommon: SargonModel {} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceProtocol.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceProtocol.swift index 1773a4cfe..a233392e9 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceProtocol.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/FactorSourceProtocol.swift @@ -49,3 +49,6 @@ public protocol FactorSourceProtocol: BaseFactorSourceProtocol { static var kind: FactorSourceKind { get } static func extract(from: some BaseFactorSourceProtocol) -> Self? } +extension FactorSourceProtocol { + public var factorSourceKind: FactorSourceKind { Self.kind } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+Swiftified.swift new file mode 100644 index 000000000..06247513d --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/OffDeviceMnemonicFactorSource+Swiftified.swift @@ -0,0 +1,38 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-14. +// + +import Foundation +import SargonUniFFI + +extension OffDeviceMnemonicFactorSource: SargonModel {} +extension OffDeviceMnemonicFactorSource: Identifiable { + public typealias ID = FactorSourceIDFromHash +} + +extension OffDeviceMnemonicFactorSource: FactorSourceProtocol { + public static let kind: FactorSourceKind = .offDeviceMnemonic + + public static func extract(from someFactorSource: some BaseFactorSourceProtocol) -> Self? { + guard case let .offDeviceMnemonic(factorSource) = someFactorSource.asGeneral else { return nil } + return factorSource + } + + public var asGeneral: FactorSource { + .offDeviceMnemonic(value: self) + } + + public var factorSourceID: FactorSourceID { + id.asGeneral + } + + public var factorSourceKind: FactorSourceKind { + .offDeviceMnemonic + } + + public var supportsOlympia: Bool { asGeneral.supportsOlympia } + public var supportsBabylon: Bool { asGeneral.supportsBabylon } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+Swiftified.swift new file mode 100644 index 000000000..b55832b9c --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/SecurityQuestionsFactorSource+Swiftified.swift @@ -0,0 +1,34 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-14. +// + +import Foundation +import SargonUniFFI + +extension SecurityQuestionsNotProductionReadyFactorSource: SargonModel {} +extension SecurityQuestionsNotProductionReadyFactorSource: Identifiable { + public typealias ID = FactorSourceIDFromHash +} + +extension SecurityQuestionsNotProductionReadyFactorSource: FactorSourceProtocol { + public static let kind: FactorSourceKind = .securityQuestions + + public static func extract(from someFactorSource: some BaseFactorSourceProtocol) -> Self? { + guard case let .securityQuestions(factorSource) = someFactorSource.asGeneral else { return nil } + return factorSource + } + + public var asGeneral: FactorSource { + .securityQuestions(value: self) + } + + public var factorSourceID: FactorSourceID { + id.asGeneral + } + + public var supportsOlympia: Bool { asGeneral.supportsOlympia } + public var supportsBabylon: Bool { asGeneral.supportsBabylon } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/TrustedContactFactorSource+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/TrustedContactFactorSource+Swiftified.swift new file mode 100644 index 000000000..e85917e84 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Factor/FactorSource/TrustedContactFactorSource+Swiftified.swift @@ -0,0 +1,38 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-14. +// + +import Foundation +import SargonUniFFI + +extension TrustedContactFactorSource: SargonModel {} +extension TrustedContactFactorSource: Identifiable { + public typealias ID = FactorSourceIDFromAddress +} + +extension TrustedContactFactorSource: FactorSourceProtocol { + public static let kind: FactorSourceKind = .trustedContact + + public static func extract(from someFactorSource: some BaseFactorSourceProtocol) -> Self? { + guard case let .trustedContact(factorSource) = someFactorSource.asGeneral else { return nil } + return factorSource + } + + public var asGeneral: FactorSource { + .trustedContact(value: self) + } + + public var factorSourceID: FactorSourceID { + id.asGeneral + } + + public var factorSourceKind: FactorSourceKind { + .trustedContact + } + + public var supportsOlympia: Bool { asGeneral.supportsOlympia } + public var supportsBabylon: Bool { asGeneral.supportsBabylon } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/MatrixOfFactorSources+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/MatrixOfFactorSources+Swiftified.swift new file mode 100644 index 000000000..53e577dbb --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/MatrixOfFactorSources+Swiftified.swift @@ -0,0 +1,11 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import Foundation +import SargonUniFFI + +extension MatrixOfFactorSources: SargonModel {} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureMetadata+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureMetadata+Swiftified.swift new file mode 100644 index 000000000..b1b308675 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureMetadata+Swiftified.swift @@ -0,0 +1,7 @@ +import Foundation +import SargonUniFFI + +extension SecurityStructureMetadata: SargonModel {} +extension SecurityStructureMetadata: Identifiable { + public typealias ID = UUID +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSourceIDs+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSourceIDs+Swiftified.swift new file mode 100644 index 000000000..08653c012 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSourceIDs+Swiftified.swift @@ -0,0 +1,10 @@ +import Foundation +import SargonUniFFI + +extension SecurityStructureOfFactorSourceIDs: SargonModel {} +extension SecurityStructureOfFactorSourceIDs: Identifiable { + public typealias ID = UUID + public var id: ID { + metadata.id + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSources+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSources+Swiftified.swift new file mode 100644 index 000000000..d8cbd158b --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/MFA/SecurityStructureOfFactorSources+Swiftified.swift @@ -0,0 +1,10 @@ +import Foundation +import SargonUniFFI + +extension SecurityStructureOfFactorSources: SargonModel {} +extension SecurityStructureOfFactorSources: Identifiable { + public typealias ID = UUID + public var id: ID { + metadata.id + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaData+Entry.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaData+Entry.swift index 62528b399..ad693c57d 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaData+Entry.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaData+Entry.swift @@ -17,7 +17,7 @@ extension PersonaData { CustomStringConvertible { case name(PersonaDataEntryName) - case emailAddress(PersonaDataEntryEmailAddress) + case emailAddress(EmailAddress) case phoneNumber(PersonaDataEntryPhoneNumber) } } diff --git a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Swiftified.swift index c11574414..12fed23dd 100644 --- a/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Swiftified.swift +++ b/apple/Sources/Sargon/Extensions/Swiftified/Profile/Persona/PersonaData/PersonaDataEntryEmailAddress+Swiftified.swift @@ -8,16 +8,17 @@ import Foundation import SargonUniFFI -extension PersonaDataEntryEmailAddress: SargonModel {} -extension PersonaDataEntryEmailAddress: SargonStringCodable {} -extension PersonaDataEntryEmailAddress: CustomStringConvertible { +public typealias PersonaDataEntryEmailAddress = EmailAddress +extension EmailAddress: SargonModel {} +extension EmailAddress: SargonStringCodable {} +extension EmailAddress: CustomStringConvertible { public var description: String { email } } -// MARK: - PersonaDataEntryEmailAddress + PersonaDataEntryProtocol -extension PersonaDataEntryEmailAddress: PersonaDataEntryProtocol { +// MARK: - EmailAddress + PersonaDataEntryProtocol +extension EmailAddress: PersonaDataEntryProtocol { public static var kind: PersonaData.Entry.Kind { .emailAddress } diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/BIOS/BIOS+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/BIOS/BIOS+Swiftified.swift new file mode 100644 index 000000000..e4fdd865f --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/BIOS/BIOS+Swiftified.swift @@ -0,0 +1,31 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +public typealias BIOS = Bios +extension BIOS: @unchecked Sendable {} + +extension BIOS { + + public convenience init( + bundle: Bundle, + userDefaultsSuite: String, + secureStorageDriver: SecureStorageDriver + ) { + let drivers = Drivers( + bundle: bundle, + userDefaultsSuite: userDefaultsSuite, + secureStorageDriver: secureStorageDriver + ) + // https://en.wikipedia.org/wiki/Power-on_self-test + log.info("📬 BIOS POST (Power-On Self Test)") + + self.init(drivers: drivers) + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Drivers+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Drivers+Swiftified.swift new file mode 100644 index 000000000..6c12af031 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Drivers+Swiftified.swift @@ -0,0 +1,61 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + + +extension Drivers: @unchecked Sendable {} + + +extension Drivers { + public convenience init( + bundle: Bundle, + userDefaultsSuite: String, + secureStorageDriver: SecureStorageDriver + ) { + self.init( + appVersion: (bundle.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "Unknown", + userDefaultsSuite: userDefaultsSuite, + secureStorageDriver: secureStorageDriver + ) + } + + public convenience init( + appVersion: String, + userDefaultsSuite: String, + secureStorageDriver: SecureStorageDriver + ) { + self.init( + secureStorage: secureStorageDriver, + hostInfo: AppleHostInfoDriver(appVersion: appVersion), + unsafeStorage: UnsafeStorage( + userDefaults: .init(suiteName: userDefaultsSuite)! + ) + ) + } +} + +extension Drivers { + + public convenience init( + secureStorage: SecureStorageDriver, + hostInfo: HostInfoDriver, + unsafeStorage: UnsafeStorage + ) { + self.init( + networking: .shared, + secureStorage: secureStorage, + entropyProvider: .shared, + hostInfo: hostInfo, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: unsafeStorage + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/HostOS+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/HostOS+Swiftified.swift new file mode 100644 index 000000000..bd7d40fae --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/HostOS+Swiftified.swift @@ -0,0 +1,28 @@ +// +// File.swift +// +// +// Created by Michael Bakogiannis on 24/7/24. +// + +import Foundation + +extension HostOs: SargonModel {} + +extension HostOs { + public static func ios(version: String) -> HostOs { + newHostOsIos(version: version) + } + + public func name() -> String { + hostOsGetName(hostOs: self) + } + + public func version() -> String { + hostOsGetVersion(hostOs: self) + } + + public func vendor() -> String { + hostOsGetVendor(hostOs: self) + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkMethod+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkMethod+Swiftified.swift new file mode 100644 index 000000000..9de356d34 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkMethod+Swiftified.swift @@ -0,0 +1,9 @@ +import Foundation +import SargonUniFFI + +extension NetworkMethod: SargonModel {} +extension NetworkMethod: CustomStringConvertible { + public var description: String { + toString() + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+Swiftified.swift new file mode 100644 index 000000000..d072c4d9f --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+Swiftified.swift @@ -0,0 +1,37 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-13. +// + +import Foundation +import SargonUniFFI + +extension URL { + public init(validating string: String) throws { + guard let url = Self.init(string: string) else { + throw SargonError.InvalidUrl(badValue: string) + } + self = url + } +} + +extension NetworkRequest { + public init( + validating urlString: String, + method: NetworkMethod, + headers: [String: String] = [:], + body: Data = .init() + ) throws { + let url = try URL( + validating: urlString + ) + self.init( + url: url, + method: method, + headers: headers, + body: body + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+URLRequest+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+URLRequest+Swiftified.swift new file mode 100644 index 000000000..8d7cfd4db --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkRequest+URLRequest+Swiftified.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +extension URLRequest { + init(sargon: NetworkRequest) { + var request = URLRequest(url: sargon.url) + request.httpMethod = sargon.method.toString() + request.httpBody = sargon.body + request.allHTTPHeaderFields = sargon.headers + self = request + } +} + + diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkResponse+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkResponse+Swiftified.swift new file mode 100644 index 000000000..755426a66 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Drivers/Networking/NetworkResponse+Swiftified.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + +extension NetworkResponse { + init(response: (Data, URLResponse)) throws { + guard let httpURLResponse = response.1 as? HTTPURLResponse else { + throw SargonError.NetworkRequestGenericFailure( + underlying: "Failed to cast to HTTPURLResponse") + } + self.init( + statusCode: UInt16(httpURLResponse.statusCode), + body: response.0 + ) + } +} diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/Event/EventKind+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/Event/EventKind+Swiftified.swift new file mode 100644 index 000000000..4fd3f5354 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/Event/EventKind+Swiftified.swift @@ -0,0 +1,16 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-24. +// + +import Foundation +import SargonUniFFI + +extension EventKind: SargonModel { + public static let sample: Self = .accountAdded + public static let sampleOther: Self = .accountUpdated +} +extension EventKind: CaseIterable {} + diff --git a/apple/Sources/Sargon/Extensions/Swiftified/System/SargonOS+Swiftified.swift b/apple/Sources/Sargon/Extensions/Swiftified/System/SargonOS+Swiftified.swift new file mode 100644 index 000000000..c88e86ac0 --- /dev/null +++ b/apple/Sources/Sargon/Extensions/Swiftified/System/SargonOS+Swiftified.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-03. +// + +import Foundation +import SargonUniFFI + + +public typealias SargonOS = SargonOs + +extension SargonOS: @unchecked Sendable {} + +extension SargonOS { + + @available(*, deprecated, message: "SHOULD migrate to use more specialized methods on SargonOS instead, e.g. `createAndSaveNewAccount` - SargonOS should be the SOLE object to perform the mutation and persisting.") + public func saveChangedProfile(_ profile: Profile) async throws { + try await deprecatedSaveFfiChangedProfile(profile: profile) + } +} diff --git a/apple/Sources/Sargon/SargonOS/BIOS+Static+Shared.swift b/apple/Sources/Sargon/SargonOS/BIOS+Static+Shared.swift new file mode 100644 index 000000000..d22df5af2 --- /dev/null +++ b/apple/Sources/Sargon/SargonOS/BIOS+Static+Shared.swift @@ -0,0 +1,58 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +extension BIOS { + + public nonisolated(unsafe) static var shared: BIOS { + guard let shared = Self._shared else { + fatalError("BIOS not created, create it with `BIOS.creatingShared:drivers`") + } + return shared + } + + /// Can be access later with `OS.shared` + @discardableResult + public static func creatingShared( + drivers: Drivers + ) -> BIOS { + Self._creatingShared(drivers: drivers, isEmulatingFreshInstall: false) + } + +} + +extension BIOS { + private nonisolated(unsafe) static var _shared: BIOS! + + /// Can be access later with `OS.shared` + @discardableResult + public static func _creatingShared( + drivers: Drivers, + isEmulatingFreshInstall: Bool + ) -> BIOS { + Self.settingShared( + shared: BIOS(drivers: drivers), + isEmulatingFreshInstall: isEmulatingFreshInstall + ) + } + + /// Can be access later with `OS.shared` + @discardableResult + internal static func settingShared( + shared: BIOS, + isEmulatingFreshInstall: Bool = false + ) -> BIOS { + if !isEmulatingFreshInstall { + assert(_shared == nil, "Should not be created twice") + } + Self._shared = shared + setRustLogLevel(.debug) + return shared + } +} diff --git a/apple/Sources/Sargon/SargonOS/SargonOS+SargonOSProtocol.swift b/apple/Sources/Sargon/SargonOS/SargonOS+SargonOSProtocol.swift new file mode 100644 index 000000000..ac6b02981 --- /dev/null +++ b/apple/Sources/Sargon/SargonOS/SargonOS+SargonOSProtocol.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation + +extension SargonOS: SargonOSProtocol { + public var os: SargonOS { self } +} + +// MARK: SargonOSProtocol Conformance +extension SargonOS { + + @discardableResult + public func createAccount( + named accountName: DisplayName + ) async throws -> Account { + try await createAndSaveNewAccount(networkId: currentNetworkID, name: accountName) + } + +} diff --git a/apple/Sources/Sargon/SargonOS/SargonOS+Static+Shared.swift b/apple/Sources/Sargon/SargonOS/SargonOS+Static+Shared.swift new file mode 100644 index 000000000..697dc0184 --- /dev/null +++ b/apple/Sources/Sargon/SargonOS/SargonOS+Static+Shared.swift @@ -0,0 +1,58 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +struct SargonOSAlreadyBooted: LocalizedError { + var errorDescription: String? { + "Radix Wallet core already initialized, should not have been initialized twice. This is a Radix developer error." + } +} + +extension SargonOS { + + public nonisolated(unsafe) static var shared: SargonOS { + guard let shared = Self._shared else { + fatalError("`SargonOS.shared` not created, create it with `SargonOS.creatingShared:bootingWith` and pass it a `BIOS`.") + } + return shared + } + + /// Can be access later with `OS.shared` + @discardableResult + public static func creatingShared( + bootingWith bios: BIOS + ) async throws -> SargonOS { + try await _creatingShared( + bootingWith: bios, + isEmulatingFreshInstall: false + ) + } + +} + +extension SargonOS { + + /// Can be access later with `OS.shared` + @discardableResult + internal static func _creatingShared( + bootingWith bios: BIOS, + isEmulatingFreshInstall: Bool + ) async throws -> SargonOS { + if !isEmulatingFreshInstall, _shared != nil { + throw SargonOSAlreadyBooted() + } + let shared = try await SargonOS.boot(bios: bios) + Self._shared = shared + return shared + } + + internal nonisolated(unsafe) static var _shared: SargonOS! + +} + diff --git a/apple/Sources/Sargon/SargonOS/SargonOSProtocol.swift b/apple/Sources/Sargon/SargonOS/SargonOSProtocol.swift new file mode 100644 index 000000000..751745782 --- /dev/null +++ b/apple/Sources/Sargon/SargonOS/SargonOSProtocol.swift @@ -0,0 +1,59 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +/// A protocol enabling us to write `TestOS` +public protocol SargonOSProtocol { + var os: SargonOS { get } + + func createAccount( + named accountName: DisplayName + ) async throws -> Account +} + +// MARK: Forward calls to `os` +extension SargonOSProtocol { + + public func createAccount( + named accountName: DisplayName + ) async throws -> Account { + try await os.createAccount(named: accountName) + } +} + +// MARK: Extensions +extension SargonOSProtocol { + + @available(*, deprecated, message: "SHOULD migrate to use more specialized access methods on SargonOS instead, e.g. `accountsOnCurrentNetwork`.") + public var profile: Profile { + os.profile() + } + + public var currentNetworkID: NetworkID { + os.currentNetworkId() + } + + public var gateways: SavedGateways { + os.gateways() + } + + @available(*, deprecated, message: "Consider using faster `accountsForDisplayOnCurrentNetwork` and follow up with ") + public var accountsOnCurrentNetwork: [Account] { + os.accountsOnCurrentNetwork() + } + + public var accountsForDisplayOnCurrentNetwork: [AccountForDisplay] { + os.accountsForDisplayOnCurrentNetwork() + } + + public func accountByAddress(_ address: AccountAddress) throws -> Account { + try os.accountByAddress(address: address) + } + +} diff --git a/apple/Sources/Sargon/SargonOS/TestOS.swift b/apple/Sources/Sargon/SargonOS/TestOS.swift new file mode 100644 index 000000000..3205db798 --- /dev/null +++ b/apple/Sources/Sargon/SargonOS/TestOS.swift @@ -0,0 +1,82 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import SargonUniFFI + +#if DEBUG + +extension BIOS { + public static func test( + bundle: Bundle = .main, + userDefaultsSuite: String = "Test", + secureStorageDriver: SecureStorageDriver + ) -> BIOS { + BIOS( + bundle: bundle, + userDefaultsSuite: userDefaultsSuite, + secureStorageDriver: secureStorageDriver + ) + } +} + +public final class TestOS { + public let os: SargonOS + + public init(os: SargonOS) { + self.os = os + } + + public convenience init(bios: BIOS) async throws { + let os = try await SargonOS.boot(bios: bios) + self.init(os: os) + } + + +} +extension TestOS: SargonOSProtocol {} + +// MARK: Private +extension TestOS { + private func nextAccountName() -> DisplayName { + let index = accountsForDisplayOnCurrentNetwork.count + return DisplayName(value: "Unnamed \(index)") + } +} + +// MARK: Public +extension TestOS { + + @discardableResult + public func createAccount( + named name: String? = nil + ) async throws -> Self { + + let accountName = try name.map { + try DisplayName( + validating: $0 + ) + } ?? nextAccountName() + + let _ = try await os.createAccount( + named: accountName + ) + return self + } + + @discardableResult + public func batchCreateAccounts( + count: UInt16, + namePrefix: DisplayName + ) async throws -> Self { + let _ = try await os.batchCreateManyAccountsThenSaveOnce(count: count, networkId: currentNetworkID, namePrefix: namePrefix.value) + return self + } +} + + +#endif // DEBUG diff --git a/apple/Tests/IntegrationTests/DriversTests/AppleHostInfoDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/AppleHostInfoDriverTests.swift new file mode 100644 index 000000000..f82869bbe --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/AppleHostInfoDriverTests.swift @@ -0,0 +1,39 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +private let appVersion = "0.0.0" +extension AppleHostInfoDriver { + init() { + self.init(appVersion: appVersion) + } +} + +class AppleHostInfoDriverTests: DriverTest { + + func test_app_version() async throws { + let sut = SUT() + let info = await sut.hostAppVersion() + XCTAssertEqual(info, appVersion) + } + + func test_device_name_not_empty() async throws { + let sut = SUT() + let info = await sut.hostDeviceName() + XCTAssertFalse(info.isEmpty) + } + + func test_device_os_name_not_empty() async throws { + let sut = SUT() + let info = await sut.hostOs() + XCTAssertFalse(info.name().isEmpty) + } + + func test_device_model_not_empty() async throws { + let sut = SUT() + let info = await sut.hostDeviceModel() + XCTAssertFalse(info.isEmpty) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/DriversTests.swift b/apple/Tests/IntegrationTests/DriversTests/DriversTests.swift new file mode 100644 index 000000000..22da9576a --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/DriversTests.swift @@ -0,0 +1,34 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + + +#if DEBUG +extension Drivers { + public static func test() -> Drivers { + Drivers( + appVersion: "0.0.1", + userDefaultsSuite: "works.rdx", + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage( + keychainService: "test" + ) + ) + } + +} +#endif + + +final class DriversTests: TestCase { + typealias SUT = Drivers + + func test_log_at_each_level() { + rustLoggerLogAtEveryLevel() + } + + func test_bios_insecure() async throws { + let _ = try await SargonOS.boot(bios: BIOS.insecure()) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/EntropyProviderDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/EntropyProviderDriverTests.swift new file mode 100644 index 000000000..ad38b2586 --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/EntropyProviderDriverTests.swift @@ -0,0 +1,22 @@ +import CustomDump +import Foundation +@testable import Sargon +import SargonUniFFI +import XCTest + +class EntropyProviderDriverTests: DriverTest { + + func test() { + let sut = SUT() + let n = 10 + XCTAssertEqual( + Set((0.. { + + func test() async throws { + let sut = SUT() + + let expectedEvents = Array([.booted, .profileSaved, .factorSourceUpdated, .accountAdded, .profileSaved]) + let task = Task { + var notifications = Set() + for await notification in await sut.notifications().prefix(expectedEvents.count) { + notifications.insert(notification) + } + return notifications + } + + let bios = BIOS(drivers: .withEventBus(sut)) + let os = try await TestOS(bios: bios) + try await os.createAccount() + let notifications = await task.value + XCTAssertEqual(Set(notifications.map(\.event.kind)), Set(expectedEvents)) + } + +} + +extension HostInfoDriver where Self == AppleHostInfoDriver { + static var shared: Self { + AppleHostInfoDriver(appVersion: "0.0.0") + } +} + +#if DEBUG +extension SecureStorageDriver where Self == Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage { + static var shared: Self { + Self(keychainService: "test") + } +} + + + + +extension Drivers { + + static func withNetworking(_ networking: some NetworkingDriver) -> Drivers { + Drivers( + networking: networking, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: .shared + ) + } + + static func withSecureStorage(_ secureStorage: some SecureStorageDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: secureStorage, + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: .shared + + ) + } + + static func withEntropyProvider(_ entropyProvider: some EntropyProviderDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: entropyProvider, + hostInfo: .shared, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: .shared + ) + } + + static func withHostInfo(_ hostInfo: some HostInfoDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: hostInfo, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: .shared + ) + } + + static func withLogging(_ logging: some LoggingDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: .shared, + logging: logging, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: .shared + ) + } + + static func withEventBus(_ eventBus: some EventBusDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: eventBus, + fileSystem: .shared, + unsafeStorage: .shared + ) + } + + static func withFileSystem(_ fileSystem: some FileSystemDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: .shared, + fileSystem: fileSystem, + unsafeStorage: .shared + ) + } + + static func withUnsafeStorage(_ unsafeStorage: some UnsafeStorageDriver) -> Drivers { + Drivers( + networking: .shared, + secureStorage: .shared, + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: .shared, + fileSystem: .shared, + unsafeStorage: unsafeStorage + ) + } +} +#endif diff --git a/apple/Tests/IntegrationTests/DriversTests/FileSystemDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/FileSystemDriverTests.swift new file mode 100644 index 000000000..b0568df58 --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/FileSystemDriverTests.swift @@ -0,0 +1,23 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +class FileSystemDriverTests: DriverTest { + + func test() async throws { + let nameOfFile = "delete_me_\(UUID().uuidString).txt" + let path = URL.temporaryDirectory.appending(path: nameOfFile, directoryHint: .notDirectory).path() + let data = Data("This file is completely safe to delete. It was generated by a unit test.".utf8) + + let sut = SUT() + try await sut.saveToFile(path: path, data: data) + let loaded = try await sut.loadFromFile(path: path) + XCTAssertEqual(loaded, data) + + XCTAssertTrue(FileManager.default.fileExists(atPath: path)) + try await sut.deleteFile(path: path) + XCTAssertFalse(FileManager.default.fileExists(atPath: path)) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/InsecureStorageTests.swift b/apple/Tests/IntegrationTests/DriversTests/InsecureStorageTests.swift new file mode 100644 index 000000000..dc7bffc99 --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/InsecureStorageTests.swift @@ -0,0 +1,20 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +class InsecureStorageDriverTests: DriverTest { + + func test() async throws { + let sut = SUT.init(keychainService: "test") + let data = Data.sampleAced + let key = SUT.Key.activeProfileId + try await sut.saveData(key: key, data: data) + let loaded = try await sut.loadData(key: key) + XCTAssertEqual(loaded, data) + try await sut.deleteDataForKey(key: key) + let loadedAfterDelete = try await sut.loadData(key: key) + XCTAssertNil(loadedAfterDelete) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/LoggingDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/LoggingDriverTests.swift new file mode 100644 index 000000000..828a5dabd --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/LoggingDriverTests.swift @@ -0,0 +1,49 @@ +import CustomDump +import Foundation +@testable import Sargon +import SargonUniFFI +import XCTest +import os + +class LoggingDriverTests: DriverTest { + + func test() { + let sut = SUT.shared + let levels = LogLevel.allCases + levels.forEach { level in + let msg = "Swift Unit test \(#file) \(#line)" + sut.log(level: level, msg: msg) + sut.swiftLogger.log(level: .init(sargonLogLevel: level), "\(msg)") + } + } + + func test_setRustLogLevel() { + LogFilter.allCases.forEach { level in + setRustLogLevel(level) + XCTAssertEqual(getRustLogLevel(), level) + } + } + + func test_os_log_type_from_loglevel() { + func doTest(_ from: Sargon.LogLevel, _ expected: OSLogType) { + XCTAssertEqual(OSLogType(sargonLogLevel: from), expected) + } + doTest(.error, .fault) + doTest(.warn, .error) + doTest(.info, .info) + doTest(.debug, .default) + doTest(.trace, .debug) + } + + func test_os_log_type_from_filter() { + func doTest(_ from: Sargon.LogFilter, _ expected: OSLogType) { + XCTAssertEqual(OSLogType(sargonFilterLevel: from), expected) + } + doTest(.off, .fault) // yes inaccurate, but not too important, can fix later. + doTest(.error, .fault) + doTest(.warn, .error) + doTest(.info, .info) + doTest(.debug, .default) + doTest(.trace, .debug) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/NetworkingDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/NetworkingDriverTests.swift new file mode 100644 index 000000000..6caab6913 --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/NetworkingDriverTests.swift @@ -0,0 +1,23 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +class NetworkingDriverTests: DriverTest { + + func test() async throws { + let sut = SUT.shared as NetworkingDriver + let response = try await sut.executeNetworkRequest( + request: .init( + validating: "https://radixdlt.com", + method: .head + ) + ) + XCTAssertEqual(response.statusCode, 200) + } + + func test_bad_url() { + XCTAssertThrowsError(try URL(validating: "")) + } +} diff --git a/apple/Tests/IntegrationTests/DriversTests/UnsafeStorageDriverTests.swift b/apple/Tests/IntegrationTests/DriversTests/UnsafeStorageDriverTests.swift new file mode 100644 index 000000000..70857ecd5 --- /dev/null +++ b/apple/Tests/IntegrationTests/DriversTests/UnsafeStorageDriverTests.swift @@ -0,0 +1,19 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + + +class UnsafeStorageDriverTests: DriverTest { + + func test_crud() async throws { + let sut = SUT() + let key = UnsafeStorage.Key.factorSourceUserHasWrittenDown + let data = Data([0x01]) + sut.saveData(key: key, data: data) + XCTAssertEqual(sut.loadData(key: key), data) + sut.deleteDataForKey(key: key) + XCTAssertNil(sut.loadData(key: key)) + } +} diff --git a/apple/Tests/IntegrationTests/GatewayClientTests.swift b/apple/Tests/IntegrationTests/GatewayClientTests.swift index f9cf9c18b..86f8536af 100644 --- a/apple/Tests/IntegrationTests/GatewayClientTests.swift +++ b/apple/Tests/IntegrationTests/GatewayClientTests.swift @@ -55,7 +55,7 @@ final class NetworkAntennaTests: TestCase { }() - let failGateway = GatewayClient(networkAntenna: failURLSession, networkId: .mainnet) + let failGateway = GatewayClient(networkingDriver: failURLSession, networkId: .mainnet) do { _ = try await failGateway.xrdBalanceOfAccountOrZero(address: AccountAddress.sample) XCTFail("Expected to fail") diff --git a/apple/Tests/IntegrationTests/SargonOS/BIOSTests.swift b/apple/Tests/IntegrationTests/SargonOS/BIOSTests.swift new file mode 100644 index 000000000..4fddf8496 --- /dev/null +++ b/apple/Tests/IntegrationTests/SargonOS/BIOSTests.swift @@ -0,0 +1,38 @@ +import CustomDump +import Foundation +@testable import Sargon +import SargonUniFFI +import XCTest + +extension BIOS { + static func creatingShared( + bundle: Bundle = .main, + userDefaultsSuite: String = "test", + secureStorageDriver: SecureStorageDriver = Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage.init( + keychainService: "test" + ) + ) -> BIOS { + Self.creatingShared(drivers: .init(bundle: bundle, userDefaultsSuite: userDefaultsSuite, secureStorageDriver: secureStorageDriver)) + } +} + +final class BIOSTests: OSTest { + typealias SUT = BIOS + + func test_set_shared() { + let sut = SUT.creatingShared() + + XCTAssertTrue(SUT.shared === sut) + let new = SUT.settingShared( + shared: .test( + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage.init( + keychainService: "other" + ) + ), + isEmulatingFreshInstall: true + ) + + XCTAssertFalse(sut === new) + XCTAssertTrue(SUT.shared === new) + } +} diff --git a/apple/Tests/IntegrationTests/SargonOS/SargonOSTests.swift b/apple/Tests/IntegrationTests/SargonOS/SargonOSTests.swift new file mode 100644 index 000000000..2c2bc07fa --- /dev/null +++ b/apple/Tests/IntegrationTests/SargonOS/SargonOSTests.swift @@ -0,0 +1,62 @@ +import CustomDump +import Foundation +@testable import Sargon +import SargonUniFFI +import XCTest + +final class SargonOSTests: OSTest { + typealias SUT = SargonOS + + override func setUp() { + super.setUp() + SUT._shared = nil + } + + func test() async throws { + let _ = try await SUT.boot( + bios: .init( + drivers: .test() + ) + ) + } + + func test_set_shared() async throws { + let sut = try await SUT.creatingShared( + bootingWith: BIOS.test( + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage( + keychainService: "test" + ) + ) + ) + XCTAssertTrue(SUT.shared === sut) + } + + func test_boot_twice_throws() async throws { + let bios = BIOS.test( + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage( + keychainService: "test" + ) + ) + let _ = try await SUT.creatingShared(bootingWith: bios) + do { + let _ = try await SUT.creatingShared(bootingWith: bios) + XCTFail("Should have thrown") + } catch let err as SargonOSAlreadyBooted { + XCTAssertEqual(err.errorDescription, "Radix Wallet core already initialized, should not have been initialized twice. This is a Radix developer error.") + } catch { XCTFail("Wrong error type, expected: \(SargonOSAlreadyBooted.self)") } + } + + func test_boot_twice_does_not_throws_when_emulating_fresh_install() async throws { + let bios = BIOS.test( + secureStorageDriver: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage( + keychainService: "test" + ) + ) + let first = try await SUT.creatingShared(bootingWith: bios) + let second = try await SUT._creatingShared(bootingWith: bios, isEmulatingFreshInstall: true) + XCTAssertFalse(first === second) + XCTAssertTrue(SUT.shared === second) + } + +} + diff --git a/apple/Tests/IntegrationTests/SargonOS/TestOSTests.swift b/apple/Tests/IntegrationTests/SargonOS/TestOSTests.swift new file mode 100644 index 000000000..ecf8603c1 --- /dev/null +++ b/apple/Tests/IntegrationTests/SargonOS/TestOSTests.swift @@ -0,0 +1,120 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +extension TestOS { + + public convenience init() async throws { + try await self.init( + bios: BIOS( + drivers: Drivers( + networking: .shared, + secureStorage: Insecure︕!TestOnly︕!Ephemeral︕!SecureStorage( + keychainService: UUID().uuidString + ), + entropyProvider: .shared, + hostInfo: .shared, + logging: .shared, + eventBus: EventBus(), + fileSystem: .shared, + unsafeStorage: UnsafeStorage( + userDefaults: .init( + suiteName: UUID().uuidString + )! + ) + ) + ) + ) + } +} + +final class TestOSTests: OSTest { + + func test_create_single_account_many_times() async throws { + let bus = EventBus() + let drivers = Drivers.withEventBus(bus) + let sut = try await TestOS(bios: .init(drivers: drivers)) + let n = 3 + + let task = Task { + var values = Set() + for await eventNotification in await bus.notifications().filter({ $0.event.addressOfNewAccount != nil }).prefix(n) { + values.insert(eventNotification) + } + return Array(values).sorted().map(\.event) + } + + try await sut + .createAccount() + .createAccount(named: "Foo") + .createAccount() + + let events = await task.value + XCTAssertEqual(sut.accountsForDisplayOnCurrentNetwork.map(\.displayName), ["Unnamed 0", "Foo", "Unnamed 2"]) + XCTAssertEqual(sut.accountsForDisplayOnCurrentNetwork.map(\.address), events.compactMap(\.addressOfNewAccount)) + } + + func test_create_account_returned() async throws { + let sut = try await TestOS() + let displayName: DisplayName = "New" + let account = try await sut.createAccount(named: displayName) + XCTAssertEqual(account.displayName, displayName) + XCTAssertEqual(sut.accountsForDisplayOnCurrentNetwork, [AccountForDisplay(account)]) + } + + func test_create_account_returned_can_be_looked_up() async throws { + let sut = try await TestOS() + let displayName: DisplayName = "New" + let account = try await sut.createAccount(named: displayName) + let lookedUp = try sut.accountByAddress(account.address) + XCTAssertEqual(lookedUp, account) + } + + func test_lookup_throws_for_unknown_accounts() async throws { + let sut = try await TestOS() + XCTAssertThrowsError(try sut.accountByAddress(.sample)) + } + + func test_new_profile_has_preset_gateways() async throws { + let sut = try await TestOS() + let gateways = sut.gateways + XCTAssertEqual(gateways, .preset) + } + + func test_if_replace_profile_throws() async throws { + let sut = try await TestOS() + var profile = sut.profile + profile.header.id = ProfileID() // mutate profile + do { + try await sut.os.saveChangedProfile(profile) + XCTFail("We expected to throw") + } catch { + /* We expected to throw */ + } + } + + func test_we_can_mutate_profile_in_swift_and_save_then_profile_is_updated() async throws { + let sut = try await TestOS() + var profile = sut.profile + let creatingDevice = profile.header.creatingDevice + let newCreatingDevice = DeviceInfo.sampleOther + XCTAssertNotEqual(newCreatingDevice, creatingDevice) + profile.header.creatingDevice = newCreatingDevice // mutate profile + try await sut.os.saveChangedProfile(profile) + XCTAssertEqual(sut.profile.header.creatingDevice, newCreatingDevice) // assert change worked + } + + func test_batch_create_many_accounts() async throws { + let sut = try await TestOS() + let n: UInt16 = 4 + try await sut.batchCreateAccounts(count: n, namePrefix: "Unnamed") + XCTAssertEqual(sut.accountsOnCurrentNetwork.map(\.displayName.value), (0.. { func test_codable() throws { let raw = """ { - "mnemonic": "bright club bacon dinner achieve pull grid save ramp cereal blush woman humble limb repeat video sudden possible story mask neutral prize goose mandate", - "passphrase": "radix" + "mnemonic": "device phone sign source sample device sample device sample device sample device sample device sample device sample device phone sign source sample device swim", + "passphrase": "" } """.data(using: .utf8)! // test decoding let sut = try JSONDecoder().decode(SUT.self, from: raw) - XCTAssertEqual(sut, SUT.sample) + XCTAssertNoDifference(sut, SUT.sample) // test encoding let encoded = try JSONEncoder().encode(sut) diff --git a/apple/Tests/TestCases/Crypto/Ed25519SignatureTests.swift b/apple/Tests/TestCases/Crypto/Ed25519SignatureTests.swift index 16fa990b4..16d3c3ce3 100644 --- a/apple/Tests/TestCases/Crypto/Ed25519SignatureTests.swift +++ b/apple/Tests/TestCases/Crypto/Ed25519SignatureTests.swift @@ -8,45 +8,53 @@ final class Ed25519SignatureTests: SignatureTest { func test_from_exactly_64_bytes() { XCTAssertEqual(SUT(exactly: SUT.sample.bytes), SUT.sample) } - + func test_as_signature() { let sut = SUT.sample XCTAssertEqual(sut.signature, Signature.ed25519(value: sut)) } func test_codable() throws { - let raw = "\"2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b\"".data(using: .utf8)! + let raw = + "\"fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103\"" + .data(using: .utf8)! // test decoding let sut = try JSONDecoder().decode(SUT.self, from: raw) XCTAssertEqual(sut, SUT.sample) - + // test encoding let encoded = try JSONEncoder().encode(sut) try XCTAssertEqual(JSONDecoder().decode(SUT.self, from: encoded), sut) } func test_wrapped_in_obj() throws { - struct Wrapper: Codable, Equatable { - let myString: String - let signature: Ed25519Signature - } - let json = """ - { - "myString": "Foo", - "signature": "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" - } - """.data(using: .utf8)! - - let decoded = try JSONDecoder().decode(Wrapper.self, from: json) - XCTAssertEqual(decoded, try Wrapper.init(myString: "Foo", signature: .init(hex: "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b"))) - } - - /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more + struct Wrapper: Codable, Equatable { + let myString: String + let signature: Ed25519Signature + } + let json = """ + { + "myString": "Foo", + "signature": "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" + } + """.data(using: .utf8)! + + let decoded = try JSONDecoder().decode(Wrapper.self, from: json) + XCTAssertEqual( + decoded, + try Wrapper.init( + myString: "Foo", + signature: .init( + hex: + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" + ))) + } + + /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more /// powerful discovery than XCTest, and maybe `eachSampleCodableRoundtripTest` will be picked up as /// a test directly. func testJSONRoundtripAllSamples() throws { try eachSampleCodableRoundtripTest() } } - diff --git a/apple/Tests/TestCases/Prelude/Decimal192Tests.swift b/apple/Tests/TestCases/Prelude/Decimal192Tests.swift index 5b347381b..723034dbb 100644 --- a/apple/Tests/TestCases/Prelude/Decimal192Tests.swift +++ b/apple/Tests/TestCases/Prelude/Decimal192Tests.swift @@ -7,7 +7,7 @@ extension Decimal192: ExpressibleByStringLiteral { extension Decimal192: ExpressibleByFloatLiteral { public init(floatLiteral float: Float32) { - try! self.init(float) + self.init(float) } } #endif diff --git a/apple/Tests/TestCases/Prelude/NetworkMethodTests.swift b/apple/Tests/TestCases/Prelude/NetworkMethodTests.swift new file mode 100644 index 000000000..2fa9e3c42 --- /dev/null +++ b/apple/Tests/TestCases/Prelude/NetworkMethodTests.swift @@ -0,0 +1,20 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class NetworkMethodTests: Test { + + func test_get_description() { + XCTAssertEqual(SUT.get.description, "GET") + } + + func test_post_description() { + XCTAssertEqual(SUT.post.description, "POST") + } + + func test_head_description() { + XCTAssertEqual(SUT.head.description, "HEAD") + } +} diff --git a/apple/Tests/TestCases/Profile/AuthorizedDapp/AuthorizedDappTests.swift b/apple/Tests/TestCases/Profile/AuthorizedDapp/AuthorizedDappTests.swift index 310624008..cfdfae572 100644 --- a/apple/Tests/TestCases/Profile/AuthorizedDapp/AuthorizedDappTests.swift +++ b/apple/Tests/TestCases/Profile/AuthorizedDapp/AuthorizedDappTests.swift @@ -5,76 +5,76 @@ import SargonUniFFI import XCTest final class AuthorizedDappTests: Test { - + func test_network_ids_mainnet() { XCTAssertTrue(SUT.sampleValuesMainnet.allSatisfy({ $0.networkID == .mainnet })) } - + func test_network_ids_stokenet() { XCTAssertTrue(SUT.sampleValuesStokenet.allSatisfy({ $0.networkID == .stokenet })) } - + func test_id_is_dapp_definition() { eachSample { sut in XCTAssertEqual(sut.id, sut.dAppDefinitionAddress) } } - + func test_codable() throws { let raw = """ - { - "networkID": 1, - "dAppDefinitionAddress": "account_rdx12xuhw6v30chdkhcu7qznz9vu926vxefr4h4tdvc0mdckg9rq4afx9t", - "displayName": "Gumball Club", - "referencesToAuthorizedPersonas": [ - { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", - "lastLogin": "2024-01-31T14:23:45.000Z", - "sharedAccounts": { - "request": { - "quantifier": "atLeast", - "quantity": 1 - }, - "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" - ] - }, - "sharedPersonaData": { - "name": "00000000-0000-0000-0000-000000000000", - "emailAddresses": { + { + "networkID": 1, + "dAppDefinitionAddress": "account_rdx12xuhw6v30chdkhcu7qznz9vu926vxefr4h4tdvc0mdckg9rq4afx9t", + "displayName": "Gumball Club", + "referencesToAuthorizedPersonas": [ + { + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", + "lastLogin": "2024-01-31T14:23:45.000Z", + "sharedAccounts": { "request": { - "quantifier": "exactly", + "quantifier": "atLeast", "quantity": 1 }, "ids": [ - "00000000-0000-0000-0000-000000000002" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, - "phoneNumbers": { - "request": { - "quantifier": "exactly", - "quantity": 1 + "sharedPersonaData": { + "name": "00000000-0000-0000-0000-000000000000", + "emailAddresses": { + "request": { + "quantifier": "exactly", + "quantity": 1 + }, + "ids": [ + "00000000-0000-0000-0000-000000000002" + ] }, - "ids": [ - "00000000-0000-0000-0000-000000000001" - ] + "phoneNumbers": { + "request": { + "quantifier": "exactly", + "quantity": 1 + }, + "ids": [ + "00000000-0000-0000-0000-000000000001" + ] + } } } - } - ] - } - """.data(using: .utf8)! - + ] + } + """.data(using: .utf8)! + // test decoding let sut = try JSONDecoder().decode(SUT.self, from: raw) - XCTAssertEqual(sut, SUT.sampleMainnetOther) - + XCTAssertNoDifference(sut, SUT.sampleMainnetOther) + // test encoding let encoded = try JSONEncoder().encode(sut) try XCTAssertEqual(JSONDecoder().decode(SUT.self, from: encoded), sut) } - - /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more + + /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more /// powerful discovery than XCTest, and maybe `eachSampleCodableRoundtripTest` will be picked up as /// a test directly. func testJSONRoundtripAllSamples() throws { diff --git a/apple/Tests/TestCases/Profile/DeviceInfoTests.swift b/apple/Tests/TestCases/Profile/DeviceInfoTests.swift index c80ea3e84..683e1faa3 100644 --- a/apple/Tests/TestCases/Profile/DeviceInfoTests.swift +++ b/apple/Tests/TestCases/Profile/DeviceInfoTests.swift @@ -6,10 +6,6 @@ import XCTest final class DeviceInfoTests: Test { - func test_new_iphone() { - XCTAssertNotEqual(SUT.sample, SUT.iPhone()) - } - func test_not_codable_but_lower_level_json_methods_json_data_roundtrip() throws{ let sut = SUT.sample let json = sut.jsonData() @@ -52,7 +48,7 @@ final class DeviceInfoTests: Test { { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } """) @@ -63,7 +59,7 @@ final class DeviceInfoTests: Test { { "id": "66F07CA2-A9D9-49E5-8152-77ACA3D1DD74", "date": "2023-09-11T16:05:56Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } """) @@ -72,7 +68,7 @@ final class DeviceInfoTests: Test { { "id": "\(UUID().uuidString)", "date": "\(Date.now.ISO8601Format())", - "description": "iPhone" + "description": "iPhone (iPhone)" } """, expected: nil) } diff --git a/apple/Tests/TestCases/Profile/Factor/ArculusCardFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/ArculusCardFactorSourceTests.swift new file mode 100644 index 000000000..892201eb9 --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/ArculusCardFactorSourceTests.swift @@ -0,0 +1,81 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-15. +// + +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class ArculusCardFactorSourceTests: SpecificFactorSourceTest { + func test_id_of_acrulus() { + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.hash(value: sut.id).description) + } + } + + func test_new() { + XCTAssertEqual( + SUT( + mnemonicWithPassphrase: .init( + mnemonic: .sampleArculus, + passphrase: "" + ), + name: "Test" + ).id, + SUT.sample.id + ) + } + + func test_factor_source_id_is_id() { + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } + } + + func test_kind() { + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .arculusCard) + } + } + + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asArculus, sut) + } + } + + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: DeviceFactorSource.sample)) + } + + func test_as_factor_source_to_string() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } + } + + func test_as_general() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.arculusCard(value: sut)) + } + } + + func test_source_that_supports_babylon() { + let sut = SUT.sample + XCTAssertTrue(sut.supportsBabylon) + XCTAssertFalse(sut.supportsOlympia) + } + + + func test_extract_wrong_throws() throws { + try eachSample { sut in + XCTAssertThrowsError(try sut.asGeneral.extract(as: DeviceFactorSource.self)) + } + } +} diff --git a/apple/Tests/TestCases/Profile/Factor/ArculusCardModelTests.swift b/apple/Tests/TestCases/Profile/Factor/ArculusCardModelTests.swift new file mode 100644 index 000000000..a108a429f --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/ArculusCardModelTests.swift @@ -0,0 +1,13 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class ArculusCardModelTests: TestCase { + typealias SUT = ArculusCardModel + + func test_description() { + XCTAssertEqual(SUT.arculusColdStorageWallet.description, "arculusColdStorageWallet") + } +} diff --git a/apple/Tests/TestCases/Profile/Factor/DeviceFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/DeviceFactorSourceTests.swift index 226806550..d7ec18dd8 100644 --- a/apple/Tests/TestCases/Profile/Factor/DeviceFactorSourceTests.swift +++ b/apple/Tests/TestCases/Profile/Factor/DeviceFactorSourceTests.swift @@ -7,47 +7,67 @@ import SwiftyJSON final class DeviceFactorSourceTests: SpecificFactorSourceTest { func test_id_of_device() { - XCTAssertEqual(SUT.sample.id.description, FactorSourceID.hash(value: SUT.sample.id).description) + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.hash(value: sut.id).description) + } } func test_factor_source_id_is_id() { - XCTAssertEqual(SUT.sample.id.asGeneral, SUT.sample.factorSourceID) + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } } func test_kind() { - XCTAssertEqual(SUT.sample.factorSourceKind, .device) + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .device) + } } func test_as_factor_source_to_string() { - XCTAssertEqual(SUT.sample.asGeneral.id.description, SUT.sample.id.description) + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } } func test_as_general() { - XCTAssertEqual(SUT.sample.asGeneral, FactorSource.device(value: SUT.sample)) + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.device(value: sut)) + } } func test_new_babylon_is_main_true() { - let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: true) + let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: true, hostInfo: .sample) XCTAssertTrue(sut.isMainBDFS) } func test_new_babylon_is_main_false() { - let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: false) + let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: false, hostInfo: .sample) XCTAssertFalse(sut.isMainBDFS) } func test_new_babylon() { - let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: true) + let sut = SUT.babylon(mnemonicWithPassphrase: .sample, isMain: true, hostInfo: .sample) XCTAssertTrue(sut.supportsBabylon) XCTAssertFalse(sut.supportsOlympia) } func test_new_olympia() { - let sut = SUT.olympia(mnemonicWithPassphrase: .sample) + let sut = SUT.olympia(mnemonicWithPassphrase: .sample, hostInfo: .sample) XCTAssertTrue(sut.supportsOlympia) XCTAssertFalse(sut.supportsBabylon) } + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asDevice, sut) + } + } + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: TrustedContactFactorSource.sample)) + } + func test_extract_wrong_throws() throws { try eachSample { sut in XCTAssertThrowsError(try sut.asGeneral.extract(as: LedgerHardwareWalletFactorSource.self)) diff --git a/apple/Tests/TestCases/Profile/Factor/FactorSourceCommonTests.swift b/apple/Tests/TestCases/Profile/Factor/FactorSourceCommonTests.swift new file mode 100644 index 000000000..9806c475f --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/FactorSourceCommonTests.swift @@ -0,0 +1,15 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class FactorSourceCommonTests: Test { + func test_babylon_neq_olmypia() { + XCTAssertNotEqual(SUT.babylon(), SUT.olympia()) + } + func test_babylon_main() { + XCTAssertTrue(SUT.babylon(isMain: true).flags.contains(.main)) + XCTAssertFalse(SUT.babylon(isMain: false).flags.contains(.main)) + } +} diff --git a/apple/Tests/TestCases/Profile/Factor/FactorSourceIDFromHashTests.swift b/apple/Tests/TestCases/Profile/Factor/FactorSourceIDFromHashTests.swift index 2d82fe170..b3b6cdd38 100644 --- a/apple/Tests/TestCases/Profile/Factor/FactorSourceIDFromHashTests.swift +++ b/apple/Tests/TestCases/Profile/Factor/FactorSourceIDFromHashTests.swift @@ -15,7 +15,7 @@ final class FactorSourceIDFromHashTests: SpecificFactorSourceIDTest { func test_id_of_ledger() { - XCTAssertEqual(SUT.sample.id.description, FactorSourceID.hash(value: SUT.sample.id).description) + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.hash(value: sut.id).description) + } + } + + func test_new() { + XCTAssertEqual( + SUT( + mnemonicWithPassphrase: .init( + mnemonic: .sampleLedger, + passphrase: "" + ), + hint: .init(name: "Test", model: .nanoS), + common: .babylon() + ).id, + SUT.sample.id + ) + } + + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asLedger, sut) + } + } + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: DeviceFactorSource.sample)) } func test_factor_source_id_is_id() { - XCTAssertEqual(SUT.sample.id.asGeneral, SUT.sample.factorSourceID) + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } } func test_kind() { - XCTAssertEqual(SUT.sample.factorSourceKind, .ledgerHqHardwareWallet) + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .ledgerHqHardwareWallet) + } } func test_as_factor_source_to_string() { - XCTAssertEqual(SUT.sample.asGeneral.id.description, SUT.sample.id.description) + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } } func test_as_general() { - XCTAssertEqual(SUT.sample.asGeneral, FactorSource.ledger(value: SUT.sample)) + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.ledger(value: sut)) + } } func test_source_that_supports_babylon() { diff --git a/apple/Tests/TestCases/Profile/Factor/OffDeviceMnemonicFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/OffDeviceMnemonicFactorSourceTests.swift new file mode 100644 index 000000000..85a3551d0 --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/OffDeviceMnemonicFactorSourceTests.swift @@ -0,0 +1,81 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-04-15. +// + +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class OffDeviceMnemonicFactorSourceTests: SpecificFactorSourceTest { + func test_id_of_off_device() { + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.hash(value: sut.id).description) + } + } + + func test_new() { + XCTAssertEqual( + SUT( + mnemonicWithPassphrase: .init( + mnemonic: .sampleOffDeviceMnemonic, + passphrase: "" + ), + hint: .init(displayName: "Test") + ).id, + SUT.sample.id + ) + } + + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asOffDeviceMnemonic, sut) + } + } + + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: DeviceFactorSource.sample)) + } + + func test_factor_source_id_is_id() { + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } + } + + func test_kind() { + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .offDeviceMnemonic) + } + } + + func test_as_factor_source_to_string() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } + } + + func test_as_general() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.offDeviceMnemonic(value: sut)) + } + } + + func test_source_that_supports_babylon() { + let sut = SUT.sample + XCTAssertTrue(sut.supportsBabylon) + XCTAssertFalse(sut.supportsOlympia) + } + + + func test_extract_wrong_throws() throws { + try eachSample { sut in + XCTAssertThrowsError(try sut.asGeneral.extract(as: DeviceFactorSource.self)) + } + } +} diff --git a/apple/Tests/TestCases/Profile/Factor/PrivateHierarchicalDeterministicFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/PrivateHierarchicalDeterministicFactorSourceTests.swift index c5346e109..13078b8c8 100644 --- a/apple/Tests/TestCases/Profile/Factor/PrivateHierarchicalDeterministicFactorSourceTests.swift +++ b/apple/Tests/TestCases/Profile/Factor/PrivateHierarchicalDeterministicFactorSourceTests.swift @@ -7,27 +7,27 @@ import XCTest final class PrivateHierarchicalDeterministicFactorSourceTests: FactorSourceTest { func test_new_babylon() { - let sut = SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample) + let sut = SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample, hostInfo: .sample) XCTAssertTrue(sut.supportsBabylon) } func test_new_olympia() { - let sut = SUT.olympia(mnemonicWithPassphrase: .sample) + let sut = SUT.olympia(mnemonicWithPassphrase: .sample, hostInfo: .sample) XCTAssertTrue(sut.supportsOlympia) } func test_kind_is_device() { - XCTAssertEqual(SUT.olympia(mnemonicWithPassphrase: .sample).factorSourceKind, .device) - XCTAssertEqual(SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample).factorSourceKind, .device) + XCTAssertEqual(SUT.olympia(mnemonicWithPassphrase: .sample, hostInfo: .sample).factorSourceKind, .device) + XCTAssertEqual(SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample, hostInfo: .sample).factorSourceKind, .device) } func test_is_main_bdfs_true() { - let sut = SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample) + let sut = SUT.babylon(isMainBDFS: true, mnemonicWithPassphrase: .sample, hostInfo: .sample) XCTAssertTrue(sut.factorSource.isMainBDFS) } func test_is_main_bdfs_false() { - let sut = SUT.babylon(isMainBDFS: false, mnemonicWithPassphrase: .sample) + let sut = SUT.babylon(isMainBDFS: false, mnemonicWithPassphrase: .sample, hostInfo: .sample) XCTAssertFalse(sut.factorSource.isMainBDFS) } } diff --git a/apple/Tests/TestCases/Profile/Factor/SecurityQuestionsFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/SecurityQuestionsFactorSourceTests.swift new file mode 100644 index 000000000..77d6d7b54 --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/SecurityQuestionsFactorSourceTests.swift @@ -0,0 +1,83 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class SecurityQuestionsFactorSourceTests: SpecificFactorSourceTest { + + func test_id_of_security_questions() { + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.hash(value: sut.id).description) + } + } + + func test_roundtrip() throws { + let mnemonic = Mnemonic.sampleSecurityQuestions + let qas = newSecurityNOTPRODUCTIONREADYQuestionsAndAnswersSample() + let sut = try SUT( + mnemonic: mnemonic, + questionsAndAnswers: qas + ) + let decrypted = try sut.decrypt(questionsAndAnswers: qas) + XCTAssertEqual(decrypted, mnemonic) + } + + + func test_new() throws { + XCTAssertEqual( + try SUT( + mnemonic: .sampleSecurityQuestions, + questionsAndAnswers: newSecurityNOTPRODUCTIONREADYQuestionsAndAnswersSample() + ).id, + SUT.sample.id + ) + } + + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asSecurityQuestions, sut) + } + } + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: DeviceFactorSource.sample)) + } + + func test_factor_source_id_is_id() { + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } + } + + func test_kind() { + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .securityQuestions) + } + } + + func test_as_factor_source_to_string() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } + } + + func test_as_general() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.securityQuestions(value: sut)) + } + } + + func test_source_that_supports_babylon() { + let sut = SUT.sample + XCTAssertTrue(sut.supportsBabylon) + XCTAssertFalse(sut.supportsOlympia) + } + + + func test_extract_wrong_throws() throws { + try eachSample { sut in + XCTAssertThrowsError(try sut.asGeneral.extract(as: DeviceFactorSource.self)) + } + } +} diff --git a/apple/Tests/TestCases/Profile/Factor/TrustedContactFactorSourceTests.swift b/apple/Tests/TestCases/Profile/Factor/TrustedContactFactorSourceTests.swift new file mode 100644 index 000000000..ebe9a0ade --- /dev/null +++ b/apple/Tests/TestCases/Profile/Factor/TrustedContactFactorSourceTests.swift @@ -0,0 +1,68 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class TrustedContactFactorSourceTests: SpecificFactorSourceTest { + + func test_id_of_trusted_contact() { + eachSample { sut in + XCTAssertEqual(sut.id.description, FactorSourceID.address(value: sut.id).description) + } + } + + func test_new() { + XCTAssertEqual( + SUT(accountAddress: .sample, contact: .sample).id, + SUT.sample.id + ) + } + + func test_as() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.asTrustedContact, sut) + } + } + + func test_other_wrong() { + XCTAssertNil(SUT.extract(from: DeviceFactorSource.sample)) + } + + + func test_factor_source_id_is_id() { + eachSample { sut in + XCTAssertEqual(sut.id.asGeneral, sut.factorSourceID) + } + } + + func test_kind() { + eachSample { sut in + XCTAssertEqual(sut.factorSourceKind, .trustedContact) + } + } + + func test_as_factor_source_to_string() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral.id.description, sut.id.description) + } + } + + func test_as_general() { + eachSample { sut in + XCTAssertEqual(sut.asGeneral, FactorSource.trustedContact(value: sut)) + } + } + + func test_source_that_supports_babylon() { + let sut = SUT.sample + XCTAssertTrue(sut.supportsBabylon) + XCTAssertFalse(sut.supportsOlympia) + } + + func test_extract_wrong_throws() throws { + try eachSample { sut in + XCTAssertThrowsError(try sut.asGeneral.extract(as: DeviceFactorSource.self)) + } + } +} diff --git a/apple/Tests/TestCases/Profile/HeaderTests.swift b/apple/Tests/TestCases/Profile/HeaderTests.swift index 2f340d312..b599c24f9 100644 --- a/apple/Tests/TestCases/Profile/HeaderTests.swift +++ b/apple/Tests/TestCases/Profile/HeaderTests.swift @@ -23,12 +23,12 @@ final class HeaderTests: Test
{ "creatingDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastUsedOnDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastModified": "2023-09-11T16:05:56.000Z", "contentHint": { @@ -64,12 +64,12 @@ final class HeaderTests: Test
{ "creatingDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastUsedOnDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastModified": "2023-09-11T16:05:56.000Z", "contentHint": { @@ -80,9 +80,9 @@ final class HeaderTests: Test
{ }, { "lastUsedOnDevice" : { - "date" : "2023-12-20T16:05:56.000Z", - "description" : "iPhone", - "id" : "aabbccdd-a9d9-49e5-8152-beefbeefbeef" + "date" : "2023-12-24T17:13:56.123Z", + "description" : "Android (Android)", + "id" : "F07CA662-D9A9-9E45-1582-ACA773D174DD" }, "id" : "87654321-bbbb-cccc-dddd-87654321dcba", "contentHint" : { @@ -91,19 +91,19 @@ final class HeaderTests: Test
{ "numberOfPersonasOnAllNetworksInTotal" : 0 }, "creatingDevice" : { - "description" : "iPhone", - "id" : "aabbccdd-a9d9-49e5-8152-beefbeefbeef", - "date" : "2023-12-20T16:05:56.000Z" + "description" : "Android (Android)", + "id" : "F07CA662-D9A9-9E45-1582-ACA773D174DD", + "date" : "2023-12-24T17:13:56.123Z" }, "snapshotVersion" : 100, - "lastModified" : "2023-12-20T16:05:56.000Z" + "lastModified" : "2023-12-24T17:13:56.123Z" } ] """.data(using: .utf8)! // test decoding let headerList = try JSONDecoder().decode([SUT].self, from: raw) - XCTAssertEqual(headerList, [SUT.sample, SUT.sampleOther]) + XCTAssertNoDifference(headerList, [SUT.sample, SUT.sampleOther]) // test encoding let encoded = try JSONEncoder().encode(headerList) diff --git a/apple/Tests/TestCases/Profile/MFA/MatrixOfFactorSourcesTests.swift b/apple/Tests/TestCases/Profile/MFA/MatrixOfFactorSourcesTests.swift new file mode 100644 index 000000000..4662a15be --- /dev/null +++ b/apple/Tests/TestCases/Profile/MFA/MatrixOfFactorSourcesTests.swift @@ -0,0 +1,8 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class MatrixOfFactorSourcesTests: Test { +} diff --git a/apple/Tests/TestCases/Profile/MFA/SecurityStructureMetadataTests.swift b/apple/Tests/TestCases/Profile/MFA/SecurityStructureMetadataTests.swift new file mode 100644 index 000000000..57f8564fa --- /dev/null +++ b/apple/Tests/TestCases/Profile/MFA/SecurityStructureMetadataTests.swift @@ -0,0 +1,19 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class SecurityStructureMetadataTests: Test { + func test_new_with_name() { + let sut = SUT.init(name: "foo") + XCTAssertEqual(sut.displayName, "foo") + } +} diff --git a/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourceIDsTests.swift b/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourceIDsTests.swift new file mode 100644 index 000000000..a52d3756d --- /dev/null +++ b/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourceIDsTests.swift @@ -0,0 +1,13 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class SecurityStructureOfFactorSourceIDsTests: Test { + func test_id() { + eachSample { sut in + XCTAssertEqual(sut.id, sut.metadata.id) + } + } +} diff --git a/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourcesTests.swift b/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourcesTests.swift new file mode 100644 index 000000000..3f75c6c07 --- /dev/null +++ b/apple/Tests/TestCases/Profile/MFA/SecurityStructureOfFactorSourcesTests.swift @@ -0,0 +1,25 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class SecurityStructureOfFactorSourcesTests: Test { + + func test_new_from_auto_in_days() { + let sut = SUT( + metadata: .sample, + numberOfDaysUntilAutoConfirmation: 10, + matrixOfFactors: .sample + ) + XCTAssertEqual(sut.numberOfEpochsUntilAutoConfirmation, 2880) + XCTAssertEqual(sut.metadata, .sample) + XCTAssertEqual(sut.matrixOfFactors, .sample) + } + + func test_id() { + eachSample { sut in + XCTAssertEqual(sut.id, sut.metadata.id) + } + } +} diff --git a/apple/Tests/TestCases/Profile/ProfileTests.swift b/apple/Tests/TestCases/Profile/ProfileTests.swift index 4c64707ca..0c9be2367 100644 --- a/apple/Tests/TestCases/Profile/ProfileTests.swift +++ b/apple/Tests/TestCases/Profile/ProfileTests.swift @@ -112,8 +112,8 @@ final class ProfileTests: Test { let decodedFromData = try SUT(jsonData: sut.jsonData()) XCTAssertEqual(decodedFromData, sut) } - var vectors = Array(zip(SUT.sampleValues, SUT.sampleValues.map { $0.toJSONString(prettyPrinted: false) })) - vectors.append(vector) + let vectors = Array(zip(SUT.sampleValues, SUT.sampleValues.map { $0.toJSONString(prettyPrinted: false) })) + // vectors.append(vector) try vectors.forEach(doTest) } diff --git a/apple/Tests/TestCases/RadixConnect/P2PLinks/LinkConnectionQrDataTests.swift b/apple/Tests/TestCases/RadixConnect/P2PLinks/LinkConnectionQrDataTests.swift index 9dbb6708e..5221d2e90 100644 --- a/apple/Tests/TestCases/RadixConnect/P2PLinks/LinkConnectionQrDataTests.swift +++ b/apple/Tests/TestCases/RadixConnect/P2PLinks/LinkConnectionQrDataTests.swift @@ -5,26 +5,26 @@ import SargonUniFFI import XCTest final class LinkConnectionQrDataTests: Test { - func test_codable() throws { + func test_codable() throws { let raw = """ - { - "purpose": "general", - "password": "deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead", - "publicKey": "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", - "signature": "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" - } - """.data(using: .utf8)! - + { + "purpose": "general", + "password": "deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead", + "publicKey": "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", + "signature": "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" + } + """.data(using: .utf8)! + // test decoding let sut = try JSONDecoder().decode(SUT.self, from: raw) XCTAssertEqual(sut, SUT.sample) - + // test encoding let encoded = try JSONEncoder().encode(sut) try XCTAssertEqual(JSONDecoder().decode(SUT.self, from: encoded), sut) } - /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more + /// Cyon: We might be able remove this function once we have converted to `swift-testing` which has much more /// powerful discovery than XCTest, and maybe `eachSampleCodableRoundtripTest` will be picked up as /// a test directly. func testJSONRoundtripAllSamples() throws { diff --git a/apple/Tests/TestCases/System/EventKindTests.swift b/apple/Tests/TestCases/System/EventKindTests.swift new file mode 100644 index 000000000..0343e707e --- /dev/null +++ b/apple/Tests/TestCases/System/EventKindTests.swift @@ -0,0 +1,38 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class EventKindTests: Test { + func test_all_cases() { + XCTAssertGreaterThan(SUT.allCases.count, 1) + } + + func test_affectsCurrentAccounts() { + func doTest(_ sut: SUT, expected: Bool) { + XCTAssertEqual(sut.affectsCurrentAccounts, expected) + } + doTest(.accountAdded, expected: true) + doTest(.accountUpdated, expected: true) + doTest(.profileUsedOnOtherDevice, expected: false) + } + + func test_affectsCurrentNetwork() { + func doTest(_ sut: SUT, expected: Bool) { + XCTAssertEqual(sut.affectsCurrentNetwork, expected) + } + doTest(.accountAdded, expected: false) + doTest(.gatewayChangedCurrent, expected: true) + doTest(.profileImported, expected: true) + } + + func test_affectsSavedGateways() { + func doTest(_ sut: SUT, expected: Bool) { + XCTAssertEqual(sut.affectsSavedGateways, expected) + } + doTest(.accountAdded, expected: false) + doTest(.profileUsedOnOtherDevice, expected: false) + doTest(.gatewayChangedCurrent, expected: true) + } +} diff --git a/apple/Tests/TestCases/System/HostOSTests.swift b/apple/Tests/TestCases/System/HostOSTests.swift new file mode 100644 index 000000000..962a9b99b --- /dev/null +++ b/apple/Tests/TestCases/System/HostOSTests.swift @@ -0,0 +1,26 @@ +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +final class HostOSTests: Test { + + func testGetName() { + let sut = SUT.sample + + XCTAssertEqual(sut.name(), "iOS") + } + + func testGetVendor() { + let sut = SUT.sample + + XCTAssertEqual(sut.vendor(), "Apple") + } + + func testGetVersion() { + let sut = SUT.sample + + XCTAssertEqual(sut.version(), "iOS 17.4.1") + } + +} diff --git a/apple/Tests/Utils/DriverTest.swift b/apple/Tests/Utils/DriverTest.swift new file mode 100644 index 000000000..3bedc876e --- /dev/null +++ b/apple/Tests/Utils/DriverTest.swift @@ -0,0 +1,9 @@ +import CustomDump +import Foundation +@testable import Sargon +import SargonUniFFI +import XCTest + +class DriverTest: TestCase { + typealias SUT = SUT_ +} diff --git a/apple/Tests/Utils/OSTest.swift b/apple/Tests/Utils/OSTest.swift new file mode 100644 index 000000000..04c9dba8a --- /dev/null +++ b/apple/Tests/Utils/OSTest.swift @@ -0,0 +1,15 @@ +import CustomDump +import Foundation +import Sargon +import SargonUniFFI +import XCTest + +class OSTest: TestCase { + + override class func shouldEnableRustLog() -> Bool { + // BIOS and SargonOS tests will have enabled Rust logging from inside of rust. + // we should not enable it twice which will lead to crash. + false + } + +} diff --git a/apple/Tests/Utils/SpecificFactorSourceTest.swift b/apple/Tests/Utils/SpecificFactorSourceTest.swift index fdb373147..689126104 100644 --- a/apple/Tests/Utils/SpecificFactorSourceTest.swift +++ b/apple/Tests/Utils/SpecificFactorSourceTest.swift @@ -6,6 +6,16 @@ import XCTest class SpecificFactorSourceTest: FactorSourceTest { + func test_get_set_common() { + let samples = SUT.sampleValues.map { + var factor = $0.asGeneral + factor.common.lastUsedOn = .init(timeIntervalSince1970: 0) + factor.common.addedOn = factor.common.lastUsedOn + return factor + } + XCTAssertTrue(samples.allSatisfy({ $0.common.addedOn == .init(timeIntervalSince1970: 0) })) + } + func test_extract() throws { try eachSample { sut in let embedded = sut.asGeneral diff --git a/apple/Tests/Utils/Test.swift b/apple/Tests/Utils/Test.swift index 1e2d34331..e8ed5f90b 100644 --- a/apple/Tests/Utils/Test.swift +++ b/apple/Tests/Utils/Test.swift @@ -5,6 +5,18 @@ import SargonUniFFI import XCTest class TestCase: XCTestCase { + + class func shouldEnableRustLog() -> Bool { + false + } + + class override func setUp() { + if shouldEnableRustLog() { + rustLoggerInit() + } + super.setUp() + } + override func setUp() { self.continueAfterFailure = false } diff --git a/examples/android/src/main/java/com/radixdlt/sargon/android/EphemeralKeystore.kt b/examples/android/src/main/java/com/radixdlt/sargon/android/EphemeralKeystore.kt index abec03b6c..681b077f6 100644 --- a/examples/android/src/main/java/com/radixdlt/sargon/android/EphemeralKeystore.kt +++ b/examples/android/src/main/java/com/radixdlt/sargon/android/EphemeralKeystore.kt @@ -1,35 +1,36 @@ package com.radixdlt.sargon.android -import com.radixdlt.sargon.SecureStorage +import com.radixdlt.sargon.BagOfBytes +import com.radixdlt.sargon.SecureStorageDriver import com.radixdlt.sargon.SecureStorageKey import com.radixdlt.sargon.extensions.identifier -class EphemeralKeystore: SecureStorage { - private val storage: MutableMap = mutableMapOf() +class EphemeralKeystore: SecureStorageDriver { + private val storage: MutableMap = mutableMapOf() - override fun loadData(key: SecureStorageKey): ByteArray? = storage[key.identifier] + override suspend fun loadData(key: SecureStorageKey): BagOfBytes? = storage[key.identifier] - override fun saveData(key: SecureStorageKey, data: ByteArray) { + override suspend fun saveData(key: SecureStorageKey, data: BagOfBytes) { storage[key.identifier] = data } - override fun deleteDataForKey(key: SecureStorageKey) { + override suspend fun deleteDataForKey(key: SecureStorageKey) { storage.remove(key = key.identifier) } fun isEmpty() = storage.isEmpty() - fun contains(value: String): Boolean { - return storage.any { entry -> - entry.value.decodeToString().contains(value) - } - } - - override fun toString(): String { - return storage.toList().joinToString(prefix = "[", postfix = "\n]") { pair -> - "\n\t${pair.first} => ${pair.second.decodeToString()}" - } - } +// fun contains(value: String): Boolean { +// return storage.any { entry -> +// entry.value().decodeToString().contains(value) +// } +// } +// +// override fun toString(): String { +// return storage.toList().joinToString(prefix = "[", postfix = "\n]") { pair -> +// "\n\t${pair.first} => ${pair.second.decodeToString()}" +// } +// } override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/examples/android/src/main/java/com/radixdlt/sargon/android/MainActivity.kt b/examples/android/src/main/java/com/radixdlt/sargon/android/MainActivity.kt index 574d4cca5..8886f668f 100644 --- a/examples/android/src/main/java/com/radixdlt/sargon/android/MainActivity.kt +++ b/examples/android/src/main/java/com/radixdlt/sargon/android/MainActivity.kt @@ -36,9 +36,7 @@ import com.radixdlt.sargon.NetworkId import com.radixdlt.sargon.NonEmptyMax32Bytes import com.radixdlt.sargon.Profile import com.radixdlt.sargon.ProfileNetwork -import com.radixdlt.sargon.SecureStorage -import com.radixdlt.sargon.Wallet -import com.radixdlt.sargon.WalletClientModel +import com.radixdlt.sargon.SecureStorageDriver import com.radixdlt.sargon.android.ui.theme.SargonAndroidTheme import com.radixdlt.sargon.annotation.UsesSampleValues import com.radixdlt.sargon.extensions.toBagOfBytes @@ -57,70 +55,70 @@ class MainActivity : ComponentActivity() { } @Composable -fun WalletContent(modifier: Modifier = Modifier, storage: SecureStorage) { - var walletState: Wallet? by remember { mutableStateOf(null) } - var profile: Profile? by remember { mutableStateOf(null) } - - Scaffold( - modifier = modifier, - topBar = { TopAppBar(title = { Text(text = "Wallet Test") }) }, - bottomBar = { - if (walletState == null) { - Button( - modifier = Modifier - .padding(16.dp) - .fillMaxWidth(), - onClick = { - walletState = - Wallet.with( - entropy = ByteArray(32) { 0xFF.toByte() }, - secureStorage = storage - ) - profile = walletState?.profile() - } - ) { Text(text = "Generate new Wallet") } - } else if (profile?.networks?.isEmpty() == true) { - Column(modifier = Modifier.padding(16.dp)) { - var accountName by remember { mutableStateOf("") } - TextField( - modifier = Modifier.fillMaxWidth(), - value = accountName, - onValueChange = { accountName = it }, - label = { Text(text = "New Account Name") }, - singleLine = true, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = - KeyboardActions( - onDone = { - walletState?.createAndSaveNewAccount( - networkId = NetworkId.MAINNET, - name = DisplayName(accountName) - ) - - profile = walletState?.profile() - } - ) - ) - } - } - } - ) { padding -> - LazyColumn(modifier = Modifier.padding(padding), contentPadding = PaddingValues(16.dp)) { - items(profile?.networks.orEmpty()) { - Network( - network = it, - onAccountAdd = { newName -> - walletState?.createNewAccount(NetworkId.MAINNET, DisplayName(newName)) - ?.let { - walletState?.addAccount(it) - - profile = walletState?.profile() - } - } - ) - } - } - } +fun WalletContent(modifier: Modifier = Modifier, storage: SecureStorageDriver) { +// var walletState: Wallet? by remember { mutableStateOf(null) } +// var profile: Profile? by remember { mutableStateOf(null) } +// +// Scaffold( +// modifier = modifier, +// topBar = { TopAppBar(title = { Text(text = "Wallet Test") }) }, +// bottomBar = { +// if (walletState == null) { +// Button( +// modifier = Modifier +// .padding(16.dp) +// .fillMaxWidth(), +// onClick = { +// walletState = +// Wallet.with( +// entropy = ByteArray(32) { 0xFF.toByte() }, +// secureStorage = storage +// ) +// profile = walletState?.profile() +// } +// ) { Text(text = "Generate new Wallet") } +// } else if (profile?.networks?.isEmpty() == true) { +// Column(modifier = Modifier.padding(16.dp)) { +// var accountName by remember { mutableStateOf("") } +// TextField( +// modifier = Modifier.fillMaxWidth(), +// value = accountName, +// onValueChange = { accountName = it }, +// label = { Text(text = "New Account Name") }, +// singleLine = true, +// keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), +// keyboardActions = +// KeyboardActions( +// onDone = { +// walletState?.createAndSaveNewAccount( +// networkId = NetworkId.MAINNET, +// name = DisplayName(accountName) +// ) +// +// profile = walletState?.profile() +// } +// ) +// ) +// } +// } +// } +// ) { padding -> +// LazyColumn(modifier = Modifier.padding(padding), contentPadding = PaddingValues(16.dp)) { +// items(profile?.networks.orEmpty()) { +// Network( +// network = it, +// onAccountAdd = { newName -> +// walletState?.createNewAccount(NetworkId.MAINNET, DisplayName(newName)) +// ?.let { +// walletState?.addAccount(it) +// +// profile = walletState?.profile() +// } +// } +// ) +// } +// } +// } } @Composable @@ -167,21 +165,21 @@ fun Network( } } -val Wallet.Companion.defaultPhoneName: String - get() = "Android Phone" - -fun Wallet.Companion.with( - entropy: ByteArray = ByteArray(32).apply { Random.nextBytes(this) }, - phoneName: String = Wallet.Companion.defaultPhoneName, - secureStorage: SecureStorage -): Wallet { - return Wallet.byCreatingNewProfileAndSecretsWithEntropy( - entropy = NonEmptyMax32Bytes(entropy.toBagOfBytes()), - walletClientModel = WalletClientModel.ANDROID, - walletClientName = phoneName, - secureStorage = secureStorage - ) -} +//val Wallet.Companion.defaultPhoneName: String +// get() = "Android Phone" +// +//fun Wallet.Companion.with( +// entropy: ByteArray = ByteArray(32).apply { Random.nextBytes(this) }, +// phoneName: String = Wallet.Companion.defaultPhoneName, +// secureStorage: SecureStorageDriver +//): Wallet { +// return Wallet.byCreatingNewProfileAndSecretsWithEntropy( +// entropy = NonEmptyMax32Bytes(entropy.toBagOfBytes()), +// walletClientModel = WalletClientModel.ANDROID, +// walletClientName = phoneName, +// secureStorage = secureStorage +// ) +//} @OptIn(UsesSampleValues::class) @Preview(showBackground = true) diff --git a/examples/iOS/App.xctestplan b/examples/iOS/App.xctestplan new file mode 100644 index 000000000..0cfa71512 --- /dev/null +++ b/examples/iOS/App.xctestplan @@ -0,0 +1,29 @@ +{ + "configurations" : [ + { + "id" : "61024E3D-4D07-4C71-9C15-82BE0C20962B", + "name" : "Test Scheme Action", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false, + "targetForVariableExpansion" : { + "containerPath" : "container:PlanbokApp.xcodeproj", + "identifier" : "48F0A6C82B7D42D400929DC2", + "name" : "PlanbokApp" + } + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:..\/Backend", + "identifier" : "PlanbokTests", + "name" : "PlanbokTests" + } + } + ], + "version" : 1 +} diff --git a/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/Planbok.xcscheme b/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/Planbok.xcscheme new file mode 100644 index 000000000..0a4d6a7c9 --- /dev/null +++ b/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/Planbok.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/PlanbokTests.xcscheme b/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/PlanbokTests.xcscheme new file mode 100644 index 000000000..b6468af4c --- /dev/null +++ b/examples/iOS/Backend/.swiftpm/xcode/xcshareddata/xcschemes/PlanbokTests.xcscheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/iOS/Backend/Package.resolved b/examples/iOS/Backend/Package.resolved index a4c42fccb..ce337944c 100644 --- a/examples/iOS/Backend/Package.resolved +++ b/examples/iOS/Backend/Package.resolved @@ -1,5 +1,14 @@ { "pins" : [ + { + "identity" : "asyncextensions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sideeffect-io/AsyncExtensions", + "state" : { + "revision" : "1f0729e4f1f6c7166acfac3cec43b3cbe83be0e6", + "version" : "0.5.2" + } + }, { "identity" : "combine-schedulers", "kind" : "remoteSourceControl", @@ -9,6 +18,14 @@ "version" : "1.0.0" } }, + { + "identity" : "jsonviewer", + "kind" : "remoteSourceControl", + "location" : "https://github.com/varkrishna/JSONViewer", + "state" : { + "revision" : "9e3b928a8651609dcbb6c54c584de09e9f02083d" + } + }, { "identity" : "keychainaccess", "kind" : "remoteSourceControl", @@ -23,8 +40,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-case-paths", "state" : { - "revision" : "551150d5e60e3be78972607d89cd69069cca3e7c", - "version" : "1.2.4" + "revision" : "8d712376c99fc0267aa0e41fea732babe365270a", + "version" : "1.3.3" } }, { @@ -50,8 +67,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-composable-architecture", "state" : { - "revision" : "cf967a28a8605629559533320d604168d733fc9c", - "version" : "1.8.0" + "revision" : "1eeca17b21b931fd6a5cc683a2cd659fb0441c66", + "version" : "1.11.0" } }, { @@ -68,8 +85,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-custom-dump", "state" : { - "revision" : "6ea3b1b6a4957806d72030a32360d4bcb155a0d2", - "version" : "1.2.0" + "revision" : "f01efb26f3a192a0e88dcdb7c3c391ec2fc25d9c", + "version" : "1.3.0" } }, { @@ -77,8 +94,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-dependencies", "state" : { - "revision" : "09e49dd46932adfe80ce672b4b3772d79ee6c21a", - "version" : "1.2.1" + "revision" : "350e1e119babe8525f9bd155b76640a5de270184", + "version" : "1.3.0" } }, { @@ -86,8 +103,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tgrapperon/swift-dependencies-additions", "state" : { - "revision" : "02e7b1801a96828049fe4d3e8bdc5e608ef5ffbc", - "version" : "1.0.1" + "revision" : "406ed2d853eb0e377173660f0965591ea7d31207", + "version" : "1.0.2" } }, { @@ -104,8 +121,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-perception", "state" : { - "revision" : "42240120b2a8797595433288ab4118f8042214c3", - "version" : "1.1.1" + "revision" : "64f7f6c28c6a4d3c4b9da2ba02383e29ab48a8cf", + "version" : "1.2.2" } }, { @@ -126,13 +143,22 @@ "version" : "1.2.1" } }, + { + "identity" : "swiftyjson", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftyJSON/SwiftyJSON", + "state" : { + "revision" : "af76cf3ef710b6ca5f8c05f3a31307d44a3c5828", + "version" : "5.0.2" + } + }, { "identity" : "xctest-dynamic-overlay", "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "b58e6627149808b40634c4552fcf2f44d0b3ca87", - "version" : "1.1.0" + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" } } ], diff --git a/examples/iOS/Backend/Package.swift b/examples/iOS/Backend/Package.swift index f7c23fd2f..8d107f20f 100644 --- a/examples/iOS/Backend/Package.swift +++ b/examples/iOS/Backend/Package.swift @@ -18,11 +18,12 @@ let package = Package( .package(name: "Sargon", path: "../../.."), .package( url: "https://github.com/pointfreeco/swift-composable-architecture", - from: "1.8.0"), + from: "1.11.0"), .package( url: "https://github.com/tgrapperon/swift-dependencies-additions", - from: "1.0.1"), + from: "1.0.2"), .package(url: "https://github.com/kishikawakatsumi/KeychainAccess", from: "4.2.2"), + .package(url: "https://github.com/varkrishna/JSONViewer", revision: "df1a57eddc49b168ff400c8595f72acbe33acc9c"), ], targets: [ .target( @@ -36,6 +37,7 @@ let package = Package( name: "DependenciesAdditions", package: "swift-dependencies-additions"), "KeychainAccess", + "JSONViewer", ], resources: [.process("Assets")], swiftSettings: swiftSettings diff --git a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Contents.json b/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Contents.json deleted file mode 100644 index 73c00596a..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/Contents.json b/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/Contents.json deleted file mode 100644 index c7962d110..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "RadixWallet@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/RadixWallet@3x.png b/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/RadixWallet@3x.png deleted file mode 100644 index f72bead5a..000000000 Binary files a/examples/iOS/Backend/Sources/Planbok/Assets/Media.xcassets/Splash.imageset/RadixWallet@3x.png and /dev/null differ diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/AccountsClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/AccountsClient.swift new file mode 100644 index 000000000..2437f2b08 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/AccountsClient.swift @@ -0,0 +1,60 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import DependenciesMacros +import IdentifiedCollections + +public typealias Accounts = IdentifiedArrayOf +extension Array where Element: Identifiable { + func asIdentified() -> IdentifiedArrayOf { + IdentifiedArrayOf(uncheckedUniqueElements: self) + } +} + +/// The purpose of this client is to provide WRITE / UPDATE methods of Profile +/// relating to Account(s). READING should be done with `@SharedReader(.accountsForDisplay)` +/// Shared state! +@DependencyClient +public struct AccountsClient: Sendable { + public typealias AccountByAddress = @Sendable (AccountAddress) throws -> Account + public typealias CreateAndSaveAccount = @Sendable (DisplayName) async throws -> Account + public typealias UpdateAccount = @Sendable (Account) async throws -> Void + public typealias BatchCreateManySavedAccounts = @Sendable (_ count: UInt16) async throws -> Void + + public var accountByAddress: AccountByAddress + public var createAndSaveAccount: CreateAndSaveAccount + public var updateAccount: UpdateAccount + public var batchCreateManySavedAccounts: BatchCreateManySavedAccounts +} + +extension AccountsClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + + return Self( + accountByAddress: { address in + try os.accountByAddress(address: address) + }, + createAndSaveAccount: { + try await os.createAndSaveNewAccount(networkId: os.currentNetworkID, name: $0) + }, + updateAccount: { account in + log.debug("Updating account") + try await os.updateAccount(updated: account) + }, + batchCreateManySavedAccounts: { count in + try await os.batchCreateManyAccountsThenSaveOnce( + count: count, + networkId: os.currentNetworkID, + namePrefix: "Unnamed" + ) + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/FactorSourcesClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/FactorSourcesClient.swift new file mode 100644 index 000000000..d645735c1 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/FactorSourcesClient.swift @@ -0,0 +1,107 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import DependenciesMacros + +@DependencyClient +public struct FactorSourcesClient: Sendable { + + public typealias AddFactorSource = @Sendable (FactorSource) async throws -> Void + public typealias UpdateFactorSource = @Sendable (FactorSource) async throws -> Void + public typealias CreateHWFactorSource = @Sendable (MnemonicWithPassphrase, FactorSourceKind) async throws -> FactorSource + public typealias CreateSecurityQuestionsFactor = @Sendable (AnswersToQuestions) throws -> SecurityQuestionsNotProductionReadyFactorSource + public typealias DecryptSecurityQuestionsFactor = @Sendable (AnswersToQuestions, SecurityQuestionsNotProductionReadyFactorSource) throws -> Mnemonic + public typealias AddAllSampleFactors = @Sendable () async throws -> Void + public var createHWFactorSource: CreateHWFactorSource + public var createSecurityQuestionsFactor: CreateSecurityQuestionsFactor + public var decryptSecurityQuestionsFactor: DecryptSecurityQuestionsFactor + public var addFactorSource: AddFactorSource + public var addAllSampleFactors: AddAllSampleFactors + public var updateFactorSource: UpdateFactorSource +} + +extension FactorSourcesClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + Self( + createHWFactorSource: { mnemonicWithPassphrase, kind -> FactorSource in + switch kind { + case .device: + try await os.createDeviceFactorSource( + mnemonicWithPassphrase: mnemonicWithPassphrase, + factorType: mnemonicWithPassphrase.mnemonic.wordCount == .twentyFour ? .babylon( + isMain: false + ) : .olympia + ).asGeneral + + case .ledgerHqHardwareWallet: + LedgerHardwareWalletFactorSource.init( + mnemonicWithPassphrase: mnemonicWithPassphrase, + hint: LedgerHardwareWalletHint( + name: "Unknown", + model: .nanoSPlus + ), + common: FactorSourceCommon.babylon() + ) + .asGeneral + case .offDeviceMnemonic: + OffDeviceMnemonicFactorSource.init( + mnemonicWithPassphrase: mnemonicWithPassphrase, + hint: .init( + displayName: "Unknown" + ) + ).asGeneral + case .arculusCard: + ArculusCardFactorSource( + mnemonicWithPassphrase: mnemonicWithPassphrase, + name: "Unknown" + ).asGeneral + case .securityQuestions: + fatalError( + "SecurityQuestions FS not supported here." + ) + + case .trustedContact: + fatalError( + "Trusted Contact not supported yet" + ) + } + + }, + createSecurityQuestionsFactor: { questionsAndAnswers in + @Dependency(MnemonicClient.self) var mnemonicClient + + let mnemonic = mnemonicClient.generateNewMnemonic(.twentyFour) + log.notice("Creating new SecurityQuestions FactorSource, mnemonic is:\n'\(mnemonic.phrase)'\nAnswers:\n\(questionsAndAnswers.map(\.answer))") + return try SecurityQuestionsNotProductionReadyFactorSource( + mnemonic: mnemonic, + questionsAndAnswers: questionsAndAnswers.elements + ) + }, + decryptSecurityQuestionsFactor: { questionsAndAnswers, factor in + try factor.decrypt(questionsAndAnswers: questionsAndAnswers.elements) + }, + addFactorSource: { factorSource in + log.notice("Adding New factorSource: \(factorSource)") + let _ = try await os.addFactorSource(factorSource: factorSource) + log.info("Finished adding new factorSource.") + }, + addAllSampleFactors: { + log.notice("Adding Many Sample factorSources") + let _ = try await os.debugAddAllSampleFactors() + log.notice("Finished adding Many Sample factorSources") + }, + updateFactorSource: { factorSource in + log.notice("Updating factorSource: \(factorSource)") + let _ = try await os.updateFactorSource(updated: factorSource) + log.info("Finished updating factorSource.") + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/GatewaysClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/GatewaysClient.swift new file mode 100644 index 000000000..f557d071e --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/GatewaysClient.swift @@ -0,0 +1,29 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import DependenciesMacros + +@DependencyClient +public struct GatewaysClient: Sendable { + public typealias SwitchGatewayTo = @Sendable (Gateway) async throws -> Void + public var switchGatewayTo: SwitchGatewayTo +} + +extension GatewaysClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + Self( + switchGatewayTo: { to in + log.notice("Changing current gateway to: \(to)") + let _ = try await os.changeCurrentGateway(to: to) + log.info("Finished changing current gateway.") + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/Keychain.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/Keychain.swift index 5114d14ae..dccd7c443 100644 --- a/examples/iOS/Backend/Sources/Planbok/Dependencies/Keychain.swift +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/Keychain.swift @@ -1,56 +1,18 @@ // // File.swift -// +// // // Created by Alexander Cyon on 2024-02-15. // @_exported import KeychainAccess import Sargon -import SargonUniFFI +import ComposableArchitecture -extension DependencyValues { - /// A dependency that exposes an ``Keychain.Dependency`` value that you can use to read and - /// write to `Keychain`. - public var keychain: Keychain.Dependency { - get { self[Keychain.Dependency.self] } - set { self[Keychain.Dependency.self] = newValue } - } -} extension Keychain: @unchecked Sendable {} -extension Keychain: SecureStorage { - @DependencyClient - public struct Dependency: DependencyKey { - - public let loadData: @Sendable (SecureStorageKey) throws -> Data? - public let saveData: @Sendable (SecureStorageKey, Data) throws -> Void - public let deleteDataForKey: @Sendable (SecureStorageKey) throws -> Void - - public static func with(keychain: Keychain) -> Self { - Self.init( - loadData: keychain.loadData(key:), - saveData: keychain.saveData(key:data:), - deleteDataForKey: keychain.deleteDataForKey(key:) - ) - } - public static let liveValue = Self.with(keychain: .shared) - public static var testValue: Self { - final class Ephemeral { - var dict = Dictionary() - init() {} - } - let ephemeral = Ephemeral() - return Self( - loadData: { ephemeral.dict[$0] }, - saveData: { ephemeral.dict[$0] = $1 }, - deleteDataForKey: { ephemeral.dict[$0] = nil } - ) - } - } - - public static let shared = Keychain(service: "works.rdx.planbok") - +extension Keychain: SecureStorageDriver { + @Sendable public func loadData(key: SecureStorageKey) throws -> Data? { try getData(key.identifier) diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/MnemonicClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/MnemonicClient.swift new file mode 100644 index 000000000..8cdfcca0b --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/MnemonicClient.swift @@ -0,0 +1,33 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import DependenciesMacros + +@DependencyClient +public struct MnemonicClient: Sendable { + public typealias LoadMnemonic = @Sendable (FactorSourceIDFromHash) async throws -> PrivateHierarchicalDeterministicFactorSource + public typealias GenerateNewMnemonic = @Sendable (BIP39WordCount) -> Mnemonic + public var loadMnemonic: LoadMnemonic + public var generateNewMnemonic: GenerateNewMnemonic +} + + +extension MnemonicClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + Self( + loadMnemonic: { id in + try await os.loadPrivateDeviceFactorSourceById(id: id) + }, + generateNewMnemonic: { wordCount in + Mnemonic(wordCount: wordCount, language: .english) + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/PasteboardClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/PasteboardClient.swift new file mode 100644 index 000000000..ec050d57a --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/PasteboardClient.swift @@ -0,0 +1,65 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-12. +// + +import Foundation +import Dependencies +import AsyncExtensions + +#if canImport(UIKit) +import UIKit +public typealias Pasteboard = UIPasteboard +extension Pasteboard { + @Sendable public func setCopied(string: String) { + self.string = string + } + @Sendable public func getCopied() -> String? { + self.string + } +} +#elseif canImport(AppKit) +import AppKit +public typealias Pasteboard = NSPasteboard +extension NSPasteboard: @unchecked Sendable {} + +extension Pasteboard { + @Sendable public func setCopied(string: String) { + self.setString(string, forType: .string) + } + @Sendable public func getCopied() -> String? { + self.string(forType: .string) + } +} +#endif + +@DependencyClient +public struct PasteboardClient: Sendable { + public typealias CopyEvents = @Sendable () -> AnyAsyncSequence + public typealias CopyString = @Sendable (String) -> Void + public typealias GetString = @Sendable () -> String? + + public var copyEvents: CopyEvents + public var copyString: CopyString + public var getString: GetString +} +extension PasteboardClient: DependencyKey { + public typealias Value = Self + public static let liveValue = Self.live() + static func live(pasteboard: Pasteboard = .general) -> Self { + let copyEvents = AsyncPassthroughSubject() + + return Self( + copyEvents: { copyEvents.share().eraseToAnyAsyncSequence() }, + copyString: { aString in + pasteboard.setCopied(string: aString) + copyEvents.send(aString) + }, + getString: { + pasteboard.getCopied() + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/ProfileClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/ProfileClient.swift new file mode 100644 index 000000000..40b118473 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/ProfileClient.swift @@ -0,0 +1,49 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import DependenciesMacros + +@DependencyClient +public struct ProfileClient: Sendable { + public typealias ActiveProfile = @Sendable () -> Profile + public typealias DeleteProfileAndMnemonicsThenCreateNew = @Sendable () async throws -> Void + public typealias ImportProfile = @Sendable (Profile) async throws -> Void + public typealias DecryptEncryptedProfile = @Sendable (_ encrypted: Data, _ password: String) throws -> Profile + + public typealias EmulateFreshInstallOfAppThenRestart = @Sendable () async throws -> Void + + public var activeProfile: ActiveProfile + public var deleteProfileAndMnemonicsThenCreateNew: DeleteProfileAndMnemonicsThenCreateNew + public var importProfile: ImportProfile + public var decryptEncryptedProfile: DecryptEncryptedProfile + public var emulateFreshInstallOfAppThenRestart: EmulateFreshInstallOfAppThenRestart +} + +extension ProfileClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + return Self( + activeProfile: { + os.profile() + }, + deleteProfileAndMnemonicsThenCreateNew: { + let _ = try await os.deleteProfileThenCreateNewWithBdfs() + }, + importProfile: { + try await os.importProfile(profile: $0) + }, + decryptEncryptedProfile: { + try Profile(encrypted: $0, decryptionPassword: $1) + }, + emulateFreshInstallOfAppThenRestart: { + try await os.emulateFreshInstall() + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/ShieldClient.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/ShieldClient.swift new file mode 100644 index 000000000..a437c1f4c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Dependencies/ShieldClient.swift @@ -0,0 +1,21 @@ +import Foundation +import Sargon +import DependenciesMacros + +@DependencyClient +public struct ShieldClient: Sendable { + public typealias SaveSecurityShield = @Sendable (Shield) async throws -> Bool + public var saveSecurityShield: SaveSecurityShield +} + + +extension ShieldClient: DependencyKey { + public static let liveValue = Self.live(os: SargonOS.shared) + public static func live(os: SargonOS) -> Self { + Self( + saveSecurityShield: { shield in + try await os.addSecurityStructureOfFactorSources(structure: shield) + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Dependencies/WalletHolder.swift b/examples/iOS/Backend/Sources/Planbok/Dependencies/WalletHolder.swift deleted file mode 100644 index 1ade2e828..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Dependencies/WalletHolder.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// File.swift -// -// -// Created by Alexander Cyon on 2024-02-16. -// - -import Foundation -import Sargon -import SargonUniFFI - -public struct WalletHolder: Equatable, Sendable { - public static func == (lhs: Self, rhs: Self) -> Bool { - lhs.wallet === rhs.wallet - } - private var profile: Profile - public let wallet: Wallet - public init(wallet: Wallet) { - self.wallet = wallet - self.profile = wallet.profile() - } - - // FIXME: Replace this with an async stream of values... - public mutating func refresh() { - self.profile = wallet.profile() - } -} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountDetailsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountDetailsFeature.swift new file mode 100644 index 000000000..0341573d1 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountDetailsFeature.swift @@ -0,0 +1,94 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct AccountDetailsFeature { + + @Dependency(AccountsClient.self) var accountsClient + + @Reducer(state: .equatable) + public enum Destination { + case changeGradient(SelectGradientFeature) + } + + @ObservableState + public struct State: Equatable { + public var accountForDisplay: AccountForDisplay + + @Presents var destination: Destination.State? + + public init(accountForDisplay: AccountForDisplay) { + self.accountForDisplay = accountForDisplay + } + } + + public enum Action: ViewAction { + public enum ViewAction { + case changeGradientButtonTapped + } + + case destination(PresentationAction) + case view(ViewAction) + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.changeGradientButtonTapped): + state.destination = .changeGradient( + SelectGradientFeature.State(gradient: state.accountForDisplay.appearanceId) + ) + return .none + + case let .destination(.presented(.changeGradient(.delegate(.selected(newGradient))))): + state.accountForDisplay.appearanceId = newGradient + state.destination = nil + return .run { [address = state.accountForDisplay.address] send in + var account = try accountsClient.accountByAddress(address) + account.appearanceId = newGradient + try await accountsClient.updateAccount(account) + } + + default: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +extension AccountDetailsFeature { + + @ViewAction(for: AccountDetailsFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public var body: some SwiftUI.View { + NavigationView { + VStack { + AccountView(accountForDisplay: store.accountForDisplay, format: .full) + + Button("Change Gradient") { + send(.changeGradientButtonTapped) + } + } + } + .sheet( + item: $store.scope(state: \.destination?.changeGradient, action: \.destination.changeGradient) + ) { store in + SelectGradientFeature.View(store: store) + } + } + } +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountsFeature.swift new file mode 100644 index 000000000..6e43fad1c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Account/AccountsFeature.swift @@ -0,0 +1,84 @@ +import Sargon +import ComposableArchitecture + + +@Reducer +public struct AccountsFeature { + + public init() {} + + @ObservableState + public struct State: Equatable { + @SharedReader(.network) var network + @SharedReader(.accountsForDisplay) var accountsForDisplay + } + + public enum Action: ViewAction { + public enum ViewAction { + case accountCardTapped(AccountForDisplay) + case createNewAccountButtonTapped + } + public enum DelegateAction { + case createNewAccount(index: Int) + case showDetailsFor(AccountForDisplay) + } + case view(ViewAction) + case delegate(DelegateAction) + } + + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.createNewAccountButtonTapped): + return .send(.delegate(.createNewAccount(index: state.accountsForDisplay.count))) + + case let .view(.accountCardTapped(account)): + return .send(.delegate(.showDetailsFor(account))) + + default: return .none + } + } + } +} + +extension AccountsFeature { + @ViewAction(for: AccountsFeature.self) + public struct View: SwiftUI.View { + + public let store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack { + Text("Accounts").font(.largeTitle) + + if store.state.accountsForDisplay.isEmpty { + Text("You dont have any accounts on \(store.state.network.description)") + } else { + ScrollView { + ForEach(store.state.accountsForDisplay) { accountForDisplay in + VStack { + AccountCardView(accountForDisplay: accountForDisplay) { + send(.accountCardTapped(accountForDisplay)) + } + } + } + } + } + + Spacer() + + Button("Create New Account") { + send(.createNewAccountButtonTapped) + } + + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/SelectGradientFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Account/SelectGradientFeature.swift similarity index 89% rename from examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/SelectGradientFeature.swift rename to examples/iOS/Backend/Sources/Planbok/Features/Account/SelectGradientFeature.swift index d06a0d18b..e2b5aebaa 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/SelectGradientFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Account/SelectGradientFeature.swift @@ -7,20 +7,17 @@ import Foundation import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct SelectGradientFeature { @ObservableState public struct State: Equatable { - public let name: DisplayName public var gradient: AppearanceID public init( - name: DisplayName, - gradient: AppearanceID = AppearanceID.allCases.first! + gradient: AppearanceID ) { - self.name = name self.gradient = gradient } } @@ -28,7 +25,7 @@ public struct SelectGradientFeature { @CasePathable public enum Action: ViewAction { public enum Delegate { - case selected(AppearanceID, DisplayName) + case selected(AppearanceID) } @CasePathable public enum ViewAction { @@ -39,6 +36,29 @@ public struct SelectGradientFeature { case delegate(Delegate) } + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case let .view(.selectedGradient(gradient)): + state.gradient = gradient + return .none + + case .view(.confirmedGradientButtonTapped): + return .send(.delegate(.selected(state.gradient))) + + default: + return .none + + } + } + } +} + +extension SelectGradientFeature { + @ViewAction(for: SelectGradientFeature.self) public struct View: SwiftUI.View { public let store: StoreOf @@ -84,24 +104,4 @@ public struct SelectGradientFeature { .padding() } } - - public init() {} - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - - case let .view(.selectedGradient(gradient)): - state.gradient = gradient - return .none - - case .view(.confirmedGradientButtonTapped): - return .send(.delegate(.selected(state.gradient, state.name))) - - default: - return .none - - } - } - } } diff --git a/examples/iOS/Backend/Sources/Planbok/Features/AccountsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/AccountsFeature.swift deleted file mode 100644 index 9224c647b..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Features/AccountsFeature.swift +++ /dev/null @@ -1,102 +0,0 @@ -import Sargon -import SargonUniFFI - -@Reducer -public struct AccountsFeature { - public init() {} - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - - case .view(.createNewAccountButtonTapped): - return .send(.delegate(.createNewAccount)) - - case .view(.deleteWalletButtonTapped): - return .send(.delegate(.deleteWallet)) - - default: return .none - } - } - } - - @ObservableState - public struct State: Equatable { - public var walletHolder: WalletHolder - - // FIXME: We really do not want this - mutating func refresh() { - walletHolder.refresh() - } - - public var profile: Profile { - walletHolder.wallet.profile() - } - - public var currentNetworkID: NetworkId { - profile.appPreferences.gateways.current.network.id - } - - public var network: ProfileNetwork { - profile.networks.first(where: { $0.id == currentNetworkID })! - } - - public var accounts: Accounts { - network.accounts - } - - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder - } - - public init(wallet: Wallet) { - self.init(walletHolder: .init(wallet: wallet)) - } - } - - public enum Action: ViewAction { - public enum ViewAction { - case createNewAccountButtonTapped - case deleteWalletButtonTapped - } - public enum DelegateAction { - case createNewAccount - case deleteWallet - } - case view(ViewAction) - case delegate(DelegateAction) - } - - @ViewAction(for: AccountsFeature.self) - public struct View: SwiftUI.View { - - public let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some SwiftUI.View { - VStack { - Text("Accounts").font(.largeTitle) - - ForEach(store.state.accounts) { account in - VStack { - AccountView(account: account) - } - } - - Spacer() - - Button("Create New Account") { - send(.createNewAccountButtonTapped) - } - - Button("Delete Wallet", role: .destructive) { - send(.deleteWalletButtonTapped) - } - } - .padding() - } - } -} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/AppFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/AppFeature.swift index 4029b3dde..6aca83890 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/AppFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/AppFeature.swift @@ -1,5 +1,5 @@ import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct AppFeature { @@ -9,8 +9,29 @@ public struct AppFeature { case splash(SplashFeature.State) case onboarding(OnboardingFeature.State) case main(MainFeature.State) - public init() { - self = .splash(.init()) + + public init(isEmulatingFreshInstall: Bool = false) { + + let drivers = Drivers( + networking: URLSession.shared, + secureStorage: Keychain(service: "rdx.works.planbok"), + entropyProvider: EntropyProvider.shared, + hostInfo: HostInfo( + appVersion: "0.0.1" + ), + logging: Log.shared, + eventBus: EventBus.shared, + fileSystem: FileSystem.shared, + unsafeStorage: UnsafeStorage.init( + userDefaults: .init( + suiteName: "rdx.works" + )! + ) + ) + + BIOS.creatingShared(drivers: drivers) + + self = .splash(.init(isEmulatingFreshInstall: true)) } } @@ -20,50 +41,30 @@ public struct AppFeature { case main(MainFeature.Action) } - public struct View: SwiftUI.View { - public let store: StoreOf - public init(store: StoreOf) { - self.store = store - } - public var body: some SwiftUI.View { - switch store.state { - case .splash: - if let store = store.scope(state: \.splash, action: \.splash) { - SplashFeature.View(store: store) - } - case .onboarding: - if let store = store.scope(state: \.onboarding, action: \.onboarding) { - OnboardingFeature.View(store: store) - } - case .main: - if let store = store.scope(state: \.main, action: \.main) { - MainFeature.View(store: store) - } - } - } - } - - public init() {} public var body: some ReducerOf { Reduce { state, action in switch action { - case let .splash(.delegate(.walletInitialized(wallet, hasAccount))): - if hasAccount { - state = .main(MainFeature.State(wallet: wallet)) + case let .splash(.delegate(.booted(hasAnyAccountOnAnyNetwork))): + if hasAnyAccountOnAnyNetwork { + state = .main(MainFeature.State()) } else { - state = .onboarding(OnboardingFeature.State(wallet: wallet)) + state = .onboarding(OnboardingFeature.State()) } return .none - case let .onboarding(.delegate(.createdAccount(with: walletHolder))): - state = .main(MainFeature.State(walletHolder: walletHolder)) + case .onboarding(.delegate(.done)): + state = .main(MainFeature.State()) return .none case .main(.delegate(.deletedWallet)): - state = .onboarding(OnboardingFeature.State(wallet: Wallet.generateNewBDFSAndEmptyProfile())) + state = .onboarding(OnboardingFeature.State()) + return .none + + case .main(.delegate(.emulateFreshInstall)): + state = AppFeature.State(isEmulatingFreshInstall: true) return .none default: @@ -82,3 +83,28 @@ public struct AppFeature { } } +extension AppFeature { + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + switch store.state { + case .splash: + if let store = store.scope(state: \.splash, action: \.splash) { + SplashFeature.View(store: store) + } + case .onboarding: + if let store = store.scope(state: \.onboarding, action: \.onboarding) { + OnboardingFeature.View(store: store) + } + case .main: + if let store = store.scope(state: \.main, action: \.main) { + MainFeature.View(store: store) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/DebugProfileFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/DebugProfileFeature.swift new file mode 100644 index 000000000..476415123 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/DebugProfileFeature.swift @@ -0,0 +1,115 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-12. +// + +import Foundation +import Sargon +import ComposableArchitecture +import JSONViewer +import AsyncExtensions + + +@Reducer +public struct DebugProfileFeature { + + @Dependency(ProfileClient.self) var profileClient + @Dependency(PasteboardClient.self) var pasteboardClient + + @ObservableState + public struct State { + public var profileJSONString: String? + } + + public enum Action: ViewAction, Sendable { + public enum ViewAction: Sendable { + case appear + case copyNode(String) + case copyButtonTapped + } + public enum InternalAction: Sendable { + case loadedProfileString(String) + } + case view(ViewAction) + case `internal`(InternalAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.appear): + return .run { send in + let jsonString = profileClient.activeProfile().toJSONString(prettyPrinted: true) + await send(.internal(.loadedProfileString(jsonString))) + } + + case .view(.copyButtonTapped): + guard let profileJSONString = state.profileJSONString else { + return .none + } + pasteboardClient.copyString(profileJSONString) + return .none + + case let .view(.copyNode(nodeValue)): + // this is NOT JSON... + pasteboardClient.copyString(nodeValue) + return .none + + case let .internal(.loadedProfileString(profileJSONString)): + state.profileJSONString = profileJSONString + return .none + } + } + } +} + +extension DebugProfileFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + Group { + if let profileJSONString = store.profileJSONString { + if let jsonNode = profileJSONString.jsonNode(sortingStrategy: .none) { + JSONViewer( + rootNode: jsonNode, + fontConfiguration: .constant(.init( + keyFont: .system(size: 12), + valueFont: .system(size: 10) + )), + initialNodeExpandStategy: .all + ) { event in + switch event { + case let .onDoubleTap(node): + send(.copyNode(node.value)) + } + } + } else { + Text("Failed to create 'JSONNode' from JSON String.") + } + } else { + Text("Loading") + } + } + .onAppear { + send(.appear) + } + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button("Copy") { + send(.copyButtonTapped) + } + .foregroundStyle(.blue) + .buttonStyle(.plain) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageFactorSourcesFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageFactorSourcesFeature.swift new file mode 100644 index 000000000..26616b787 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageFactorSourcesFeature.swift @@ -0,0 +1,138 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct ManageFactorSourcesFeature { + + @Dependency(FactorSourcesClient.self) var factorsClient + + @ObservableState + public struct State: Equatable { + @SharedReader(.factorSources) var factorSources + } + + @CasePathable + public enum Action: ViewAction { + + @CasePathable + public enum ViewAction { + case addAllSampleValuesTapped + + case deviceButtonTapped + case ledgerButtonTapped + case arculusButtonTapped + case offDeviceButtonTapped + case securityQuestionsButtonTapped + case trustedContactButtonTapped + } + + case view(ViewAction) + + @CasePathable + public enum DelegateAction { + case navigate(Navigate) + + @CasePathable + public enum Navigate { + case toFactor(kind: FactorSourceKind) + } + } + + case delegate(DelegateAction) + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.addAllSampleValuesTapped): + return .run { send in + try await factorsClient.addAllSampleFactors() + } + + case .view(.deviceButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .device)))) + + case .view(.ledgerButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .ledgerHqHardwareWallet)))) + + case .view(.arculusButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .arculusCard)))) + + case .view(.offDeviceButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .offDeviceMnemonic)))) + + case .view(.securityQuestionsButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .securityQuestions)))) + + case .view(.trustedContactButtonTapped): + return .send(.delegate(.navigate(.toFactor(kind: .trustedContact)))) + + default: + return .none + + } + } + } +} + +extension ManageFactorSourcesFeature { + + @ViewAction(for: ManageFactorSourcesFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public var body: some SwiftUI.View { + VStack { + Text("FactorSources").font(.largeTitle) + Text("You have #\(store.state.factorSources.count) factor sources") + Text("of #\(Set(store.state.factorSources.map(\.kind)).count) different kinds.") + + Button("ADD ALL SAMPLE FACTORS") { + send(.addAllSampleValuesTapped) + } + + Spacer() + + Button("Device") { + send(.deviceButtonTapped) + } + + Button("Ledger") { + send(.ledgerButtonTapped) + } + + Button("Arculus") { + send(.arculusButtonTapped) + } + + Button("Off Device Mnemonic") { + send(.offDeviceButtonTapped) + } + + Button("Security Questions") { + send(.securityQuestionsButtonTapped) + } + + Button("Trusted Contact") { + send(.trustedContactButtonTapped) + } + + } + .padding(.bottom, 100) + } + } + +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageSpecificFactorSourcesFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageSpecificFactorSourcesFeature.swift new file mode 100644 index 000000000..4da5e5b4a --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Manage/ManageSpecificFactorSourcesFeature.swift @@ -0,0 +1,211 @@ +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct EditLabelOffDeviceMnemonicFactor { + + @Dependency(FactorSourcesClient.self) var factorSourcesClient + @Dependency(\.dismiss) var dismiss + + @ObservableState + public struct State: Equatable { + public let factorSource: OffDeviceMnemonicFactorSource + public var label: String + public var displayName: DisplayName? { + try? DisplayName(validating: label) + } + public init(factorSource: OffDeviceMnemonicFactorSource) { + self.factorSource = factorSource + self.label = factorSource.hint.displayName.value + } + } + + @CasePathable + public enum Action: ViewAction { + @CasePathable + public enum ViewAction { + case labelChanged(String) + case confirmButtonTapped + } + case view(ViewAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.labelChanged(label)): + state.label = label + return .none + case .view(.confirmButtonTapped): + guard let displayName = state.displayName else { + return .none + } + + return .run { [factorSource = state.factorSource] send in + var factorSource = factorSource + factorSource.hint.displayName = displayName + try await factorSourcesClient.updateFactorSource(factorSource.asGeneral) + await dismiss() + } + } + } + } +} +extension EditLabelOffDeviceMnemonicFactor { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + LabeledTextField(label: "", text: $store.label.sending(\.view.labelChanged)) + Button("Confirm") { + send(.confirmButtonTapped) + } + .buttonStyle(.borderedProminent) + .disabled(store.displayName == nil) + } + } + } + +} + +@Reducer +public struct ManageSpecificFactorSourcesFeature { + + @Reducer(state: .equatable) + public enum Destination { + case decryptSecurityQuestions(DecryptSecurityQuestionsFeatureCoordinator) + case editLabelOffDeviceMnemonicFactor(EditLabelOffDeviceMnemonicFactor) + } + + @ObservableState + public struct State { + @SharedReader(.factorSources) var factorSources + + @Presents var destination: Destination.State? + public let kind: FactorSourceKind + } + + @CasePathable + public enum Action: ViewAction { + + @CasePathable + public enum ViewAction { + case addNewButtonTapped + case factorSourceActionButtonTapped(FactorSource) + } + + case view(ViewAction) + case destination(PresentationAction) + + @CasePathable + public enum DelegateAction { + case addNew(FactorSourceKind) + } + + case delegate(DelegateAction) + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.addNewButtonTapped): + return .send(.delegate(.addNew(state.kind))) + + case let .view(.factorSourceActionButtonTapped(factorSource)): + if let securityQuestions = factorSource.asSecurityQuestions { + state.destination = .decryptSecurityQuestions( + DecryptSecurityQuestionsFeatureCoordinator.State( + securityQuestionsFactorSource: securityQuestions + ) + ) + } else if let offDeviceMnemonic = factorSource.asOffDeviceMnemonic { + state.destination = .editLabelOffDeviceMnemonicFactor(EditLabelOffDeviceMnemonicFactor.State(factorSource: offDeviceMnemonic)) + } else { + log.warning("FactorSource tapped but no action performed: \(factorSource)") + } + return .none + + case .destination(.presented(.decryptSecurityQuestions(.delegate(.done)))): + state.destination = nil + return .none + + default: + return .none + + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +extension ManageSpecificFactorSourcesFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public var kind: FactorSourceKind { + store.kind + } + public var factors: IdentifiedArrayOf { + store.factorSources.filter(kind: kind) + } + + public var body: some SwiftUI.View { + VStack { + Text("\(kind) Factors").font(.largeTitle) + + if factors.isEmpty { + Text("You have no factors") + } else { + ScrollView { + ForEach(factors, id: \.id) { factorSource in + VStack { + FactorSourceCardView(factorSource: factorSource) { + send(.factorSourceActionButtonTapped(factorSource)) + } + } + } + } + } + + Spacer() + + Button("Add New") { + send(.addNewButtonTapped) + } + } + .padding(.bottom, 100) + .sheet( + item: $store.scope( + state: \.destination?.decryptSecurityQuestions, + action: \.destination.decryptSecurityQuestions + ) + ) { store in + DecryptSecurityQuestionsFeatureCoordinator.View(store: store) + } + .sheet( + item: $store.scope( + state: \.destination?.editLabelOffDeviceMnemonicFactor, + action: \.destination.editLabelOffDeviceMnemonicFactor + ) + ) { store in + EditLabelOffDeviceMnemonicFactor.View(store: store) + } + } + } + +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/InputMnemonicFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/InputMnemonicFeature.swift new file mode 100644 index 000000000..b8e8936de --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/InputMnemonicFeature.swift @@ -0,0 +1,157 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-01. +// + +import Foundation +import ComposableArchitecture +import Sargon + +@Reducer +public struct InputMnemonicFeature { + + @Reducer(state: .equatable) + public enum Destination { + case prefillMnemonic(AlertState) + + public enum PrefillMnemonicAlert: String, CaseIterable { + case device24 + case device24Other + case device12 + case device12Other + case offDevice + case offDeviceOther + case securityQuestions + case securityQuestionsOther + case ledger + case ledgerOther + case arculus + case arculusOther + } + } + + @ObservableState + public struct State: Equatable { + @Presents var destination: Destination.State? + public var bip39Passphrase = "" + public var phrase = "" + public var mnemonic: Mnemonic? { + try? Mnemonic(phrase: phrase) + } + public var mnemonicWithPassphrase: MnemonicWithPassphrase? { + guard let mnemonic else { return nil } + return MnemonicWithPassphrase(mnemonic: mnemonic, passphrase: bip39Passphrase) + } + } + + @CasePathable + public enum Action: ViewAction { + @CasePathable + public enum ViewAction { + case phraseChanged(String) + case prefillButtonTapped + case confirmMnemonicButtonTapped + } + public enum DelegateAction { + case confirmed(MnemonicWithPassphrase) + } + case view(ViewAction) + case delegate(DelegateAction) + case destination(PresentationAction) + + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.phraseChanged(phrase)): + state.phrase = phrase + return .none + + case .view(.prefillButtonTapped): + state.destination = .prefillMnemonic(.init( + title: TextState("Prefill Mnemonic"), + message: TextState("Will fill in the phrase"), + buttons: [ + .cancel(TextState("Cancel")) + ] + Destination.PrefillMnemonicAlert.allCases.map { action in + ButtonState(action: action, label: { + TextState("Prefill \(action.rawValue)") + }) + } + )) + return .none + + case .view(.confirmMnemonicButtonTapped): + guard let mnemonicWithPassphrase = state.mnemonicWithPassphrase else { return .none } + return .send(.delegate(.confirmed(mnemonicWithPassphrase))) + + case .delegate: + return .none + + case let .destination(.presented(.prefillMnemonic(prefillAction))): + let mnemonic = switch prefillAction { + case .device24: Mnemonic.sampleDevice + case .device24Other: Mnemonic.sampleDeviceOther + case .arculus: Mnemonic.sampleArculus + case .arculusOther: Mnemonic.sampleArculusOther + case .device12: Mnemonic.sampleDevice12Words + case .device12Other: Mnemonic.sampleDevice12WordsOther + case .ledger: Mnemonic.sampleLedger + case .ledgerOther: Mnemonic.sampleLedgerOther + case .securityQuestions: Mnemonic.sampleSecurityQuestions + case .securityQuestionsOther: Mnemonic.sampleSecurityQuestionsOther + case .offDevice: Mnemonic.sampleOffDeviceMnemonic + case .offDeviceOther: Mnemonic.sampleOffDeviceMnemonicOther + } + return .send(.view(.phraseChanged(mnemonic.phrase))) + + case .destination(.dismiss): + state.destination = nil + return .none + case .destination: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + + +extension InputMnemonicFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack { + Text("Input Mnemonic").font(.largeTitle) + + LabeledTextField(label: "Phrase", text: $store.phrase.sending(\.view.phraseChanged)) + + Button("Prefill") { + send(.prefillButtonTapped) + } + + Button("Confirm") { + send(.confirmMnemonicButtonTapped) + } + .disabled(store.mnemonic == nil) + } + .padding() + .buttonStyle(.borderedProminent) + .alert($store.scope(state: \.destination?.prefillMnemonic, action: \.destination.prefillMnemonic)) + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewHWFactorSourceFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewHWFactorSourceFeature.swift new file mode 100644 index 000000000..8457c72f9 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewHWFactorSourceFeature.swift @@ -0,0 +1,79 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-01. +// + +import Foundation +import ComposableArchitecture +import Sargon + +@Reducer +public struct NewHWFactorSourceFeature { + + @Dependency(FactorSourcesClient.self) var factorSourcesClient + + @ObservableState + public struct State: Equatable { + public let kind: FactorSourceKind + public var inputMnemonic: InputMnemonicFeature.State + public init(kind: FactorSourceKind) { + self.kind = kind + self.inputMnemonic = .init() + } + } + + @CasePathable + public enum Action { + case `internal`(InternalAction) + case delegate(DelegateAction) + @CasePathable + public enum InternalAction { + case inputMnemonic(InputMnemonicFeature.Action) + } + @CasePathable + public enum DelegateAction { + case createdAndSavedNewFactorSource + } + } + + public var body: some ReducerOf { + Scope(state: \.inputMnemonic, action: \.internal.inputMnemonic) { + InputMnemonicFeature() + } + + Reduce { state, action in + switch action { + case let .internal(.inputMnemonic(.delegate(.confirmed(mnemonicWithPassphrase)))): + return .run { [kind = state.kind] send in + let factorSource = try await factorSourcesClient.createHWFactorSource(mnemonicWithPassphrase, kind) + try await factorSourcesClient.addFactorSource(factorSource) + await send(.delegate(.createdAndSavedNewFactorSource)) + } + case .delegate: + return .none + + case .internal: + return .none + } + } + } + +} + +extension NewHWFactorSourceFeature { + public typealias HostingFeature = Self + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("New \(store.state.kind) Factor") + InputMnemonicFeature.View(store: store.scope(state: \.inputMnemonic, action: \.internal.inputMnemonic)) + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewTrustedContactFactorSourceFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewTrustedContactFactorSourceFeature.swift new file mode 100644 index 000000000..9824e3023 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/New/NewTrustedContactFactorSourceFeature.swift @@ -0,0 +1,156 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import ComposableArchitecture +import Sargon + +@Reducer +public struct NewTrustedContactFactorSourceFeature { + + @Dependency(FactorSourcesClient.self) var factorSourcesClient + + @ObservableState + public struct State: Equatable { + + @SharedReader(.network) var network + + public var email = "" + public var name = "" + public var accountAddress = "" + + public var emailAddress: EmailAddress? { + EmailAddress(email: email) + } + + public var displayName: DisplayName? { + try? DisplayName(validating: name) + } + + public var account: AccountAddress? { + try? AccountAddress(validatingAddress: accountAddress) + } + + public var contact: TrustedContactFactorSourceContact? { + guard let emailAddress, let displayName else { + return nil + } + return TrustedContactFactorSourceContact( + emailAddress: emailAddress, + name: displayName + ) + } + } + + public enum Action: BindableAction, ViewAction { + public enum ViewAction { + case addButtonTapped + case randomEmailAddressButtonTapped + case randomAccountAddressButtonTapped + } + public enum DelegateAction { + case done + } + case binding(BindingAction) + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + BindingReducer() + Reduce { state, action in + switch action { + + case .view(.randomEmailAddressButtonTapped): + let wordlist = bip39LanguageWordlist(language: .english) + let word0 = wordlist.randomElement()!.word + let word1 = wordlist.randomElement()!.word + state.email = "\(word0)@\(word1).com" + return .none + + case .view(.randomAccountAddressButtonTapped): + state.accountAddress = AccountAddress.random(networkID: state.network).address + return .none + + case .view(.addButtonTapped): + guard let contact = state.contact, + let accountAddress = state.account else { + return .none + } + let trustedContact = TrustedContactFactorSource( + accountAddress: accountAddress, + contact: contact + ) + + return .run { send in + try await factorSourcesClient.addFactorSource(trustedContact.asGeneral) + await send(.delegate(.done)) + } + + case .binding: + return .none + + case .delegate: + return .none + + } + } + } +} + +extension NewTrustedContactFactorSourceFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("New Trusted Contact") + .font(.largeTitle) + + Spacer() + + LabeledTextField(label: "Name", text: $store.name) + + LabeledTextField(label: "AccountAddress", text: $store.accountAddress) { + buttonRandomize(with: .randomAccountAddressButtonTapped) + } + + LabeledTextField(label: "Email", text: $store.email) { + buttonRandomize(with: .randomEmailAddressButtonTapped) + } + + Spacer() + + Button("Add Factor Source") { + send(.addButtonTapped) + } + .buttonStyle(.borderedProminent) + .disabled(store.contact == nil || store.account == nil) + } + } + + @ViewBuilder + private func buttonRandomize( + with action: HostingFeature.Action.ViewAction + ) -> some SwiftUI.View { + Button(action: { send(action) }, label: { + Image(systemName: "dice") + .imageScale(.large) + .foregroundStyle(Color.white) + .padding() + .background(Color.blue) + .clipShape(.rect(cornerRadius: 10)) + }) + + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ManageSecurityShieldsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ManageSecurityShieldsFeature.swift new file mode 100644 index 000000000..8e155122c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ManageSecurityShieldsFeature.swift @@ -0,0 +1,192 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct ManageSecurityShieldsFeature { + + + @Reducer(state: .equatable) + public enum Destination { + case newSecurityShield(NewSecurityShieldCoordinator) + } + + @ObservableState + public struct State { + @SharedReader(.shields) var shields + @SharedReader(.factorSources) var factorSources + @Presents var destination: Destination.State? + + public init(copyAndEdit preset: Shield? = nil) { + if let preset { + destination = .newSecurityShield(NewSecurityShieldCoordinator.State(copyAndEdit: preset)) + } + } + + public var canAddSampleShields: Bool { + // FIXME: cleanup + var used: [FactorSource] = [] + let m = Shield.sample.matrixOfFactors + used.append(contentsOf: m.primaryRole.thresholdFactors) + used.append(contentsOf: m.primaryRole.overrideFactors) + used.append(contentsOf: m.recoveryRole.thresholdFactors) + used.append(contentsOf: m.recoveryRole.overrideFactors) + used.append(contentsOf: m.confirmationRole.thresholdFactors) + used.append(contentsOf: m.confirmationRole.overrideFactors) + let usedIDs = Set(used.map(\.id)) + return Set(factorSources.map(\.id)).isSuperset(of: usedIDs) + } + } + + public enum Action: ViewAction { + public enum InternalAction { + case newShield(preset: Shield?) + } + public enum ViewAction { + case shieldTapped(Shield) + case addNewButtonTapped + case addSampleShieldButtonTapped + case addSampleOtherShieldButtonTapped + } + case destination(PresentationAction) + public enum DelegateAction { + public enum Navigate { + case toDetailsForShield(Shield) + } + case navigate(Navigate) + } + case delegate(DelegateAction) + case view(ViewAction) + case `internal`(InternalAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.shieldTapped(shield)): + return .send(.delegate(.navigate(.toDetailsForShield(shield)))) + + case .view(.addSampleShieldButtonTapped): + return .send(.internal(.newShield(preset: Shield.sample))) + + case .view(.addSampleOtherShieldButtonTapped): + return .send(.internal(.newShield(preset: Shield.sampleOther))) + + case .view(.addNewButtonTapped): + return .send(.internal(.newShield(preset: nil))) + + case let .internal(.newShield(preset)): + state.destination = .newSecurityShield(NewSecurityShieldCoordinator.State(copyAndEdit: preset)) + return .none + + case .destination(.presented(.newSecurityShield(.delegate(.done)))): + state.destination = nil + return .none + + case .delegate: + return .none + case .destination: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + + +extension ManageSecurityShieldsFeature { + + public typealias HostingFeature = ManageSecurityShieldsFeature + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + + Text("Shields").font(.largeTitle) + + ScrollView { + + Text("Security shields are a combination of factors you can use to protect your accounts and personas.") + + Text("Here are your current security shields.") + + if store.shields.isEmpty { + Text("You have no shields") + } else { + ForEach(store.shields, id: \.id) { shield in + VStack { + ShieldCardView(shield: shield) { + send(.shieldTapped(shield)) + } + } + } + } + } + + Spacer() + + Button("Add New") { + send(.addNewButtonTapped) + } + Button("Add New Sample") { + send(.addSampleShieldButtonTapped) + } + .disabled(!store.canAddSampleShields) + Button("Add New Sample Other") { + send(.addSampleOtherShieldButtonTapped) + } + .disabled(!store.canAddSampleShields) + if !store.canAddSampleShields { + Text("Add ALL Sample Factors from Manage Factor Sources to be able to add sample shields").font(.footnote) + } + } + .padding(.horizontal) + .padding(.bottom, 100) + .sheet( + item: $store.scope( + state: \.destination?.newSecurityShield, + action: \.destination.newSecurityShield + ) + ) { store in + NewSecurityShieldCoordinator.View(store: store) + + } + } + } +} + +public struct ShieldCardView: SwiftUI.View { + public let shield: Shield + public let action: () -> Void + public var body: some SwiftUI.View { + Button(action: action, label: { + HStack { + Image(systemName: "lock.shield") + .resizable() + .imageScale(.large) + .aspectRatio(contentMode: .fit) + .frame(idealHeight: 50) + Text("\(shield.metadata.displayName)") + .font(.title2) + Spacer() + Image(systemName: "chevron.right") + } + .foregroundStyle(Color.app.blue1) + }) + .buttonStyle(.plain) + .padding() + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/FactorSourceExtensions/FactorSourceKind+Extensions.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/FactorSourceExtensions/FactorSourceKind+Extensions.swift new file mode 100644 index 000000000..c6cd4e1c3 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/FactorSourceExtensions/FactorSourceKind+Extensions.swift @@ -0,0 +1,102 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon + +extension FactorSourceKind: Identifiable { + public typealias ID = String + public var id: ID { + toString() + } +} + +extension FactorSourceKind: CaseIterable { + // FIXME: MOVE Into Rust Sargon! + public static let allCases: [Self] = [ + .device, + .arculusCard, + .ledgerHqHardwareWallet, + .offDeviceMnemonic, + .trustedContact, + .securityQuestions + ] +} + +// FIXME: MOVE Into Rust Sargon! +public enum FactorSourceKindUnavailabilityReason: Hashable, Sendable { + case canNeverBeUsedForRole(Role) + case exceededLimitOfKindPerRoleReached(exceededLimit: UInt8, Role) + + public func toString(kind: FactorSourceKind) -> String { + switch self { + case let .canNeverBeUsedForRole(role): "Cannot be used as \(role)" + case let .exceededLimitOfKindPerRoleReached(exceededLimit, role): "Cannot use more than \(exceededLimit) factors of kind \(kind) for \(role)" + } + } +} + +extension FactorSourceKind { + + // FIXME: MOVE Into Rust Sargon! + public func unavailabilityForRole(_ role: Role, usedFactorsForRole: FactorSources) -> FactorSourceKindUnavailabilityReason? { + guard canBeUsedForRole(role) else { + return .canNeverBeUsedForRole(role) + } + guard let limit = limitOfFactorSourceKindFor(role: role) else { + return nil + } + if usedFactorsForRole.filter({ $0.kind == self }).count >= limit { + return .exceededLimitOfKindPerRoleReached(exceededLimit: limit, role) + } else { + return nil // free to use + } + } + + // FIXME: MOVE Into Rust Sargon! + private func limitOfFactorSourceKindFor(role: Role) -> UInt8? { + switch self { + case .device: return 1 + default: return nil + } + } + + // FIXME: MOVE Into Rust Sargon! + private func canBeUsedForRole(_ role: Role) -> Bool { + switch self { + case .device: + return role == .primary + case .securityQuestions: + return role == .confirmation + case .offDeviceMnemonic: + return role != .primary + case .trustedContact: + return role != .primary + default: return true + } + } +} + +extension FactorSourceKind { + + public var title: String { + switch self { + case .device: return "This Phone" + case .arculusCard: return "Arculus Card" + case .ledgerHqHardwareWallet: return "Ledger Hardware Wallet" + case .trustedContact: return "Trusted Contact" + case .securityQuestions: return "Security Questions" + case .offDeviceMnemonic: return "Password" + } + } + public var subtitle: String? { + switch self { + case .device: return "Face ID / PIN" + default: return nil + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/IntroWhatIsShieldFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/IntroWhatIsShieldFeature.swift new file mode 100644 index 000000000..d5752e755 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/IntroWhatIsShieldFeature.swift @@ -0,0 +1,69 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct IntroWhatIsShieldFeature { + + @ObservableState + public struct State: Equatable {} + + @ObservableState + public enum Action: ViewAction { + public enum ViewAction { + case continueButtonTapped + } + public enum DelegateAction { + case `continue` + } + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.continueButtonTapped): + return .send(.delegate(.continue)) + case .delegate: + return .none + } + } + } +} + + +extension IntroWhatIsShieldFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Create a Security Shield").font(.largeTitle) + + Spacer() + Text("Let's make sure you can always access your accounts - even if you lose your phone or buy a new one.") + + Spacer() + + Button("Create security shield") { + send(.continueButtonTapped) + } + } + .padding() + .navigationTitle("New Shield") + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/NameNewShieldFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/NameNewShieldFeature.swift new file mode 100644 index 000000000..7caa580f0 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/NameNewShieldFeature.swift @@ -0,0 +1,122 @@ +import Sargon +import ComposableArchitecture + +@Reducer +public struct NameNewShieldFeature { + + @Dependency(ShieldClient.self) var shieldClient + + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + public var shieldName = "" + public var errorMessage: String? + var copyOf: Shield? { + newShieldDraft.copyOf + } + public init() { + if let copyOf { + self.shieldName = "Copy of \(copyOf.metadata.displayName.value)" + } else { + self.shieldName = "My Shield" + } + } + } + + public enum Action: ViewAction { + public enum Delegate { + case done + } + public enum InternalAction { + case named(DisplayName) + } + @CasePathable + public enum ViewAction { + case shieldNameChanged(String) + case continueButtonTapped + } + case delegate(Delegate) + case `internal`(InternalAction) + case view(ViewAction) + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.shieldNameChanged(name)): + state.errorMessage = nil + state.shieldName = name + return .none + + case .view(.continueButtonTapped): + state.errorMessage = nil + do { + let displayName = try DisplayName(validating: state.shieldName) + return .send(.internal(.named(displayName))) + } catch { + state.errorMessage = "Invalid DisplayName, can't be empty or too long." + return .none + } + + case let .internal(.named(name)): + guard let matrixOfFactors = state.newShieldDraft.matrixOfFactors else { + return .none + } + let shield = Shield( + metadata: SecurityStructureMetadata(name: name), + numberOfDaysUntilAutoConfirmation: state.newShieldDraft.numberOfDaysUntilAutoConfirmation, + matrixOfFactors: matrixOfFactors + ) + + return .run { send in + try await shieldClient.saveSecurityShield(shield) + await send(.delegate(.done)) + } + + case .delegate: + return .none + + } + } + } +} + +extension NameNewShieldFeature { + + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Name Shield").font(.largeTitle) + + Spacer() + LabeledTextField(label: "Shield Name", text: $store.shieldName.sending(\.view.shieldNameChanged)) + if let error = store.state.errorMessage { + Text("\(error)") + .foregroundStyle(Color.red) + .font(.footnote) + .fontWeight(.bold) + } + if let original = store.copyOf { + let sameMatrix = original.matrixOfFactors == store.newShieldDraft.matrixOfFactors + let copyOrEditedCopy = sameMatrix ? "Copy" : "**Edited** copy" + Text("(\(copyOrEditedCopy) of: '\(original.metadata.displayName.value)')") + } + Spacer() + Button("Continue") { + send(.continueButtonTapped) + } + .buttonStyle(.borderedProminent) + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSelectKindFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSelectKindFeature.swift new file mode 100644 index 000000000..bead8e097 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSelectKindFeature.swift @@ -0,0 +1,112 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct PickFactorSelectKindFeature { + + @Dependency(\.dismiss) var dismiss + + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + + public let role: Role + public init(role: Role) { + self.role = role + } + + public var usedFactorsForRole: FactorSources { + matrixOfFactorsForRole.usedFactorSources + } + + public var matrixOfFactorsForRole: MatrixOfFactorsForRole { + get { newShieldDraft[role] } + set { + newShieldDraft[role] = newValue + } + } + + + } + + @CasePathable + public enum Action: ViewAction { + public enum ViewAction { + case kindButtonTapped(FactorSourceKind) + case dismissButtonTapped + } + public enum DelegateAction { + case selectedKind(FactorSourceKind) + } + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.kindButtonTapped(kind)): + return .send(.delegate(.selectedKind(kind))) + case .view(.dismissButtonTapped): + return .run { _ in + await dismiss() + } + case .delegate: + return .none + } + } + } +} + +extension PickFactorSelectKindFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack(alignment: .leading) { + ScrollView { + ForEach(FactorSourceKind.allCases) { kind in + let unavailability = kind.unavailabilityForRole(store.role, usedFactorsForRole: store.usedFactorsForRole) + Button(action: { + send(.kindButtonTapped(kind)) + }, label: { + VStack(alignment: .leading) { + Text("`\(kind.title)`") + if let unavailability { + Text("\(unavailability.toString(kind: kind))") + } + } + }) + .disabled(unavailability != nil) + } + } + .navigationTitle("Pick Factor Kind") + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Close") { + send(.dismissButtonTapped) + } + .foregroundStyle(.blue) + .buttonStyle(.plain) + } + } + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSourceFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSourceFeature.swift new file mode 100644 index 000000000..98c597ad7 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/Children/PickFactorSourceFeature.swift @@ -0,0 +1,188 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct PickFactorSourceFeature { + + @ObservableState + public struct State: Equatable { + + @SharedReader(.factorSources) var factorSources + @Shared(.newShieldDraft) var newShieldDraft + + public func isFactorSourceAvailable(id: FactorSourceID) -> Bool { + newShieldDraft[role].usedFactorSources.contains(where: { $0.id == id }) == false + } + public var idOfSelected: FactorSourceID? = nil + public let role: Role + public let kind: FactorSourceKind + } + + @CasePathable + public enum Action: ViewAction { + @CasePathable + public enum ViewAction { + case tappedFactorSource(id: FactorSourceID) + case confirmSelectedFactorButtonTapped + } + public enum DelegateAction { + case done + } + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.confirmSelectedFactorButtonTapped): + guard + let selected = state.idOfSelected, + let factor = state.factorSources[id: selected] + else { + return .none + } + state.newShieldDraft.pickedFactorSource(factor, role: state.role) + return .send(.delegate(.done)) + + case let .view(.tappedFactorSource(id)): + if let selected = state.idOfSelected, + id == selected { + state.idOfSelected = nil + } else { + state.idOfSelected = id + } + return .none + + case .delegate: + return .none + + } + } + } +} + +extension FactorSource { + public var displayLabel: String { + switch self { + case let .device(value): "\(value.hint.name) (\(value.hint.model))" + case let .ledger(value):"\(value.hint.name) (\(value.hint.model))" + case let .arculusCard(value): "\(value.hint.name) (\(value.hint.model))" + case let .offDeviceMnemonic(value): "\(value.hint.displayName)" + case let .trustedContact(value): "\(value.contact.name) (\(value.contact.emailAddress.email))" + case let .securityQuestions(value): "Questions: \(value.sealedMnemonic.securityQuestions.map({ q in q.id.description }).joined(separator: ", "))" + } + } +} + +extension PickFactorSourceFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + + public let store: StoreOf + + public var kind: FactorSourceKind { + store.kind + } + + public var factors: IdentifiedArrayOf { + store.factorSources.filter(kind: kind) + } + + public init(store: StoreOf) { + self.store = store + } + + public struct SelectableFactorView: SwiftUI.View { + + public let factorSource: FactorSource + public let isAvailable: Bool + public let isSelected: Bool + + public let action: () -> Void + + public var body: some SwiftUI.View { + Button(action: action, label: { + HStack { + VStack(alignment: .leading) { + Text("\(factorSource.displayLabel)") + Labeled("Last Used", factorSource.lastUsedOn.formatted(.dateTime)) + Labeled("Added", factorSource.addedOn.formatted(.dateTime)) + Labeled("ID", "...\(factorSource.id.description.suffix(6))").font(.footnote) + + if !isAvailable { + Text("ALREADY USED IN SHIELD").fontWeight(.bold) + } + } + .multilineTextAlignment(.leading) + + if isAvailable { + Circle() + .stroke(Color.app.gray2, lineWidth: 3) + .fill(isSelected ? Color.app.gray2 : Color.app.gray5) + .frame(width: 20, height: 20) + } + } + .padding() + .background(Color.app.white) + .foregroundStyle(Color.app.gray1) + .overlay( + RoundedRectangle(cornerRadius: 15) + .inset(by: 1) + .stroke(.gray, lineWidth: 1) + ) + .padding() + }) + .disabled(!isAvailable) + .buttonStyle(.plain) + + } + } + + public var body: some SwiftUI.View { + VStack { + Text("Select A Factor") + .font(.largeTitle) + + Text("For \(store.role)") + + Text("You have the the following \(store.kind) factors") + + ScrollView { + VStack { + ForEach(factors) { factorSource in + SelectableFactorView( + factorSource: factorSource, + isAvailable: store.state.isFactorSourceAvailable(id: factorSource.id), + isSelected: factorSource.id == store.idOfSelected + ) { + send(.tappedFactorSource(id: factorSource.id)) + } + } + } + + } + + Button("Confirm") { + send(.confirmSelectedFactorButtonTapped) + } + .buttonStyle(.borderedProminent) + .disabled(store.idOfSelected == nil) + } + .background(Color.app.gray5) + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/PickFactorSourceCoordinator.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/PickFactorSourceCoordinator.swift new file mode 100644 index 000000000..d47d9168c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/PickFactorSourceCoordinator/PickFactorSourceCoordinator.swift @@ -0,0 +1,102 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct PickFactorSourceCoordinator { + + @Reducer(state: .equatable) + public enum Path { + case pickFactorSource(PickFactorSourceFeature) + } + + @ObservableState + public struct State: Equatable { + public var role: Role { + pickKind.role + } + public var path = StackState() + public var pickKind: PickFactorSelectKindFeature.State + + public init(role: Role) { + self.pickKind = PickFactorSelectKindFeature.State(role: role) + } + } + + @CasePathable + public enum Action { + @CasePathable + public enum DelegateAction { + case done + } + + case path(StackAction) + case pickKind(PickFactorSelectKindFeature.Action) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Scope(state: \.pickKind, action: \.pickKind) { + PickFactorSelectKindFeature() + } + Reduce { state, action in + switch action { + + case let .pickKind(.delegate(.selectedKind(kind))): + state.path.append(.pickFactorSource(PickFactorSourceFeature.State( + role: state.role, + kind: kind + ))) + return .none + + case .path(.element(id: _, action: .pickFactorSource(.delegate(.done)))): + return .send(.delegate(.done)) + + case .pickKind: + return .none + + case .path: + return .none + + case .delegate: + return .none + } + } + .forEach(\.path, action: \.path) + } +} + +extension PickFactorSourceCoordinator { + public typealias HostingFeature = Self + + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + + public var body: some SwiftUI.View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + PickFactorSelectKindFeature.View( + store: store.scope(state: \.pickKind, action: \.pickKind) + ) + } destination: { store in + switch store.case { + case let .pickFactorSource(store): + PickFactorSourceFeature.View(store: store) + } + } + } + + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/FactorsBuilderFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/FactorsBuilderFeature.swift new file mode 100644 index 000000000..a580ec541 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/FactorsBuilderFeature.swift @@ -0,0 +1,268 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import SwiftUI +import Sargon +import ComposableArchitecture + +@Reducer +public struct FactorsBuilderFeature { + + @ObservableState + public struct State: Equatable { + public enum Mode: Sendable, Hashable { + case threshold, override + } + + @Shared(.newShieldDraft) var newShieldDraft + + public let mode: Mode + public let role: Role + + public init(mode: Mode, role: Role) { + self.mode = mode + self.role = role + } + + public var threshold: FactorThreshold { + get { + if mode == .threshold { + matrixOfFactorsForRole.threshold + } else { + .any + } + } + set { + assert(mode == .threshold) + matrixOfFactorsForRole.threshold = newValue + } + } + + + public var matrixOfFactorsForRole: MatrixOfFactorsForRole { + get { newShieldDraft[role] } + set { + newShieldDraft[role] = newValue + } + } + + public var factors: Factors { + get { + switch mode { + case .override: + matrixOfFactorsForRole.overrideFactors + case .threshold: + matrixOfFactorsForRole.thresholdFactors + } + } + set { + switch mode { + case .override: + matrixOfFactorsForRole.overrideFactors = newValue + case .threshold: + matrixOfFactorsForRole.thresholdFactors = newValue + } } + } + + public var pickedFactorID: Factor.ID? { + get { + newShieldDraft.pendingFactorID + } + set { + newShieldDraft.pendingFactorID = newValue + } + } + + public var title: LocalizedStringKey { + switch mode { + case .override: + "Override Factors" + case .threshold: + "Threshold Factors" + } + } + + public var canChangeThreshold: Bool { + mode == .threshold + } + } + + @CasePathable + public enum Action: ViewAction { + + @CasePathable + public enum ViewAction { + case titleButtonTapped + case appendFactorButtonTapped + case pickFactorButtonTapped(Factor) + case removeButtonTapped(Factor) + case changeThresholdButtonTapped + case factorsChanged(Factors) + } + + public enum DelegateAction { + case pickFactor + case setThreshold + } + + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.titleButtonTapped): + log.info("Title button tapped, show important info!") + return .none + + case .view(.appendFactorButtonTapped): + state.factors.append(Factor()) + return .none + + case let .view(.pickFactorButtonTapped(factor)): + state.pickedFactorID = factor.id + return .send(.delegate(.pickFactor)) + + case let .view(.removeButtonTapped(toRemove)): + state.newShieldDraft.removeFactor(toRemove, role: state.role) + return .none + + case .view(.changeThresholdButtonTapped): + assert(state.mode == .threshold) + return .send(.delegate(.setThreshold)) + + case let .view(.factorsChanged(new)): + state.factors = new + return .none + + case .delegate: + return .none + } + } + } +} +extension FactorsBuilderFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack(spacing: 0) { + HStack { + Button( + action: { + send(.titleButtonTapped) + }, + label: { + Label(store.title, systemImage: "info.circle") + .labelStyle(.flipped()) + } + ) + Spacer() + } + .padding() + + Divider().background(Color.app.gray2) + + VStack(spacing: 10) { + ForEach(store.factors) { factor in + FactorView( + factor: factor, + pickAction: { + send(.pickFactorButtonTapped(factor)) + } + ) { + send(.removeButtonTapped(factor)) + } + } + .padding(.horizontal) + .padding(.top, 10) + + Button("Add factors") { + send(.appendFactorButtonTapped) + } + .foregroundStyle(Color.app.gray1.opacity(0.7)) + .padding() + } + .frame(maxWidth: .infinity, minHeight: 50) + .background(Color.app.gray5) + + + Divider().background(Color.app.gray3) + + Button(action: { + send(.changeThresholdButtonTapped) + }, label: { + HStack { + Text("Factors required to sign transactions?") + Spacer() + Text("\(store.threshold)") + .fontWeight(.bold) + .foregroundStyle(store.canChangeThreshold ? Color.app.blue2 : Color.app.gray2) + } + .multilineTextAlignment(.leading) + }) + .padding() + .disabled(!store.canChangeThreshold) + + } + .foregroundStyle(Color.app.gray1) + .overlay( + RoundedRectangle(cornerRadius: 15) + .inset(by: 1) + .stroke(.gray, lineWidth: 1) + ) + .padding(.horizontal) + .buttonStyle(.plain) + } + } +} + +//#Preview { +// VStack { +// +// FactorsBuilderView( +// factors: .init(get: { [FactorSource.sample].map({ Factor(factorSource: $0) }).asIdentified() }, set: { +// print("Preview NOOP set factors sources to: \($0)") +// }), +// factorThreshold: .threshold(3), +// title: "Threshold", +// titleAction: { +// print("Preview NOOP - titleAction") +// }, +// changeThresholdAction: { print("Preview NOOP - changeThresholdAction") }, +// pickAction: { +// print("Preview NOOP - pickAction") +// } +// ) +// FactorsBuilderView( +// factors: .init(get: { [] }, set: { +// print("Preview NOOP set factors sources to: \($0)") +// }), +// factorThreshold: .any, +// title: "Override", +// titleAction: { +// print("Preview NOOP - titleAction") +// }, +// changeThresholdAction: nil, +// pickAction: { +// print("Preview NOOP - pickAction") +// } +// ) +// } +//} +// diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/RoleFactorsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/RoleFactorsFeature.swift new file mode 100644 index 000000000..782549b15 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/RoleFactorsFeature.swift @@ -0,0 +1,235 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct RoleFactorsFeature { + + + @Reducer(state: .equatable) + public enum Destination { + case pickFactorSourceCoordinator(PickFactorSourceCoordinator) + case setFactorThreshold(SetFactorThresholdFeature) + case setDaysUntilAutoConfirm(SetDaysUntilAutoConfirm) + } + + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + public var thresholdFactorsBuilder: FactorsBuilderFeature.State + public var overrideFactorsBuilder: FactorsBuilderFeature.State + public let role: Role + + @Presents var destination: Destination.State? + + public var daysUntilAutoConfirm: UInt16 { + newShieldDraft.numberOfDaysUntilAutoConfirmation + } + + public init(role: Role) { + self.role = role + self.thresholdFactorsBuilder = FactorsBuilderFeature.State(mode: .threshold, role: role) + self.overrideFactorsBuilder = FactorsBuilderFeature.State(mode: .override, role: role) + } + + var canProceed: Bool { + newShieldDraft.isValidRole(role) + } + } + + @CasePathable + public enum Action: ViewAction { + + @CasePathable + public enum ViewAction { + case confirmButtonTapped + case changeDaysUntilAutoConfirmButtonTapped + } + + public enum DelegateAction { + case `continue`(role: Role) + } + + case destination(PresentationAction) + + + case view(ViewAction) + case delegate(DelegateAction) + + case thresholdFactorsBuilder(FactorsBuilderFeature.Action) + case overrideFactorsBuilder(FactorsBuilderFeature.Action) + + } + + public var body: some ReducerOf { + Scope(state: \.thresholdFactorsBuilder, action: \.thresholdFactorsBuilder) { + FactorsBuilderFeature() + } + Scope(state: \.overrideFactorsBuilder, action: \.overrideFactorsBuilder) { + FactorsBuilderFeature() + } + Reduce { state, action in + switch action { + + case .view(.changeDaysUntilAutoConfirmButtonTapped): + state.destination = .setDaysUntilAutoConfirm(SetDaysUntilAutoConfirm.State()) + return .none + + case .view(.confirmButtonTapped): + return .send(.delegate(.continue(role: state.role))) + + case .thresholdFactorsBuilder(.delegate(.pickFactor)), .overrideFactorsBuilder(.delegate(.pickFactor)): + state.destination = .pickFactorSourceCoordinator(PickFactorSourceCoordinator.State(role: state.role)) + return .none + + + case .thresholdFactorsBuilder(.delegate(.setThreshold)): + state.destination = .setFactorThreshold(SetFactorThresholdFeature.State( + role: state.role + )) + return .none + + + case .destination(.presented(.setFactorThreshold(.delegate(.confirm)))): + state.destination = nil + return .none + + case .destination(.presented(.pickFactorSourceCoordinator(.delegate(.done)))): + state.destination = nil + return .none + + case .destination(.presented(.setDaysUntilAutoConfirm(.delegate(.done)))): + state.destination = nil + return .none + + case .thresholdFactorsBuilder: + return .none + + case .overrideFactorsBuilder: + return .none + + case .destination: + return .none + + case .delegate: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +extension RoleFactorsFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + ScrollView { + VStack(alignment: .center, spacing: 20) { + Text("\(store.role.title)").font(.largeTitle) + + Text("These factors are required to \(store.role.actionDetailed)") + .foregroundStyle(Color.app.gray2) + + FactorsBuilderFeature.View( + store: store.scope( + state: \.thresholdFactorsBuilder, + action: \.thresholdFactorsBuilder + ) + ) + + FactorsBuilderFeature.View( + store: store.scope( + state: \.overrideFactorsBuilder, + action: \.overrideFactorsBuilder + ) + ) + + if store.role == .recovery { + Button(action: { + send(.changeDaysUntilAutoConfirmButtonTapped) + }, label: { + HStack { + Image(systemName: "lock") + VStack { + Text("Wallet Lock") + Text("Lock duration") + .font(.system(size: 14)) + .foregroundStyle(Color.app.gray3) + } + Spacer() + Text("\(store.daysUntilAutoConfirm) days") + .fontWeight(.bold) + .foregroundStyle(Color.app.blue2) + } + .padding() + .multilineTextAlignment(.leading) + .foregroundStyle(Color.app.gray1) + .overlay( + RoundedRectangle(cornerRadius: 15) + .inset(by: 1) + .stroke(.gray, lineWidth: 1) + ) + .frame(maxWidth: .infinity) + .padding() + }) + .buttonStyle(.plain) + .frame(maxWidth: .infinity) + } + + Button("Confirm") { + send(.confirmButtonTapped) + } + .buttonStyle(.borderedProminent) + .disabled(!store.canProceed) + } + .padding() + } + .sheet( + item: $store.scope(state: \.destination?.setDaysUntilAutoConfirm, action: \.destination.setDaysUntilAutoConfirm) + ) { store in + SetDaysUntilAutoConfirm.View(store: store) + } + .sheet( + item: $store.scope(state: \.destination?.pickFactorSourceCoordinator, action: \.destination.pickFactorSourceCoordinator) + ) { store in + PickFactorSourceCoordinator.View(store: store) + } + .sheet( + item: $store.scope(state: \.destination?.setFactorThreshold, action: \.destination.setFactorThreshold) + ) { store in + SetFactorThresholdFeature.View(store: store) + .presentationDetents([.medium]) + } + } + } +} + + + + +#Preview { + RoleFactorsFeature.View( + store: Store( + initialState: RoleFactorsFeature.State(role: .primary), + reducer: { + RoleFactorsFeature() + } + ) + ) +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/SetDaysUntilAutoConfirm.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/SetDaysUntilAutoConfirm.swift new file mode 100644 index 000000000..877ddecef --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Features/SetDaysUntilAutoConfirm.swift @@ -0,0 +1,107 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-09. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct SetDaysUntilAutoConfirm { + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + public var daysString = "" + public init() { + daysString = daysUntilAutoConfirm.description + } + public var daysUntilAutoConfirm: UInt16 { + get { + newShieldDraft.numberOfDaysUntilAutoConfirmation + } + set { + newShieldDraft.numberOfDaysUntilAutoConfirmation = newValue + } + } + + public var daysFromString: UInt16? { + UInt16(daysString) + } + } + + @CasePathable + public enum Action: ViewAction { + + public enum DelegateAction { + case done + } + @CasePathable + public enum ViewAction { + case confirmButtonTapped + case numberOfDaysChanged(String) + } + case view(ViewAction) + case delegate(DelegateAction) + } + + + public var body: some ReducerOf { + + Reduce { state, action in + switch action { + + case let .view(.numberOfDaysChanged(daysString)): + state.daysString = daysString + if let days = state.daysFromString { + state.daysUntilAutoConfirm = days + } + return .none + case .view(.confirmButtonTapped): + return .send(.delegate(.done)) + + case .delegate: + return .none + } + } + } + +} + +extension SetDaysUntilAutoConfirm { + public typealias HostingFeature = SetDaysUntilAutoConfirm + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Number of days") + .font(.largeTitle) + + Spacer() + + Text("Will auto confirm after \(store.daysUntilAutoConfirm.description) days.") + + LabeledTextField(label: "#Days", text: $store.daysUntilAutoConfirm.description.sending(\.view.numberOfDaysChanged)) + .keyboardType(.numberPad) + + Spacer() + + Button("Confirm") { + send(.confirmButtonTapped) + } + .disabled(store.daysFromString == nil) + .foregroundStyle(Color.app.white) + } + .foregroundStyle(Color.app.gray1) + .padding() + } + } + +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Views/FactorView.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Views/FactorView.swift new file mode 100644 index 000000000..5e12c3eb4 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/Roles/Views/FactorView.swift @@ -0,0 +1,116 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import SwiftUI +import Sargon + +public struct FactorView: SwiftUI.View { + + public let factor: Factor + public let pickAction: (() -> Void)? + public let removeAction: (() -> Void)? + + public init( + factor: Factor, + pickAction: (() -> Void)? = nil, + removeAction: (() -> Void)? = nil + ) { + self.factor = factor + self.pickAction = pickAction + self.removeAction = removeAction + } + + public init( + _ factorSource: FactorSource + ) { + self.init(factor: Factor(factorSource: factorSource)) + } + + public var body: some SwiftUI.View { + HStack { + if let pickAction { + Button(action: pickAction, label: { + label + }) + } else { + label + } + + + Spacer() + + if let removeAction { + Button(action: removeAction, label: { + Image(systemName: "plus").rotationEffect(.degrees(45)) + }) + } + } + } + + @ViewBuilder + private var label: some View { + HStack(alignment: .top) { + if let factorSource = factor.factorSource { + + Image(systemName: factorSource.kind.image) + .resizable() + .imageScale(.large) + .aspectRatio(contentMode: .fit) + .frame(width: 40) + .rotationEffect(.degrees(factorSource.kind.rotationDegrees)) + .offset(y: factorSource.kind.rotationDegrees > 0 ? 10 : 0) + + VStack(alignment: .leading) { + Text("\(factorSource.kind.title)") + if let subtitle = factorSource.kind.subtitle { + Text("\(subtitle)") + .foregroundStyle(Color.app.gray2) + } + Spacer() + } + } else { + Text("Select a factor") + .fontWeight(.bold) + } + } + .frame(maxWidth: .infinity, idealHeight: 40, alignment: .leading) + .padding() + .background(Color.app.white) + .clipShape(.rect(cornerRadius: 10)) + } +} + +extension FactorSourceKind { + public var image: String { + switch self { + case .device: return "lock.iphone" + case .ledgerHqHardwareWallet: return "mediastick" + case .arculusCard: return "key.radiowaves.forward" + case .trustedContact: return "figure.child.and.lock" + case .securityQuestions: return "person.crop.circle.badge.questionmark" + case .offDeviceMnemonic: return "key" + } + } + public var rotationDegrees: CGFloat { + switch self { + case .ledgerHqHardwareWallet: return 90 + default: return 0 + } + } + +} + +#Preview { + ScrollView { + VStack { + ForEach(factorSourcesAllSampleValues().shuffled()) { + FactorView($0) + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/SetFactorThresholdFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/SetFactorThresholdFeature.swift new file mode 100644 index 000000000..4be73d0e6 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Children/SetFactorThresholdFeature.swift @@ -0,0 +1,220 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import ComposableArchitecture +import Sargon +import SwiftUI + +@Reducer +public struct SetFactorThresholdFeature { + + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + public let role: Role + public var threshold: FactorThreshold + + public init(role: Role) { + self.role = role + self.threshold = .all + + self.threshold = alreadySet + } + + public var matrixOfFactorsForRole: MatrixOfFactorsForRole { + newShieldDraft[role] + } + + public var numberOfFactors: Int { + matrixOfFactorsForRole.thresholdFactors.count + } + public var options: [FactorThreshold] { + var options: [FactorThreshold] = [.any, .all] + guard numberOfFactors > 0 else { + return options + } + let exceeding1 = UInt16(numberOfFactors - 1) + if exceeding1 > 1 { + options.append(contentsOf: (1...exceeding1).map(FactorThreshold.threshold)) + } + return options + } + + + public var alreadySet: FactorThreshold { + matrixOfFactorsForRole.threshold + } + public var recommended: FactorThreshold { + .any + } + + + } + + public enum Action: ViewAction { + public enum ViewAction { + case changedThreshold(Int) + case confirmButtonTapped + } + public enum DelegateAction { + case confirm + } + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case let .view(.changedThreshold(index)): + var index = max(index, 0) + index = min(index, state.options.count - 1) + state.threshold = state.options[index] + return .none + + case .view(.confirmButtonTapped): + state.newShieldDraft[state.role].threshold = state.threshold + return .send(.delegate(.confirm)) + + case .delegate: + return .none + } + } + } +} + +extension SetFactorThresholdFeature { + + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack(alignment: .center) { + Text("Choose the number of security factors required for \(store.role.title)") + scrollView + Text("Use \(store.threshold) of your security factors to \(store.role.action)") + Button("Confirm") { + send(.confirmButtonTapped) + } + } + .lineLimit(nil) + .padding() + } + + var scrollView: some SwiftUI.View { + GeometryReader { geo in + let cellWidth = max(geo.size.width / 4, 50) // must use `max`, will be `0` initially... + let contentMarginX = (geo.size.width - cellWidth) / 2 + ScrollView(.horizontal, showsIndicators: false) { + HStack(alignment: .top, spacing: 0) { + ForEach(store.options, id: \.self) { option in + VStack(alignment: .center, spacing: 0) { + Text("\(option)").font(.system(size: 45)) + .fontWeight(.bold) + .frame(width: cellWidth) + .foregroundStyle(option == store.threshold ? Color.app.blue1 : Color.app.gray5) + Group { + if option == store.alreadySet || option == store.recommended { + Text(option == store.alreadySet ? "Current" : "Recommended") + .font(.system(size: 10)) + .padding(5) + .background(Color.app.gray4) + .mask(Capsule()) + } else { + Spacer() + } + } + .frame(width: cellWidth, height: 20) + } + .id(option) + .frame(width: cellWidth) + } + } + .background( + GeometryReader { + Color.clear.preference( + key: ViewOffsetKey.self, + value: -$0.frame( + in: .named(coordinateSpaceScrollView) + ) + .origin.x + ) + } + ) + .onPreferenceChange(ViewOffsetKey.self) { + let positionX = contentMarginX + $0 + + send(.changedThreshold(Int(CGFloat(positionX / cellWidth).rounded()))) + } + } + .coordinateSpace(name: coordinateSpaceScrollView) + .contentMargins(contentMarginX) + } + } + private let coordinateSpaceScrollView = "coordinateSpaceScrollView" + } +} + +struct ViewOffsetKey: PreferenceKey { + typealias Value = CGFloat + static let defaultValue = CGFloat.zero + + static func reduce( + value: inout Value, + nextValue: () -> Value + ) { + value += nextValue() + } +} + +extension Role { + public var title: String { + switch self { + case .primary: return "Signing" + case .recovery: return "Wallet lock & recovery" + case .confirmation: return "Confirm Recovery" + } + } + public var action: String { + switch self { + case .primary: return "sign transaction" + case .recovery: return "initiate recovery" + case .confirmation: return "confirm recovery" + } + } + public var actionDetailed: String { + switch self { + case .primary: return "withdraw your assets and log in to dApps." + case .recovery: return "initiate recovery" + case .confirmation: return "confirm recovery" + } + } + +} + +//#Preview { +// let role: Role = .primary +// @Shared(.thresholdFactors) var thresholdFactors +// thresholdFactors[role] = FactorThreshold.all +//SetFactorThresholdFeature.View( +// store: Store( +// initialState: SetFactorThresholdFeature.State( +// role: role, +// numberOfFactors: 5 +// ), +// reducer: { +// SetFactorThresholdFeature() +// } +//)) +//} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+Models.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+Models.swift new file mode 100644 index 000000000..254ff0f2e --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+Models.swift @@ -0,0 +1,74 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon +import IdentifiedCollections + +public enum Role: Sendable, Hashable { + case primary, recovery, confirmation +} + +public struct Factor: Hashable, Sendable, Identifiable { + public let id = UUID() + public var factorSource: FactorSource? + public init(factorSource: FactorSource? = nil) { + self.factorSource = factorSource + } +} + +public typealias Factors = IdentifiedArrayOf + +public enum FactorThreshold: Hashable, Sendable, CustomStringConvertible { + init(count: UInt16, thresholdFactorsCount: Int) { + let factorCount = UInt16(thresholdFactorsCount) + if count == factorCount { + self = .all + } else if count == 1 { + self = .any + } else { + self = .threshold(count) + } + } + + public func isValid(thresholdFactorCount: Int) -> Bool { + switch self { + case .any: return true + case .all: return true + case let .threshold(lhsThreshold): + let isValid = thresholdFactorCount > lhsThreshold + if !isValid { + log.fault("Number of factors not greater than threshold") + } + return isValid + } + } + + public mutating func decrease() { + switch self { + case .any, .all: break + case let .threshold(thres) where thres <= 1: + self = .all + case let .threshold(thres) where thres > 1: + self = .threshold(thres - 1) + default: fatalError("not possible") + } + } + + case any + case all + case threshold(UInt16) + + public var description: String { + switch self { + case .any: return "Any" + case .all: return "All" + case let .threshold(threshold): return "\(threshold)" + } + } +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+SharedState.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+SharedState.swift new file mode 100644 index 000000000..94cb13f3c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/Models/NewShield+SharedState.swift @@ -0,0 +1,223 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation +import Sargon +import ComposableArchitecture + +public struct MatrixOfFactorsForRole: Hashable, Sendable { + public let role: Role + public var thresholdFactors: Factors + public var threshold: FactorThreshold + public var overrideFactors: Factors + fileprivate init(role: Role, thresholdFactors: Factors = [], threshold: FactorThreshold = .any, overrideFactors: Factors = []) { + self.role = role + self.threshold = threshold + self.thresholdFactors = thresholdFactors + self.overrideFactors = overrideFactors + } + init(roleWithFactors: R) where R: RoleFromDraft { + let thresholdFactors = roleWithFactors.thresholdFactors.map { Factor.init(factorSource: $0) }.asIdentified() + self.init( + role: R.role, + thresholdFactors: thresholdFactors, + threshold: .init(count: roleWithFactors.threshold, thresholdFactorsCount: thresholdFactors.count), + overrideFactors: roleWithFactors.overrideFactors.map { Factor.init(factorSource: $0) }.asIdentified() + ) + } + var usedFactorSources: FactorSources { + var all: FactorSources = [] + all.append(contentsOf: thresholdFactors.compactMap(\.factorSource)) + all.append(contentsOf: overrideFactors.compactMap(\.factorSource)) + return all + } + var thresholdFactorSources: [FactorSource] { + thresholdFactors.compactMap(\.factorSource) + } + var overrideFactorsSources: [FactorSource] { + overrideFactors.compactMap(\.factorSource) + } +} + +public protocol RoleFromDraft { + + var thresholdFactors: [FactorSource] { get } + /** + * How many threshold factors that must be used to perform some function with this role. + */ + var threshold: UInt16 { get } + /** + * Overriding / Super admin / "sudo" / God / factors, **ANY** + * single of these factor which can perform the function of this role, + * disregarding of `threshold`. + */ + var overrideFactors: [FactorSource] { get } + + static var role: Role { get } + init(thresholdFactors: [FactorSource], threshold: UInt16, overrideFactors: [FactorSource]) + init?(draft: MatrixOfFactorsForRole) +} +extension RoleFromDraft { + + public init?(draft: MatrixOfFactorsForRole) { + precondition(draft.role == Self.role) + if draft.thresholdFactorSources.isEmpty && draft.overrideFactorsSources.isEmpty { + return nil + } + if !draft.threshold.isValid(thresholdFactorCount: draft.thresholdFactorSources.count) { + return nil + } + + self = .init( + thresholdFactors: draft.thresholdFactorSources, + threshold: { + switch draft.threshold { + case .any: UInt16(min(1, draft.thresholdFactorSources.count)) + case .all: UInt16(draft.thresholdFactorSources.count) + case let .threshold(t): t + } + }(), + overrideFactors: draft.overrideFactorsSources + ) + } + + +} +extension PrimaryRoleWithFactorSources: RoleFromDraft { + public static let role: Role = .primary +} +extension RecoveryRoleWithFactorSources: RoleFromDraft { + public static let role: Role = .recovery +} +extension ConfirmationRoleWithFactorSources: RoleFromDraft { + public static let role: Role = .confirmation +} + + + +public struct NewShieldDraft: Hashable, Sendable { + public let copyOf: Shield? + public var numberOfDaysUntilAutoConfirmation: UInt16 = 14 + private var primary: MatrixOfFactorsForRole + private var recovery: MatrixOfFactorsForRole + private var confirmation: MatrixOfFactorsForRole + + private var _primaryRole: PrimaryRoleWithFactorSources? { + PrimaryRoleWithFactorSources(draft: primary) + } + private var _recoveryRole: RecoveryRoleWithFactorSources? { + RecoveryRoleWithFactorSources(draft: recovery) + } + private var _confirmationRole: ConfirmationRoleWithFactorSources? { + ConfirmationRoleWithFactorSources(draft: confirmation) + } + public var matrixOfFactors: MatrixOfFactorSources? { + guard + let primary = _primaryRole, + let recovery = _recoveryRole, + let confirmation = _confirmationRole + else { + return nil + } + return MatrixOfFactorSources( + primaryRole: primary, + recoveryRole: recovery, + confirmationRole: confirmation + ) + } + + public var usedFactorSources: FactorSources { + var allUsed: FactorSources = [] + allUsed.append(contentsOf: primary.usedFactorSources) + allUsed.append(contentsOf: recovery.usedFactorSources) + allUsed.append(contentsOf: confirmation.usedFactorSources) + return allUsed + } + + public var pendingFactorID: Factor.ID? + + public func isValidRole(_ role: Role) -> Bool { + switch role { + case .confirmation: self._confirmationRole != nil + case .recovery: self._recoveryRole != nil + case .primary: self._primaryRole != nil + } + } + + public mutating func removeFactor(_ factor: Factor, role: Role) { + if factor.id == pendingFactorID { + pendingFactorID = nil // not really possible in UI, but prudent. + } + if self[role].thresholdFactors.contains(factor) { + self[role].thresholdFactors.remove(factor) + // Also decrease factor threshold if needed + if !self[role].threshold.isValid(thresholdFactorCount: self[role].thresholdFactors.count) { + self[role].threshold.decrease() + } + } else if self[role].overrideFactors.contains(factor) { + self[role].overrideFactors.remove(factor) + } + } + public mutating func pickedFactorSource(_ factorSource: FactorSource, role: Role) { + guard let pendingFactorID else { + assertionFailure("Expected pending...") + return + } + let id = pendingFactorID + assert(!self[role].usedFactorSources.contains(factorSource)) + if self[role].overrideFactors.contains(where: { $0.id == id }) { + self[role].overrideFactors[id: id]?.factorSource = factorSource + } else if self[role].thresholdFactors.contains(where: { $0.id == id }) { + self[role].thresholdFactors[id: id]?.factorSource = factorSource + } + self.pendingFactorID = nil + } + + public init() { + self.copyOf = nil + self.primary = MatrixOfFactorsForRole(role: .primary) + self.recovery = MatrixOfFactorsForRole(role: .recovery) + self.confirmation = MatrixOfFactorsForRole(role: .confirmation) + } + + public init(copyAndEdit preset: Shield) { + self.copyOf = preset + self.primary = .init(roleWithFactors: preset.matrixOfFactors.primaryRole) + self.recovery = .init(roleWithFactors: preset.matrixOfFactors.recoveryRole) + self.confirmation = .init(roleWithFactors: preset.matrixOfFactors.confirmationRole) + self.numberOfDaysUntilAutoConfirmation = UInt16(preset.numberOfEpochsUntilAutoConfirmation / 288) + } + + public subscript(role: Role) -> MatrixOfFactorsForRole { + get { + switch role { + case .primary: return self.primary + case .recovery: return self.recovery + case .confirmation: return self.confirmation + } + } + set { + switch role { + case .primary: self.primary = newValue + case .recovery: self.recovery = newValue + case .confirmation: self.confirmation = newValue + } + } + } +} + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + static var newShieldDraft: Self { + PersistenceKeyDefault( + .inMemory("newShieldDraft"), + NewShieldDraft() + ) + } +} + + + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/NewSecurityShieldCoordinator.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/NewSecurityShieldCoordinator.swift new file mode 100644 index 000000000..d1315f369 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/New/NewSecurityShieldCoordinator.swift @@ -0,0 +1,125 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-06. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct NewSecurityShieldCoordinator { + + @Reducer(state: .equatable) + public enum Path { + case roleFactors(RoleFactorsFeature) + case nameShield(NameNewShieldFeature) + } + + + @ObservableState + public struct State: Equatable { + @Shared(.newShieldDraft) var newShieldDraft + public var intro: IntroWhatIsShieldFeature.State + public var path = StackState() + public init(copyAndEdit preset: Shield?) { + self.intro = IntroWhatIsShieldFeature.State() + if let preset { + newShieldDraft = .init(copyAndEdit: preset) + + // skip intro + HostingFeature.next(&self) + } + } + } + + @CasePathable + public enum Action { + case path(StackAction) + case intro(IntroWhatIsShieldFeature.Action) + + case delegate(DelegateAction) + + public enum DelegateAction { + case done + } + } + + @discardableResult + fileprivate static func next( + lastRole: Role? = nil, + _ state: inout State + ) -> EffectOf { + let nextRole: Role? = switch lastRole { + case .none: + .primary + case .primary: + .recovery + case .recovery: + .confirmation + case .confirmation: + nil + } + if let nextRole { + state.path.append(.roleFactors(RoleFactorsFeature.State(role: nextRole))) + } else { + state.path.append(.nameShield(NameNewShieldFeature.State())) + } + return .none + } + + public var body: some ReducerOf { + Scope(state: \.intro, action: \.intro) { + IntroWhatIsShieldFeature() + } + Reduce { state, action in + switch action { + case .intro(.delegate(.continue)): + return Self.next(&state) + + case let .path(.element(id: _, action: .roleFactors(.delegate(.continue(role))))): + return Self.next(lastRole: role, &state) + + case .path(.element(id: _, action: .nameShield(.delegate(.done)))): + return .send(.delegate(.done)) + + case .path: + return .none + + case .intro: + return .none + case .delegate: + return .none + + } + } + .forEach(\.path, action: \.path) + } +} + +extension NewSecurityShieldCoordinator { + public typealias HostingFeature = Self + + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + IntroWhatIsShieldFeature.View( + store: store.scope(state: \.intro, action: \.intro) + ) + } destination: { store in + switch store.case { + case let .roleFactors(store): + RoleFactorsFeature.View(store: store) + case let .nameShield(store): + NameNewShieldFeature.View(store: store) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ShieldDetailsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ShieldDetailsFeature.swift new file mode 100644 index 000000000..ba758f42c --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/FactorSource/Shields/ShieldDetailsFeature.swift @@ -0,0 +1,233 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-09. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct ShieldDetailsFeature { + + @ObservableState + public struct State { + public let shield: Shield + } + + public enum Action: ViewAction { + public enum ViewAction { + case copyAndEditButtonTapped + } + public enum DelegateAction { + case copyAndEdit(Shield) + } + case view(ViewAction) + case delegate(DelegateAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.copyAndEditButtonTapped): + return .send(.delegate(.copyAndEdit(state.shield))) + case .delegate: + return .none + } + } + } +} + +extension ShieldDetailsFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack(alignment: .leading) { + + ScrollView { + VStack(alignment: .leading, spacing: 30) { + section(role: store.shield.matrixOfFactors.primaryRole) + + section(role: store.shield.matrixOfFactors.recoveryRole) + + section(role: store.shield.matrixOfFactors.confirmationRole) + } + .padding() + } + } + .background(Color.app.gray5) + .navigationTitle(store.state.shield.metadata.displayName.value) + .navigationBarTitleDisplayMode(.large) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button("Copy & Edit") { + send(.copyAndEditButtonTapped) + } + .foregroundStyle(.blue) + .buttonStyle(.plain) + } + } + } + + func section(role roleWithFactors: R) -> some SwiftUI.View { + VStack(alignment: .leading, spacing: 3) { + VStack(alignment: .leading) { + let role = R.role + if let detailTitle = role.detailTitle, let icon = role.smallIcon { + Label(detailTitle, systemImage: icon) + .imageScale(.small) + .font(.title2) + .fontWeight(.bold) + .foregroundStyle(Color.app.gray2) + } + HStack(spacing: 15) { + Image(systemName: role.largeIcon) + .resizable() + .aspectRatio(contentMode: .fit) + .imageScale(.medium) + .frame(width: 40) + .padding() + .foregroundStyle(Color.app.white) + .background(Color.app.gray3) + .clipShape(.rect(cornerRadius: 10)) + + VStack(alignment: .leading) { + Text(role.action.capitalized) + .font(.title2) + .fontWeight(.bold) + Text("Required to " + role.actionVeryDetailed) + .font(.footnote) + .foregroundStyle(Color.app.gray2) + } + Spacer() + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.app.white) + .clipShape(.rect(topLeadingRadius: 10, topTrailingRadius: 10)) + } + .multilineTextAlignment(.leading) + + sectionFactors( + factors: roleWithFactors.thresholdFactors, + factorAmount: "Must present **\(roleWithFactors.thresholdAmount)** of the following", + emptyFactors: "No threshold factors set", + roundCorners: false + ) + + sectionFactors( + factors: roleWithFactors.overrideFactors, + factorAmount: "Or must present **1** of the following", + emptyFactors: "No override factors set" + ) + + } + } + + @ViewBuilder + func sectionFactors( + factors: [FactorSource], + factorAmount: LocalizedStringKey, + emptyFactors: LocalizedStringKey, + roundCorners: Bool = true + ) -> some SwiftUI.View { + VStack(alignment: .leading) { + + if !factors.isEmpty { + HStack { + Text(factorAmount) + Spacer() + } + + ForEach(factors) { factorSource in + FactorView(factorSource) + .foregroundStyle(Color.app.gray1) + .overlay( + RoundedRectangle(cornerRadius: 15) + .inset(by: 1) + .stroke(.gray, lineWidth: 1) + ) + } + } else { + HStack { + Text(emptyFactors) + Spacer() + } + } + } + .foregroundStyle(Color.app.gray1) + .frame(maxWidth: .infinity) + .multilineTextAlignment(.leading) + .padding() + .background(Color.app.white) + .clipShape(.rect(bottomLeadingRadius: roundCorners ? 10 : 0, bottomTrailingRadius: roundCorners ? 10 : 0)) + .shadow(color: Color.app.gray3, radius: 4, x: 0, y: 1) + } + } + +} + +extension RoleFromDraft { + var thresholdAmount: String { + + if threshold == thresholdFactors.count { + return "All" + } else if threshold == 1 { + return "Any" + } else { + return String(describing: threshold) + } + + } +} + +extension Role { + var detailTitle: String? { + switch self { + case .primary: return "Transactions" + case .recovery: return "Recovery Assistance" + case .confirmation: return nil + } + } + public var actionVeryDetailed: String { + switch self { + case .primary: return "withdraw your assets and log in to dApps." + case .recovery: return "lock your account or start recovering your accounts if you lose your phone." + case .confirmation: return "confirm recovery" + } + } + var smallIcon: String? { + switch self { + case .primary: return "pencil.circle" + case .recovery: return "wrench.and.screwdriver" + case .confirmation: return nil + } + } + var largeIcon: String { + switch self { + case .primary: return "pencil.and.list.clipboard" + case .recovery: return "cross.case" + case .confirmation: return "person.badge.shield.checkmark" + } + } +} + +#Preview { + NavigationStack { + ShieldDetailsFeature.View( + store: Store( + initialState: ShieldDetailsFeature.State(shield: .sample) + ) { + ShieldDetailsFeature() + } + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/CreateAccountFlowFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/CreateAccountFlowFeature.swift index 1a7ec9b44..b00d46b47 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/CreateAccountFlowFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/CreateAccountFlowFeature.swift @@ -1,27 +1,15 @@ import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct CreateAccountFlowFeature { - - @Reducer(state: .equatable) - public enum Path { - case selectGradient(SelectGradientFeature) - } - + @ObservableState public struct State: Equatable { - public let walletHolder: WalletHolder - public var path = StackState() public var nameAccount: NameNewAccountFeature.State - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder - self.nameAccount = NameNewAccountFeature.State(walletHolder: walletHolder) - } - - public init(wallet: Wallet) { - self.init(walletHolder: .init(wallet: wallet)) + public init(index: Int) { + self.nameAccount = NameNewAccountFeature.State(index: index) } } @@ -29,31 +17,11 @@ public struct CreateAccountFlowFeature { public enum DelegateAction { case createdAccount } - case path(StackAction) case nameAccount(NameNewAccountFeature.Action) case delegate(DelegateAction) } - public struct View: SwiftUI.View { - @Bindable var store: StoreOf - public init(store: StoreOf) { - self.store = store - } - public var body: some SwiftUI.View { - NavigationStack(path: $store.scope(state: \.path, action: \.path)) { - NameNewAccountFeature.View( - store: store.scope(state: \.nameAccount, action: \.nameAccount) - ) - } destination: { store in - switch store.state { - case .selectGradient: - if let store = store.scope(state: \.selectGradient, action: \.selectGradient) { - SelectGradientFeature.View(store: store) - } - } - } - } - } + @Dependency(AccountsClient.self) var accountsClient public init() {} @@ -66,48 +34,36 @@ public struct CreateAccountFlowFeature { switch action { case let .nameAccount(.delegate(.named(name))): - state.path.append(.selectGradient(.init(name: name))) - return .none - - case .path(let pathAction): - switch pathAction { - - case let .element( - id: _, - action: .selectGradient(.delegate(.selected(appearanceID, displayName))) - ): - do { - let wallet = state.walletHolder.wallet - var account = try wallet.createNewAccount( - networkId: .mainnet, - name: displayName - ) - account.appearanceId = appearanceID - - try wallet.addAccount(account: account) - - return .send(.delegate(.createdAccount)) - - } catch { - fatalError("TODO error handling: \(error)") - } - - case .element(id: _, action: _): - return .none - case .popFrom(id: _): - return .none - case .push(id: _, state: _): - return .none + return .run { send in + try await accountsClient.createAndSaveAccount(name) + await send(.delegate(.createdAccount)) + } catch: { _, error in + fatalError("TODO error handling: \(error)") } - return .none - case .nameAccount(.view): + case .nameAccount: return .none case .delegate: return .none } } - .forEach(\.path, action: \.path) } } + +extension CreateAccountFlowFeature { + public struct View: SwiftUI.View { + + @Bindable var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + NameNewAccountFeature.View( + store: store.scope(state: \.nameAccount, action: \.nameAccount) + ) + } + } + +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/NameAccountFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/NameAccountFeature.swift index acf5bffe6..a131ddce9 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/NameAccountFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/CreateAccount/Steps/NameAccountFeature.swift @@ -1,19 +1,15 @@ import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct NameNewAccountFeature { @ObservableState public struct State: Equatable { - public let walletHolder: WalletHolder - public var accountName = "" + public var accountName: String public var errorMessage: String? - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder - } - public init(wallet: Wallet) { - self.init(walletHolder: .init(wallet: wallet)) + public init(index: Int = 0) { + self.accountName = "Unnamed \(index)" } } @@ -30,33 +26,6 @@ public struct NameNewAccountFeature { case view(ViewAction) } - @ViewAction(for: NameNewAccountFeature.self) - public struct View: SwiftUI.View { - @Bindable public var store: StoreOf - public init(store: StoreOf) { - self.store = store - } - public var body: some SwiftUI.View { - VStack { - Text("Name Account").font(.largeTitle) - Spacer() - LabeledTextField(label: "Account Name", text: $store.accountName.sending(\.view.accountNameChanged)) - if let error = store.state.errorMessage { - Text("\(error)") - .foregroundStyle(Color.red) - .font(.footnote) - .fontWeight(.bold) - } - Spacer() - Button("Continue") { - send(.continueButtonTapped) - } - .buttonStyle(.borderedProminent) - } - .padding() - } - } - public init() {} public var body: some ReducerOf { @@ -84,3 +53,35 @@ public struct NameNewAccountFeature { } } } + +extension NameNewAccountFeature { + + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Name Account").font(.largeTitle) + Spacer() + LabeledTextField(label: "Account Name", text: $store.accountName.sending(\.view.accountNameChanged)) + if let error = store.state.errorMessage { + Text("\(error)") + .foregroundStyle(Color.red) + .font(.footnote) + .fontWeight(.bold) + } + Spacer() + Button("Continue") { + send(.continueButtonTapped) + } + .buttonStyle(.borderedProminent) + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/ImportProfileFlowFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/ImportProfileFlowFeature.swift new file mode 100644 index 000000000..9972ac6b8 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/ImportProfileFlowFeature.swift @@ -0,0 +1,125 @@ +import Sargon +import UniformTypeIdentifiers +import Foundation +import ComposableArchitecture + +@Reducer +public struct ImportProfileFlowFeature { + + @Dependency(ProfileClient.self) var profileClient + + @Reducer(state: .equatable) + public enum Path { + case inputDecryptionPassword(InputDecryptionPasswordFeature) + } + + @ObservableState + public struct State: Equatable { + public var path = StackState() + public var selectFile: SelectFileFeature.State + + public init() { + self.selectFile = SelectFileFeature.State() + } + } + + public enum Action { + public enum DelegateAction { + case imported + case failed + } + case path(StackAction) + + case selectFile(SelectFileFeature.Action) + case delegate(DelegateAction) + } + + public init() {} + + public var body: some ReducerOf { + Scope(state: \.selectFile, action: \.selectFile) { + SelectFileFeature() + } + + Reduce { state, action in + switch action { + + case let .selectFile(.delegate(.analyzedContentsOfFile(contents: data, analysis: profileFileContents))): + switch profileFileContents { + + case .notProfile: + return .send(.delegate(.failed)) + + case .encryptedProfile: + state.path.append(.inputDecryptionPassword(InputDecryptionPasswordFeature.State(encryptedProfile: data))) + return .none + + case let .plaintextProfile(plaintextProfile): + return importProfile(&state, plaintextProfile) + + } + + case .path(let pathAction): + switch pathAction { + + case let .element( + id: _, + action: .inputDecryptionPassword(.delegate(.inputtedPassword(encryptedProfile, decryptionPassword))) + ): + do { + let decrypted = try profileClient.decryptEncryptedProfile(encryptedProfile, decryptionPassword) + state.path = .init() + return importProfile(&state, decrypted) + } catch { + log.error("Failed to decrypt encrypted profile, error: \(error)") + } + + case .element(id: _, action: _): + return .none + case .popFrom(id: _): + return .none + case .push(id: _, state: _): + return .none + } + return .none + + case .selectFile: + return .none + + case .delegate: + return .none + } + } + .forEach(\.path, action: \.path) + } + + func importProfile(_ state: inout State, _ profile: Profile) -> Effect { + return .run { send in + try await profileClient.importProfile(profile) + await send(.delegate(.imported)) + } + } +} + +extension ImportProfileFlowFeature { + public struct View: SwiftUI.View { + + @Bindable var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + SelectFileFeature.View( + store: store.scope(state: \.selectFile, action: \.selectFile) + ) + } destination: { store in + switch store.case { + case let .inputDecryptionPassword(store): + InputDecryptionPasswordFeature.View(store: store) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/FileDocument+Profile.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/FileDocument+Profile.swift new file mode 100644 index 000000000..9804d8291 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/FileDocument+Profile.swift @@ -0,0 +1,57 @@ +import ComposableArchitecture +import Sargon +import SwiftUI +import UniformTypeIdentifiers + +// MARK: - NoJSONDataFound +struct NoJSONDataFound: Error {} + +// MARK: - FileContentIsNotProfile +struct FileContentIsNotProfile: LocalizedError { + var errorDescription: String? { + "Invalid backup file." + } +} + +// MARK: - ExportableProfileFile +/// An exportable (and thus importable) Profile file, either encrypted or plaintext. +public enum ExportableProfileFile: FileDocument, Sendable, Hashable { + case plaintext(Profile) + case encrypted(Data) +} + + +extension ExportableProfileFile { + public static let readableContentTypes: [UTType] = [.profile] + + public init(configuration: ReadConfiguration) throws { + guard let data = configuration.file.regularFileContents + else { + throw NoJSONDataFound() + } + try self.init(data: data) + } + + public init(data: Data) throws { + switch Profile.analyzeContents(data: data) { + case .encryptedProfile: + self = .encrypted(data) + case .notProfile: + throw FileContentIsNotProfile() + case let .plaintextProfile(plaintextProfile): + self = .plaintext(plaintextProfile) + } + } + + public func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { + @Dependency(\.encode) var encode + + switch self { + case let .plaintext(plaintext): + let jsonData = plaintext.jsonData() + return FileWrapper(regularFileWithContents: jsonData) + case let .encrypted(encryptedSnapshot): + return FileWrapper(regularFileWithContents: encryptedSnapshot) + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/InputDecryptionPasswordFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/InputDecryptionPasswordFeature.swift new file mode 100644 index 000000000..26c25d674 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/InputDecryptionPasswordFeature.swift @@ -0,0 +1,77 @@ +import Sargon +import UniformTypeIdentifiers +import Foundation +import ComposableArchitecture + +@Reducer +public struct InputDecryptionPasswordFeature { + + @CasePathable + public enum Action: ViewAction { + public enum DelegateAction { + case inputtedPassword(encryptedProfile: Data, decryptionPassword: String) + } + + @CasePathable + public enum ViewAction { + case passwordChanged(String) + case confirmPasswordButtonTapped + } + case delegate(DelegateAction) + case view(ViewAction) + } + + @ObservableState + public struct State: Equatable { + public let encryptedProfile: Data + public var password = "" + public init(encryptedProfile: Data) { + self.encryptedProfile = encryptedProfile + } + } + + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.passwordChanged(password)): + state.password = password + return .none + + case .view(.confirmPasswordButtonTapped): + return .send(.delegate(.inputtedPassword(encryptedProfile: state.encryptedProfile, decryptionPassword: state.password))) + + case .delegate: + return .none + + } + } + } +} + +extension InputDecryptionPasswordFeature { + + @ViewAction(for: InputDecryptionPasswordFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack { + LabeledTextField(label: "Decryption password", text: $store.password.sending(\.view.passwordChanged)) + + Button("Confirm") { + send(.confirmPasswordButtonTapped) + } + .buttonStyle(.borderedProminent) + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/SelectFileFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/SelectFileFeature.swift new file mode 100644 index 000000000..1f5ef82b7 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/ImportProfileFlowFeature/Steps/SelectFileFeature.swift @@ -0,0 +1,113 @@ +import Sargon +import UniformTypeIdentifiers +import Foundation +import ComposableArchitecture + +extension UTType { + // FIXME: should we declare our own file format? For now we use require `.json` file extension. + public static let profile: Self = .json +} + + +extension String { + static let profileFileEncryptedPart = "encrypted" + private static let filenameProfileBase = "radix_wallet_backup_file" + static let filenameProfileNotEncrypted: Self = "\(filenameProfileBase).plaintext.json" + static let filenameProfileEncrypted: Self = "\(filenameProfileBase).\(profileFileEncryptedPart).json" +} + +struct LackedPermissionToAccessSecurityScopedResource: Error {} + +@Reducer +public struct SelectFileFeature { + + @CasePathable + public enum Action: ViewAction { + public enum DelegateAction { + case analyzedContentsOfFile(contents: Data, analysis: ProfileFileContents) + } + + @CasePathable + public enum ViewAction { + case openFileButtonTapped + case profileImportResult(Result) + case isPresentingFileImporterChanged(Bool) + } + case delegate(DelegateAction) + case view(ViewAction) + } + + @ObservableState + public struct State: Equatable { + public var isPresentingFileImporter = false + public init() {} + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.openFileButtonTapped): + state.isPresentingFileImporter = true + return .none + + case let .view(.profileImportResult(.failure(error))): + log.error("Failed to read file, error: \(error)") + return .none + + case let .view(.profileImportResult(.success(profileURL))): + do { + guard profileURL.startAccessingSecurityScopedResource() else { + throw LackedPermissionToAccessSecurityScopedResource() + } + defer { profileURL.stopAccessingSecurityScopedResource() } + let data = try Data(contentsOf: profileURL) + + let analyzed = Profile.analyzeContents(data: data) + return .send(.delegate(.analyzedContentsOfFile(contents: data, analysis: analyzed))) + + } catch { + log.error("Failed to import profile, error: \(error)") + } + return .none + + + case let .view(.isPresentingFileImporterChanged(isPresentingFileImporter)): + state.isPresentingFileImporter = isPresentingFileImporter + return .none + + case .delegate: + return .none + } + } + } +} + +extension SelectFileFeature { + + @ViewAction(for: SelectFileFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack { + Text("Select file") + + Button("Open file selector") { + send(.openFileButtonTapped) + } + } + .fileImporter( + isPresented: $store.isPresentingFileImporter.sending(\.view.isPresentingFileImporterChanged), + allowedContentTypes: [.profile], + onCompletion: { send(.profileImportResult($0.mapError { $0 as NSError })) } + ) + .navigationTitle("Open Profile file") + } + } + +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/NewOrImportProfileFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/NewOrImportProfileFeature.swift new file mode 100644 index 000000000..8f7d1447a --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/NewOrImportProfileFeature.swift @@ -0,0 +1,77 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-02-16. +// + +import Foundation +import ComposableArchitecture +import Sargon +import SwiftUI + +@Reducer +public struct NewOrImportProfileFeature { + public init() {} + + @ObservableState + public struct State: Equatable { + public init() {} + } + + public enum Action: ViewAction { + + public enum DelegateAction { + case newProfile + case importProfile + } + + public enum ViewAction { + case newProfileButtonTapped + case importProfileButtonTapped + } + + case delegate(DelegateAction) + case view(ViewAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.importProfileButtonTapped): + .send(.delegate(.importProfile)) + + case .view(.newProfileButtonTapped): + .send(.delegate(.newProfile)) + + case .delegate: + .none + + } + } + } +} + +extension NewOrImportProfileFeature { + + @ViewAction(for: NewOrImportProfileFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + + public var body: some SwiftUI.View { + VStack { + Text("Existing or new user?").font(.title) + + Button("New Profile") { + send(.newProfileButtonTapped) + } + + Button("Import Profile") { + send(.importProfileButtonTapped) + } + } + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/OnboardingFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/OnboardingFeature.swift index 7a08a2c7c..552a7f6c0 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/OnboardingFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/OnboardingFeature.swift @@ -1,44 +1,41 @@ +import SwiftUI import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct OnboardingFeature { @Reducer(state: .equatable) public enum Path { + case newOrImportProfile(NewOrImportProfileFeature) case writeDownMnemonic(WriteDownMnemonicFeature) } @Reducer(state: .equatable) public enum Destination { case createAccount(CreateAccountFlowFeature) + case importProfile(ImportProfileFlowFeature) } @ObservableState public struct State: Equatable { - public let walletHolder: WalletHolder public var path = StackState() public var welcome: WelcomeFeature.State @Presents var destination: Destination.State? - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder + public init() { self.welcome = WelcomeFeature.State() } - - public init(wallet: Wallet) { - self.init(walletHolder: .init(wallet: wallet)) - } } @CasePathable public enum Action { @CasePathable public enum DelegateAction { - case createdAccount(with: WalletHolder) + case done } - + case destination(PresentationAction) case path(StackAction) case welcome(WelcomeFeature.Action) @@ -56,8 +53,18 @@ public struct OnboardingFeature { case .path(let pathAction): switch pathAction { + case .element(id: _, action: .writeDownMnemonic(.delegate(.done))): - return .send(.delegate(.createdAccount(with: state.walletHolder))) + return .send(.delegate(.done)) + + case .element(id: _, action: .newOrImportProfile(.delegate(.importProfile))): + state.destination = .importProfile(.init()) + return .none + + case .element(id: _, action: .newOrImportProfile(.delegate(.newProfile))): + state.destination = .createAccount(CreateAccountFlowFeature.State(index: 0)) + return .none + case .popFrom(id: _): return .none case .push(id: _, state: _): @@ -65,18 +72,28 @@ public struct OnboardingFeature { default: return .none } + case .welcome(.delegate(.done)): - state.destination = .createAccount(CreateAccountFlowFeature.State(walletHolder: state.walletHolder)) + + state.path.append(.newOrImportProfile(.init())) return .none - case .welcome(.view): + + + case .welcome: return .none + case .delegate: return .none + + case .destination(.presented(.importProfile(.delegate(.imported)))): + state.destination = nil + return .send(.delegate(.done)) + case .destination(.presented(.createAccount(.delegate(.createdAccount)))): state.destination = nil - state.path.append(.writeDownMnemonic(.init(walletHolder: state.walletHolder))) + state.path.append(.writeDownMnemonic(.init())) return .none - + default: return .none } @@ -84,9 +101,11 @@ public struct OnboardingFeature { .forEach(\.path, action: \.path) .ifLet(\.$destination, action: \.destination) } +} +extension OnboardingFeature { public struct View: SwiftUI.View { - @Bindable var store: StoreOf + @Bindable public var store: StoreOf public init(store: StoreOf) { self.store = store @@ -99,24 +118,22 @@ public struct OnboardingFeature { ) } destination: { store in switch store.case { - case .writeDownMnemonic: - if let store = store.scope(state: \.writeDownMnemonic, action: \.writeDownMnemonic) { - WriteDownMnemonicFeature.View(store: store) - } + case let .newOrImportProfile(store): + NewOrImportProfileFeature.View(store: store) + case let .writeDownMnemonic(store): + WriteDownMnemonicFeature.View(store: store) } } .sheet( - item: $store.scope( - state: \.destination?.createAccount, - action: \.destination.createAccount - ) + item: $store.scope(state: \.destination?.createAccount, action: \.destination.createAccount) ) { store in CreateAccountFlowFeature.View(store: store) } - + .sheet( + item: $store.scope(state: \.destination?.importProfile, action: \.destination.importProfile) + ) { importProfileStore in + ImportProfileFlowFeature.View(store: importProfileStore) + } } - } - - } diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WelcomeFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WelcomeFeature.swift index e95e2e6f2..83798c97a 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WelcomeFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WelcomeFeature.swift @@ -6,6 +6,8 @@ // import Foundation +import ComposableArchitecture +import Sargon @Reducer public struct WelcomeFeature { @@ -27,6 +29,19 @@ public struct WelcomeFeature { case view(ViewAction) } + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.continueButtonTapped): + .send(.delegate(.done)) + case .delegate: + .none + } + } + } +} + +extension WelcomeFeature { @ViewAction(for: WelcomeFeature.self) public struct View: SwiftUI.View { public let store: StoreOf @@ -56,15 +71,4 @@ The build artifacts of UniFFI are have three major components: .padding() } } - - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .view(.continueButtonTapped): - .send(.delegate(.done)) - case .delegate: - .none - } - } - } } diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WriteDownMnemonicFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WriteDownMnemonicFeature.swift index 44b0350d3..1f3cd468f 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WriteDownMnemonicFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/Onboarding/WriteDownMnemonicFeature.swift @@ -6,20 +6,20 @@ // import Foundation +import ComposableArchitecture +import Sargon @Reducer public struct WriteDownMnemonicFeature { - - @Dependency(\.keychain) var keychain + @Dependency(MnemonicClient.self) var mnemonicClient + public init() {} @ObservableState public struct State: Equatable { - public let walletHolder: WalletHolder public var mnemonic: String? - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder + public init() { } } @@ -31,9 +31,39 @@ public struct WriteDownMnemonicFeature { case revealMnemonicButtonTapped case continueButtonTapped } + public enum InternalAction { + case loadedPrivateHDFactor(PrivateHierarchicalDeterministicFactorSource) + } case delegate(DelegateAction) case view(ViewAction) + case `internal`(InternalAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .internal(.loadedPrivateHDFactor(privateHDFactor)): + state.mnemonic = privateHDFactor.mnemonicWithPassphrase.mnemonic.phrase + return .none + + case .view(.revealMnemonicButtonTapped): + return .run { send in + let id = try SargonOS.shared.profile().factorSources.first!.id.extract(as: FactorSourceIdFromHash.self) + let privateHDFactor = try await mnemonicClient.loadMnemonic(id) + await send(.internal(.loadedPrivateHDFactor(privateHDFactor))) + } catch: { error, send in + fatalError("error \(error)") + } + case .view(.continueButtonTapped): + return .send(.delegate(.done)) + case .delegate: + return .none + } + } } +} + +extension WriteDownMnemonicFeature { @ViewAction(for: WriteDownMnemonicFeature.self) public struct View: SwiftUI.View { @@ -61,24 +91,4 @@ public struct WriteDownMnemonicFeature { } } - public var body: some ReducerOf { - Reduce { state, action in - switch action { - case .view(.revealMnemonicButtonTapped): - let wallet = state.walletHolder.wallet - - do { - let bdfsMnemonic = try wallet.mainBdfsMnemonicWithPassphrase() - state.mnemonic = bdfsMnemonic.mnemonic.phrase - } catch { - fatalError("handle error: \(error)") - } - return .none - case .view(.continueButtonTapped): - return .send(.delegate(.done)) - case .delegate: - return .none - } - } - } } diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/DecryptSecurityQuestionsFeature/DecryptSecurityQuestionsFeatureCoordinator.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/DecryptSecurityQuestionsFeature/DecryptSecurityQuestionsFeatureCoordinator.swift new file mode 100644 index 000000000..38fcd4fe1 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/DecryptSecurityQuestionsFeature/DecryptSecurityQuestionsFeatureCoordinator.swift @@ -0,0 +1,138 @@ +import SwiftUI +import Sargon +import ComposableArchitecture + +@Reducer +public struct DecryptSecurityQuestionsFeatureCoordinator { + + @Dependency(FactorSourcesClient.self) var factorSourcesClient + @Dependency(OverlayWindowClient.self) var overlayWindowClient + + @Reducer(state: .equatable) + public enum Path { + case answerQuestion(AnswerSecurityQuestionFeature) + } + + @ObservableState + public struct State: Equatable { + @Shared(.questions) var questions + @Shared(.pendingAnswers) var pendingAnswers + + public let securityQuestionsFactorSource: SecurityQuestionsNotProductionReadyFactorSource + public var firstQuestion: AnswerSecurityQuestionFeature.State + public var path = StackState() + + public init(securityQuestionsFactorSource: SecurityQuestionsNotProductionReadyFactorSource) { + self.securityQuestionsFactorSource = securityQuestionsFactorSource + self.firstQuestion = AnswerSecurityQuestionFeature.State(index: 0, answer: "") + self.questions = securityQuestionsFactorSource + .sealedMnemonic + .securityQuestions.asIdentified() + self.pendingAnswers = [] + } + } + + @CasePathable + public enum Action { + @CasePathable + public enum DelegateAction { + case done + } + + case path(StackAction) + case firstQuestion(AnswerSecurityQuestionFeature.Action) + case delegate(DelegateAction) + } + + public init() {} + + func nextStep(_ state: inout State, nextIndex indexOfNextQuestionToAnswer: Int) -> EffectOf { + if indexOfNextQuestionToAnswer < state.questions.count { + state.path.append(.answerQuestion( + AnswerSecurityQuestionFeature.State( + index: indexOfNextQuestionToAnswer + ) + )) + return .none + } else { + precondition(state.pendingAnswers.count == state.questions.count) + let answersToQuestionsArray = state.pendingAnswers.map({ + let question = state.questions[id: $0.id]! + return SecurityNotProductionReadyQuestionAndAnswer(question: question, answer: $0.answer) + }) + let answersToQuestions = answersToQuestionsArray.asIdentified() + + do { + let mnemonic = try factorSourcesClient.decryptSecurityQuestionsFactor( + answersToQuestions, + state.securityQuestionsFactorSource + ) + log.info("Decrypted: \(mnemonic.phrase)") + overlayWindowClient.scheduleHUDMessage(.openedSecurityQuestionsSealedMnemonic) + return .send(.delegate(.done)) + } catch { + log.fault("Failed to decrypt SecurityQuestionsFactorSource with answers to questions, error: \(error)") + overlayWindowClient.scheduleHUDMessage(.failedToOpenSecurityQuestionsSealedMnemonic) + return .send(.delegate(.done)) + } + } + } + + public var body: some ReducerOf { + Scope(state: \.firstQuestion, action: \.firstQuestion) { + AnswerSecurityQuestionFeature() + } + Reduce { state, action in + switch action { + + case .path(let pathAction): + switch pathAction { + + case let .element(id: _, action: .answerQuestion(.delegate(.done(index)))): + return nextStep(&state, nextIndex: index + 1) + + case .popFrom(id: _): + return .none + case .push(id: _, state: _): + return .none + default: + return .none + } + + case let .firstQuestion(.delegate(.done(index))): + return nextStep(&state, nextIndex: index + 1) + + case .firstQuestion: + return .none + + case .delegate: + return .none + + } + } + .forEach(\.path, action: \.path) + } +} + +extension DecryptSecurityQuestionsFeatureCoordinator { + public struct View: SwiftUI.View { + @Bindable var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + AnswerSecurityQuestionFeature.View( + store: store.scope(state: \.firstQuestion, action: \.firstQuestion) + ) + } destination: { store in + switch store.case { + case let .answerQuestion(store): + AnswerSecurityQuestionFeature.View(store: store) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/AnswerSecurityQuestionFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/AnswerSecurityQuestionFeature.swift new file mode 100644 index 000000000..984daa28e --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/AnswerSecurityQuestionFeature.swift @@ -0,0 +1,124 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import Sargon +import ComposableArchitecture + +@Reducer +public struct AnswerSecurityQuestionFeature { + + @ObservableState + public struct State: Equatable { + + @Shared(.pendingAnswers) var pendingAnswers + @Shared(.questions) var questions + + public let index: Int + public var answer: String = "" + public var trimmed: String { + trimSecurityQuestionsAnswer(answer: answer) + } + public var question: SecurityNotProductionReadyQuestion { + questions[index] + } + + public init(index: Int, answer: String) { + self.index = index + self.answer = answer + } + + public init(index: Int) { + self.init(index: index, answer: "") + self.answer = pendingAnswers[id: questions[index].id]?.answer ?? "" + } + } + + @CasePathable + public enum Action: ViewAction { + case delegate(DelegateAction) + case view(ViewAction) + public enum DelegateAction { + case done(Int) + } + + @CasePathable + public enum ViewAction { + case answerChanged(String) + case confirmButtonTapped + } + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.answerChanged(answer)): + state.answer = answer + return .none + case .view(.confirmButtonTapped): + guard !state.trimmed.isEmpty else { return .none } + state.pendingAnswers[id: state.question.id] = PendingAnswerToQuestion(questionID: state.question.id, answer: state.trimmed) + return .send(.delegate(.done(state.index))) + case .delegate: + return .none + } + } + } +} +extension AnswerSecurityQuestionFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Question #\(store.state.index)") + .font(.largeTitle) + + Spacer() + + Text("\(store.state.question.question)") + .font(.title) + .fontWeight(.bold) + + Spacer() + + if + case let unsafeAnswers = store.state.question.expectedAnswerFormat.unsafeAnswers, + !unsafeAnswers.isEmpty + { + Text("Unsuitable if your answer would be: \(unsafeAnswers.map({ "\"\($0)\"" }).joined(separator: ", "))") + .foregroundStyle(Color.red) + } + + LabeledTextField( + label: "Answer", + text: $store.answer.sending(\.view.answerChanged), + placeholder: "Suggested format: `\(store.state.question.expectedAnswerFormat.answerStructure)`", + hint: "Example: *\"\(store.state.question.expectedAnswerFormat.exampleAnswer)\"*" + ) + .padding(.vertical, 20) + + Labeled("Used", "'\(store.state.trimmed)'") + + Spacer() + + Button("Confirm") { + send(.confirmButtonTapped) + } + .buttonStyle(.borderedProminent) + .disabled(store.state.answer.isEmpty) + } + .multilineTextAlignment(.leading) + .padding() + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SecurityQuestionsReviewAnswersFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SecurityQuestionsReviewAnswersFeature.swift new file mode 100644 index 000000000..e4744db79 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SecurityQuestionsReviewAnswersFeature.swift @@ -0,0 +1,130 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import SwiftUI +import Sargon +import ComposableArchitecture + +extension SecurityNotProductionReadyQuestionAndAnswer: Identifiable { + public typealias ID = SecurityNotProductionReadyQuestion.ID + public var id: ID { + question.id + } +} + +public typealias AnswersToQuestions = IdentifiedArrayOf + +@Reducer +public struct SecurityQuestionsReviewAnswersFeature { + + @Dependency(FactorSourcesClient.self) var factorSourcesClient + + @ObservableState + public struct State: Equatable { + @Shared(.pendingAnswers) var toWipeAnswers + public let answersToQuestions: AnswersToQuestions + public var isAdding = false + } + + @CasePathable + public enum Action: ViewAction { + case delegate(DelegateAction) + case view(ViewAction) + case `internal`(InternalAction) + public enum DelegateAction { + case factorCreatedAndAdded + } + + public enum InternalAction { + case factorCreatedAndAdded + } + + + @CasePathable + public enum ViewAction { + case addFactorButtonTapped + } + + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case .view(.addFactorButtonTapped): + guard !state.isAdding else { return .none } + state.isAdding = true + return .run { [qas = state.answersToQuestions] send in + let factor = try factorSourcesClient.createSecurityQuestionsFactor(qas) + try await factorSourcesClient.addFactorSource(factor.asGeneral) + await send(.internal(.factorCreatedAndAdded)) + } + case .internal(.factorCreatedAndAdded): + state.toWipeAnswers = [] // IMPORTANT! Since this is shared state (in memory) we SHOULD wipe secrets + return .send(.delegate(.factorCreatedAndAdded)) + + case .delegate: + return .none + } + } + } +} + +extension SecurityQuestionsReviewAnswersFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Review Answers").font(.largeTitle) + ScrollView { + ForEach(store.state.answersToQuestions) { answerToQuestion in + let index = store.state.answersToQuestions.firstIndex(of: answerToQuestion)! + AnsweredQuestionCard(answerToQuestion, index) + } + .multilineTextAlignment(.leading) + } + + Button("Add Factor") { + send(.addFactorButtonTapped) + } + .disabled(store.state.isAdding) + .buttonStyle(.borderedProminent) + } + .padding() + } + } +} + +public struct AnsweredQuestionCard: SwiftUI.View { + public let answerToQuestion: AnswersToQuestions.Element + public let index: Int + public init( + _ answerToQuestion: AnswersToQuestions.Element, + _ index: Int + ) { + self.answerToQuestion = answerToQuestion + self.index = index + } + public var body: some View { + VStack(alignment: .leading, spacing: 20) { + Labeled("Question \(index)", answerToQuestion.question.question, axis: .vertical) + Labeled("Answer \(index)", answerToQuestion.answer, axis: .vertical) + } + .fontWeight(.bold) + .foregroundStyle(Color.white) + .frame(maxWidth:. infinity) + .padding() + .background(Color.green) + .clipShape(.rect(cornerRadius: 20)) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SelectQuestionsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SelectQuestionsFeature.swift new file mode 100644 index 000000000..c5203657a --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SelectQuestionsFeature.swift @@ -0,0 +1,188 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import Sargon +import ComposableArchitecture + + +@Reducer +public struct SelectQuestionsFeature { + + @Reducer(state: .equatable) + public enum Destination { + case prefillQuestionsAndAnswersAlert(AlertState) + + public enum PrefillQuestionsAndAnswersAlert: String, CaseIterable { + case sample + case sampleOther + } + } + + + @ObservableState + public struct State: Equatable { + @Shared(.questions) var questions + @Presents var destination: Destination.State? + + public var canProceed: Bool { + // FIXME: change to UniFFI export the `SealedMnemonic::QUESTION_COUNT`... + do { + let _ = try SecurityQuestionsNotProductionReadyFactorSource(mnemonic: .sample, questionsAndAnswers: questions.enumerated().map({ + SecurityNotProductionReadyQuestionAndAnswer.init(question: $0.element, answer: "\($0.offset)") + })) + return true + } catch { + return false + } + } + public var questionCount: Int { + // FIXME: change to UniFFI export the `SealedMnemonic::QUESTION_COUNT`... + 6 // might be wrong, the `canProceed` tells the truth though. + } + + } + + @CasePathable + public enum Action: ViewAction { + case delegate(DelegateAction) + case view(ViewAction) + case destination(PresentationAction) + + public enum DelegateAction { + case done(prefillWith: [SecurityNotProductionReadyQuestionAndAnswer]?) + } + + @CasePathable + public enum ViewAction { + case confirmedQuestions + case prefillButtonTapped + } + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.prefillButtonTapped): + state.destination = .prefillQuestionsAndAnswersAlert(.init( + title: TextState("Prefill?"), + message: TextState("Will take you to review screen."), + buttons: [ + .cancel(TextState("Cancel")) + ] + Destination.PrefillQuestionsAndAnswersAlert.allCases.map { action in + ButtonState( + action: action, + label: { + TextState("Prefill with '\(action.rawValue)'") + }) + } + )) + return .none + + case .view(.confirmedQuestions): + precondition(state.canProceed) + return .send(.delegate(.done(prefillWith: nil))) + + case let .destination(.presented(.prefillQuestionsAndAnswersAlert(prefillAction))): + let qas = switch prefillAction { + case .sample: + newSecurityNOTPRODUCTIONREADYQuestionsAndAnswersSample() + case .sampleOther: + newSecurityNOTPRODUCTIONREADYQuestionsAndAnswersSampleOther() + } + + state.destination = nil + return .send(.delegate(.done(prefillWith: qas))) + + case .destination: + return .none + + case .delegate: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +public struct SelectQuestionCard: View { + @Shared(.questions) var questions + public let question: SecurityNotProductionReadyQuestion + public var id: SecurityNotProductionReadyQuestion.ID { + question.id + } + public var isSelected: Bool { + questions[id: id] != nil + } + public var body: some SwiftUI.View { + Button(action: { + if isSelected { + questions.remove(id: id) + } else { + questions.append(question) + } + }, label: { + HStack { + Text(isSelected ? "✅" : "☑️").font(.title) + VStack(alignment: .leading) { + Text("\(question.question)").font(.headline).fontWeight(.bold) + if case let unsafeAnswers = question.expectedAnswerFormat.unsafeAnswers, !unsafeAnswers.isEmpty { + Text("Unsuitable if: \(unsafeAnswers.joined(separator: ","))") + .font(.footnote) + .foregroundStyle(Color.red) + } + } + } + .multilineTextAlignment(.leading) + }) + .buttonStyle(.plain) + .frame(maxWidth: .infinity, alignment: .leading) + .cornerRadius(.small1) + } +} + +extension SelectQuestionsFeature { + public typealias HostingFeature = Self + + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + VStack { + Text("Pick #\(store.questionCount) questions").font(.title) + Text("Picked: \(store.state.questions.count)") + + Button("Prefill Q + As") { + send(.prefillButtonTapped) + } + .buttonStyle(.borderedProminent) + + ScrollView { + ForEach(SecurityNotProductionReadyQuestion.all) { question in + SelectQuestionCard(question: question) + .padding(.bottom, 10) + } + } + .padding(.vertical, 10) + + Button("Confirm Questions") { + send(.confirmedQuestions) + } + .buttonStyle(.borderedProminent) + .disabled(!store.canProceed) + } + .padding() + .alert($store.scope(state: \.destination?.prefillQuestionsAndAnswersAlert, action: \.destination.prefillQuestionsAndAnswersAlert)) + } + } +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SharedState+SecurityQuestions.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SharedState+SecurityQuestions.swift new file mode 100644 index 000000000..51b99fb3e --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/Children/SharedState+SecurityQuestions.swift @@ -0,0 +1,48 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-03. +// + +import Foundation +import Sargon +import ComposableArchitecture + +extension SecurityNotProductionReadyQuestion: Identifiable { + public typealias ID = UInt16 +} +extension SecurityNotProductionReadyQuestion { + public static let all: [SecurityNotProductionReadyQuestion] = securityQuestionsAll() +} + + +extension PersistenceReaderKey +where Self == PersistenceKeyDefault> { + static var pendingAnswers: Self { + PersistenceKeyDefault( + .inMemory("pendingAnswers"), + [] + ) + } +} + +public struct PendingAnswerToQuestion: Hashable, Sendable, Identifiable { + public typealias ID = SecurityNotProductionReadyQuestion.ID + public let questionID: ID + public let answer: String + + public var id: ID { questionID } +} + +public typealias PendingAnswersToQuestions = IdentifiedArrayOf + +extension PersistenceReaderKey +where Self == PersistenceKeyDefault>> { + static var questions: Self { + PersistenceKeyDefault( + .inMemory("questions"), + [] + ) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/NewSecurityQuestionsFeatureCoordinator.swift b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/NewSecurityQuestionsFeatureCoordinator.swift new file mode 100644 index 000000000..e8d3be757 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Flows/SecurityQuestions/NewSecurityQuestionsFeature/NewSecurityQuestionsFeatureCoordinator.swift @@ -0,0 +1,148 @@ +import SwiftUI +import Sargon +import ComposableArchitecture + +@Reducer +public struct NewSecurityQuestionsFeatureCoordinator { + + @Reducer(state: .equatable) + public enum Path { + case answerQuestion(AnswerSecurityQuestionFeature) + case reviewAnswers(SecurityQuestionsReviewAnswersFeature) + } + + @ObservableState + public struct State: Equatable { + @Shared(.questions) var questions + @Shared(.pendingAnswers) var pendingAnswers + + public var selectQuestions: SelectQuestionsFeature.State + public var path = StackState() + + public init() { + self.selectQuestions = SelectQuestionsFeature.State() + questions = .init() + pendingAnswers = .init() + } + } + + @CasePathable + public enum Action { + @CasePathable + public enum DelegateAction { + case done + } + + case path(StackAction) + case selectQuestions(SelectQuestionsFeature.Action) + case delegate(DelegateAction) + } + + public init() {} + + func nextStep(_ state: inout State, nextIndex indexOfNextQuestionToAnswer: Int) -> EffectOf { + if indexOfNextQuestionToAnswer < state.questions.count { + state.path.append(.answerQuestion( + AnswerSecurityQuestionFeature.State( + index: indexOfNextQuestionToAnswer + ) + )) + } else { + precondition(state.pendingAnswers.count == state.questions.count) + let answersToQuestionsArray = state.pendingAnswers.map({ + let question = state.questions[id: $0.id]! + return SecurityNotProductionReadyQuestionAndAnswer(question: question, answer: $0.answer) + }) + let answersToQuestions = answersToQuestionsArray.asIdentified() + state.path.append(.reviewAnswers(SecurityQuestionsReviewAnswersFeature.State( + answersToQuestions: answersToQuestions + ))) + } + + + return .none + } + + public var body: some ReducerOf { + Scope(state: \.selectQuestions, action: \.selectQuestions) { + SelectQuestionsFeature() + } + Reduce { state, action in + switch action { + + case .path(let pathAction): + switch pathAction { + + case let .element(id: _, action: .answerQuestion(.delegate(.done(index)))): + return nextStep(&state, nextIndex: index + 1) + + case .element(id: _, action: .reviewAnswers(.delegate(.factorCreatedAndAdded))): + return .send(.delegate(.done)) + + case .popFrom(id: _): + return .none + case .push(id: _, state: _): + return .none + default: + return .none + } + + case let .selectQuestions(.delegate(.done(prefillWith))): + if let qas = prefillWith { + state.questions = qas.map(\.question).asIdentified() + + state.pendingAnswers = qas.map({ PendingAnswerToQuestion.init(questionID: $0.question.id, answer: $0.answer) }).asIdentified() + + state.path = StackState( + (0.. + + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { + SelectQuestionsFeature.View( + store: store.scope(state: \.selectQuestions, action: \.selectQuestions) + ) + } destination: { store in + switch store.case { + case let .answerQuestion(store): + AnswerSecurityQuestionFeature.View(store: store) + + case let .reviewAnswers(store): + SecurityQuestionsReviewAnswersFeature.View(store: store) + } + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/MainFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/MainFeature.swift index 6226293a0..50b968a58 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/MainFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/MainFeature.swift @@ -1,57 +1,76 @@ import Sargon -import SargonUniFFI +import ComposableArchitecture @Reducer public struct MainFeature { + @Dependency(ProfileClient.self) var profileClient + @Dependency(AccountsClient.self) var accountsClient + + @Reducer + public enum Path { + case settings(SettingsFeature) + case manageSecurityShields(ManageSecurityShieldsFeature) + case shieldDetails(ShieldDetailsFeature) + case manageFactorSources(ManageFactorSourcesFeature) + case manageSpecificFactorSources(ManageSpecificFactorSourcesFeature) + case accountDetails(AccountDetailsFeature) + case profileView(DebugProfileFeature) + } + @Reducer(state: .equatable) public enum Destination { case createAccount(CreateAccountFlowFeature) - case sampleValues(SampleValuesFeature) - case alert(AlertState) - public enum Alert { - case confirmedDeleteWallet + case newHWFactorSource(NewHWFactorSourceFeature) + case newTrustedContact(NewTrustedContactFactorSourceFeature) + case newSecurityQuestions(NewSecurityQuestionsFeatureCoordinator) + case deleteProfileAlert(AlertState) + + public enum DeleteProfileAlert { + case confirmedDeleteProfileBDFSThenOnboard + case confirmedEmulateFreshInstallThenTerminate } } @ObservableState - public struct State: Equatable { - + public struct State { + @SharedReader(.network) var network @Presents var destination: Destination.State? - + public var path = StackState() public var accounts: AccountsFeature.State - public let walletHolder: WalletHolder - - public init(walletHolder: WalletHolder) { - self.walletHolder = walletHolder - self.accounts = AccountsFeature.State(walletHolder: walletHolder) - } - public init(wallet: Wallet) { - self.init(walletHolder: .init(wallet: wallet)) + public init() { + self.accounts = AccountsFeature.State() } + } @CasePathable public enum Action: ViewAction { + @CasePathable public enum ViewAction { - case sampleValuesButtonTapped + case settingsButtonTapped + case deleteWalletButtonTapped } + @CasePathable public enum DelegateAction { case deletedWallet + case emulateFreshInstall } + case view(ViewAction) case destination(PresentationAction) + case path(StackAction) + case accounts(AccountsFeature.Action) case delegate(DelegateAction) } - @Dependency(\.keychain) var keychain public init() {} public var body: some ReducerOf { @@ -61,56 +80,178 @@ public struct MainFeature { Reduce { state, action in switch action { - case .view(.sampleValuesButtonTapped): - state.destination = .sampleValues(SampleValuesFeature.State()) - return .none + case .path(let pathAction): + switch pathAction { + + case let .element(id: _, action: action): + switch action { + case .settings(.delegate(.navigate(.toProfileView))): + state.path.append(.profileView(DebugProfileFeature.State())) + return .none + + case .settings(.delegate(.navigate(.toShields))): + state.path.append(.manageSecurityShields(ManageSecurityShieldsFeature.State())) + return .none + + case .settings(.delegate(.navigate(.toFactorSources))): + state.path.append(.manageFactorSources(ManageFactorSourcesFeature.State())) + return .none + + case let .shieldDetails(.delegate(.copyAndEdit(preset))): + state.path.append(.manageSecurityShields(ManageSecurityShieldsFeature.State(copyAndEdit: preset))) + return .none + + case let .manageSecurityShields(.delegate(.navigate(.toDetailsForShield(shield)))): + state.path.append(.shieldDetails(ShieldDetailsFeature.State(shield: shield))) + return .none + + + case let .manageFactorSources(.delegate(.navigate(.toFactor(kind)))): + state.path.append(.manageSpecificFactorSources( + ManageSpecificFactorSourcesFeature.State(kind: kind) + )) + return .none + + case let .manageSpecificFactorSources(.delegate(.addNew(kind))): + if kind == .securityQuestions { + state.destination = .newSecurityQuestions(NewSecurityQuestionsFeatureCoordinator.State()) + } else if kind == .trustedContact { + state.destination = .newTrustedContact(NewTrustedContactFactorSourceFeature.State()) + } else { + state.destination = .newHWFactorSource(NewHWFactorSourceFeature.State(kind: kind)) + } + return .none + + case .profileView: + return .none + + case .settings: + return .none + + case .manageSecurityShields: + return .none + + case .manageFactorSources: + return .none - case .accounts(.delegate(.deleteWallet)): - state.destination = .alert(.init( + case .manageSpecificFactorSources: + return .none + + case .accountDetails: + return .none + + case .shieldDetails: + return .none + + } + + case .popFrom(id: _): + return .none + + case .push(id: _, state: _): + return .none + } + + case .view(.deleteWalletButtonTapped): + state.destination = .deleteProfileAlert(.init( title: TextState("Delete wallet?"), message: TextState("Warning"), buttons: [ .cancel(TextState("Cancel")), .destructive( - TextState("Delete Wallet and mnemonic"), - action: .send(.confirmedDeleteWallet) + TextState("Delete Profile & BDFS -> Onboard"), + action: .send(.confirmedDeleteProfileBDFSThenOnboard) + ), + .destructive( + TextState("Emulate Fresh Install -> Restart"), + action: .send(.confirmedEmulateFreshInstallThenTerminate) ) ] )) return .none - case .accounts(.delegate(.createNewAccount)): + + case .view(.settingsButtonTapped): + state.path.append(.settings(SettingsFeature.State())) + return .none + + case let .accounts(.delegate(.showDetailsFor(accountForDisplay))): + state.path.append(.accountDetails(AccountDetailsFeature.State(accountForDisplay: accountForDisplay))) + return .none + + + case let .accounts(.delegate(.createNewAccount(index))): state.destination = .createAccount( - CreateAccountFlowFeature.State( - walletHolder: state.walletHolder - ) + CreateAccountFlowFeature.State(index: index) ) return .none - case .destination(.presented(.alert(.confirmedDeleteWallet))): - print("⚠️ Confirmed deletion of wallet") + case .destination(.presented(.newSecurityQuestions(.delegate(.done)))): state.destination = nil - let profileID = state.walletHolder.wallet.profile().id - do { - try keychain.deleteDataForKey(SecureStorageKey.profileSnapshot(profileId: profileID)) - try keychain.deleteDataForKey(SecureStorageKey.activeProfileId) - return .send(.delegate(.deletedWallet)) - } catch { - fatalError("Fix error handling, error: \(error)") + return .none + + case .destination(.presented(.newTrustedContact(.delegate(.done)))): + state.destination = nil + return .none + + case .destination(.presented(.newHWFactorSource(.delegate(.createdAndSavedNewFactorSource)))): + state.destination = nil + return .none + + case .destination(.presented(.deleteProfileAlert(.confirmedEmulateFreshInstallThenTerminate))): + log.notice("Confirmed deletion of Profile & BDFS") + state.destination = nil + return .run { send in + try await profileClient.emulateFreshInstallOfAppThenRestart() + await send(.delegate(.emulateFreshInstall)) } - + + case .destination(.presented(.deleteProfileAlert(.confirmedDeleteProfileBDFSThenOnboard))): + log.notice("Confirmed deletion of Profile & BDFS (will then onboard)") + state.destination = nil + return .run { send in + try await profileClient.deleteProfileAndMnemonicsThenCreateNew() + await send(.delegate(.deletedWallet)) + } + + case .destination(.presented(.createAccount(.delegate(.createdAccount)))): state.destination = nil - state.accounts.refresh() // FIXME: we really do not want this. return .none - + default: return .none } } + .forEach(\.path, action: \.path) .ifLet(\.$destination, action: \.destination) } - + +} + +public struct BannerThisIsNotRadixWallet: View { + public let onMainnet: Bool + public init(onMainnet: Bool) { + self.onMainnet = onMainnet + } + public var body: some View { + VStack(alignment: .center, spacing: 4) { + Text("Demo app, **not** the Radix Wallet app.") + .font(.system(size: 22)) + Text(onMainnet ? "" : "‼️ On Testnet ‼️") + .font(.system(size: 12)) + } + .frame(maxWidth: .infinity, alignment: .center) + .padding(4) + .background(Color.yellow) + .foregroundStyle(Color.red) + .fontWeight(.bold) + } + +} + + +extension MainFeature { @ViewAction(for: MainFeature.self) public struct View: SwiftUI.View { @@ -121,43 +262,93 @@ public struct MainFeature { } public var body: some SwiftUI.View { - NavigationStack { - VStack { + VStack(spacing: 0) { + + BannerThisIsNotRadixWallet( + onMainnet: store.network == .mainnet + ) + + NavigationStack(path: $store.scope(state: \.path, action: \.path)) { VStack { - Text("ProfileID:") - Text("\(store.state.walletHolder.wallet.profile().id)") + VStack { + Text("ProfileID:") + Text("\(SargonOS.shared.profile.id)") + } + + AccountsFeature.View( + store: store.scope(state: \.accounts, action: \.accounts) + ) + + Button("Delete Wallet", role: .destructive) { + send(.deleteWalletButtonTapped) + } } - - AccountsFeature.View( - store: store.scope(state: \.accounts, action: \.accounts) + .toolbar { + ToolbarItem(placement: .primaryAction) { + Button("Settings") { + send(.settingsButtonTapped) + } + } + } + } destination: { store in + switch store.case { + + case let .settings(store): + SettingsFeature.View(store: store) + + case let .manageSecurityShields(store): + ManageSecurityShieldsFeature.View(store: store) + + case let .manageFactorSources(store): + ManageFactorSourcesFeature.View(store: store) + + case let .manageSpecificFactorSources(store): + ManageSpecificFactorSourcesFeature.View(store: store) + + case let .accountDetails(store): + AccountDetailsFeature.View(store: store) + + case let .shieldDetails(store): + ShieldDetailsFeature.View(store: store) + + case let .profileView(store): + DebugProfileFeature.View(store: store) + } + } + .sheet( + item: $store.scope( + state: \.destination?.createAccount, + action: \.destination.createAccount ) + ) { store in + CreateAccountFlowFeature.View(store: store) } .sheet( item: $store.scope( - state: \.destination?.sampleValues, - action: \.destination.sampleValues + state: \.destination?.newHWFactorSource, + action: \.destination.newHWFactorSource ) ) { store in - NavigationView { - SampleValuesFeature.View(store: store) - } + NewHWFactorSourceFeature.View(store: store) } .sheet( item: $store.scope( - state: \.destination?.createAccount, - action: \.destination.createAccount + state: \.destination?.newTrustedContact, + action: \.destination.newTrustedContact ) ) { store in - CreateAccountFlowFeature.View(store: store) + NewTrustedContactFactorSourceFeature.View(store: store) } - .alert($store.scope(state: \.destination?.alert, action: \.destination.alert)) - .toolbar { - ToolbarItem(placement: .primaryAction) { - Button("Samples") { - send(.sampleValuesButtonTapped) - } - } + .sheet( + item: $store.scope( + state: \.destination?.newSecurityQuestions, + action: \.destination.newSecurityQuestions + ) + ) { store in + NewSecurityQuestionsFeatureCoordinator.View(store: store) } + .alert($store.scope(state: \.destination?.deleteProfileAlert, action: \.destination.deleteProfileAlert)) + } } } diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/AppDelegate.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/AppDelegate.swift new file mode 100644 index 000000000..d6d641220 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/AppDelegate.swift @@ -0,0 +1,14 @@ +import ComposableArchitecture +import SwiftUI + +public final class AppDelegate: NSObject, UIApplicationDelegate { + public func application( + _ application: UIApplication, + configurationForConnecting connectingSceneSession: UISceneSession, + options: UIScene.ConnectionOptions + ) -> UISceneConfiguration { + let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) + sceneConfig.delegateClass = SceneDelegate.self + return sceneConfig + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDFeature.swift new file mode 100644 index 000000000..b0c961656 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDFeature.swift @@ -0,0 +1,189 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-11. +// + +import Foundation +import ComposableArchitecture + +@Reducer +public struct HUDFeature { + + @Dependency(\.continuousClock) var clock + + @ObservableState + public struct State: Equatable { + static let hiddenOffset: CGFloat = -128.0 + static let autoDismissDelay: Double = 1.0 + + let content: HUDMessage + var offset = Self.hiddenOffset + + } + + public enum Action: ViewAction, Sendable { + public enum ViewAction: Sendable { + case onAppear + case animationCompletion + } + public enum DelegateAction: Sendable { + case dismiss + } + public enum InternalAction: Sendable { + case autoDismiss + } + case view(ViewAction) + case delegate(DelegateAction) + case `internal`(InternalAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .internal(.autoDismiss): + state.offset = State.hiddenOffset + return .none + + case .view(.animationCompletion): + if state.offset == State.hiddenOffset { + /// Notify the delegate only after the animation did complete. + return .send(.delegate(.dismiss)) + } else { + return .run { send in + try await clock.sleep(for: .seconds(State.autoDismissDelay)) + await send(.internal(.autoDismiss), animation: .hudAnimation) + } + } + case .view(.onAppear): + state.offset = 0 + return .none + + case .delegate: + return .none + + } + } + } +} + +extension HUDFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + public let store: StoreOf + public init(store: StoreOf) { + self.store = store + } + + public var body: some SwiftUI.View { + VStack { + Group { + if store.offset == 0 { + HStack { + if let icon = store.content.icon { + Image(systemName: icon.systemName) + .foregroundColor(icon.foregroundColor) + .frame(.smallest) + } + Text(store.content.text) + .foregroundColor(.app.gray1) + .font(.footnote) + } + .padding(.vertical, .small1) + .padding(.horizontal, .medium3) + .background( + Capsule() + .foregroundColor(.app.background) + .shadow( + color: .app.gray1.opacity(0.16), + radius: 12, + x: 0, + y: 5 + ) + ) + } else { + Color.clear + } + } + .offset(y: store.offset) + .onAppear { + send(.onAppear, animation: .hudAnimation) + } + .onAnimationCompleted(for: store.offset) { + send(.animationCompletion) + } + Spacer() + + } + } + } +} + +public enum HitTargetSize: CGFloat { + /// 24 + case smallest = 24 + + public var frame: CGSize { + .init(width: rawValue, height: rawValue) + } +} + +extension View { + @inlinable + public func frame(_ size: HitTargetSize, alignment: Alignment = .center) -> some View { + frame(width: size.frame.width, height: size.frame.height, alignment: alignment) + } +} + +// MARK: - SwiftUI.Animation + Sendable +extension SwiftUI.Animation: @unchecked Sendable {} + +extension SwiftUI.Animation { + static var hudAnimation: SwiftUI.Animation { + .spring() + } +} + +extension View { + public func onAnimationCompleted( + for animatedValue: some Sendable & VectorArithmetic, + completion: @escaping @Sendable () -> Void + ) -> some View { + modifier( + OnAnimationCompletedViewModifier( + animatedValue: animatedValue, + completion: completion + ) + ) + } +} +// MARK: - OnAnimationCompletedViewModifier +/// A view modifier allowing to observe the completion of a given value animation +private struct OnAnimationCompletedViewModifier: Animatable, ViewModifier { + typealias Completion = @MainActor @Sendable () -> Void + var animatableData: Value { + didSet { + guard animatableData == animatedValue else { return } + Task { [completion] in + await completion() + } + } + } + + private let animatedValue: Value + private let completion: Completion + + init(animatedValue: Value, completion: @escaping Completion) { + self.animatedValue = animatedValue + self.animatableData = animatedValue + self.completion = completion + } + + func body(content: Content) -> some View { + content + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDMessage.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDMessage.swift new file mode 100644 index 000000000..c9c89d72b --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/HUDMessage.swift @@ -0,0 +1,52 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-11. +// + +import Foundation + +public struct HUDMessage: Sendable, Hashable, Identifiable { + public let id = UUID() + public let text: String + public let icon: Icon? + + public struct Icon: Hashable, Sendable { + public let systemName: String + public let foregroundColor: Color + + public init( + systemName: String, + foregroundColor: Color + ) { + self.systemName = systemName + self.foregroundColor = foregroundColor + } + + public static let success = Self( + systemName: "checkmark.circle.fill", + foregroundColor: Color.app.green1 + ) + + public static let fail = Self( + systemName: "exclamationmark.triangle.fill", + foregroundColor: Color.app.red1 + ) + } + + public init( + text: String, + icon: Icon? + ) { + self.text = text + self.icon = icon + } + + public static func success(text: String, icon: Icon? = .success) -> Self { + Self.init(text: text, icon: icon) + } + public static func failure(text: String, icon: Icon? = .fail) -> Self { + Self.init(text: text, icon: icon) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayFeature.swift new file mode 100644 index 000000000..01792b6a3 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayFeature.swift @@ -0,0 +1,129 @@ +import ComposableArchitecture +import SwiftUI + + +@Reducer +struct OverlayFeature { + + @Dependency(OverlayWindowClient.self) var overlayWindowClient + @Dependency(\.continuousClock) var clock + + @Reducer(state: .equatable) + public enum Destination: Sendable { + case hud(HUDFeature) + } + + @ObservableState + struct State: Equatable { + var itemsQueue: IdentifiedArrayOf = [] + + var isPresenting: Bool { + destination != nil + } + + @Presents + public var destination: Destination.State? + } + + @CasePathable + public enum Action: ViewAction, Sendable { + @CasePathable + public enum ViewAction { + case task + } + enum InternalAction { + case scheduleItem(HUDMessage) + case showNextItemIfPossible + } + case `internal`(InternalAction) + case view(ViewAction) + case destination(PresentationAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + + switch action { + case .view(.task): + return .run { send in + for try await item in overlayWindowClient.getScheduledItems() { + guard !Task.isCancelled else { return } + await send(.internal(.scheduleItem(item))) + } + } + case let .internal(.scheduleItem(hudMessage)): + state.itemsQueue.append(hudMessage) + return showItemIfPossible(state: &state) + case .internal(.showNextItemIfPossible): + return showItemIfPossible(state: &state) + + case .destination(.presented(.hud(.delegate(.dismiss)))): + return dismiss(&state) + + case .destination: + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } + + private func showItemIfPossible(state: inout State) -> Effect { + guard !state.itemsQueue.isEmpty else { + return .none + } + + if state.isPresenting { + guard let presentedItem = state.itemsQueue.first else { + return .none + } + + // A HUD is force dismissed when next item comes in, AKA it is a lower priority. + state.destination = nil + state.itemsQueue.removeFirst() + return .run { send in + // Hacky - A very minor delay is needed before showing the next item is a HUD. + try await clock.sleep(for: .milliseconds(200)) + await send(.internal(.showNextItemIfPossible)) + } + } + + let nextItem = state.itemsQueue[0] + + state.destination = .hud(.init(content: nextItem)) + return .none + } + + + private func dismiss(_ state: inout State) -> Effect { + state.destination = nil + state.itemsQueue.removeFirst() + return showItemIfPossible(state: &state) + } + +} + +extension OverlayFeature { + public typealias HostingFeature = Self + + @ViewAction(for: HostingFeature.self) + public struct View: SwiftUI.View { + @Bindable public var store: StoreOf + public init(store: StoreOf) { + self.store = store + } + public var body: some SwiftUI.View { + + Color.clear + .task { send(.task) } + .fullScreenCover( + item: $store.scope( + state: \.destination?.hud, + action: \.destination.hud + ) + ) { store in + HUDFeature.View(store: store) + .background(TransparentBackground()) + } + } + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayWindowClient.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayWindowClient.swift new file mode 100644 index 000000000..a7b43b0c5 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/OverlayWindowClient.swift @@ -0,0 +1,75 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-11. +// + +import Foundation +import SwiftUI +import Dependencies +import ComposableArchitecture +import Sargon +import AsyncExtensions + +@DependencyClient +public struct OverlayWindowClient: Sendable { + public typealias GetScheduledItems = @Sendable () -> AnyAsyncSequence + public typealias ScheduleHUDMessage = @Sendable (HUDMessage) -> Void + + public var getScheduledItems: GetScheduledItems + + /// Schedule a HUD message to be shown in the Overlay Window. + /// Usually to be called from the Main Window. + public var scheduleHUDMessage: ScheduleHUDMessage + +} + +extension OverlayWindowClient: DependencyKey { + public static let liveValue: Self = { + @Dependency(PasteboardClient.self) var pasteboardClient + let items = AsyncPassthroughSubject() + + let scheduleHUDMessage: ScheduleHUDMessage = { message in + items.send(message) + } + + Task { + for await event in await EventBus.shared.notifications() { + scheduleHUDMessage( + HUDMessage( + text: "Sargon Event: `\(event.event.kind)`", + icon: HUDMessage.Icon( + systemName: "bell", + foregroundColor: .blue + ) + ) + ) + } + } + + Task { + for try await _ in pasteboardClient.copyEvents() { + scheduleHUDMessage( + HUDMessage.success(text: "Copied") + ) + + } + } + + return Self( + getScheduledItems: { items.eraseToAnyAsyncSequence() }, + scheduleHUDMessage: scheduleHUDMessage + ) + }() + + public static let testValue = OverlayWindowClient( + getScheduledItems: { AsyncLazySequence([]).eraseToAnyAsyncSequence() }, + scheduleHUDMessage: { _ in } + ) +} + +extension HUDMessage { + public static let openedSecurityQuestionsSealedMnemonic = Self.success(text: "Successful decryption with answers.") + public static let failedToOpenSecurityQuestionsSealedMnemonic = Self.failure(text: "Failed to decrypt with answers.") +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/SceneDelegate.swift b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/SceneDelegate.swift new file mode 100644 index 000000000..f63e57eff --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/OverlayWindow/SceneDelegate.swift @@ -0,0 +1,55 @@ +import ComposableArchitecture +import SwiftUI + +public final class SceneDelegate: NSObject, UIWindowSceneDelegate, ObservableObject { + public weak var windowScene: UIWindowScene? + public var overlayWindow: UIWindow? + + public func scene( + _ scene: UIScene, + willConnectTo session: UISceneSession, + options connectionOptions: UIScene.ConnectionOptions + ) { + windowScene = scene as? UIWindowScene + if + let windowScene, + !_XCTIsTesting + { + overlayWindow(in: windowScene) + } + } + + func overlayWindow(in scene: UIWindowScene) { + let overlayView = OverlayFeature.View( + store: .init( + initialState: .init(), + reducer: OverlayFeature.init + )) + + let overlayWindow = UIWindow(windowScene: scene) + overlayWindow.rootViewController = UIHostingController(rootView: overlayView) + overlayWindow.rootViewController?.view.backgroundColor = .clear + overlayWindow.windowLevel = .normal + 1 + overlayWindow.isUserInteractionEnabled = false + overlayWindow.backgroundColor = .clear + overlayWindow.makeKeyAndVisible() + self.overlayWindow = overlayWindow + } +} + + +struct TransparentBackground: UIViewRepresentable { + func makeUIView(context: Context) -> UIView { + let view = UIView() + DispatchQueue.main.async { + view.backgroundColor = .clear + view.superview?.backgroundColor = .clear + view.superview?.superview?.backgroundColor = .clear + view.superview?.superview?.superview?.backgroundColor = .clear + view.superview?.superview?.superview?.superview?.backgroundColor = .clear + } + return view + } + + func updateUIView(_ uiView: UIView, context: Context) {} +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/PreviewAddressesFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/PreviewAddressesFeature.swift deleted file mode 100644 index 04070b401..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Features/PreviewAddressesFeature.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Sargon -import SargonUniFFI - -#if DEBUG -public struct SampleAddressesView: SwiftUI.View { - public var body: some SwiftUI.View { - VStack(alignment: .leading, spacing: .large2) { - ForEach(Address.sampleValues, id: \.self) { address in - Text("`\(address.address)`") - .font(.footnote) - .lineLimit(3) - .multilineTextAlignment(.leading) - .fixedSize(horizontal: false, vertical: true) - } - } - } -} - -#endif diff --git a/examples/iOS/Backend/Sources/Planbok/Features/SampleValuesFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/SampleValuesFeature.swift deleted file mode 100644 index 3936731fa..000000000 --- a/examples/iOS/Backend/Sources/Planbok/Features/SampleValuesFeature.swift +++ /dev/null @@ -1,34 +0,0 @@ -import Sargon -import SargonUniFFI - -#if DEBUG -@Reducer -public struct SampleValuesFeature { - - @ObservableState - public struct State: Equatable {} - - public enum Action {} - - public init() {} - - public struct View: SwiftUI.View { - public let store: StoreOf - public var body: some SwiftUI.View { - Form { - Section("TX Manifests") { - Text("`\(TransactionManifest.sample.description)`") - } - .font(.footnote) - - Section("Addresses") { - SampleAddressesView() - } - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding() - } - } -} - -#endif diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Settings/GatewaysFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Settings/GatewaysFeature.swift new file mode 100644 index 000000000..dde21e77f --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Settings/GatewaysFeature.swift @@ -0,0 +1,93 @@ +import Sargon +import ComposableArchitecture + +@Reducer +public struct GatewaysFeature { + + @Dependency(GatewaysClient.self) var gatewaysClient + + @ObservableState + public struct State: Equatable { + @SharedReader(.savedGateways) var savedGateways + } + + @CasePathable + public enum Action: ViewAction { + @CasePathable + public enum ViewAction { + case gatewayTapped(Gateway, isCurrent: Bool) + } + case view(ViewAction) + } + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + case let .view(.gatewayTapped(gateway, isCurrent)): + if isCurrent { + log.debug("Tapped \(gateway), but not switching since it is already current.") + return .none + } else { + return .run { _ in + try await gatewaysClient.switchGatewayTo(gateway) + } + } + } + } + } +} +extension GatewaysFeature { + @ViewAction(for: GatewaysFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + public var body: some SwiftUI.View { + VStack { + Text("Saved gateways").font(.title) + + ScrollView { + ForEach(store.state.savedGateways.all.sorted()) { gateway in + let isCurrent = gateway == store.state.savedGateways.current + VStack { + GatewayView(gateway: gateway, isCurrent: isCurrent) { + send(.gatewayTapped(gateway, isCurrent: isCurrent)) + } + .padding(.bottom, 10) + } + } + } + } + .padding([.leading, .trailing], 20) + } + } +} + +extension Gateway: Comparable { + public static func < (lhs: Self, rhs: Self) -> Bool { + if lhs.networkID == .mainnet { return true } + if rhs.networkID == .mainnet { return false } + return lhs.networkID.rawValue < rhs.networkID.rawValue && lhs.url.absoluteString < rhs.url.absoluteString + } +} + +public struct GatewayView: SwiftUI.View { + public let gateway: Gateway + public let isCurrent: Bool + public let action: () -> Void + + public var body: some SwiftUI.View { + + Button.init(action: action, label: { + HStack { + Text(isCurrent ? "✅" : "☑️").font(.title) + VStack { + Text("\(gateway.network.displayDescription)").font(.body) + Text("\(gateway.networkID.toString())") + } + } + }) + .buttonStyle(.plain) + .frame(maxWidth: .infinity, alignment: .leading) + .cornerRadius(.small1) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/Features/Settings/SettingsFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/Settings/SettingsFeature.swift new file mode 100644 index 000000000..03cd81109 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/Features/Settings/SettingsFeature.swift @@ -0,0 +1,163 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-05. +// + +import Foundation +import Sargon +import ComposableArchitecture +import SwiftUI + +@Reducer +public struct SettingsFeature { + @Dependency(AccountsClient.self) var accountsClient + + @Reducer(state: .equatable) + public enum Destination { + case createManyAccountsAlert(AlertState) + + public enum CreateManyAccountsAlert: Int, CaseIterable { + case create10 = 10 + case create20 = 20 + case create50 = 50 + case create100 = 100 + case create200 = 200 + case create500 = 500 + case create1000 = 1000 + } + } + + @ObservableState + public struct State: Equatable { + @Presents var destination: Destination.State? + } + + @CasePathable + public enum Action: ViewAction { + + @CasePathable + public enum ViewAction { + case createManyAccountsButtonTapped + case factorSourcesButtonTapped + case shieldsButtonTapped + case profileViewButtonTapped + } + + case view(ViewAction) + case destination(PresentationAction) + + + @CasePathable + public enum DelegateAction { + case navigate(Navigate) + + @CasePathable + public enum Navigate { + case toFactorSources + case toShields + case toProfileView + } + } + + case delegate(DelegateAction) + } + + public init() {} + + public var body: some ReducerOf { + Reduce { state, action in + switch action { + + case .view(.profileViewButtonTapped): + return .send(.delegate(.navigate(.toProfileView))) + + case .view(.createManyAccountsButtonTapped): + state.destination = .createManyAccountsAlert(.init( + title: TextState("How many?"), + message: TextState("Will batch create many accounts and then perform one single save action."), + buttons: [ + .cancel(TextState("Cancel")) + ] + Destination.CreateManyAccountsAlert.allCases.map { action in + ButtonState.init(action: action, label: { + TextState("Create \(action.rawValue)") + }) + } + )) + return .none + + case .view(.factorSourcesButtonTapped): + return .send(.delegate(.navigate(.toFactorSources))) + + case .view(.shieldsButtonTapped): + return .send(.delegate(.navigate(.toShields))) + + case let .destination(.presented(.createManyAccountsAlert(action))): + state.destination = nil + let count = UInt16(action.rawValue) + return .run { send in + try await accountsClient.batchCreateManySavedAccounts(count) + } + + default: + return .none + + } + } + .ifLet(\.$destination, action: \.destination) + } +} + +extension SettingsFeature { + + @ViewAction(for: SettingsFeature.self) + public struct View: SwiftUI.View { + + @Bindable public var store: StoreOf + + public var body: some SwiftUI.View { + VStack { + Text("Settings").font(.largeTitle) + + Spacer() + + GatewaysFeature.View( + store: Store( + initialState: GatewaysFeature.State() + ) { + GatewaysFeature() + } + ) + + Spacer() + + Button("Profile View (Debug)") { + send(.profileViewButtonTapped) + } + + + Button("Handle Factor Sources") { + send(.factorSourcesButtonTapped) + } + + Button("Handle Security Shields") { + send(.shieldsButtonTapped) + } + + VStack { + Button("Create Many Accounts") { + send(.createManyAccountsButtonTapped) + } + Label("This button is here, in Settings, and not on Home screen since we wanna test that the accounts on Home screen is updated when we dismiss Settings.", systemImage: "info.circle") + .font(.footnote) + } + } + .padding(.bottom, 100) + .padding(.horizontal, 10) + .alert($store.scope(state: \.destination?.createManyAccountsAlert, action: \.destination.createManyAccountsAlert)) + } + } + +} + diff --git a/examples/iOS/Backend/Sources/Planbok/Features/SplashFeature.swift b/examples/iOS/Backend/Sources/Planbok/Features/SplashFeature.swift index 7ff24da06..3a7d81931 100644 --- a/examples/iOS/Backend/Sources/Planbok/Features/SplashFeature.swift +++ b/examples/iOS/Backend/Sources/Planbok/Features/SplashFeature.swift @@ -1,29 +1,30 @@ -import Sargon -import SargonUniFFI +@testable import Sargon +import ComposableArchitecture @Reducer public struct SplashFeature { @Dependency(\.continuousClock) var clock - @Dependency(\.keychain) var keychain - @ObservableState public struct State { - public init() {} + let isEmulatingFreshInstall: Bool + public init(isEmulatingFreshInstall: Bool = false) { + self.isEmulatingFreshInstall = isEmulatingFreshInstall + } } - - public enum Action: ViewAction { - public enum DelegateAction { - case walletInitialized(Wallet, hasAccount: Bool) + + public enum Action: ViewAction, Sendable { + public enum DelegateAction: Sendable { + case booted(hasAnyAccountOnAnyNetwork: Bool) } - public enum ViewAction { + public enum ViewAction: Sendable { case appear } case delegate(DelegateAction) case view(ViewAction) } - + @ViewAction(for: SplashFeature.self) public struct View: SwiftUI.View { public let store: StoreOf @@ -31,54 +32,44 @@ public struct SplashFeature { self.store = store } public var body: some SwiftUI.View { - Image("Splash", bundle: Bundle.module) - .resizable() + Text("Swift Sargon") + .font(.largeTitle) .ignoresSafeArea(edges: [.top, .bottom]) .onAppear { send(.appear) } } } - + + @Dependency(\.mainQueue) var mainQueue public init() {} - + public var body: some ReducerOf { - Reduce { state, action in + Reduce { + state, + action in switch action { + case .view(.appear): - .run { send in - let secureStorage = Keychain.shared - try await clock.sleep(for: .milliseconds(1200)) - if try keychain.loadData(SecureStorageKey.activeProfileId) != nil { - let wallet = try Wallet.byLoadingProfile(secureStorage: secureStorage) - let profile = wallet.profile() - let hasAccount = profile.networks.first?.accounts.isEmpty == false - await send(.delegate(.walletInitialized(wallet, hasAccount: hasAccount))) - } else { - await send(.delegate(.walletInitialized( - Wallet.generateNewBDFSAndEmptyProfile(secureStorage: secureStorage), - hasAccount: false) - )) - } - } + struct SplashID: Hashable { } + return .run { [isEmulatingFreshInstall = state.isEmulatingFreshInstall] send in + + let os = try await SargonOS._creatingShared( + bootingWith: BIOS.shared, + isEmulatingFreshInstall: isEmulatingFreshInstall + ) + await send( + .delegate(.booted( + hasAnyAccountOnAnyNetwork: os.hasAnyAccountOnAnyNetwork() + )) + ) + } + .debounce(id: SplashID(), for: 0.8, scheduler: mainQueue) + case .delegate: - .none + return .none } } } } -extension Wallet { - static func generateNewBDFSAndEmptyProfile(secureStorage: SecureStorage = Keychain.shared) -> Wallet { - do { - return try Wallet.byCreatingNewProfileAndSecretsWithEntropy( - entropy: .init(bagOfBytes: BagOfBytes.random(byteCount: 32)), - walletClientModel: .iphone, - walletClientName: "Unknown iPhone", - secureStorage: secureStorage - ) - } catch { - fatalError("TODO Handle errors: error \(error)") - } - } -} diff --git a/examples/iOS/Backend/Sources/Planbok/SargonExtensions/Sargon+Extensions.swift b/examples/iOS/Backend/Sources/Planbok/SargonExtensions/Sargon+Extensions.swift new file mode 100644 index 000000000..59f3b6354 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SargonExtensions/Sargon+Extensions.swift @@ -0,0 +1,27 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-26. +// + +import Foundation +import Sargon + +public typealias AccountsForDisplay = IdentifiedArrayOf + +extension IdentifiedArray where Element: Identifiable, Element.ID == ID { + public static var `default`: Self { IdentifiedArrayOf.init() } +} + +extension NetworkID { + public static let `default` = Self.mainnet +} + +extension SargonOS { + + public var accountsForDisplayOnCurrentNetworkIdentified: AccountsForDisplay { + accountsForDisplayOnCurrentNetwork.asIdentified() + } + +} diff --git a/examples/iOS/Backend/Sources/Planbok/SharedState/SargonKey.swift b/examples/iOS/Backend/Sources/Planbok/SharedState/SargonKey.swift new file mode 100644 index 000000000..7025da5b8 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SharedState/SargonKey.swift @@ -0,0 +1,172 @@ +import Foundation +import ComposableArchitecture +import Sargon + +extension PersistenceKeyDefault: @unchecked Sendable where Base: Sendable {} +extension KeyPath: @unchecked Sendable where Root: Sendable, Value: Sendable {} + +/// A `PersistenceReaderKey` that listens to relevant event notifications emitted +/// by the SargonOS to which `SargonKey` subscribes using an `EventBus` and +/// based on `shouldFetch` we fetch the latest `Value` from the SargonOS +/// using `fetchValueFromSargonOS` method. For example we +/// might create a SharedReader which subscribs the active Profiles +/// non hidden accounts on the current network like so: +/// +/// ``` +/// SargonKey( +/// fetchValueFromSargonOS: { os in os[keyPath: \.accountsForDisplayOnCurrentNetworkIdentified] }, +/// shouldFetch: { eventKind in eventKind[keyPath: \.affectsCurrentAccounts] } +/// ) +/// ``` +/// +/// Which we also can create using `SargonKey:accessing:fetchIf` init, like so: +/// ``` +/// SargonKey( +/// accessing: \.accountsForDisplayOnCurrentNetworkIdentified, +/// fetchIf: \.affectsCurrentAccounts +/// ) +/// ``` +public struct SargonKey: Hashable, PersistenceReaderKey, Sendable { + public typealias FetchValueFromSargonOS = @Sendable () -> Value? + public typealias ShouldFetch = @Sendable (EventKind) -> Bool + + /// A closure which we invoke if `shouldFetch` returns `true` for a received `EventNotification`, + /// which fetches a new value from SargonOS. The closure has already been translated from a `(SargonOS) -> Value?` + /// closure in the initializer of `SargonKey` into a `() -> Value?`. + private let fetchValueFromSargonOS: FetchValueFromSargonOS + + /// A predicate which returns `true` given an received `EventNotification` of a certain kind + /// (`EventKind`) if we should call `fetchValueFromSargonOS` else `false`, if the + /// event kind is not relevant for the `Value` of this `SargonKey`. E.g. the EventKind `.addedAccount`, + /// does not affect the current network, so a `SargonKey` should return `false` for + /// a received `EventNotification` of kind `.addedAccount`. + /// + /// However, we SHOULD not make our own decisions here on the Swift side if a certain event is + /// relevant or not, better to use the functions `affectsX` which we have wrapped as computed + /// properties on `EventKind`, e.g. `eventKind.affectsCurrentAccounts`. + private let shouldFetch: ShouldFetch + + /// Owned (retained) by SargonOS + private unowned let eventBus: EventBus + + public init( + sargonOS: SargonOS = .shared, + eventBus: EventBus = .shared, + fetchValueFromSargonOS: @escaping @Sendable (SargonOS) -> Value?, + shouldFetch: @escaping ShouldFetch + ) { + self.eventBus = eventBus + self.fetchValueFromSargonOS = { [weak sargonOS] in + guard let sargonOS else { + return nil + } + return fetchValueFromSargonOS(sargonOS) + } + self.shouldFetch = shouldFetch + } +} + + +extension SargonKey { + + /// Create a new `SargonKey` with `KeyPath` based API, instead of closure based. + /// + /// This allows use to write: + /// + /// ``` + /// SargonKey( + /// accessing: \.accountsForDisplayOnCurrentNetworkIdentified, + /// fetchIf: \.affectsCurrentAccounts + /// ) + /// ``` + /// + /// Instead of more verbose: + /// + /// ``` + /// SargonKey( + /// fetchValueFromSargonOS: { os in os[keyPath: \.accountsForDisplayOnCurrentNetworkIdentified] }, + /// shouldFetch: { eventKind in eventKind[keyPath: \.affectsCurrentAccounts] } + /// ) + /// ``` + public init( + accessing lastValueWithOSKeyPath: KeyPath, + fetchIf fetchIfKeyPath: KeyPath + ) { + self.init( + fetchValueFromSargonOS: { $0[keyPath: lastValueWithOSKeyPath] }, + shouldFetch: { $0[keyPath: fetchIfKeyPath] } + ) + + } +} + +// MARK: PersistenceReaderKey +extension SargonKey { + + /// Loads the freshest value from storage (SargonOS). Returns `nil` if there is no value in storage. + /// + /// - Parameter initialValue: An initial value assigned to the `@Shared` property. + /// - Returns: An initial value provided by an external system, or `nil`. + public func load(initialValue: Value?) -> Value? { + fetchValueFromSargonOS() ?? initialValue + } + + + /// Subscribes to external updates, we do it by subscribing to `EventBus.notifications()`. + /// + /// - Parameters: + /// - initialValue: An initial value assigned to the `@Shared` property. + /// - didSet: A closure that is invoked with new values from an external system, or `nil` if the + /// external system no longer holds a value. + /// - Returns: A subscription to updates from an external system. If it is cancelled or + /// deinitialized, the `didSet` closure will no longer be invoked. + public func subscribe( + initialValue: Value?, + didSet: @Sendable @escaping (_ newValue: Value?) -> Void + ) -> Shared.Subscription { + let task = Task { [shouldFetch = self.shouldFetch] in + for await _ in await eventBus.notifications().map(\.event.kind).filter({ + shouldFetch($0) + }) { + guard !Task.isCancelled else { return } + + // The call `fetchValueFromSargonOS` might be costly + // we SHOULD try to use as fast and cheap calls as possible + // i.e. it is best to call `os.currentNetwork()` which is near instant + // compared to `os.profile().gateways.current.network.id` which is + // costly, since the whole of Profile has to pass across the UniFFI + // boundary + let newValue = fetchValueFromSargonOS() + + didSet(newValue) + } + } + return .init { + task.cancel() + } + } +} + +extension SargonKey { + /// A String representation of `Self.Value`, used for `Equatable` and `Hashable` + /// conformance. + private var valueKind: String { + String(describing: Value.self) + } +} + +// MARK: Equatable +extension SargonKey { + public static func == (lhs: SargonKey, rhs: SargonKey) -> Bool { + lhs.valueKind == rhs.valueKind && /* this aint pretty, but I guess it works */ EventKind.allCases.map(lhs.shouldFetch) == EventKind.allCases.map(rhs.shouldFetch) + } +} + +// MARK: Hashable +extension SargonKey { + public func hash(into hasher: inout Hasher) { + hasher.combine(valueKind) + /* this aint pretty, but I guess it works */ + hasher.combine(EventKind.allCases.map(shouldFetch)) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+Accounts.swift b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+Accounts.swift new file mode 100644 index 000000000..dbd06dcc3 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+Accounts.swift @@ -0,0 +1,26 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-26. +// + +import Foundation +import Sargon +import ComposableArchitecture + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + public static var accountsForDisplay: Self { + Self.sharedAccountsForDisplay + } +} + +extension PersistenceKeyDefault> { + public static let sharedAccountsForDisplay = Self( + SargonKey( + accessing: \.accountsForDisplayOnCurrentNetworkIdentified, + fetchIf: \.affectsCurrentAccounts + ), + .default + ) +} diff --git a/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+FactorSources.swift b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+FactorSources.swift new file mode 100644 index 000000000..60408c5d8 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+FactorSources.swift @@ -0,0 +1,109 @@ +import Foundation +import Sargon +import SargonUniFFI +import ComposableArchitecture +import IdentifiedCollections + +public typealias FactorSources = IdentifiedArrayOf + +public typealias Shield = SecurityStructureOfFactorSources +public typealias Shields = IdentifiedArrayOf + + + +public typealias ShieldReference = SecurityStructureOfFactorSourceIDs +public typealias ShieldReferences = IdentifiedArrayOf + + +extension FactorSources { + public func compactMap(as kind: F.Type = F.self) -> IdentifiedArrayOf where F: FactorSourceProtocol { + self.elements.compactMap({ $0.extract(F.self) }).asIdentified() + } + public func filter(kind: FactorSourceKind) -> Self { + self.elements.filter({ $0.kind == kind }).asIdentified() + } +} + + +public typealias DeviceFactorSources = IdentifiedArrayOf +public typealias LedgerHWWalletFactorSources = IdentifiedArrayOf +public typealias ArculusCardFactorSources = IdentifiedArrayOf +public typealias OffDeviceMnemonicFactorSources = IdentifiedArrayOf +public typealias SecurityQuestionsFactorSources = IdentifiedArrayOf + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + public static var factorSources: Self { + Self.sharedFactorSources + } +} + +extension PersistenceKeyDefault> { + public static let sharedFactorSources = Self( + SargonKey( + accessing: \.factorSources, + fetchIf: \.affectsFactorSources + ), + [] + ) +} + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + public static var shields: Self { + Self.sharedShields + } +} +extension PersistenceKeyDefault> { + public static let sharedShields = Self( + SargonKey( + accessing: \.shields, + fetchIf: \.affectsShields + ), + [] + ) +} + +extension SargonOS { + + public var factorSources: FactorSources { + factorSources().asIdentified() + } + + public var shieldReferences: ShieldReferences { + securityStructuresOfFactorSourceIds().asIdentified() + } + + public var shields: Shields { + shieldReferences.compactMap({ try? self.securityStructureOfFactorSourcesFromSecurityStructureOfFactorSourceIds(structureOfIds: $0) }).asIdentified() + } + + public var deviceFactorSources: DeviceFactorSources { + factorSources.compactMap({ $0.extract(DeviceFactorSource.self)}).asIdentified() + } + + public var ledgerFactorSources: LedgerHWWalletFactorSources { + factorSources.compactMap({ $0.extract(LedgerHardwareWalletFactorSource.self)}).asIdentified() + } + + public var arculusCardFactorSources: ArculusCardFactorSources { + factorSources.compactMap({ $0.extract(ArculusCardFactorSource.self)}).asIdentified() + } + + public var offDeviceMnemonicFactorSources: OffDeviceMnemonicFactorSources { + factorSources.compactMap({ $0.extract(OffDeviceMnemonicFactorSource.self)}).asIdentified() + } + + public var securityQuestionsFactorSources: SecurityQuestionsFactorSources { + factorSources.compactMap({ $0.extract(SecurityQuestionsNotProductionReadyFactorSource.self)}).asIdentified() + } +} + +extension EventKind { + + public var affectsFactorSources: Bool { + eventKindAffectsFactorSources(eventKind: self) + } + + public var affectsShields: Bool { + eventKindAffectsSecurityStructures(eventKind: self) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+NetworkID.swift b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+NetworkID.swift new file mode 100644 index 000000000..d0066ea3d --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+NetworkID.swift @@ -0,0 +1,21 @@ +import Sargon +import Dependencies +import Foundation +import ComposableArchitecture + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + public static var network: Self { + Self.sharedNetwork + } +} + +extension PersistenceKeyDefault> { + public static let sharedNetwork = Self( + SargonKey( + accessing: \.currentNetworkID, + fetchIf: \.affectsCurrentNetwork + ), + .default + ) +} + diff --git a/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+SavedGateways.swift b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+SavedGateways.swift new file mode 100644 index 000000000..5ae973df7 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/SharedState/SharedState+SavedGateways.swift @@ -0,0 +1,27 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-05-26. +// + +import Foundation +import Sargon +import ComposableArchitecture + +extension PersistenceReaderKey where Self == PersistenceKeyDefault> { + public static var savedGateways: Self { + Self.sharedSavedGateways + } +} + +extension PersistenceKeyDefault> { + public static let sharedSavedGateways = Self( + SargonKey( + accessing: \.gateways, + fetchIf: \.affectsSavedGateways + ), + .default + ) + +} diff --git a/examples/iOS/Backend/Sources/Planbok/View/DesignSystem/Color.swift b/examples/iOS/Backend/Sources/Planbok/View/DesignSystem/Color.swift index 55e89497c..7a29a8c57 100644 --- a/examples/iOS/Backend/Sources/Planbok/View/DesignSystem/Color.swift +++ b/examples/iOS/Backend/Sources/Planbok/View/DesignSystem/Color.swift @@ -45,7 +45,7 @@ extension Color { extension Color { /// Namespace only - public struct App { fileprivate init() {} } + public struct App: Sendable { fileprivate init() {} } public static let app = App() } diff --git a/examples/iOS/Backend/Sources/Planbok/View/LabelStyleFlip.swift b/examples/iOS/Backend/Sources/Planbok/View/LabelStyleFlip.swift new file mode 100644 index 000000000..6614dfc0a --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/View/LabelStyleFlip.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-07. +// + +import Foundation + + +public struct LabelStyleFlip: LabelStyle { + let imageColor: Color + public func makeBody(configuration: Configuration) -> some View { + HStack(alignment: .center) { + configuration.title + configuration.icon.foregroundStyle(imageColor) + } + } +} +extension LabelStyle where Self == LabelStyleFlip { + public static func flipped(imageColor: Color = .gray) -> Self { LabelStyleFlip(imageColor: imageColor) } +} diff --git a/examples/iOS/Backend/Sources/Planbok/View/Views/AccountView.swift b/examples/iOS/Backend/Sources/Planbok/View/Views/AccountView.swift index 54a22b28f..538092e84 100644 --- a/examples/iOS/Backend/Sources/Planbok/View/Views/AccountView.swift +++ b/examples/iOS/Backend/Sources/Planbok/View/Views/AccountView.swift @@ -1,26 +1,44 @@ import Sargon -import SargonUniFFI +import ComposableArchitecture -public struct AccountView: SwiftUI.View { - public let account: Account +public struct AccountCardView: SwiftUI.View { + public let accountForDisplay: AccountForDisplay + public let action: () -> Void + + public var body: some SwiftUI.View { + + Button.init(action: action, label: { + AccountView(accountForDisplay: accountForDisplay) + }) + .buttonStyle(.plain) + .cornerRadius(.small1) + } +} +public struct AccountView: SwiftUI.View { + public let accountForDisplay: AccountForDisplay + public let format: AddressFormat + + init(accountForDisplay: AccountForDisplay, format: AddressFormat = .default) { + self.accountForDisplay = accountForDisplay + self.format = format + } + public var body: some SwiftUI.View { - VStack(alignment: .leading, spacing: .medium3) { VStack(alignment: .leading, spacing: .zero) { - Text(account.displayName.value) + Text(accountForDisplay.displayName.value) .lineLimit(1) .foregroundColor(.white) .frame(maxWidth: .infinity, alignment: .leading) - AddressView(account.address) - .foregroundColor(.app.whiteTransparent) + AddressView(accountForDisplay.address, format: format) + .foregroundColor(.app.whiteTransparent) } .padding(.horizontal, .medium1) .padding(.vertical, .medium2) - .background(account.appearanceID.gradient) - .cornerRadius(.small1) - - } + .background(accountForDisplay.appearanceId.gradient) + + } } diff --git a/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceCardView.swift b/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceCardView.swift new file mode 100644 index 000000000..1db1bdd26 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceCardView.swift @@ -0,0 +1,39 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-01. +// + +import Foundation +import SwiftUI + +public struct FactorSourceCardView: SwiftUI.View { + + public let factorSource: FactorSource + public let action: @Sendable () -> Void + + public init( + factorSource: FactorSource, + action: @escaping @Sendable () -> Void = {} + ) { + self.factorSource = factorSource + self.action = action + } + + public var body: some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Kind", factorSource.kind) + Labeled("ID", "...\(factorSource.id.description.suffix(6))") + Labeled("Added", factorSource.addedOn.formatted(.dateTime)) + Labeled("Last Used", factorSource.lastUsedOn.formatted(.dateTime)) + Labeled("Main?", factorSource.common.flags.contains(.main) ? "TRUE" : "FALSE") + Divider() + factorSource.hintView(action: action) + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + .padding() + } +} + diff --git a/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceHintView.swift b/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceHintView.swift new file mode 100644 index 000000000..3241e4119 --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/View/Views/FactorSourceHintView.swift @@ -0,0 +1,113 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-01. +// + +import Foundation +import Sargon +import SwiftUI + +extension FactorSource { + public func hintView( + action: (() -> Void)? = nil + ) -> some SwiftUI.View { + Group { + if let device = asDevice { + device.hint.display() + } else if let ledger = asLedger { + ledger.hint.display() + } else if let arculus = asArculus { + arculus.hint.display() + } else if let offDevice = asOffDeviceMnemonic { + offDevice.hint.display(action: action) + } else if let securityQuestions = asSecurityQuestions { + securityQuestions.sealedMnemonic.display(action: action) + } else if let trustedContact = asTrustedContact { + trustedContact.contact.display() + } else { + Text("No hint") + } + } + } +} + +extension TrustedContactFactorSourceContact { + public func display( + action: @escaping @Sendable () -> Void = {} + ) -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Contact Name", name) + Labeled("Contact Email", emailAddress) + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} +extension SecurityQuestionsSealedNotProductionReadyMnemonic { + public func display( + action: (() -> Void)? + ) -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("#Questions", self.securityQuestions.count) + if let action { + Button("Decrypt with answers", action: action) + } + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} +extension OffDeviceMnemonicHint { + public func display( + action: (() -> Void)? = nil + ) -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Label", displayName) + if let action { + Button("Edit Label", action: action) + } + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} +extension ArculusCardHint { + public func display() -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Arculus Name", name) + Labeled("Arculus Model", String(describing: model)) + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} +extension DeviceFactorSourceHint { + public func display() -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Device Name", name) + Labeled("Device Model", model) + Labeled("#Mnemonic Words", mnemonicWordCount.rawValue) + if let systemVersion { + Labeled("iOS", systemVersion) + } + if let hostAppVersion { + Labeled("App Version", hostAppVersion) + } + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} + +extension LedgerHardwareWalletHint { + public func display() -> some SwiftUI.View { + VStack(alignment: .leading) { + Labeled("Ledger Name", name) + Labeled("Ledger Model", model) + } + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity) + } +} diff --git a/examples/iOS/Backend/Sources/Planbok/View/Views/Labeled.swift b/examples/iOS/Backend/Sources/Planbok/View/Views/Labeled.swift new file mode 100644 index 000000000..4983ac70e --- /dev/null +++ b/examples/iOS/Backend/Sources/Planbok/View/Views/Labeled.swift @@ -0,0 +1,60 @@ +// +// File.swift +// +// +// Created by Alexander Cyon on 2024-06-01. +// + +import Foundation +import SwiftUI + +public struct Labeled: SwiftUI.View { + public let title: String + public let value: String + public let axis: Axis + + public init( + _ title: String, + _ value: V, + axis: Axis = .horizontal + ) where V: CustomStringConvertible { + self.axis = axis + self.title = title + self.value = value.description + } + + public var textTitle: some SwiftUI.View { + Text("**\(title)**") + } + public var textValue: some SwiftUI.View { + Text("`\(value)`") + } + public var body: some SwiftUI.View { + Group { + if axis == .horizontal { + HStack { + textTitle + textValue + Spacer() + } + } else { + VStack(alignment: .leading) { + HStack { + textTitle + Spacer() + } + .frame(maxWidth: .infinity) + HStack { + textValue + Spacer() + } + .frame(maxWidth: .infinity) + } + } + } + .multilineTextAlignment(.leading) + .padding(.horizontal, 10) + } + + +} diff --git a/examples/iOS/Backend/Sources/Planbok/View/Views/LabeledTextField.swift b/examples/iOS/Backend/Sources/Planbok/View/Views/LabeledTextField.swift index 1c21bdfae..127c36a66 100644 --- a/examples/iOS/Backend/Sources/Planbok/View/Views/LabeledTextField.swift +++ b/examples/iOS/Backend/Sources/Planbok/View/Views/LabeledTextField.swift @@ -1,14 +1,55 @@ -public struct LabeledTextField: SwiftUI.View { +public struct LabeledTextField: SwiftUI.View { public let label: LocalizedStringKey + public let placeholder: LocalizedStringKey @Binding public var text: String + public let hint: LocalizedStringKey? + public let trailingView: Trailing + init( + label: LocalizedStringKey, + text: Binding, + placeholder: LocalizedStringKey? = nil, + hint: LocalizedStringKey? = nil, + @ViewBuilder trailingView: () -> Trailing + ) { + self.label = label + self._text = text + self.placeholder = placeholder ?? label + self.hint = hint + self.trailingView = trailingView() + } +} +extension LabeledTextField where Trailing == EmptyView { + public init( + label: LocalizedStringKey, + text: Binding, + placeholder: LocalizedStringKey? = nil, + hint: LocalizedStringKey? = nil + ) { + self.init(label: label, text: text, placeholder: placeholder, hint: hint, trailingView: { EmptyView() }) + } +} + +extension LabeledTextField { public var body: some View { VStack(alignment: .leading) { - Text(label).padding(.leading, 5) - TextField(label, text: $text) + Text(label) + .padding(.leading, 5) + + HStack { + TextField(placeholder, text: $text) + .autocorrectionDisabled() + .textInputAutocapitalization(.never) + .textFieldStyle(.roundedBorder) + + trailingView + } + + Text(hint ?? "") + .font(.footnote) + .padding(.leading, 5) } - .textFieldStyle(.roundedBorder) } } diff --git a/examples/iOS/Backend/Tests/PlanbokTests/PlanbokTests.swift b/examples/iOS/Backend/Tests/PlanbokTests/PlanbokTests.swift index c242f0190..a15c72cd4 100644 --- a/examples/iOS/Backend/Tests/PlanbokTests/PlanbokTests.swift +++ b/examples/iOS/Backend/Tests/PlanbokTests/PlanbokTests.swift @@ -1,7 +1,45 @@ import XCTest @testable import Planbok +@testable import Sargon -final class PlanbokTests: XCTestCase { - func testExample() throws { +class TestCase: XCTestCase { + + override func setUp() async throws { + try await super.setUp() + let _ = try await SargonOS._creatingShared(bootingWith: BIOS.insecure(), isEmulatingFreshInstall: true) + } +} + +final class PlanbokTests: TestCase { + + + func test_shared_reader_network_is_on_mainnet_for_new_profile() { + @SharedReader(.network) var network + XCTAssertEqual(network, .mainnet) + } + + func test_shared_reader_network_updates_when_gateway_switches() async throws { + let os = try await SargonOS._creatingShared( + bootingWith: BIOS.insecure(), + isEmulatingFreshInstall: true + ) + @SharedReader(.network) var network + let _ = try await os.changeCurrentGateway(to: .stokenet) + await Task.megaYield() + XCTAssertEqual(network, .stokenet) + } + + func test_shared_reader_accounts_switches_updates_when_gateway_switches() async throws { + let os = try await SargonOS._creatingShared( + bootingWith: BIOS.insecure(), + isEmulatingFreshInstall: true + ) + @SharedReader(.accountsForDisplay) var accountsForDisplay + let account = try await os.createAndSaveNewUnnamedMainnetAccount() + await Task.megaYield() + XCTAssertEqual(accountsForDisplay, [AccountForDisplay(account)]) + let _ = try await os.changeCurrentGateway(to: .stokenet) + await Task.megaYield() + XCTAssertEqual(accountsForDisplay, []) } } diff --git a/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.pbxproj b/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.pbxproj index 0609c21d2..eba745c6a 100644 --- a/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.pbxproj +++ b/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.pbxproj @@ -7,13 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 48601C3D2BB869270032792E /* Planbok in Frameworks */ = {isa = PBXBuildFile; productRef = 48601C3C2BB869270032792E /* Planbok */; }; - 48C8EF4C2B7DEA0300EF7F97 /* Planbok in Frameworks */ = {isa = PBXBuildFile; productRef = 48C8EF4B2B7DEA0300EF7F97 /* Planbok */; }; + 484ED3C72BE407DA00E5EF13 /* Planbok in Frameworks */ = {isa = PBXBuildFile; productRef = 484ED3C62BE407DA00E5EF13 /* Planbok */; }; 48F0A6CD2B7D42D400929DC2 /* PlanbokApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48F0A6CC2B7D42D400929DC2 /* PlanbokApp.swift */; }; 48F0A6D12B7D42D500929DC2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 48F0A6D02B7D42D500929DC2 /* Assets.xcassets */; }; 48F0A6D52B7D42D500929DC2 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 48F0A6D42B7D42D500929DC2 /* Preview Assets.xcassets */; }; - E6EF0F482B7FA6CC00889B69 /* Sargon in Frameworks */ = {isa = PBXBuildFile; productRef = E6EF0F472B7FA6CC00889B69 /* Sargon */; }; - E6EF0F4B2B7FA6E500889B69 /* Planbok in Frameworks */ = {isa = PBXBuildFile; productRef = E6EF0F4A2B7FA6E500889B69 /* Planbok */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -29,21 +26,26 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E6EF0F4B2B7FA6E500889B69 /* Planbok in Frameworks */, - E6EF0F482B7FA6CC00889B69 /* Sargon in Frameworks */, - 48601C3D2BB869270032792E /* Planbok in Frameworks */, - 48C8EF4C2B7DEA0300EF7F97 /* Planbok in Frameworks */, + 484ED3C72BE407DA00E5EF13 /* Planbok in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 484ED3C52BE407DA00E5EF13 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; 48F0A6C02B7D42D400929DC2 = { isa = PBXGroup; children = ( 48F0A6CB2B7D42D400929DC2 /* PlanbokApp */, 48F0A6CA2B7D42D400929DC2 /* Products */, + 484ED3C52BE407DA00E5EF13 /* Frameworks */, ); sourceTree = ""; }; @@ -91,10 +93,7 @@ ); name = PlanbokApp; packageProductDependencies = ( - 48C8EF4B2B7DEA0300EF7F97 /* Planbok */, - E6EF0F472B7FA6CC00889B69 /* Sargon */, - E6EF0F4A2B7FA6E500889B69 /* Planbok */, - 48601C3C2BB869270032792E /* Planbok */, + 484ED3C62BE407DA00E5EF13 /* Planbok */, ); productName = Planbok; productReference = 48F0A6C92B7D42D400929DC2 /* PlanbokApp.app */; @@ -394,19 +393,7 @@ /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 48601C3C2BB869270032792E /* Planbok */ = { - isa = XCSwiftPackageProductDependency; - productName = Planbok; - }; - 48C8EF4B2B7DEA0300EF7F97 /* Planbok */ = { - isa = XCSwiftPackageProductDependency; - productName = Planbok; - }; - E6EF0F472B7FA6CC00889B69 /* Sargon */ = { - isa = XCSwiftPackageProductDependency; - productName = Sargon; - }; - E6EF0F4A2B7FA6E500889B69 /* Planbok */ = { + 484ED3C62BE407DA00E5EF13 /* Planbok */ = { isa = XCSwiftPackageProductDependency; productName = Planbok; }; diff --git a/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6a270d786..a2ee07abf 100644 --- a/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/examples/iOS/Frontend/PlanbokApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,15 @@ { - "originHash" : "499421ea4579eb376de81993d10d3d2d55fc3615948e54c9c8f3bd7ffa45545e", + "originHash" : "d2c44c9d1e75627b3f098bd4effc87c97109d4cd273c0cf94bf7c57c9dec8eb1", "pins" : [ + { + "identity" : "asyncextensions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sideeffect-io/AsyncExtensions", + "state" : { + "revision" : "1f0729e4f1f6c7166acfac3cec43b3cbe83be0e6", + "version" : "0.5.2" + } + }, { "identity" : "combine-schedulers", "kind" : "remoteSourceControl", @@ -51,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-composable-architecture", "state" : { - "revision" : "115fe5af41d333b6156d4924d7c7058bc77fd580", - "version" : "1.9.2" + "revision" : "433a23118f739078644ebeb4009e23d307af694a", + "version" : "1.10.4" } }, { @@ -78,8 +87,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-dependencies", "state" : { - "revision" : "d3a5af3038a09add4d7682f66555d6212058a3c0", - "version" : "1.2.2" + "revision" : "350e1e119babe8525f9bd155b76640a5de270184", + "version" : "1.3.0" } }, { @@ -87,8 +96,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tgrapperon/swift-dependencies-additions", "state" : { - "revision" : "02e7b1801a96828049fe4d3e8bdc5e608ef5ffbc", - "version" : "1.0.1" + "revision" : "406ed2d853eb0e377173660f0965591ea7d31207", + "version" : "1.0.2" } }, { @@ -105,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-perception", "state" : { - "revision" : "83fc3d89676b33f1c3d49e9268e76ef62430339f", - "version" : "1.1.3" + "revision" : "8e8ca36c02abc7775a3ab81f9468c0df5fe22c2c", + "version" : "1.1.7" } }, { @@ -127,13 +136,22 @@ "version" : "1.2.1" } }, + { + "identity" : "swiftyjson", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftyJSON/SwiftyJSON", + "state" : { + "revision" : "af76cf3ef710b6ca5f8c05f3a31307d44a3c5828", + "version" : "5.0.2" + } + }, { "identity" : "xctest-dynamic-overlay", "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "b13b1d1a8e787a5ffc71ac19dcaf52183ab27ba2", - "version" : "1.1.1" + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" } } ], diff --git a/examples/iOS/Frontend/PlanbokApp.xcodeproj/xcshareddata/xcschemes/App.xcscheme b/examples/iOS/Frontend/PlanbokApp.xcodeproj/xcshareddata/xcschemes/App.xcscheme index f5b0870d9..5e98958af 100644 --- a/examples/iOS/Frontend/PlanbokApp.xcodeproj/xcshareddata/xcschemes/App.xcscheme +++ b/examples/iOS/Frontend/PlanbokApp.xcodeproj/xcshareddata/xcschemes/App.xcscheme @@ -27,8 +27,13 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + App.xcscheme_^#shared#^_ orderHint - 0 + 1 PlanbokApp.xcscheme_^#shared#^_ diff --git a/examples/iOS/Frontend/PlanbokApp/PlanbokApp.swift b/examples/iOS/Frontend/PlanbokApp/PlanbokApp.swift index 24e60f7a6..ecc868aa6 100644 --- a/examples/iOS/Frontend/PlanbokApp/PlanbokApp.swift +++ b/examples/iOS/Frontend/PlanbokApp/PlanbokApp.swift @@ -11,6 +11,8 @@ import ComposableArchitecture @main struct PlanbokApp: App { + @UIApplicationDelegateAdaptor var delegate: AppDelegate + var body: some Scene { WindowGroup { AppFeature.View( @@ -22,6 +24,7 @@ struct PlanbokApp: App { ) .textFieldStyle(.roundedBorder) .buttonStyle(.borderedProminent) + .environment(\.colorScheme, .light) } } } diff --git a/examples/iOS/Planbok.xcworkspace/contents.xcworkspacedata b/examples/iOS/Planbok.xcworkspace/contents.xcworkspacedata index 738286bc1..2bf549385 100644 --- a/examples/iOS/Planbok.xcworkspace/contents.xcworkspacedata +++ b/examples/iOS/Planbok.xcworkspace/contents.xcworkspacedata @@ -7,4 +7,7 @@ + + diff --git a/examples/iOS/Planbok.xcworkspace/xcshareddata/swiftpm/Package.resolved b/examples/iOS/Planbok.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4cd6d249f..3659c8b61 100644 --- a/examples/iOS/Planbok.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/examples/iOS/Planbok.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,14 @@ { "pins" : [ + { + "identity" : "asyncextensions", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sideeffect-io/AsyncExtensions", + "state" : { + "revision" : "1f0729e4f1f6c7166acfac3cec43b3cbe83be0e6", + "version" : "0.5.2" + } + }, { "identity" : "combine-schedulers", "kind" : "remoteSourceControl", @@ -9,6 +18,14 @@ "version" : "1.0.0" } }, + { + "identity" : "jsonviewer", + "kind" : "remoteSourceControl", + "location" : "https://github.com/varkrishna/JSONViewer", + "state" : { + "revision" : "df1a57eddc49b168ff400c8595f72acbe33acc9c" + } + }, { "identity" : "keychainaccess", "kind" : "remoteSourceControl", @@ -23,8 +40,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-case-paths", "state" : { - "revision" : "551150d5e60e3be78972607d89cd69069cca3e7c", - "version" : "1.2.4" + "revision" : "8d712376c99fc0267aa0e41fea732babe365270a", + "version" : "1.3.3" } }, { @@ -50,8 +67,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-composable-architecture", "state" : { - "revision" : "cf967a28a8605629559533320d604168d733fc9c", - "version" : "1.8.0" + "revision" : "1eeca17b21b931fd6a5cc683a2cd659fb0441c66", + "version" : "1.11.0" } }, { @@ -68,8 +85,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-custom-dump", "state" : { - "revision" : "6ea3b1b6a4957806d72030a32360d4bcb155a0d2", - "version" : "1.2.0" + "revision" : "f01efb26f3a192a0e88dcdb7c3c391ec2fc25d9c", + "version" : "1.3.0" } }, { @@ -77,8 +94,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-dependencies", "state" : { - "revision" : "09e49dd46932adfe80ce672b4b3772d79ee6c21a", - "version" : "1.2.1" + "revision" : "350e1e119babe8525f9bd155b76640a5de270184", + "version" : "1.3.0" } }, { @@ -86,8 +103,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tgrapperon/swift-dependencies-additions", "state" : { - "revision" : "02e7b1801a96828049fe4d3e8bdc5e608ef5ffbc", - "version" : "1.0.1" + "revision" : "406ed2d853eb0e377173660f0965591ea7d31207", + "version" : "1.0.2" } }, { @@ -104,8 +121,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-perception", "state" : { - "revision" : "42240120b2a8797595433288ab4118f8042214c3", - "version" : "1.1.1" + "revision" : "8e8ca36c02abc7775a3ab81f9468c0df5fe22c2c", + "version" : "1.1.7" } }, { @@ -113,8 +130,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax", "state" : { - "revision" : "64889f0c732f210a935a0ad7cda38f77f876262d", - "version" : "509.1.1" + "revision" : "303e5c5c36d6a558407d364878df131c3546fad8", + "version" : "510.0.2" } }, { @@ -140,8 +157,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "b58e6627149808b40634c4552fcf2f44d0b3ca87", - "version" : "1.1.0" + "revision" : "6f30bdba373bbd7fbfe241dddd732651f2fbd1e2", + "version" : "1.1.2" } } ], diff --git a/fixtures/transaction/create_3_nft_collections.rtm b/fixtures/transaction/create_3_nft_collections.rtm index 3ee3d11b5..bc0c04ddf 100644 --- a/fixtures/transaction/create_3_nft_collections.rtm +++ b/fixtures/transaction/create_3_nft_collections.rtm @@ -186,8 +186,8 @@ CREATE_NON_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY Enum<1u8>( Enum<136u8>( Array
( - Address("account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql"), - Address("account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr") + Address("account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m"), + Address("account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp") ) ) ), @@ -686,8 +686,8 @@ CREATE_NON_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY Enum<1u8>( Enum<136u8>( Array
( - Address("account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql"), - Address("account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr") + Address("account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m"), + Address("account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp") ) ) ), @@ -1186,8 +1186,8 @@ CREATE_NON_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY Enum<1u8>( Enum<136u8>( Array
( - Address("account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql"), - Address("account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr") + Address("account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m"), + Address("account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp") ) ) ), @@ -1499,7 +1499,7 @@ CREATE_NON_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY Enum<0u8>() ; CALL_METHOD - Address("account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql") + Address("account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m") "try_deposit_batch_or_abort" Expression("ENTIRE_WORKTOP") Enum<0u8>() diff --git a/fixtures/vector/big_profile_100_accounts.json b/fixtures/vector/big_profile_100_accounts.json index f65a069a5..e872d9f90 100644 --- a/fixtures/vector/big_profile_100_accounts.json +++ b/fixtures/vector/big_profile_100_accounts.json @@ -1 +1,4498 @@ -{"header":{"snapshotVersion":100,"id":"f888c9b0-66df-443e-8a3f-bc5bba66ec52","creatingDevice":{"id":"9337b2c0-5793-4f50-8788-e1209cb4be2f","date":"2024-04-29T16:34:32.389Z","description":"Test - iPhone"},"lastUsedOnDevice":{"id":"9337b2c0-5793-4f50-8788-e1209cb4be2f","date":"2024-04-29T16:34:32.389Z","description":"Test - iPhone"},"lastModified":"2024-04-29T16:34:32.389Z","contentHint":{"numberOfAccountsOnAllNetworksInTotal":0,"numberOfPersonasOnAllNetworksInTotal":0,"numberOfNetworks":0}},"factorSources":[{"discriminator":"device","device":{"id":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"},"common":{"cryptoParameters":{"supportedCurves":["curve25519"],"supportedDerivationPathSchemes":["cap26"]},"addedOn":"2023-09-11T16:05:56.000Z","lastUsedOn":"2023-09-11T16:05:56.000Z","flags":["main"]},"hint":{"name":"Unknown Name","model":"iPhone","mnemonicWordCount":24}}}],"appPreferences":{"display":{"isCurrencyAmountVisible":true,"fiatCurrencyPriceTarget":"usd"},"gateways":{"current":"https://mainnet.radixdlt.com/","saved":[{"network":{"name":"mainnet","id":1,"displayDescription":"Mainnet"},"url":"https://mainnet.radixdlt.com/"},{"network":{"name":"stokenet","id":2,"displayDescription":"Stokenet"},"url":"https://babylon-stokenet-gateway.radixdlt.com/"}]},"p2pLinks":[],"security":{"isCloudProfileSyncEnabled":true,"isDeveloperModeEnabled":false,"structureConfigurationReferences":[]},"transaction":{"defaultDepositGuarantee":"0.99"}},"networks":[{"networkID":1,"accounts":[{"networkID":1,"address":"account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8","displayName":"Account 0","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/0H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69","displayName":"Account 1","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/1H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x","displayName":"Account 2","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fb97ffd1ee33ea7378bd4de6096371bfd7bc4ffcec3c99f959e8e238660eaf5b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/2H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x6qearl72520hj8p0ppet8tcyh3jfwd4qd0a5qn522e0xeutunc3l","displayName":"Account 3","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"57d0e188922c1d0342df770466c21e2235eb617bbe7f3ea8f524794e331920e5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/3H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yx8prkr8e3rtuxpl7grqv6vf6vy6hsmze3qtl4n08uya4padnu7f8","displayName":"Account 4","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"28bf9fdb2bad0500a3141314810f5f3acdda275bdfa0eb27b8f3bd8bf80a54ed"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/4H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296mvkzlzmyke3mvdf0e8wngtv5hw076gt9lf6mfdtncxp4eqmyt5c","displayName":"Account 5","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7efdaff52f3bd99f954fb6e687a43210171cf3704e5d7a804c57d576e4da5ebc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/5H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128e706u8c58yqjut5ckczwts5s298l3cljf444s65sc8gnfpxhgmd8","displayName":"Account 6","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"669a7c3f7c9c9fa1c687c0ef0b912f339119469b45ed087738eedbc0090217fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/6H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128un7clxuceztd85apdwnsy3geq0eauf83d00nuhk2s0k9n82tuyd2","displayName":"Account 7","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"455a6e3c56d8095648c4097738c44d5fd386f5511eff941122b8bc4b4da3bb9a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/7H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jcaqc4p5pmgulnnez4c8vnm4qy8l9kvtg8a6ekttnp89vkquqsc3","displayName":"Account 8","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"68c8bc7c23089f6451e61395511a988fbbf97bbac93d5dda5e00036c74b9e68c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/8H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwdjvetd5r7yfl5qhenmaz2wvdmw4tzngla33lk2gnksrx8sql6jp","displayName":"Account 9","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ed6761e65cbc0835a33f3898c6890c2095de32ffb80e9fd41a7f0b81b6e29a70"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/9H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12833x30kj3hex5tlx45hx6k8taug48aayc2u3k8kg3zhla4r09ha4q","displayName":"Account 10","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2a08f5aa1045064d41a832f52033b5f21d67806a81b79afaa304400244ce0ce7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/10H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dke694mupmyuysal25jj8tmml7fqmm2rusmaf3pew4s6kw5dd4hl","displayName":"Account 11","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cb7723df969d87c27906788045166f993b8ebf34737ea3c47c883c3abd4fa822"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/11H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zc9sl539kcu7qqdav4sr9jtwgm0r5xx4uak54vdtfj5pex2jmtc7","displayName":"Account 12","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5691bc11b73178ed7f8ad1d8b09f42267abbd3c27ee8d61813e36cb9a355bedb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/12H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kgdy452yhjqql0dead9v8xgh6ctxlasx4t5ut73w0r92c5djr8t8","displayName":"Account 13","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"363848aebfc8f393b583980071bfa93d8d381dbc14a3c2d683eec34703aca200"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/13H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128666mqpqgvwx39leq7wjnx4dk0ucpg09w0erj68wn3znmzkryr53n","displayName":"Account 14","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"389e865c93785043427a7889b8922705a447e82c4f75f4e4378f92ab0811aba5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/14H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlwqc93yfxgrzktehyjpuve0frk260c6p6scjnmg679zpy0rfvyx0","displayName":"Account 15","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7b2ce8df18bcfcb94695b0fc76053fed448de192454a75ba29c34b75efb47712"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/15H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fz545qp2l68y5vvkuhmfrcdwqrkkzusmygvfqvxtnkxeysx0reel","displayName":"Account 16","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f055f5611e158d70d378fc8381f2f3c9a15b1f33096aa62df86cda229b068f90"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/16H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128had2ef24sj7wgjzcmw239crqct4hyh2lxwewyagpkvu3tlv3s9mp","displayName":"Account 17","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b54896ee1049fd4a1ac3deb618f8c3fbe16042b391dcac02c1e4085206771db3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/17H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzf9tgwvrp4crad856vshvuhasrdzq5e28phf3236ggvdxu9xxjmu","displayName":"Account 18","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"882439de53048eccbd4ddbbe61cc04524762f22f29c6b3fe4e217b878a042fd9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/18H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1282pquu8czj82el770qjlzsjutfcmezx0jcm0vw4eajyxdg9tt5uca","displayName":"Account 19","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3b80cee5e24bd0c7820841957dc3f38ef4482546921ce80a16dcb8482cfd4117"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/19H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296rsdttnudwpjkfy0htskunxkfpks9fn8epz9e4y8hy02veg2nr8f","displayName":"Account 20","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bb4c50dc68269aa53fd14c1f3de8b3fb322e714498a6005ec63d254305f0acf8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/20H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z6geuwgqgqagu5tljmeqc8llp5smwgkffqf2cm3juextw848r2cn","displayName":"Account 21","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b377a9f9c9efe3d5924ecd66494db44b7c4cf387fb47ea2626eb2b54f7d452b9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/21H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129camasdv5jmeuv04xcxltqlfry2dgnrarazvnqtjkwxvzaeud0njd","displayName":"Account 22","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"345540c5c63a2e9d3397b539f22221231cd83650b2dd11c46b8fd3e2384e587b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/22H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ye9cd37e20ea9v33pxjjxe7gr8qwq604vyqjhzve3zts48sjuq5fn","displayName":"Account 23","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cdaeb21a2a49f1e280fd9afd1c9f77c0b51973f11ac275e1cc7b6fd13d44f5a1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/23H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1290a5lus9h340csrsl2m5rxsgqdv97y4zmqsfzw8kwzp7hatv6ea5r","displayName":"Account 24","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ed1a2591bbfe8df4aac1d20eb5b0c21f3b9e9813dcc20b69c7817a194181db7e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/24H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3dzym9wejdl946gqxjp2pdpzkylqmr7xpmgqma9cwmlkp8qdvrrg","displayName":"Account 25","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"70d80a78d62f80d339b520a74e5f09f8326303cbe314ac3ff1c4f4788fb0f7f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/25H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128wy039tee6fp9y6kptz3zmvphvya04xjjkm3uk8j7583cs355n4vk","displayName":"Account 26","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"29855264d9fe2acf3b12481e729eaab06c66ec3b56657438b9c1a1d0901be1d2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/26H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhsvu0530fjymcaqmsqamcgr6dmud20azayc2c8jfr9rve8safttj","displayName":"Account 27","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"26f725bc0f9f193fc2326989f1bb2cf0a69bbcfa39f876e2ef81cb2da69de9a7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/27H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128pfngrm5sax9ax58nddmmrrjka28d20fwzru4q4rrwfm8m5nnjlcn","displayName":"Account 28","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d28823ae567603b18832c809c0e246953f79e17c0910502c1c6464693a3f785"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/28H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywvw632uvx9pkx8enxhruhka5pxgwzu8huyqzmx87pmen0g7dp2tu","displayName":"Account 29","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e65d674ba760bbce1538ee70d79a3be8ca7bf3a8359e02890af201f35defe90c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/29H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdlaua2swqq0txcsld6snvk9yztc9uqrrlldrrca52kkurvxv9xen","displayName":"Account 30","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6ecc81720489082be58fb22758833c5e315b70ba76db32f7d2c903814aaca049"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/30H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzamrfhu8cdp59aseqvc89d73fnquq8a7tzkmfn7hn8ulvyjnvss0","displayName":"Account 31","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0d80278ee7339ff4b19112f010728c02040c11462afc0c8d0317ca8de36e7b31"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/31H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwcmqva3f9ycnfg7dv3upd37saafgeuq0kypcx4n9gn8hclsfrdpp","displayName":"Account 32","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3eb35670db98a5a16495953d62964a142afdd5cdf79a1ebd23009b23b34d64ce"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/32H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129er3y5geyjrcw49v47y9mct0574gqc3lk03r98ap8wkaatkn28475","displayName":"Account 33","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9bc77e38a56cc407aa1d458e0945e67b4a44a6b194d33ed4bc65002c0afcc957"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/33H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wqzgu0pukjwf430s2y3wkj6q0dwu3d4h6pdhjugwuljujx3er703","displayName":"Account 34","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9e3c7a34ec5279719a61f788131338322daa6379c97b13a14f2e9b9cb5d5aed2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/34H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yuvpn4kz9wj8c4rg9cwzryedpvms3cckafeca90rjj25fdak0krww","displayName":"Account 35","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3ccb06806f5ea69aa9a02b9861de061ea595a5680f54885f664fdc4796d97227"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/35H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xezazunkp99ltnd9hyk2jg6fjwpspevrdqna7h8ate2c72lczuhzm","displayName":"Account 36","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9f41bf20bb5a78f7d0e0b180de4e25d0bb8e99da3da9413cbf66eba9a12da614"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/36H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9qrru0084tjfg5n3hl9xc4pkaamq4nmu2y4kkfpamv3hn8tyjfjm","displayName":"Account 37","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de1811c9d577ffbfd1c3d2b3465eeefd0b8bdde344c89d9360ec25eb4591b07e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/37H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3adlu4ayscqqgtm4dmugzejaxelsltcjzn30dadf2pzq9pgpujh6","displayName":"Account 38","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08e69139c9347e7b53c975052ae65b179a055cf6ce1d7c522cb13df1276c67bc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/38H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vaedutdfk9a6fmmfl6xgc3gj2wp07cd8zr0arq6eyyannnywtxkg","displayName":"Account 39","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f6bf10a2a4388522355fe9dbd4241ada9cbc121fa8c71acc16911d7a1e7cb647"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/39H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2fnh8905srym63l80x27sxng3wpj667jj9f2qq8lg4c8rhsjk9cu","displayName":"Account 40","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eccd2a4d74202487a237cc96a065f3a7fcb7196ea9f002f94228fc6859dc752e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/40H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m4axtr8wrelsqmyujdpyjcwjku58ydgy6y2p7k8l9ellq6977dzx","displayName":"Account 41","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"86c2052a3fe9a44501bc3e422eae54902912ed7474ec5d32b97b9f5daba8a7d4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/41H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xr9wc5npsmvs3eup9mnwh6ssh98f87nh7swxgetxjyqp0mum7x4cx","displayName":"Account 42","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"680eb162e315e47637c106ab6eeea28c4b93a46955dcc7c1284c5153897b9184"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/42H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12820t4zhl0yn5xjwgvulr6fmk36hh382dmqw6j7vn04umhncdqtm9q","displayName":"Account 43","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7a1571a12e8938e05b5a6c43bd357ba1accfdde06d41d18400cf72fd4078945c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/43H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128y2h6cmf3axlaat8828nr7lk4hxyey72saksum4kgew8gwvh2y7p4","displayName":"Account 44","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"56b48477d310bcc4b2b9684dfac4a82339869ce6846a2215cd05a835daa1c47b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/44H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128s7xzavt4rshrg8yvyw73p6cqvv9r0ywtsxul8cggp6nx32xe2tja","displayName":"Account 45","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"acb6a155391612c8e1503516913bf39787758b828c2e5ae5f7c15ae73fb4c7af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/45H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xzlpc2a8t7xrtmjq3z8z3lgy37dtq50vvqkqqgh5n2ktyszdcsrae","displayName":"Account 46","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dfa7f95e0f67c1336dc7dfe5b86965ff570d144b7bbe98f110aded5f0fc2c63d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/46H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128k6zcylyejtwrkhgyxm72pymuj6txme30jppgrj8wnfxlde83a332","displayName":"Account 47","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e66e64c7729e5d12b7638996f0a611ed2ce333d8bf5e261bb8834c86154bee53"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/47H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128meygx0wqz2tv92znn6r3pqdl8jlkyuwcuhwvyr2npjcu72y5lzvz","displayName":"Account 48","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ae0f9b0035f558b7ae1f4a9b0d3d2b3cd25c6ba9fadbf93a39c5e9a6bc217123"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/48H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yg2h2jf053qew7vj5ysruefuk280ye2m9rmy5mje804rqphv92jfu","displayName":"Account 49","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"939e8364393df844e551bc38e584f0f0244bb9fc7ea05b67dd5ec4af8373e5ae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/49H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129rq2qnukv8n9hhrda7su80ude9ql0kd93nr4ud08scvt3qk7u3zql","displayName":"Account 50","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ae4d1762ceeea62b2679463369b3b4491ef167426499323a86949906bf941c5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/50H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqk00ex4sf2j3jn9z7gscgc9jtzzvdf8fqxkh8yh5vzee4wj6khae","displayName":"Account 51","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ab04fddbb5ed94dd2a1fd65c0cdf8a3cb290b219570174e1522299bf28e45d20"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/51H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yyrat9y239mey9nvfzctdwzl2fn0wxwkz9jcyymcend6wm5vp5j8a","displayName":"Account 52","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7a5b8f17954dccdc1b5bbaef0dbb098bb22103b0f2649cdfaae8d125d675bf46"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/52H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128c63cza84ly02f3zdhaxgy9t9u8nnc7fhgsqspq3vsahlut6rmwcz","displayName":"Account 53","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c8e4d1be73dc1af108005d4c504f35469dd327c776f21d14f087532981a2e851"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/53H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdjnn8kfrl6qhzrsx9zrswqh2klqc8l0s4x3lx9t08w7uu7vkc2f2","displayName":"Account 54","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c5a525fb5fa55ae4f71445181ecc184b97624589e83f7ffc5ac1f73104c0e0f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/54H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hznpt8l66mdckfwjkcdg880ulzz600jzx4uyvm4xkglu8dljana2","displayName":"Account 55","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"091b1426a64042ac980466fc78f904d01864b9caeeca6f3543ace5265dede25e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/55H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12876gkzv2at4ctg56g7j4gehvhjfvufkjqfh6jaak6g88a7sxr63dp","displayName":"Account 56","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a508af656037f05a7bd9494192ce1ff43c2f53f485dadb27d286bf39a0eb57eb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/56H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymwul899nngh634ehnl7e9d9w9fzm385dhxfuqcxyhus3tzg806v5","displayName":"Account 57","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d5b5da8447042114ec19a89b868081c11a7554176253c8e7790d6b1751168f4a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/57H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq2avq8gnhtchyad4ll7rf8lm9v9wj9hykh2vydqrcrh3ufu7enju","displayName":"Account 58","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a5b71de2a5f68ab4c03aee47dc118f1c56515dc31a4dcbea1263ad471e3354e8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/58H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytcg246jw44hnrmndf3xu5gyx5ff6q20srct6xvs8nhta5y0uv7y4","displayName":"Account 59","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"813a685daf8de406eda741806d1cbf8390da65db1d7e16b3880afda117c8b466"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/59H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xqky0n5hy0feg4p88l22h43r367mlr5f40kxe32dnrfvud2r9vs7l","displayName":"Account 60","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6a814380c90872c2c1f8f395e37c1f0d64de65187748b6fa48493d308101f27d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/60H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nyv238c0sskxql93q4ve0ljevql20eyvgan26ktdfwhanc6hpxft","displayName":"Account 61","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"42830831cf5fe0e56c4994d4f58b23797df2f4f1d8df117ed973e39d6aaf8d3c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/61H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn9hv2fszcdfgdhm9ks0jmtcxl53zfqflr0hdefa0cfdqds7hvuw8","displayName":"Account 62","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c8eb78fe95545222b0a43498314dbcc6b2a8981971b2699bf37191981b4909ae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/62H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xm0t7m37kj9s8ant6gzax7mrkmedk5thkmsgccxhlafwj0ljq5s3w","displayName":"Account 63","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"35bc63901f8a3028f98010fbb885ead1fdd559765c125dac3a6ed5cf790b0b63"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/63H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128y05mhlupdj7j7f6luj6jyygqdwzgvflxazskqdu34zec2puq70gk","displayName":"Account 64","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b5a1b8b7d662dccdc6e6d0b71548d68a7312c18b4d7995afe8fddae636942201"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/64H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129amht2lkldjkwdyarmp44wf6dven6d67fzzkw3nd55nuh75q6crcu","displayName":"Account 65","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d9e7c78deb2821781373bc86a004f1b54738478b439a29c0d13b55fc4512d6c8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/65H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xa2y0t6zdh285shuxa4npqwv7hx3fltkefeknl39dk76ct7gf690u","displayName":"Account 66","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0c236395a3f1c80674334e22165534dd0240cc478bfa01c8f6c08affa37201d1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/66H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284am526meks3lk7ffvtdjzqtxsyk5t3crultu7zgqxg767xnlx99q","displayName":"Account 67","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"aa3ba01d82d7533d1d0729f168a19224504792fa8ec9c38df1ff0fb9b206cc08"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/67H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymzm2c5vk73dg6vcvspqae752j5l8jyd3d7azvwyrag6fhs68nvk8","displayName":"Account 68","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b816a599a2b6543f0b21e4b3de6ba0b01772d6284e7d701ac277d9d7cf800b4a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/68H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhvn6hhvgg9rey4p3fdstx3e3gm3c6wcmjx55xeh5x5y4xnul5yht","displayName":"Account 69","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d18541b47df5138809a3ae113e92ea44e6d5a1216caaf8eb9c5dedb64b7ac4dd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/69H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xued97788qq6jy4h0yvyvyq28cpcs5qc3vwc96j8lj0cnwmrnrtra","displayName":"Account 70","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0d3483a25057a22b2db1e283cad8a639ce689123c87b4aabad79673bc90ed75"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/70H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yk7fj5c02f44x2mztmqg33qx7l2ukr84kukqmlpvgz2qx075fu7pp","displayName":"Account 71","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eca680ad0bb07e8cb48995d9621c8422ee22f702577268f836a98b33650dc0ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/71H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7n4qdd2upgpp7x4jmph4amak32pp4ftenjqthkr4jjke0h5fpe03","displayName":"Account 72","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5024e1dbaf4bc4cf76b4329eceb6852ad5823ec286888029e2bd40e3766b4a48"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/72H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xts8svsfncg5tdrdm7fj54ve403n239duztd2n7ecqdlzdqlrrz65","displayName":"Account 73","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"271cc35ed91d6413dea70412462c8478b0ddae63dfa7ae0f338e3830defa521a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/73H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12860tf7hnrlgt6mmeeeg8j60uumstvj0p2me7hte0hyvwlclklke2g","displayName":"Account 74","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c6004390891ca7556fc12e7adf9d2d4360b461ba6627adc8622986cc7a865e86"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/74H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128d09txv9nj9ke73e9fe70ecda3j0dtgc70vva83aet0r7qm8j5uny","displayName":"Account 75","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c37ef94bd08ac7983fee50f2cafa30c907f02ceef6c8c434c1e39e712ec95f7b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/75H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0hf758k428p52whty3s6afunj7ptqjgvfu0jt7yle5rsw2xcncv4","displayName":"Account 76","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4477ec5ae587884cdd858e84702925efad40581ea9a7a9a05d5bb435704509f3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/76H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tj5pr3ky0lnqzgft82g6250vdr0qv9p8eturayechza5l5sl87ay","displayName":"Account 77","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"44c18d16cad6cb9f74d0c3e691da43c465f9d9155d287f5c2f3ceb7b5d976bc7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/77H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129cmakdgn3dryvx4cz6n6ghg2r8ns207ny58vwwnqskesn77g7xllc","displayName":"Account 78","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9b7fa0c43c14a180d0c309b740cc3da8214ab56b863ebaf96d83db3a66b8726f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/78H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgcyjnv6ncdn4zspd6dh9fvz7jq45c7td09hfw5wy88q39d84t0jf","displayName":"Account 79","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a34cd357d8643ba3749b1e07b3b11710d6fabd128e8fca851e01bbf1acba7eb2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/79H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12983u5qyke6rlh5mrh259ac7pwhmdxz7chyfd63esz6j204qg7lgya","displayName":"Account 80","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d6a2c42e7e7a81bbfd8f6f1cdcacc6756bb2c2146e4635bf2fd4b14035e2c592"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/80H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdmc0a74m7ahj9kanh4fz07nye8uz7r40adrtwc6e58vjdfyuplkq","displayName":"Account 81","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0a03a79a259d62c58d9ac57eb2d0d2fa61915403780e32b01584c53ee1da2998"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/81H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vqqqm577un5v5c6xhvg5jkf3llajy5fzwd9j87pmqgcv8xx9mk8v","displayName":"Account 82","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f0a60da8e1d5564e9fa5740e7ffd756048f4dcb8911ca6cc32d813c5b5dc275"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/82H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128n2uzfaca4qu4la93dz6xwrhhe8n0763ljqjstnfw8rk7d97lq4gj","displayName":"Account 83","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"40f0747ce685a534cc4b5c2f0b2a9e766872938da129cd80540053bd9a9519aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/83H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3h5wvhgwvesetrwgg6357np3lw4sc0aygedqx98r3hwdsd5myexs","displayName":"Account 84","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a18b9d0cab8ace19970fd919d6c73af7db3b1485b65a6be2f236975a3d298f4d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/84H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9mz7x65qltcnhy6d56wvhgdnz6u8r8yf32u5dmdeep9486mtc8ut","displayName":"Account 85","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c1d41e17462ccdedba82b823220ce23ecccb35d492fcdc0ba77c2e02874a26da"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/85H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129gdut7n5n3tmu34hkyr8ahhas7pk0xw5t47t926nvp8evqgfs5qal","displayName":"Account 86","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"da406d098fcc7cc84b34105ce65b911d08c79508d73db36a8a59dfb1c9cb24ee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/86H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qvnvptxudvwnsgvekfsnpcfddj5590jjzxy4j4cjkqvkhrnf6mtl","displayName":"Account 87","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c303114cdd9c043736e8d063f743bba6e22f5b09de741daa000b8a35cf2dd54c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/87H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ufwtlnhlpq459d36y572jtvke2223hzr2rafndglzuahp4wh5qen","displayName":"Account 88","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"203e06a16b4bfaaa6223ffd6aca332ff7d7973bf8d2d65339ac9eac72b5a5c33"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/88H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xfrpa9msqczg34wnq4xpfpu6lszu2dshhct7wuc262f3adwzygxhy","displayName":"Account 89","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6166e18b799ed3f016a6c82fd0e7fc2d2767f9620b26a6bc0016928a4a1f618d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/89H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128alfs6x6gzumkdlqh8rwht44f043mfdwyle3dnzeqpf72mvzz9u8z","displayName":"Account 90","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eebba9c9cadcabc71907ebdbdb878d4b037be976dc33dfe1339cb79f96dd51cf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/90H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z6czydnqc64gu4ncvrsvupcntg27d8hk9c0kqymrezvevr7lc635","displayName":"Account 91","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6c3ed45aa46210961fb871cf2ca25a71cd3a9c777289e4f50e3a541eac7cc041"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/91H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dduatx6jtsrfln0f9exgx0pvvpmn6h4nqa3w7k3wzwk3lljeeeyw","displayName":"Account 92","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8e0948203c3793ecee22215b2e9a232f2bb959e1cd827148c64a9f10c16e62fa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/92H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymnu9h44a7phcnzen6jfxs9t49ne5f0rpc2q4uhhrkknjg8vp9mpg","displayName":"Account 93","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"445642dd3256f25230e8aab3b969870ed927255b060850ecbee7b59fae83bc2b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/93H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128x9wqvlk3k9m53j7a7qaf9mrtpujjm00h27n252fl6vvz654ux2mc","displayName":"Account 94","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"505580e526466e5fadbaa53241e86a175b7fa0d96115d17d6de7520f24d99874"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/94H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ev8m9wtdcttqzkesnk3tlu870qvw76qudu6vqpca7yyz4qya4734","displayName":"Account 95","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7f3b16507c7d720ae146b5a8ed52163dd42527acddd108603c910e04a5efd931"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/95H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128u6v72jylu9xfyzxfcgwpj3kg2ewvah5gdqkr77qtmun2hrm3fdp3","displayName":"Account 96","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c5c76cc0154749b657536db22fa41dcd471675aaf9857fae671fccd92cf20b2f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/96H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129y3zzlhtt06n9yfm3ge028wl88ard4r4xh4q2kyx92ar3zzt0z235","displayName":"Account 97","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"13643883dcd700a642a2f27db18b9fae474f807e3821d5f0b70ee5382ba6044b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/97H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280ws7uj5gnr7dhutwt75ccx02jva45m6n7qzss66397s4hxx4a3us","displayName":"Account 98","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4ff0d6e356b2821ba3c8f9d253d062b3bd500d3a7a6e2509b85c64809d259428"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/98H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xljsrujmlzgqupz3zxujusldt257tcq980z4hvktmuvxljf76z72g","displayName":"Account 99","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"938d1a0e1e8e3550ef2a4c74d7492d9b04f48e93a382d476628cb56932ccf008"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/99H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}}],"personas":[],"authorizedDapps":[]}]} \ No newline at end of file +{ + "header": { + "snapshotVersion": 100, + "id": "f888c9b0-66df-443e-8a3f-bc5bba66ec52", + "creatingDevice": { + "id": "9337b2c0-5793-4f50-8788-e1209cb4be2f", + "date": "2024-04-29T16:34:32.389Z", + "description": "Test - iPhone" + }, + "lastUsedOnDevice": { + "id": "9337b2c0-5793-4f50-8788-e1209cb4be2f", + "date": "2024-04-29T16:34:32.389Z", + "description": "Test - iPhone" + }, + "lastModified": "2024-04-29T16:34:32.389Z", + "contentHint": { + "numberOfAccountsOnAllNetworksInTotal": 0, + "numberOfPersonasOnAllNetworksInTotal": 0, + "numberOfNetworks": 0 + } + }, + "factorSources": [ + { + "discriminator": "device", + "device": { + "id": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + }, + "common": { + "cryptoParameters": { + "supportedCurves": [ + "curve25519" + ], + "supportedDerivationPathSchemes": [ + "cap26" + ] + }, + "addedOn": "2023-09-11T16:05:56.000Z", + "lastUsedOn": "2023-09-11T16:05:56.000Z", + "flags": [ + "main" + ] + }, + "hint": { + "name": "Unknown Name", + "model": "iPhone", + "mnemonicWordCount": 24 + } + } + } + ], + "appPreferences": { + "display": { + "isCurrencyAmountVisible": true, + "fiatCurrencyPriceTarget": "usd" + }, + "gateways": { + "current": "https://mainnet.radixdlt.com/", + "saved": [ + { + "network": { + "name": "mainnet", + "id": 1, + "displayDescription": "Mainnet" + }, + "url": "https://mainnet.radixdlt.com/" + }, + { + "network": { + "name": "stokenet", + "id": 2, + "displayDescription": "Stokenet" + }, + "url": "https://babylon-stokenet-gateway.radixdlt.com/" + } + ] + }, + "p2pLinks": [], + "security": { + "isCloudProfileSyncEnabled": true, + "isDeveloperModeEnabled": false, + "structureConfigurationReferences": [] + }, + "transaction": { + "defaultDepositGuarantee": "0.99" + } + }, + "networks": [ + { + "networkID": 1, + "accounts": [ + { + "networkID": 1, + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "displayName": "Account 0", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/0H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", + "displayName": "Account 1", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/1H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x", + "displayName": "Account 2", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fb97ffd1ee33ea7378bd4de6096371bfd7bc4ffcec3c99f959e8e238660eaf5b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/2H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x6qearl72520hj8p0ppet8tcyh3jfwd4qd0a5qn522e0xeutunc3l", + "displayName": "Account 3", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "57d0e188922c1d0342df770466c21e2235eb617bbe7f3ea8f524794e331920e5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/3H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yx8prkr8e3rtuxpl7grqv6vf6vy6hsmze3qtl4n08uya4padnu7f8", + "displayName": "Account 4", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "28bf9fdb2bad0500a3141314810f5f3acdda275bdfa0eb27b8f3bd8bf80a54ed" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/4H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296mvkzlzmyke3mvdf0e8wngtv5hw076gt9lf6mfdtncxp4eqmyt5c", + "displayName": "Account 5", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7efdaff52f3bd99f954fb6e687a43210171cf3704e5d7a804c57d576e4da5ebc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/5H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128e706u8c58yqjut5ckczwts5s298l3cljf444s65sc8gnfpxhgmd8", + "displayName": "Account 6", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "669a7c3f7c9c9fa1c687c0ef0b912f339119469b45ed087738eedbc0090217fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/6H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128un7clxuceztd85apdwnsy3geq0eauf83d00nuhk2s0k9n82tuyd2", + "displayName": "Account 7", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "455a6e3c56d8095648c4097738c44d5fd386f5511eff941122b8bc4b4da3bb9a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/7H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jcaqc4p5pmgulnnez4c8vnm4qy8l9kvtg8a6ekttnp89vkquqsc3", + "displayName": "Account 8", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "68c8bc7c23089f6451e61395511a988fbbf97bbac93d5dda5e00036c74b9e68c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/8H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwdjvetd5r7yfl5qhenmaz2wvdmw4tzngla33lk2gnksrx8sql6jp", + "displayName": "Account 9", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ed6761e65cbc0835a33f3898c6890c2095de32ffb80e9fd41a7f0b81b6e29a70" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/9H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12833x30kj3hex5tlx45hx6k8taug48aayc2u3k8kg3zhla4r09ha4q", + "displayName": "Account 10", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2a08f5aa1045064d41a832f52033b5f21d67806a81b79afaa304400244ce0ce7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/10H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dke694mupmyuysal25jj8tmml7fqmm2rusmaf3pew4s6kw5dd4hl", + "displayName": "Account 11", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cb7723df969d87c27906788045166f993b8ebf34737ea3c47c883c3abd4fa822" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/11H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zc9sl539kcu7qqdav4sr9jtwgm0r5xx4uak54vdtfj5pex2jmtc7", + "displayName": "Account 12", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5691bc11b73178ed7f8ad1d8b09f42267abbd3c27ee8d61813e36cb9a355bedb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/12H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kgdy452yhjqql0dead9v8xgh6ctxlasx4t5ut73w0r92c5djr8t8", + "displayName": "Account 13", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "363848aebfc8f393b583980071bfa93d8d381dbc14a3c2d683eec34703aca200" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/13H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128666mqpqgvwx39leq7wjnx4dk0ucpg09w0erj68wn3znmzkryr53n", + "displayName": "Account 14", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "389e865c93785043427a7889b8922705a447e82c4f75f4e4378f92ab0811aba5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/14H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlwqc93yfxgrzktehyjpuve0frk260c6p6scjnmg679zpy0rfvyx0", + "displayName": "Account 15", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7b2ce8df18bcfcb94695b0fc76053fed448de192454a75ba29c34b75efb47712" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/15H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fz545qp2l68y5vvkuhmfrcdwqrkkzusmygvfqvxtnkxeysx0reel", + "displayName": "Account 16", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f055f5611e158d70d378fc8381f2f3c9a15b1f33096aa62df86cda229b068f90" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/16H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128had2ef24sj7wgjzcmw239crqct4hyh2lxwewyagpkvu3tlv3s9mp", + "displayName": "Account 17", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b54896ee1049fd4a1ac3deb618f8c3fbe16042b391dcac02c1e4085206771db3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/17H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzf9tgwvrp4crad856vshvuhasrdzq5e28phf3236ggvdxu9xxjmu", + "displayName": "Account 18", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "882439de53048eccbd4ddbbe61cc04524762f22f29c6b3fe4e217b878a042fd9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/18H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1282pquu8czj82el770qjlzsjutfcmezx0jcm0vw4eajyxdg9tt5uca", + "displayName": "Account 19", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3b80cee5e24bd0c7820841957dc3f38ef4482546921ce80a16dcb8482cfd4117" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/19H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296rsdttnudwpjkfy0htskunxkfpks9fn8epz9e4y8hy02veg2nr8f", + "displayName": "Account 20", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bb4c50dc68269aa53fd14c1f3de8b3fb322e714498a6005ec63d254305f0acf8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/20H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z6geuwgqgqagu5tljmeqc8llp5smwgkffqf2cm3juextw848r2cn", + "displayName": "Account 21", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b377a9f9c9efe3d5924ecd66494db44b7c4cf387fb47ea2626eb2b54f7d452b9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/21H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129camasdv5jmeuv04xcxltqlfry2dgnrarazvnqtjkwxvzaeud0njd", + "displayName": "Account 22", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "345540c5c63a2e9d3397b539f22221231cd83650b2dd11c46b8fd3e2384e587b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/22H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ye9cd37e20ea9v33pxjjxe7gr8qwq604vyqjhzve3zts48sjuq5fn", + "displayName": "Account 23", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cdaeb21a2a49f1e280fd9afd1c9f77c0b51973f11ac275e1cc7b6fd13d44f5a1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/23H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1290a5lus9h340csrsl2m5rxsgqdv97y4zmqsfzw8kwzp7hatv6ea5r", + "displayName": "Account 24", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ed1a2591bbfe8df4aac1d20eb5b0c21f3b9e9813dcc20b69c7817a194181db7e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/24H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3dzym9wejdl946gqxjp2pdpzkylqmr7xpmgqma9cwmlkp8qdvrrg", + "displayName": "Account 25", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "70d80a78d62f80d339b520a74e5f09f8326303cbe314ac3ff1c4f4788fb0f7f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/25H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128wy039tee6fp9y6kptz3zmvphvya04xjjkm3uk8j7583cs355n4vk", + "displayName": "Account 26", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "29855264d9fe2acf3b12481e729eaab06c66ec3b56657438b9c1a1d0901be1d2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/26H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhsvu0530fjymcaqmsqamcgr6dmud20azayc2c8jfr9rve8safttj", + "displayName": "Account 27", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "26f725bc0f9f193fc2326989f1bb2cf0a69bbcfa39f876e2ef81cb2da69de9a7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/27H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128pfngrm5sax9ax58nddmmrrjka28d20fwzru4q4rrwfm8m5nnjlcn", + "displayName": "Account 28", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d28823ae567603b18832c809c0e246953f79e17c0910502c1c6464693a3f785" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/28H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywvw632uvx9pkx8enxhruhka5pxgwzu8huyqzmx87pmen0g7dp2tu", + "displayName": "Account 29", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e65d674ba760bbce1538ee70d79a3be8ca7bf3a8359e02890af201f35defe90c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/29H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdlaua2swqq0txcsld6snvk9yztc9uqrrlldrrca52kkurvxv9xen", + "displayName": "Account 30", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6ecc81720489082be58fb22758833c5e315b70ba76db32f7d2c903814aaca049" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/30H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzamrfhu8cdp59aseqvc89d73fnquq8a7tzkmfn7hn8ulvyjnvss0", + "displayName": "Account 31", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0d80278ee7339ff4b19112f010728c02040c11462afc0c8d0317ca8de36e7b31" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/31H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwcmqva3f9ycnfg7dv3upd37saafgeuq0kypcx4n9gn8hclsfrdpp", + "displayName": "Account 32", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3eb35670db98a5a16495953d62964a142afdd5cdf79a1ebd23009b23b34d64ce" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/32H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129er3y5geyjrcw49v47y9mct0574gqc3lk03r98ap8wkaatkn28475", + "displayName": "Account 33", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9bc77e38a56cc407aa1d458e0945e67b4a44a6b194d33ed4bc65002c0afcc957" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/33H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wqzgu0pukjwf430s2y3wkj6q0dwu3d4h6pdhjugwuljujx3er703", + "displayName": "Account 34", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9e3c7a34ec5279719a61f788131338322daa6379c97b13a14f2e9b9cb5d5aed2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/34H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yuvpn4kz9wj8c4rg9cwzryedpvms3cckafeca90rjj25fdak0krww", + "displayName": "Account 35", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3ccb06806f5ea69aa9a02b9861de061ea595a5680f54885f664fdc4796d97227" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/35H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xezazunkp99ltnd9hyk2jg6fjwpspevrdqna7h8ate2c72lczuhzm", + "displayName": "Account 36", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9f41bf20bb5a78f7d0e0b180de4e25d0bb8e99da3da9413cbf66eba9a12da614" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/36H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9qrru0084tjfg5n3hl9xc4pkaamq4nmu2y4kkfpamv3hn8tyjfjm", + "displayName": "Account 37", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de1811c9d577ffbfd1c3d2b3465eeefd0b8bdde344c89d9360ec25eb4591b07e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/37H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3adlu4ayscqqgtm4dmugzejaxelsltcjzn30dadf2pzq9pgpujh6", + "displayName": "Account 38", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "08e69139c9347e7b53c975052ae65b179a055cf6ce1d7c522cb13df1276c67bc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/38H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vaedutdfk9a6fmmfl6xgc3gj2wp07cd8zr0arq6eyyannnywtxkg", + "displayName": "Account 39", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f6bf10a2a4388522355fe9dbd4241ada9cbc121fa8c71acc16911d7a1e7cb647" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/39H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2fnh8905srym63l80x27sxng3wpj667jj9f2qq8lg4c8rhsjk9cu", + "displayName": "Account 40", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eccd2a4d74202487a237cc96a065f3a7fcb7196ea9f002f94228fc6859dc752e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/40H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m4axtr8wrelsqmyujdpyjcwjku58ydgy6y2p7k8l9ellq6977dzx", + "displayName": "Account 41", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "86c2052a3fe9a44501bc3e422eae54902912ed7474ec5d32b97b9f5daba8a7d4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/41H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xr9wc5npsmvs3eup9mnwh6ssh98f87nh7swxgetxjyqp0mum7x4cx", + "displayName": "Account 42", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "680eb162e315e47637c106ab6eeea28c4b93a46955dcc7c1284c5153897b9184" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/42H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12820t4zhl0yn5xjwgvulr6fmk36hh382dmqw6j7vn04umhncdqtm9q", + "displayName": "Account 43", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7a1571a12e8938e05b5a6c43bd357ba1accfdde06d41d18400cf72fd4078945c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/43H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128y2h6cmf3axlaat8828nr7lk4hxyey72saksum4kgew8gwvh2y7p4", + "displayName": "Account 44", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "56b48477d310bcc4b2b9684dfac4a82339869ce6846a2215cd05a835daa1c47b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/44H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128s7xzavt4rshrg8yvyw73p6cqvv9r0ywtsxul8cggp6nx32xe2tja", + "displayName": "Account 45", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "acb6a155391612c8e1503516913bf39787758b828c2e5ae5f7c15ae73fb4c7af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/45H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xzlpc2a8t7xrtmjq3z8z3lgy37dtq50vvqkqqgh5n2ktyszdcsrae", + "displayName": "Account 46", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dfa7f95e0f67c1336dc7dfe5b86965ff570d144b7bbe98f110aded5f0fc2c63d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/46H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128k6zcylyejtwrkhgyxm72pymuj6txme30jppgrj8wnfxlde83a332", + "displayName": "Account 47", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e66e64c7729e5d12b7638996f0a611ed2ce333d8bf5e261bb8834c86154bee53" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/47H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128meygx0wqz2tv92znn6r3pqdl8jlkyuwcuhwvyr2npjcu72y5lzvz", + "displayName": "Account 48", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ae0f9b0035f558b7ae1f4a9b0d3d2b3cd25c6ba9fadbf93a39c5e9a6bc217123" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/48H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yg2h2jf053qew7vj5ysruefuk280ye2m9rmy5mje804rqphv92jfu", + "displayName": "Account 49", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "939e8364393df844e551bc38e584f0f0244bb9fc7ea05b67dd5ec4af8373e5ae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/49H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129rq2qnukv8n9hhrda7su80ude9ql0kd93nr4ud08scvt3qk7u3zql", + "displayName": "Account 50", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ae4d1762ceeea62b2679463369b3b4491ef167426499323a86949906bf941c5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/50H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqk00ex4sf2j3jn9z7gscgc9jtzzvdf8fqxkh8yh5vzee4wj6khae", + "displayName": "Account 51", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ab04fddbb5ed94dd2a1fd65c0cdf8a3cb290b219570174e1522299bf28e45d20" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/51H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yyrat9y239mey9nvfzctdwzl2fn0wxwkz9jcyymcend6wm5vp5j8a", + "displayName": "Account 52", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7a5b8f17954dccdc1b5bbaef0dbb098bb22103b0f2649cdfaae8d125d675bf46" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/52H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128c63cza84ly02f3zdhaxgy9t9u8nnc7fhgsqspq3vsahlut6rmwcz", + "displayName": "Account 53", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c8e4d1be73dc1af108005d4c504f35469dd327c776f21d14f087532981a2e851" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/53H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdjnn8kfrl6qhzrsx9zrswqh2klqc8l0s4x3lx9t08w7uu7vkc2f2", + "displayName": "Account 54", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c5a525fb5fa55ae4f71445181ecc184b97624589e83f7ffc5ac1f73104c0e0f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/54H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hznpt8l66mdckfwjkcdg880ulzz600jzx4uyvm4xkglu8dljana2", + "displayName": "Account 55", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "091b1426a64042ac980466fc78f904d01864b9caeeca6f3543ace5265dede25e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/55H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12876gkzv2at4ctg56g7j4gehvhjfvufkjqfh6jaak6g88a7sxr63dp", + "displayName": "Account 56", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a508af656037f05a7bd9494192ce1ff43c2f53f485dadb27d286bf39a0eb57eb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/56H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymwul899nngh634ehnl7e9d9w9fzm385dhxfuqcxyhus3tzg806v5", + "displayName": "Account 57", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d5b5da8447042114ec19a89b868081c11a7554176253c8e7790d6b1751168f4a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/57H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq2avq8gnhtchyad4ll7rf8lm9v9wj9hykh2vydqrcrh3ufu7enju", + "displayName": "Account 58", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a5b71de2a5f68ab4c03aee47dc118f1c56515dc31a4dcbea1263ad471e3354e8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/58H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytcg246jw44hnrmndf3xu5gyx5ff6q20srct6xvs8nhta5y0uv7y4", + "displayName": "Account 59", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "813a685daf8de406eda741806d1cbf8390da65db1d7e16b3880afda117c8b466" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/59H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xqky0n5hy0feg4p88l22h43r367mlr5f40kxe32dnrfvud2r9vs7l", + "displayName": "Account 60", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6a814380c90872c2c1f8f395e37c1f0d64de65187748b6fa48493d308101f27d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/60H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nyv238c0sskxql93q4ve0ljevql20eyvgan26ktdfwhanc6hpxft", + "displayName": "Account 61", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "42830831cf5fe0e56c4994d4f58b23797df2f4f1d8df117ed973e39d6aaf8d3c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/61H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn9hv2fszcdfgdhm9ks0jmtcxl53zfqflr0hdefa0cfdqds7hvuw8", + "displayName": "Account 62", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c8eb78fe95545222b0a43498314dbcc6b2a8981971b2699bf37191981b4909ae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/62H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xm0t7m37kj9s8ant6gzax7mrkmedk5thkmsgccxhlafwj0ljq5s3w", + "displayName": "Account 63", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "35bc63901f8a3028f98010fbb885ead1fdd559765c125dac3a6ed5cf790b0b63" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/63H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128y05mhlupdj7j7f6luj6jyygqdwzgvflxazskqdu34zec2puq70gk", + "displayName": "Account 64", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b5a1b8b7d662dccdc6e6d0b71548d68a7312c18b4d7995afe8fddae636942201" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/64H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129amht2lkldjkwdyarmp44wf6dven6d67fzzkw3nd55nuh75q6crcu", + "displayName": "Account 65", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d9e7c78deb2821781373bc86a004f1b54738478b439a29c0d13b55fc4512d6c8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/65H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xa2y0t6zdh285shuxa4npqwv7hx3fltkefeknl39dk76ct7gf690u", + "displayName": "Account 66", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0c236395a3f1c80674334e22165534dd0240cc478bfa01c8f6c08affa37201d1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/66H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284am526meks3lk7ffvtdjzqtxsyk5t3crultu7zgqxg767xnlx99q", + "displayName": "Account 67", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "aa3ba01d82d7533d1d0729f168a19224504792fa8ec9c38df1ff0fb9b206cc08" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/67H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymzm2c5vk73dg6vcvspqae752j5l8jyd3d7azvwyrag6fhs68nvk8", + "displayName": "Account 68", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b816a599a2b6543f0b21e4b3de6ba0b01772d6284e7d701ac277d9d7cf800b4a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/68H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhvn6hhvgg9rey4p3fdstx3e3gm3c6wcmjx55xeh5x5y4xnul5yht", + "displayName": "Account 69", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d18541b47df5138809a3ae113e92ea44e6d5a1216caaf8eb9c5dedb64b7ac4dd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/69H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xued97788qq6jy4h0yvyvyq28cpcs5qc3vwc96j8lj0cnwmrnrtra", + "displayName": "Account 70", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0d3483a25057a22b2db1e283cad8a639ce689123c87b4aabad79673bc90ed75" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/70H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yk7fj5c02f44x2mztmqg33qx7l2ukr84kukqmlpvgz2qx075fu7pp", + "displayName": "Account 71", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eca680ad0bb07e8cb48995d9621c8422ee22f702577268f836a98b33650dc0ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/71H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7n4qdd2upgpp7x4jmph4amak32pp4ftenjqthkr4jjke0h5fpe03", + "displayName": "Account 72", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5024e1dbaf4bc4cf76b4329eceb6852ad5823ec286888029e2bd40e3766b4a48" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/72H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xts8svsfncg5tdrdm7fj54ve403n239duztd2n7ecqdlzdqlrrz65", + "displayName": "Account 73", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "271cc35ed91d6413dea70412462c8478b0ddae63dfa7ae0f338e3830defa521a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/73H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12860tf7hnrlgt6mmeeeg8j60uumstvj0p2me7hte0hyvwlclklke2g", + "displayName": "Account 74", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c6004390891ca7556fc12e7adf9d2d4360b461ba6627adc8622986cc7a865e86" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/74H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128d09txv9nj9ke73e9fe70ecda3j0dtgc70vva83aet0r7qm8j5uny", + "displayName": "Account 75", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c37ef94bd08ac7983fee50f2cafa30c907f02ceef6c8c434c1e39e712ec95f7b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/75H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0hf758k428p52whty3s6afunj7ptqjgvfu0jt7yle5rsw2xcncv4", + "displayName": "Account 76", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4477ec5ae587884cdd858e84702925efad40581ea9a7a9a05d5bb435704509f3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/76H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tj5pr3ky0lnqzgft82g6250vdr0qv9p8eturayechza5l5sl87ay", + "displayName": "Account 77", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "44c18d16cad6cb9f74d0c3e691da43c465f9d9155d287f5c2f3ceb7b5d976bc7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/77H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129cmakdgn3dryvx4cz6n6ghg2r8ns207ny58vwwnqskesn77g7xllc", + "displayName": "Account 78", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9b7fa0c43c14a180d0c309b740cc3da8214ab56b863ebaf96d83db3a66b8726f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/78H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgcyjnv6ncdn4zspd6dh9fvz7jq45c7td09hfw5wy88q39d84t0jf", + "displayName": "Account 79", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a34cd357d8643ba3749b1e07b3b11710d6fabd128e8fca851e01bbf1acba7eb2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/79H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12983u5qyke6rlh5mrh259ac7pwhmdxz7chyfd63esz6j204qg7lgya", + "displayName": "Account 80", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d6a2c42e7e7a81bbfd8f6f1cdcacc6756bb2c2146e4635bf2fd4b14035e2c592" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/80H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdmc0a74m7ahj9kanh4fz07nye8uz7r40adrtwc6e58vjdfyuplkq", + "displayName": "Account 81", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0a03a79a259d62c58d9ac57eb2d0d2fa61915403780e32b01584c53ee1da2998" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/81H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vqqqm577un5v5c6xhvg5jkf3llajy5fzwd9j87pmqgcv8xx9mk8v", + "displayName": "Account 82", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f0a60da8e1d5564e9fa5740e7ffd756048f4dcb8911ca6cc32d813c5b5dc275" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/82H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128n2uzfaca4qu4la93dz6xwrhhe8n0763ljqjstnfw8rk7d97lq4gj", + "displayName": "Account 83", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "40f0747ce685a534cc4b5c2f0b2a9e766872938da129cd80540053bd9a9519aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/83H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3h5wvhgwvesetrwgg6357np3lw4sc0aygedqx98r3hwdsd5myexs", + "displayName": "Account 84", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a18b9d0cab8ace19970fd919d6c73af7db3b1485b65a6be2f236975a3d298f4d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/84H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9mz7x65qltcnhy6d56wvhgdnz6u8r8yf32u5dmdeep9486mtc8ut", + "displayName": "Account 85", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c1d41e17462ccdedba82b823220ce23ecccb35d492fcdc0ba77c2e02874a26da" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/85H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129gdut7n5n3tmu34hkyr8ahhas7pk0xw5t47t926nvp8evqgfs5qal", + "displayName": "Account 86", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "da406d098fcc7cc84b34105ce65b911d08c79508d73db36a8a59dfb1c9cb24ee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/86H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qvnvptxudvwnsgvekfsnpcfddj5590jjzxy4j4cjkqvkhrnf6mtl", + "displayName": "Account 87", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c303114cdd9c043736e8d063f743bba6e22f5b09de741daa000b8a35cf2dd54c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/87H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ufwtlnhlpq459d36y572jtvke2223hzr2rafndglzuahp4wh5qen", + "displayName": "Account 88", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "203e06a16b4bfaaa6223ffd6aca332ff7d7973bf8d2d65339ac9eac72b5a5c33" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/88H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xfrpa9msqczg34wnq4xpfpu6lszu2dshhct7wuc262f3adwzygxhy", + "displayName": "Account 89", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6166e18b799ed3f016a6c82fd0e7fc2d2767f9620b26a6bc0016928a4a1f618d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/89H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128alfs6x6gzumkdlqh8rwht44f043mfdwyle3dnzeqpf72mvzz9u8z", + "displayName": "Account 90", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eebba9c9cadcabc71907ebdbdb878d4b037be976dc33dfe1339cb79f96dd51cf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/90H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z6czydnqc64gu4ncvrsvupcntg27d8hk9c0kqymrezvevr7lc635", + "displayName": "Account 91", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6c3ed45aa46210961fb871cf2ca25a71cd3a9c777289e4f50e3a541eac7cc041" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/91H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dduatx6jtsrfln0f9exgx0pvvpmn6h4nqa3w7k3wzwk3lljeeeyw", + "displayName": "Account 92", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8e0948203c3793ecee22215b2e9a232f2bb959e1cd827148c64a9f10c16e62fa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/92H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymnu9h44a7phcnzen6jfxs9t49ne5f0rpc2q4uhhrkknjg8vp9mpg", + "displayName": "Account 93", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "445642dd3256f25230e8aab3b969870ed927255b060850ecbee7b59fae83bc2b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/93H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128x9wqvlk3k9m53j7a7qaf9mrtpujjm00h27n252fl6vvz654ux2mc", + "displayName": "Account 94", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "505580e526466e5fadbaa53241e86a175b7fa0d96115d17d6de7520f24d99874" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/94H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ev8m9wtdcttqzkesnk3tlu870qvw76qudu6vqpca7yyz4qya4734", + "displayName": "Account 95", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7f3b16507c7d720ae146b5a8ed52163dd42527acddd108603c910e04a5efd931" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/95H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128u6v72jylu9xfyzxfcgwpj3kg2ewvah5gdqkr77qtmun2hrm3fdp3", + "displayName": "Account 96", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c5c76cc0154749b657536db22fa41dcd471675aaf9857fae671fccd92cf20b2f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/96H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129y3zzlhtt06n9yfm3ge028wl88ard4r4xh4q2kyx92ar3zzt0z235", + "displayName": "Account 97", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "13643883dcd700a642a2f27db18b9fae474f807e3821d5f0b70ee5382ba6044b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/97H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280ws7uj5gnr7dhutwt75ccx02jva45m6n7qzss66397s4hxx4a3us", + "displayName": "Account 98", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4ff0d6e356b2821ba3c8f9d253d062b3bd500d3a7a6e2509b85c64809d259428" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/98H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xljsrujmlzgqupz3zxujusldt257tcq980z4hvktmuvxljf76z72g", + "displayName": "Account 99", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "938d1a0e1e8e3550ef2a4c74d7492d9b04f48e93a382d476628cb56932ccf008" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/99H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + } + ], + "personas": [], + "authorizedDapps": [] + } + ] +} \ No newline at end of file diff --git a/fixtures/vector/huge_profile_1000_accounts.json b/fixtures/vector/huge_profile_1000_accounts.json index 1e9c2f7fc..d9236316d 100644 --- a/fixtures/vector/huge_profile_1000_accounts.json +++ b/fixtures/vector/huge_profile_1000_accounts.json @@ -1 +1,44097 @@ -{"header":{"snapshotVersion":100,"id":"f7ec13c6-09d4-4e7f-8ad1-2456e38f5290","creatingDevice":{"id":"0b5d1a15-a132-4fe9-8d64-8d81cb3c57af","date":"2024-04-29T15:03:20.953Z","description":"Test - iPhone"},"lastUsedOnDevice":{"id":"0b5d1a15-a132-4fe9-8d64-8d81cb3c57af","date":"2024-04-29T15:03:20.953Z","description":"Test - iPhone"},"lastModified":"2024-04-29T15:03:20.953Z","contentHint":{"numberOfAccountsOnAllNetworksInTotal":0,"numberOfPersonasOnAllNetworksInTotal":0,"numberOfNetworks":0}},"factorSources":[{"discriminator":"device","device":{"id":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"},"common":{"cryptoParameters":{"supportedCurves":["curve25519"],"supportedDerivationPathSchemes":["cap26"]},"addedOn":"2023-09-11T16:05:56.000Z","lastUsedOn":"2023-09-11T16:05:56.000Z","flags":["main"]},"hint":{"name":"Unknown Name","model":"iPhone","mnemonicWordCount":24}}}],"appPreferences":{"display":{"isCurrencyAmountVisible":true,"fiatCurrencyPriceTarget":"usd"},"gateways":{"current":"https://mainnet.radixdlt.com/","saved":[{"network":{"name":"mainnet","id":1,"displayDescription":"Mainnet"},"url":"https://mainnet.radixdlt.com/"},{"network":{"name":"stokenet","id":2,"displayDescription":"Stokenet"},"url":"https://babylon-stokenet-gateway.radixdlt.com/"}]},"security":{"isCloudProfileSyncEnabled":true,"isDeveloperModeEnabled":false,"structureConfigurationReferences":[]},"transaction":{"defaultDepositGuarantee":"0.99"}},"networks":[{"networkID":1,"accounts":[{"networkID":1,"address":"account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8","displayName":"Account 0","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/0H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69","displayName":"Account 1","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/1H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x","displayName":"Account 2","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fb97ffd1ee33ea7378bd4de6096371bfd7bc4ffcec3c99f959e8e238660eaf5b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/2H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x6qearl72520hj8p0ppet8tcyh3jfwd4qd0a5qn522e0xeutunc3l","displayName":"Account 3","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"57d0e188922c1d0342df770466c21e2235eb617bbe7f3ea8f524794e331920e5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/3H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yx8prkr8e3rtuxpl7grqv6vf6vy6hsmze3qtl4n08uya4padnu7f8","displayName":"Account 4","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"28bf9fdb2bad0500a3141314810f5f3acdda275bdfa0eb27b8f3bd8bf80a54ed"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/4H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296mvkzlzmyke3mvdf0e8wngtv5hw076gt9lf6mfdtncxp4eqmyt5c","displayName":"Account 5","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7efdaff52f3bd99f954fb6e687a43210171cf3704e5d7a804c57d576e4da5ebc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/5H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128e706u8c58yqjut5ckczwts5s298l3cljf444s65sc8gnfpxhgmd8","displayName":"Account 6","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"669a7c3f7c9c9fa1c687c0ef0b912f339119469b45ed087738eedbc0090217fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/6H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128un7clxuceztd85apdwnsy3geq0eauf83d00nuhk2s0k9n82tuyd2","displayName":"Account 7","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"455a6e3c56d8095648c4097738c44d5fd386f5511eff941122b8bc4b4da3bb9a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/7H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jcaqc4p5pmgulnnez4c8vnm4qy8l9kvtg8a6ekttnp89vkquqsc3","displayName":"Account 8","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"68c8bc7c23089f6451e61395511a988fbbf97bbac93d5dda5e00036c74b9e68c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/8H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwdjvetd5r7yfl5qhenmaz2wvdmw4tzngla33lk2gnksrx8sql6jp","displayName":"Account 9","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ed6761e65cbc0835a33f3898c6890c2095de32ffb80e9fd41a7f0b81b6e29a70"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/9H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12833x30kj3hex5tlx45hx6k8taug48aayc2u3k8kg3zhla4r09ha4q","displayName":"Account 10","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2a08f5aa1045064d41a832f52033b5f21d67806a81b79afaa304400244ce0ce7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/10H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dke694mupmyuysal25jj8tmml7fqmm2rusmaf3pew4s6kw5dd4hl","displayName":"Account 11","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cb7723df969d87c27906788045166f993b8ebf34737ea3c47c883c3abd4fa822"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/11H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zc9sl539kcu7qqdav4sr9jtwgm0r5xx4uak54vdtfj5pex2jmtc7","displayName":"Account 12","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5691bc11b73178ed7f8ad1d8b09f42267abbd3c27ee8d61813e36cb9a355bedb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/12H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kgdy452yhjqql0dead9v8xgh6ctxlasx4t5ut73w0r92c5djr8t8","displayName":"Account 13","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"363848aebfc8f393b583980071bfa93d8d381dbc14a3c2d683eec34703aca200"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/13H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128666mqpqgvwx39leq7wjnx4dk0ucpg09w0erj68wn3znmzkryr53n","displayName":"Account 14","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"389e865c93785043427a7889b8922705a447e82c4f75f4e4378f92ab0811aba5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/14H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlwqc93yfxgrzktehyjpuve0frk260c6p6scjnmg679zpy0rfvyx0","displayName":"Account 15","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7b2ce8df18bcfcb94695b0fc76053fed448de192454a75ba29c34b75efb47712"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/15H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fz545qp2l68y5vvkuhmfrcdwqrkkzusmygvfqvxtnkxeysx0reel","displayName":"Account 16","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f055f5611e158d70d378fc8381f2f3c9a15b1f33096aa62df86cda229b068f90"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/16H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128had2ef24sj7wgjzcmw239crqct4hyh2lxwewyagpkvu3tlv3s9mp","displayName":"Account 17","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b54896ee1049fd4a1ac3deb618f8c3fbe16042b391dcac02c1e4085206771db3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/17H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzf9tgwvrp4crad856vshvuhasrdzq5e28phf3236ggvdxu9xxjmu","displayName":"Account 18","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"882439de53048eccbd4ddbbe61cc04524762f22f29c6b3fe4e217b878a042fd9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/18H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1282pquu8czj82el770qjlzsjutfcmezx0jcm0vw4eajyxdg9tt5uca","displayName":"Account 19","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3b80cee5e24bd0c7820841957dc3f38ef4482546921ce80a16dcb8482cfd4117"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/19H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296rsdttnudwpjkfy0htskunxkfpks9fn8epz9e4y8hy02veg2nr8f","displayName":"Account 20","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bb4c50dc68269aa53fd14c1f3de8b3fb322e714498a6005ec63d254305f0acf8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/20H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z6geuwgqgqagu5tljmeqc8llp5smwgkffqf2cm3juextw848r2cn","displayName":"Account 21","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b377a9f9c9efe3d5924ecd66494db44b7c4cf387fb47ea2626eb2b54f7d452b9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/21H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129camasdv5jmeuv04xcxltqlfry2dgnrarazvnqtjkwxvzaeud0njd","displayName":"Account 22","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"345540c5c63a2e9d3397b539f22221231cd83650b2dd11c46b8fd3e2384e587b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/22H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ye9cd37e20ea9v33pxjjxe7gr8qwq604vyqjhzve3zts48sjuq5fn","displayName":"Account 23","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cdaeb21a2a49f1e280fd9afd1c9f77c0b51973f11ac275e1cc7b6fd13d44f5a1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/23H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1290a5lus9h340csrsl2m5rxsgqdv97y4zmqsfzw8kwzp7hatv6ea5r","displayName":"Account 24","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ed1a2591bbfe8df4aac1d20eb5b0c21f3b9e9813dcc20b69c7817a194181db7e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/24H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3dzym9wejdl946gqxjp2pdpzkylqmr7xpmgqma9cwmlkp8qdvrrg","displayName":"Account 25","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"70d80a78d62f80d339b520a74e5f09f8326303cbe314ac3ff1c4f4788fb0f7f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/25H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128wy039tee6fp9y6kptz3zmvphvya04xjjkm3uk8j7583cs355n4vk","displayName":"Account 26","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"29855264d9fe2acf3b12481e729eaab06c66ec3b56657438b9c1a1d0901be1d2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/26H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhsvu0530fjymcaqmsqamcgr6dmud20azayc2c8jfr9rve8safttj","displayName":"Account 27","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"26f725bc0f9f193fc2326989f1bb2cf0a69bbcfa39f876e2ef81cb2da69de9a7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/27H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128pfngrm5sax9ax58nddmmrrjka28d20fwzru4q4rrwfm8m5nnjlcn","displayName":"Account 28","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d28823ae567603b18832c809c0e246953f79e17c0910502c1c6464693a3f785"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/28H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywvw632uvx9pkx8enxhruhka5pxgwzu8huyqzmx87pmen0g7dp2tu","displayName":"Account 29","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e65d674ba760bbce1538ee70d79a3be8ca7bf3a8359e02890af201f35defe90c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/29H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdlaua2swqq0txcsld6snvk9yztc9uqrrlldrrca52kkurvxv9xen","displayName":"Account 30","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6ecc81720489082be58fb22758833c5e315b70ba76db32f7d2c903814aaca049"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/30H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzamrfhu8cdp59aseqvc89d73fnquq8a7tzkmfn7hn8ulvyjnvss0","displayName":"Account 31","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0d80278ee7339ff4b19112f010728c02040c11462afc0c8d0317ca8de36e7b31"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/31H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwcmqva3f9ycnfg7dv3upd37saafgeuq0kypcx4n9gn8hclsfrdpp","displayName":"Account 32","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3eb35670db98a5a16495953d62964a142afdd5cdf79a1ebd23009b23b34d64ce"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/32H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129er3y5geyjrcw49v47y9mct0574gqc3lk03r98ap8wkaatkn28475","displayName":"Account 33","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9bc77e38a56cc407aa1d458e0945e67b4a44a6b194d33ed4bc65002c0afcc957"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/33H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wqzgu0pukjwf430s2y3wkj6q0dwu3d4h6pdhjugwuljujx3er703","displayName":"Account 34","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9e3c7a34ec5279719a61f788131338322daa6379c97b13a14f2e9b9cb5d5aed2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/34H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yuvpn4kz9wj8c4rg9cwzryedpvms3cckafeca90rjj25fdak0krww","displayName":"Account 35","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3ccb06806f5ea69aa9a02b9861de061ea595a5680f54885f664fdc4796d97227"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/35H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xezazunkp99ltnd9hyk2jg6fjwpspevrdqna7h8ate2c72lczuhzm","displayName":"Account 36","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9f41bf20bb5a78f7d0e0b180de4e25d0bb8e99da3da9413cbf66eba9a12da614"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/36H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9qrru0084tjfg5n3hl9xc4pkaamq4nmu2y4kkfpamv3hn8tyjfjm","displayName":"Account 37","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de1811c9d577ffbfd1c3d2b3465eeefd0b8bdde344c89d9360ec25eb4591b07e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/37H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3adlu4ayscqqgtm4dmugzejaxelsltcjzn30dadf2pzq9pgpujh6","displayName":"Account 38","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08e69139c9347e7b53c975052ae65b179a055cf6ce1d7c522cb13df1276c67bc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/38H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vaedutdfk9a6fmmfl6xgc3gj2wp07cd8zr0arq6eyyannnywtxkg","displayName":"Account 39","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f6bf10a2a4388522355fe9dbd4241ada9cbc121fa8c71acc16911d7a1e7cb647"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/39H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2fnh8905srym63l80x27sxng3wpj667jj9f2qq8lg4c8rhsjk9cu","displayName":"Account 40","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eccd2a4d74202487a237cc96a065f3a7fcb7196ea9f002f94228fc6859dc752e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/40H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m4axtr8wrelsqmyujdpyjcwjku58ydgy6y2p7k8l9ellq6977dzx","displayName":"Account 41","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"86c2052a3fe9a44501bc3e422eae54902912ed7474ec5d32b97b9f5daba8a7d4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/41H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xr9wc5npsmvs3eup9mnwh6ssh98f87nh7swxgetxjyqp0mum7x4cx","displayName":"Account 42","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"680eb162e315e47637c106ab6eeea28c4b93a46955dcc7c1284c5153897b9184"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/42H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12820t4zhl0yn5xjwgvulr6fmk36hh382dmqw6j7vn04umhncdqtm9q","displayName":"Account 43","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7a1571a12e8938e05b5a6c43bd357ba1accfdde06d41d18400cf72fd4078945c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/43H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128y2h6cmf3axlaat8828nr7lk4hxyey72saksum4kgew8gwvh2y7p4","displayName":"Account 44","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"56b48477d310bcc4b2b9684dfac4a82339869ce6846a2215cd05a835daa1c47b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/44H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128s7xzavt4rshrg8yvyw73p6cqvv9r0ywtsxul8cggp6nx32xe2tja","displayName":"Account 45","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"acb6a155391612c8e1503516913bf39787758b828c2e5ae5f7c15ae73fb4c7af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/45H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xzlpc2a8t7xrtmjq3z8z3lgy37dtq50vvqkqqgh5n2ktyszdcsrae","displayName":"Account 46","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dfa7f95e0f67c1336dc7dfe5b86965ff570d144b7bbe98f110aded5f0fc2c63d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/46H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128k6zcylyejtwrkhgyxm72pymuj6txme30jppgrj8wnfxlde83a332","displayName":"Account 47","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e66e64c7729e5d12b7638996f0a611ed2ce333d8bf5e261bb8834c86154bee53"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/47H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128meygx0wqz2tv92znn6r3pqdl8jlkyuwcuhwvyr2npjcu72y5lzvz","displayName":"Account 48","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ae0f9b0035f558b7ae1f4a9b0d3d2b3cd25c6ba9fadbf93a39c5e9a6bc217123"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/48H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yg2h2jf053qew7vj5ysruefuk280ye2m9rmy5mje804rqphv92jfu","displayName":"Account 49","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"939e8364393df844e551bc38e584f0f0244bb9fc7ea05b67dd5ec4af8373e5ae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/49H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129rq2qnukv8n9hhrda7su80ude9ql0kd93nr4ud08scvt3qk7u3zql","displayName":"Account 50","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ae4d1762ceeea62b2679463369b3b4491ef167426499323a86949906bf941c5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/50H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqk00ex4sf2j3jn9z7gscgc9jtzzvdf8fqxkh8yh5vzee4wj6khae","displayName":"Account 51","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ab04fddbb5ed94dd2a1fd65c0cdf8a3cb290b219570174e1522299bf28e45d20"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/51H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yyrat9y239mey9nvfzctdwzl2fn0wxwkz9jcyymcend6wm5vp5j8a","displayName":"Account 52","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7a5b8f17954dccdc1b5bbaef0dbb098bb22103b0f2649cdfaae8d125d675bf46"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/52H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128c63cza84ly02f3zdhaxgy9t9u8nnc7fhgsqspq3vsahlut6rmwcz","displayName":"Account 53","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c8e4d1be73dc1af108005d4c504f35469dd327c776f21d14f087532981a2e851"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/53H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdjnn8kfrl6qhzrsx9zrswqh2klqc8l0s4x3lx9t08w7uu7vkc2f2","displayName":"Account 54","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c5a525fb5fa55ae4f71445181ecc184b97624589e83f7ffc5ac1f73104c0e0f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/54H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hznpt8l66mdckfwjkcdg880ulzz600jzx4uyvm4xkglu8dljana2","displayName":"Account 55","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"091b1426a64042ac980466fc78f904d01864b9caeeca6f3543ace5265dede25e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/55H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12876gkzv2at4ctg56g7j4gehvhjfvufkjqfh6jaak6g88a7sxr63dp","displayName":"Account 56","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a508af656037f05a7bd9494192ce1ff43c2f53f485dadb27d286bf39a0eb57eb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/56H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymwul899nngh634ehnl7e9d9w9fzm385dhxfuqcxyhus3tzg806v5","displayName":"Account 57","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d5b5da8447042114ec19a89b868081c11a7554176253c8e7790d6b1751168f4a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/57H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq2avq8gnhtchyad4ll7rf8lm9v9wj9hykh2vydqrcrh3ufu7enju","displayName":"Account 58","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a5b71de2a5f68ab4c03aee47dc118f1c56515dc31a4dcbea1263ad471e3354e8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/58H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytcg246jw44hnrmndf3xu5gyx5ff6q20srct6xvs8nhta5y0uv7y4","displayName":"Account 59","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"813a685daf8de406eda741806d1cbf8390da65db1d7e16b3880afda117c8b466"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/59H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xqky0n5hy0feg4p88l22h43r367mlr5f40kxe32dnrfvud2r9vs7l","displayName":"Account 60","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6a814380c90872c2c1f8f395e37c1f0d64de65187748b6fa48493d308101f27d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/60H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nyv238c0sskxql93q4ve0ljevql20eyvgan26ktdfwhanc6hpxft","displayName":"Account 61","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"42830831cf5fe0e56c4994d4f58b23797df2f4f1d8df117ed973e39d6aaf8d3c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/61H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn9hv2fszcdfgdhm9ks0jmtcxl53zfqflr0hdefa0cfdqds7hvuw8","displayName":"Account 62","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c8eb78fe95545222b0a43498314dbcc6b2a8981971b2699bf37191981b4909ae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/62H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xm0t7m37kj9s8ant6gzax7mrkmedk5thkmsgccxhlafwj0ljq5s3w","displayName":"Account 63","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"35bc63901f8a3028f98010fbb885ead1fdd559765c125dac3a6ed5cf790b0b63"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/63H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128y05mhlupdj7j7f6luj6jyygqdwzgvflxazskqdu34zec2puq70gk","displayName":"Account 64","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b5a1b8b7d662dccdc6e6d0b71548d68a7312c18b4d7995afe8fddae636942201"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/64H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129amht2lkldjkwdyarmp44wf6dven6d67fzzkw3nd55nuh75q6crcu","displayName":"Account 65","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d9e7c78deb2821781373bc86a004f1b54738478b439a29c0d13b55fc4512d6c8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/65H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xa2y0t6zdh285shuxa4npqwv7hx3fltkefeknl39dk76ct7gf690u","displayName":"Account 66","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0c236395a3f1c80674334e22165534dd0240cc478bfa01c8f6c08affa37201d1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/66H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284am526meks3lk7ffvtdjzqtxsyk5t3crultu7zgqxg767xnlx99q","displayName":"Account 67","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"aa3ba01d82d7533d1d0729f168a19224504792fa8ec9c38df1ff0fb9b206cc08"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/67H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymzm2c5vk73dg6vcvspqae752j5l8jyd3d7azvwyrag6fhs68nvk8","displayName":"Account 68","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b816a599a2b6543f0b21e4b3de6ba0b01772d6284e7d701ac277d9d7cf800b4a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/68H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhvn6hhvgg9rey4p3fdstx3e3gm3c6wcmjx55xeh5x5y4xnul5yht","displayName":"Account 69","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d18541b47df5138809a3ae113e92ea44e6d5a1216caaf8eb9c5dedb64b7ac4dd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/69H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xued97788qq6jy4h0yvyvyq28cpcs5qc3vwc96j8lj0cnwmrnrtra","displayName":"Account 70","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0d3483a25057a22b2db1e283cad8a639ce689123c87b4aabad79673bc90ed75"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/70H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yk7fj5c02f44x2mztmqg33qx7l2ukr84kukqmlpvgz2qx075fu7pp","displayName":"Account 71","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eca680ad0bb07e8cb48995d9621c8422ee22f702577268f836a98b33650dc0ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/71H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7n4qdd2upgpp7x4jmph4amak32pp4ftenjqthkr4jjke0h5fpe03","displayName":"Account 72","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5024e1dbaf4bc4cf76b4329eceb6852ad5823ec286888029e2bd40e3766b4a48"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/72H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xts8svsfncg5tdrdm7fj54ve403n239duztd2n7ecqdlzdqlrrz65","displayName":"Account 73","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"271cc35ed91d6413dea70412462c8478b0ddae63dfa7ae0f338e3830defa521a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/73H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12860tf7hnrlgt6mmeeeg8j60uumstvj0p2me7hte0hyvwlclklke2g","displayName":"Account 74","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c6004390891ca7556fc12e7adf9d2d4360b461ba6627adc8622986cc7a865e86"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/74H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128d09txv9nj9ke73e9fe70ecda3j0dtgc70vva83aet0r7qm8j5uny","displayName":"Account 75","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c37ef94bd08ac7983fee50f2cafa30c907f02ceef6c8c434c1e39e712ec95f7b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/75H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0hf758k428p52whty3s6afunj7ptqjgvfu0jt7yle5rsw2xcncv4","displayName":"Account 76","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4477ec5ae587884cdd858e84702925efad40581ea9a7a9a05d5bb435704509f3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/76H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tj5pr3ky0lnqzgft82g6250vdr0qv9p8eturayechza5l5sl87ay","displayName":"Account 77","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"44c18d16cad6cb9f74d0c3e691da43c465f9d9155d287f5c2f3ceb7b5d976bc7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/77H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129cmakdgn3dryvx4cz6n6ghg2r8ns207ny58vwwnqskesn77g7xllc","displayName":"Account 78","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9b7fa0c43c14a180d0c309b740cc3da8214ab56b863ebaf96d83db3a66b8726f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/78H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgcyjnv6ncdn4zspd6dh9fvz7jq45c7td09hfw5wy88q39d84t0jf","displayName":"Account 79","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a34cd357d8643ba3749b1e07b3b11710d6fabd128e8fca851e01bbf1acba7eb2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/79H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12983u5qyke6rlh5mrh259ac7pwhmdxz7chyfd63esz6j204qg7lgya","displayName":"Account 80","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d6a2c42e7e7a81bbfd8f6f1cdcacc6756bb2c2146e4635bf2fd4b14035e2c592"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/80H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdmc0a74m7ahj9kanh4fz07nye8uz7r40adrtwc6e58vjdfyuplkq","displayName":"Account 81","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0a03a79a259d62c58d9ac57eb2d0d2fa61915403780e32b01584c53ee1da2998"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/81H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vqqqm577un5v5c6xhvg5jkf3llajy5fzwd9j87pmqgcv8xx9mk8v","displayName":"Account 82","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f0a60da8e1d5564e9fa5740e7ffd756048f4dcb8911ca6cc32d813c5b5dc275"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/82H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128n2uzfaca4qu4la93dz6xwrhhe8n0763ljqjstnfw8rk7d97lq4gj","displayName":"Account 83","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"40f0747ce685a534cc4b5c2f0b2a9e766872938da129cd80540053bd9a9519aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/83H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3h5wvhgwvesetrwgg6357np3lw4sc0aygedqx98r3hwdsd5myexs","displayName":"Account 84","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a18b9d0cab8ace19970fd919d6c73af7db3b1485b65a6be2f236975a3d298f4d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/84H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9mz7x65qltcnhy6d56wvhgdnz6u8r8yf32u5dmdeep9486mtc8ut","displayName":"Account 85","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c1d41e17462ccdedba82b823220ce23ecccb35d492fcdc0ba77c2e02874a26da"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/85H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129gdut7n5n3tmu34hkyr8ahhas7pk0xw5t47t926nvp8evqgfs5qal","displayName":"Account 86","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"da406d098fcc7cc84b34105ce65b911d08c79508d73db36a8a59dfb1c9cb24ee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/86H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qvnvptxudvwnsgvekfsnpcfddj5590jjzxy4j4cjkqvkhrnf6mtl","displayName":"Account 87","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c303114cdd9c043736e8d063f743bba6e22f5b09de741daa000b8a35cf2dd54c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/87H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ufwtlnhlpq459d36y572jtvke2223hzr2rafndglzuahp4wh5qen","displayName":"Account 88","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"203e06a16b4bfaaa6223ffd6aca332ff7d7973bf8d2d65339ac9eac72b5a5c33"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/88H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xfrpa9msqczg34wnq4xpfpu6lszu2dshhct7wuc262f3adwzygxhy","displayName":"Account 89","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6166e18b799ed3f016a6c82fd0e7fc2d2767f9620b26a6bc0016928a4a1f618d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/89H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128alfs6x6gzumkdlqh8rwht44f043mfdwyle3dnzeqpf72mvzz9u8z","displayName":"Account 90","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eebba9c9cadcabc71907ebdbdb878d4b037be976dc33dfe1339cb79f96dd51cf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/90H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z6czydnqc64gu4ncvrsvupcntg27d8hk9c0kqymrezvevr7lc635","displayName":"Account 91","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6c3ed45aa46210961fb871cf2ca25a71cd3a9c777289e4f50e3a541eac7cc041"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/91H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dduatx6jtsrfln0f9exgx0pvvpmn6h4nqa3w7k3wzwk3lljeeeyw","displayName":"Account 92","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8e0948203c3793ecee22215b2e9a232f2bb959e1cd827148c64a9f10c16e62fa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/92H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymnu9h44a7phcnzen6jfxs9t49ne5f0rpc2q4uhhrkknjg8vp9mpg","displayName":"Account 93","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"445642dd3256f25230e8aab3b969870ed927255b060850ecbee7b59fae83bc2b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/93H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128x9wqvlk3k9m53j7a7qaf9mrtpujjm00h27n252fl6vvz654ux2mc","displayName":"Account 94","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"505580e526466e5fadbaa53241e86a175b7fa0d96115d17d6de7520f24d99874"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/94H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ev8m9wtdcttqzkesnk3tlu870qvw76qudu6vqpca7yyz4qya4734","displayName":"Account 95","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7f3b16507c7d720ae146b5a8ed52163dd42527acddd108603c910e04a5efd931"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/95H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128u6v72jylu9xfyzxfcgwpj3kg2ewvah5gdqkr77qtmun2hrm3fdp3","displayName":"Account 96","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c5c76cc0154749b657536db22fa41dcd471675aaf9857fae671fccd92cf20b2f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/96H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129y3zzlhtt06n9yfm3ge028wl88ard4r4xh4q2kyx92ar3zzt0z235","displayName":"Account 97","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"13643883dcd700a642a2f27db18b9fae474f807e3821d5f0b70ee5382ba6044b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/97H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280ws7uj5gnr7dhutwt75ccx02jva45m6n7qzss66397s4hxx4a3us","displayName":"Account 98","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4ff0d6e356b2821ba3c8f9d253d062b3bd500d3a7a6e2509b85c64809d259428"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/98H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xljsrujmlzgqupz3zxujusldt257tcq980z4hvktmuvxljf76z72g","displayName":"Account 99","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"938d1a0e1e8e3550ef2a4c74d7492d9b04f48e93a382d476628cb56932ccf008"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/99H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129f4jltjxtl4jmx8x3hzx5djh0468tzhlgp40jn6s0sqep9eqgekpk","displayName":"Account 100","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fb6303ac8264b475bb53e35af02e7d7f8c21eb7a20bed679d08d78bf6bacec80"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/100H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284elcu2222q2g7zz0wtwwdky387htrsw7d0ldtsy5madflzvf3hac","displayName":"Account 101","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d748ba2bb25654a0d72a92359485ded51ee8843c22695a18df979380429ebe56"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/101H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128r79hjn7zwwxw2x3794cfe3qmw7n52m4s72wv2fjwhyj9f8tn5u58","displayName":"Account 102","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"95d2b6fca7ac6c300dffd6be44b467accc01c3019ef8673a93d1503c5c9b55ca"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/102H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yn9vg9h2cetcv9hf32g0p3a85udcaj45whjc0twc4pezsn2rgjtxh","displayName":"Account 103","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8418c2e7552a633a9468a0240fc232d4d84cb4999b48ef4272888356cf3b7eb3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/103H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlj9zltt8wuk4qwqpxzylawmulj9jl62memyyggnuvls25skp5czx","displayName":"Account 104","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"25407ae2014bb2718dad4a70f6a04d2fcdf0a557fe8f0e6e7c27ca79e0c63a7a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/104H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12967lrl5krag2rtqtephpchcexkxne964s6605mwnlny83tq64yhv5","displayName":"Account 105","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fd2043317c6554da1f4330c3aa0905379f21713f8af4acb63e2be22f5eafa0cc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/105H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xfnucc3sqzkuk6acnntm3uns67pngqdnxggtw2lp3tltdwgaklkkf","displayName":"Account 106","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4f61b143412cc59521733c91cc119f5aeda2a539924735939b08ee92db681ad0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/106H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x70h3nktm2d0eugpuh42f6auhppsfltv5d67qjswlg2uy4nx596ll","displayName":"Account 107","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dd67381913a55768f7eda4090c6160f78b1daf02ab2de7c7f40fa347034a86e2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/107H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y20w967lvlh2u3vzfwpvzvp8twd4mjgrknsp5ylk609735ncc53fx","displayName":"Account 108","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8d6bb502c45bed21d135de960e79301648e98f2aa31521b8aaeb6a852a7c2d3d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/108H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kyw3ht4ehahkjg3pw5p0p7fdze044x0xjq0q5ec96egq27x9augg","displayName":"Account 109","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9474e7b8b201bddf6e43265d184307c7f0df1fead236d9fe8e29e60c4f91ca6a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/109H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vft3fqhr74nrf3ydvwkum05sp4lt7aclgd8x2gps7fghmlhqvktu","displayName":"Account 110","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3a20d5c533bd835dbe0e4d4ea197194b8fbec9b489fee9301d0ab6782a0a6f80"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/110H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yyvagffvxtxlj7mp06mwtf0vktssp9ksq8lygwh80dnr2hj9vvdsy","displayName":"Account 111","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bfaf082e41e590e14afafa26bcacb57ee09e43939d7c80d829a6ea0f5b57a7aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/111H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292n3l9njjwzq7m8hqygnnx5cm3ndynjuf4060cscumm4drxwhdwd7","displayName":"Account 112","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"365eb7e08d78ee65f994d06da2e90141818d460e244803ea61084650492dd369"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/112H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xd50s4ghryufrgd3zgj3vkmkwucwfj5209sc48600uc8xaa6y2hyk","displayName":"Account 113","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"146ca11dad4f43509e6bab1c11addb0f04e485f88679a5e2e5e6e3fea23a99fd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/113H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xe00qfjdjeaydxtlxkl24w2r9e4saegdlm3ehhwnjh0wl5vtut329","displayName":"Account 114","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5fedd8f5dc469a5c8b6d73af9c4bc1bd73804c9e71fdd54bfd80a0012a64ca2c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/114H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1288thck47wnhqhz0fv42jhea9dy77wpjn4w5tfm9rlugh4j4uwdvuu","displayName":"Account 115","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4a94bd83ae2a28901a58a67d62242280f25d4b2a12b22d2de18552af69295056"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/115H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yd7a0x2lrpnvrhcj27fz5z3f4793ky5445gstp5x3u5xnn78n0q25","displayName":"Account 116","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5fb879e5a9b06f13dec89c3e261f1908e29debe5b8e6dcb82bf3200693972f0a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/116H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xcvpps4zs643mjnvnku40qpzqygmlgsqhgva5qlfmsp7wss4aefnx","displayName":"Account 117","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"abb76c75a7f124ca20aec4277c86ab7b1f2d64f14be5019e3de8fcc828f921cb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/117H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285q67aw70xh3hz0ja2z0sjaxmzjp0seyavm0rqk7cnnl6pneyl4m0","displayName":"Account 118","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"78cc143b7a32cf389cc4def4001d438d99c68c386ecf71d7abc77777ae0fa793"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/118H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128e48v6l6k0nk45kwuffm2eawwv3pkteysqfymwpgzt7ck92haqzau","displayName":"Account 119","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5aca3131ef4ee1dfa96445cb19af3391dbdfc92f25ccf80e2a7f8d3bcf6490dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/119H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0lr5s3nnnkuvp7jar92thmp03pt5676x3kgf3qszeq63c7em9sav","displayName":"Account 120","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2b3dd0e89d95fb7ad9f74358fa312799d92947b9e3a7e08ef94f9f4a55a21bc6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/120H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yc85yzwxddcmps2ph9pmvz0p0clapp3lj0x9gjep73sxmzvngr4qy","displayName":"Account 121","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a297a8b0fa4bd9d355c2d73a71b453260d6b8c1ffd5a5e3142fe136cbac47539"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/121H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kwdnhkevu6zpxztq9xykhaqxssw0ga3ur3fmmqjkw0xucmcwksdx","displayName":"Account 122","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bdabd79fa90232b924d52c26d611b94e464346201734cc55b397cd031cb5cff5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/122H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgmafsxhr4pdhx6hhjv3dfgcwhh627th7w8fnz7c6y5qzaaqwxza4","displayName":"Account 123","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bf5e02b7ac7eaeab6af520fbaeb0b77a53c5d6b50f3391dcf938ab6b7efd4f47"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/123H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdee8c8evtehvl34m3f65htfn4klravr7rryyldnc437wzlrkhds2","displayName":"Account 124","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e50576ca5e4d2d59eb55315dc2864c129ded2f2bcd8dbdd47123233f4fbc95cb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/124H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12998q5u4r0dd7ll3ze0enacmykgvd6gnnrxm4leexqhy6afzxzel5f","displayName":"Account 125","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f17763778ed54d72ebb4bd02223684ca38193080712ed3cc5fcdc350f337393e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/125H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128qwsa89amkcca6vq7ntpxmhkzc0gzhddsqalqe5zfu34khu6zsv2j","displayName":"Account 126","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1622a7d1ded4a3a33f4bb0a2270076c9a8caf40caffea487139f9ca59e09c4d9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/126H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywnjez7uykgzg28l7pr0dqdg8u8yvhhgfczgc6zyegdf9l7vj7hdh","displayName":"Account 127","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9b9fb7b4e9cbc1a0b5106527c0a4a95f3c0e0040757b3fab5e08f1974e31a4f3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/127H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ynn0a252jmefge3vf6q6k45cx8dlu4ggqu40r3rfvn8sawhm0m7pl","displayName":"Account 128","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ba2076c828f31271f42df5c243196b4c956cac94cc6da28e1a05fef485ec3535"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/128H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjvznjd22qpcggzmn0fzped4066vxxfp2qq7ngur2nwlxt2rvxdve","displayName":"Account 129","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f46cf45de9eed8e5255cafb8b688a53fc1cadd8825dfe2d1483f55656f87c2fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/129H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128n2h0nh5v2x3r7luxfqmj52526yzn5skhzs8ddjy9kxy8826768gd","displayName":"Account 130","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0310fd7a5743a62eb9b7342a161d9fdaec6945863624b09efc834986d10ed8c4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/130H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1297usj7yfzj0s8qrqk09ehzz5ygd98e7tvsyf3s7r3r70nv9q4vndy","displayName":"Account 131","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"913ab020b4544c99216a249a87b95d7876bcf9497090715031c1a5705a4f7fa2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/131H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xg7ke28eyt8pppzaxh3rj7dkuz3m7qxcvzm46hpz0sjw4szw3hc2r","displayName":"Account 132","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b087a8e84d43c9e7233f706945e9c59eaaaafe47c08f0084695205c8d2495681"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/132H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yh0epn2yn2ukhxepye70myzky86acg2kym5quxxdlvqa78lx95xaq","displayName":"Account 133","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6b47574431a76be48410fb550d77a46002e32174bacdc8731bceaeca2ac2e04b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/133H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ekq786e6xgscq9wjxeknyl2ccspshfedqda4gcuu4k2jvq25y6a3","displayName":"Account 134","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d28bdc5a04a27044d685ec295433df7ec2b63197847736d64dd39739c81d22a0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/134H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xavr6wc78wak6rehqg9vlv3pcqn76560r4zdmyfcg5098vw46qshq","displayName":"Account 135","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c2aca617986bc48199651cde8ef3948e34b5626f107879d15979f26a786851c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/135H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295gzmwwvw5lv36l3c054qrdnceg9st3ggdyxe20v9cytxjktqzl6e","displayName":"Account 136","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3761616798cbfb9f240ed25417bec212caf05651134b291ef3a3522ead8805e2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/136H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhax9p7sxgy8pgnumq7ej47awqh6htn8erhegumac2pephfk9uyfk","displayName":"Account 137","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fae55a8ca536a140e4b70fc9724bc9b09919b9e31a834450934f86e91e146ac4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/137H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2xf6qx3ujdg7rf98t3ujyjsn8l5f48lv9skctr4pwe9sywxyfjhh","displayName":"Account 138","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c9726d7f2ecb5402d49018fa309b6243b1f9b5f1264f4f9c9004ea017965f7e8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/138H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3av6q4cenms74ppwr8j27chvrsty8ddns6vejzh9hwwh32ktn6qj","displayName":"Account 139","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2b25e0a8f65ae3cfc531abb5f173f7916ffbc1d1c98989d035196bfca87be274"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/139H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywjxhm0cpute526yeze5fmrlq4m5xyf3fx0wqw2vxy3cdfdzcvkvn","displayName":"Account 140","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"766f13f759b96c9972e3dc7454415e3b2d086933f32419a8a42d5c3ad907f0d2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/140H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pkdfyf30sr9z5v627n8usq76yc30wl4cqw5nayvg70k3g7rw2s37","displayName":"Account 141","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9958ec0928fe4db581eac49653b6210df8673ebb4559b3bce7a65603c7706af7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/141H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zlnqzw02cd2rgpzxg6jcjt7fd4zg3wf9une22pzln4z66cw28ek4","displayName":"Account 142","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d5a32335ca2989b3e03a8fe6146b0cd9142b7d92d86a15ef88494b4f6f4d0726"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/142H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1282p5gschg89kg06w660p0dyen8p4knmym4pa0dfufca403v5zwe7p","displayName":"Account 143","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5686513ac662ef1f1a266bca616206a462202dfb1745928bf702413bf2ac8039"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/143H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4qas7ensnjf8mj3ncwhf7cvfp3p62kedauehdfax5n2ukl6x4s8t","displayName":"Account 144","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"04f4150acbcadce07a2b3908be0cfa50e8bac89b4065a5d1852cba7f7f533083"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/144H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1283ugsz7y3tmkq0663wm6lj7jsmhj9t4mq7fwll35pvcq98xaqzmg3","displayName":"Account 145","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3567e1551d630f4344b483203bff53b8dedd4723d06f1b26d773b26793258543"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/145H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tjyndamswsllyvx8lvmlaepp4rkza7g2f8rjvqrqqkqwwqq7x3lz","displayName":"Account 146","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"02d9714b0e702a738434c1655dfea0e6b10393b28c4e4a8df4099abf13332857"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/146H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128k90z32dfnnjqgn7dqa2uz9j4ttj7zaun8hx0ae8t8uwasj8y9gel","displayName":"Account 147","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"af579bf70c3a8b0dee0414fb07cb50e96bcefab18145d85590e0e374f4b7a139"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/147H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jfudgzr8gca5esaczprcfz4af3wzy8r0pzx2k60k7m8v90qj53c4","displayName":"Account 148","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"97492d558c5abd9dcadb7a8f61b710f3e057a37932454b5bd95ab4118668e86d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/148H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296wp6ny7wjeguc857dfae8m4kthrmtswmgg08dacqkanaze86m0um","displayName":"Account 149","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"10d7fdda4cb2a5325b4c60c6fd241ba04b29c8efffa19ae48a2517db3c7a4d7f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/149H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fy2wh7lue6jgs3hu9u2nz3phlay09zkkj4cxzjj8u9uxxn5j2g0j","displayName":"Account 150","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d22d053980f36f87ceaa09f3a9d8cc41c8d1ebca73145664dedbec77c2861e71"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/150H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjlnf0dqsms6yslglyhyyvdursykpgv2227m5nsedy2muc4pvm2an","displayName":"Account 151","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bf8a3092a896377649aaa40ade0a404b4681639a8089de639345edc291d9067a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/151H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymfq39mnx29v9n27v27mwuk8r5l50htwdg7zrvvqlls5t9w5pvyt9","displayName":"Account 152","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e17604e9cc6a29a2c34a4349c65866539894fc7883d439f9d591fdd1bdf61280"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/152H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yd84q226uecsfxa0ae52kgku538d3sa0dd7gw0w7zhzrvwkwc0wyp","displayName":"Account 153","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"05c1e40ed23ac266ec289d767562df10823e52775e2054803f169bd6a51aa40e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/153H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdjghwqlsscauf6jx4dv3369lprync3qw79qhg63n5hpqtscuzpn7","displayName":"Account 154","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1987ba70a5b7b69c7440ce3435db743d4f6c4adaf299846a2623471108cdcdf9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/154H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hh3ztcr9tjtr8s9ew9a6a78w626xzfxguqa09kgahtlmq8tqdudf","displayName":"Account 155","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0933fd889eb02f8b0ce8f09bb4ec6f3dad71e351d26491d965eb7c3a3a19714d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/155H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9y3xvjpf00wtce4q70qy5x99n5r34209wxrp2e9sngpwy6sd79vu","displayName":"Account 156","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3bf20690f9430d900105a85286a7b365f4c7b0acadb398cd33a3a91180835f6e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/156H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywt07sm6yp8n63ezm53dd0s3dy633cc97spsluat4ahx0msdj6220","displayName":"Account 157","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0db2476c48545d3a3cfad8158cdcc63e07fa918760950bb6ae98c8e16c2df3c9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/157H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yuhas59acc653agf0mzu6pzfajlj3fmklnr68vdxr5685p256j7fz","displayName":"Account 158","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cf2e792c58e3a9dc55efdc7c90c9379e15f8fb051fdf2aa77c3e68b204590f08"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/158H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yc2px2mfrx8wsefkk2gg5s5npudd0kqp6ahvwgpddgjfxzx2qmz96","displayName":"Account 159","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"60cd9fdf23df43d89c44266be17cb1c180786104a24260be746c2e9d05eafc9c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/159H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jgq85lc3geh2wtargej0nl8000q0j876w2nzf4q8m5ygu525su8t","displayName":"Account 160","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d3c1df9ccf438064570b5ce5390c6d483dd909413701fd3b07a8a8eca420d3f1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/160H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129a4jq9gnwvljyg4xnrepgdutg8vav0gl7yydkx357qvj9jgcemgpp","displayName":"Account 161","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ecc5417b6a48fe4d888cf9965ffd2a5b939224abbc85247e30adcc3666edfdb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/161H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yehpmctzkxuvpq9knkevgghgumdkpujla34scr2zu4rxhx5g02lck","displayName":"Account 162","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"90d04c8c2f02eb709c562dc65927820aaa5c7fb89e0499ecc6a9f5dfe9f337a4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/162H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9gew5dmgjjtdhg996u2c286u4l7eyy037m4fhtwu5myvt8fe4adm","displayName":"Account 163","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"288e3dad4ee61ec64df226543b0c474f6d9272adca895a8a27284bc1c186d3d6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/163H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8csnh4atz04dhkfqau2zjpgwq0rjnu7uuaqkfvfle0qcqj9s6ch3","displayName":"Account 164","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d84fd0c65dc22ae35df96073eead267acea98fe84dcbf4a7257dcb4898a75bd0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/164H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129av50ej27kwld4pjzh59jcyeugdc0garpwqaf3cvhvvg2vl0ngcmj","displayName":"Account 165","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6c56dbd5d23adb6c835cbbd950da3cbac6e104f66578998933be13de8082cdad"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/165H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yty93sullm8e862mgt2hkymm4gga20yvklwxe92fyhgvyfahf9p9c","displayName":"Account 166","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ea2b12ae08f2ce4a01cc3d8b80ddb589a4b5aeca5fa02cfda27d3a0d9038e3af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/166H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yc5q2huelr7pwjvnxe6mrx6chuegwatlde94w8f9dp90nszmcl63m","displayName":"Account 167","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a99029ab741a425dc5ffbfd7e001c540ca1fbbf56966302589f7e0887564fae7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/167H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vdgy3zlxdm6a26l89tuhtl2tgx0n85wuaygngfw9fv94zkp920h5","displayName":"Account 168","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"37df16b44c9c484feb9c04610f0b50c8c2f2546a4d61ad4e11b5e92f326199ed"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/168H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128eswuucx4mhejqc0y8guyx57m3j0ht6h0e8wp3rff7656v2u89hac","displayName":"Account 169","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5095e2c16658afe82b88b9653ac59156dca1b18a4c4f5306650079f3fe36290c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/169H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294t2vyuteac83502xe3eksmjgvujl0um94lt0esc6np7260u83xyt","displayName":"Account 170","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3c1b94dd2a3fa720dcc91d36fbe0531d28aad12bc7d2b8ec22c655af34362707"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/170H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285s5h6grkd8zs9v684z78qptp5tx7d5n8sgrrlzc8g5739appru6g","displayName":"Account 171","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f6a5f1b3cbf0253e90b52796bf773fcf159651aeb731f8b201a9ed1621a12a39"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/171H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xk6nvlrdu9yypjy3hhw5xxju3fv37wak3gyrcu633k330xpkfty8j","displayName":"Account 172","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"41d4f91490ab4b5c198c47fc297a463bd40656b7c5feb55e20e6004f275169c9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/172H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydpr9cm9958mk8ph05utkrcwl40ftgagwmqg3egwgqfe3a5euwlze","displayName":"Account 173","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b9c690593fbe1d62a49d0dd895191baaf6f4d54357f75ec723b716c5cbe04294"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/173H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdm62z509xsn7frqs7llnz5a55yqtl6w9aps9dpmjjam4j9vy8y4q","displayName":"Account 174","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d5961bdf3f811e2efade9948889f921d65c7f9026a597633a6ba3aaf0c4cd2bc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/174H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1283h55lpme4l08d6un8awq2pkw0nzdzz2se4elv63rqkk5m5wzjcm5","displayName":"Account 175","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"37865b70e8a30682dec3f12f2d860d933524bf989285ea81bb5ff9be42c1431a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/175H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ya8tdvm9c4msqpmc63a58hlhzx70unt397s7t6nf9ufam47yp8wwk","displayName":"Account 176","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2dbee6cd13ea486b3321146b023969b7d5efb6625085a1bbf962a162e6a3df95"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/176H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128gn6gglyvz84rjqt8n6m5vkhgtuuzv7ytf2p88tm54fh9ajxupvfu","displayName":"Account 177","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3877c8e5ffd745066d84f69210244556c9277432ce93f6be238c7377c47e1c4d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/177H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rl62krfmsx0699jas986g0njpjjgtpxz0pxsxa6n6nmmhpavwag0","displayName":"Account 178","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d2dd3b1ff4585e2b86d624639b0b43b217a64dea98e940f1fc6523a6295d8424"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/178H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128j5fux3qakrttg4ruk2hczcfrkzzmqgxc68x7829kz6y2fknqlvgr","displayName":"Account 179","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"981ce2cea02bbee49222c5cd7643249829ce3502166b55f6234df2258a7e1725"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/179H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128aa5vxwfchhrf7v70jszxy59uu8rantdnu4spegv2ffeg3vtysceq","displayName":"Account 180","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"58e5a07a31019d44d09d3c56384e1f2a08fbd8e2160e8b01720bbeae1a75091e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/180H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7jgsm9u208kgkq5350k2dwejauje3slme4c0zc3xddxj0nxydz8j","displayName":"Account 181","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d51001e2a84f426303a5ffd279e048bb28de9e9df704a29ed58065e26f83149"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/181H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128xv5hx4az67eup4tpcqe9zzefd8g2j0x07f0qjvdx2jek948d4uv8","displayName":"Account 182","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"57ba6d49b74e62a0a38bf4d12385a38b4e45435dbc12bc31126faae84dfab234"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/182H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xt229h8ruge07tfg8p9rs6s4f2kjzn8x5yulk0k2mnsndc58a25sr","displayName":"Account 183","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"56b929d4b0711437c4675e69ef51cd45ae843642c81629c008a39738cf412c73"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/183H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128p5jfwwkz8sqq99vcmpqq29zavllkrgfp7853a8cl5y6gxu3mystl","displayName":"Account 184","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c0fad7286845c7a28ac428736b9718c1e16114745ffe0f9ad07d35515ad38598"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/184H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x5n570l540fl45f5gg389x54rj8mfjsk2yq4tdfdjhke9kuryylr5","displayName":"Account 185","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"40635ef300d6f85eeb8760ab03457f5b62f8906bba4ceb644da355a18b54abf8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/185H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgqdyqh2mh7kkjycjypraz7m6a67wrsmgw0r6l6kzadc5ulues2yu","displayName":"Account 186","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b9a80a5a8f0191c68ea82d8f67744ce646538f2dbe30066de4871b98cd1e8505"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/186H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ysre2tps736p9z7a964qdnt7u0hh0zre85y65ssxfkc33xmsszvje","displayName":"Account 187","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cb75d580003d5c5e8139db0aa33f336b9c6027e6c7601d50007d34257814381e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/187H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292769f2egm5ne5uejwp2hajlrp6tamdlcxdmdxc9wvppnaelljn62","displayName":"Account 188","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c6824bed1327f14842487d4ce0862e7c843f1f250dcfd24b5a4100922f44d38f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/188H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dykj0zdx5czj9xdanxeyfmx4fj6efz649hkm82l4wrnlhr4j8luy","displayName":"Account 189","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8ef07b32b115687fdb599038ce69f5f6c05e615042f38607c01aec4280181a42"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/189H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128lx87na2m43uhwaycjt20xnjvk8ew543xau6pdaaxra5tsf0kctf2","displayName":"Account 190","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"09b6c6f34f3d0d905de87f6b576eb72d5259893fcde5fbf0adaa6e16a1e5be8a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/190H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9srdljc5jcv7u0ykpuef5mzf3cxce5km6n4wxh6ylkz480p3l3a9","displayName":"Account 191","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"43ecb37856ef1cadf8c9f84eec93e115b71f8103bcc172f6a3ce53de77a35efb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/191H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129lz2j37afwj06twc82rsfd5kg0su3p9a36gapt6h5h9pcxqe4dcvg","displayName":"Account 192","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"124015320c1a7c6dec7418175ca4bea803279d74d7e5c0c94c371d67abd45760"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/192H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128nqfpvduh9hukmz29avjndd57gjnywzraajna9fl7kttggnf5zgpu","displayName":"Account 193","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f8841dafad7e383629a15e579162a8a98dfcecdf7cf2ba15af9df0540f09349e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/193H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqm47u08edsdc7v2cm4eery36j5fg8rvdun2h3w2wl73yqv5gtkrw","displayName":"Account 194","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d72bc8b25079e5627b02c5c4579943350cd3f70d49b8f9f6eb05cdc3c7fdf9bf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/194H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129hdx47g02hxdh2tstc3z0q4dys0s0mpm3w57nlnf5smj5jlgn5tv7","displayName":"Account 195","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"968a9cb14c8b6170dab0ea1ed9facdc8fe31942d85ec7bd00b13f499d991a640"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/195H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ahk2cnerp4js6thqfmlk56xdvwk0h00hmsfpry0clx80cevzz94m","displayName":"Account 196","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d1ca0e7d43678e23821fb97c0790547be12f4024c89e873572c8771234110e12"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/196H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128favvcvz5y5m7x3jfkeew4affqxal2edx4plp2hr7wqtph53q2kr4","displayName":"Account 197","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e31a0260fcb585eb4855d47b6875b99a85f976ab8d984d3b6dce55b91feb83cd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/197H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7fnys9qxc3mrfg2as5khjgnhggnrzp6j373f7l3q4gx46hdntemy","displayName":"Account 198","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3cd75d32c63b45721bf710416f1a0aafc6f8970bcf125059c2e80967c6c15464"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/198H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq42zpwnz9n6tqc5w8xc94ar09gvszlx8zujt6uv7k0r0ykxns46j","displayName":"Account 199","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0affd80828f53bcca1216834cf8eef5a83b26f11d2cef548ec21e4ed4aa612a8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/199H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128mspyhpagj6gfdl5w90zh64m8lrpfptraaxk2ajl4hmz83vhdyhnl","displayName":"Account 200","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"164d46227015a0621acf9bd949e608062e48972232a472ecf427f2ff1cac5b37"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/200H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xmcycnt7y4pqukn840nszwfawqsvzzpc55wx8dk5dgt9ql8wnm0wk","displayName":"Account 201","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"04bc01d63716d01f77da7eaba1e1d2cd715d900d0c4ce58ce42fa7331b7d9cad"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/201H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8zzu3qm2n282r8jddnpmylw3z89fwdk7x5e9yteg8fnmkyyv8a4w","displayName":"Account 202","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0ca67fffdc0f4cff3c77f33a1fdb4c503b26c4f22d66108fc4de27fc07b79353"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/202H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x50z4pkam8770g33mwp2vz82md2uuag4wa3xswlzqg08fgh2dy7z6","displayName":"Account 203","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"93eec539cc066caa0867dc362945e59f5354c90a25311299d2f97b69c076a3bb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/203H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7u4a7fea7nsasul8xdjmcsll55p3mfy7s40gy03yf2g9dfjvpvf2","displayName":"Account 204","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fa49304bea68f5944b2ed192251d2689a7c0f395e59b56f5d44b7e4551b5f929"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/204H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y6y2547jw7ymzuh0ytrz93ejm662kuqguq7h042lk6p4088lh4nkc","displayName":"Account 205","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"563335238903182ac79ed7c08d0a0b45a11c0c994cedaed1f0e87010a37d8cf9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/205H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydd6fufwznfdrd9cne6hp6nv6jtamafmnpne0987kcx6wtgh2ge2k","displayName":"Account 206","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5819877a04e09e58175cd3b58075441678246131d2d9574be6fcc69e4efe86c8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/206H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xrd5a6tfc76mzm7axaz4gl7sjnjnu88l2adsmrl47m92yvx7mlny0","displayName":"Account 207","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0b44545297b51bb2022cc428175a06198bf1b5444889cb37ff9fc336ed49b10a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/207H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128um2jnt3t083gulzemr2k68jtf6s0ag3628fe4hd5pwjg3x9whnd7","displayName":"Account 208","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c1d9ae15e915feb73793bffa1b2524127cf7a63fb4e625c3c8267164ec7899d0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/208H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129cuy5gn6t3k52km96ltnjasmw22urhn6myyjkljeg26j8cpxxu5dg","displayName":"Account 209","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"da691a2b564a6aeab59ace68e17602ab166d68568d3c2515fc99510e49c73f83"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/209H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m489sz4g2m2h04w2hup0jzrqmf982d309zzlvlyl94m9t5ze2t22","displayName":"Account 210","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bb70fe3a19ef7add068bd15bf78cb8f905c2a4242e2c91e5639e86265f29afe4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/210H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlpxy4uascwpnvyveuea6zv7g69erc0n5um5g532jgyawg3pzqt2z","displayName":"Account 211","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9038326b18ae75afaf52bded2628a00cd61d297808a9fddb06ab66f196dcac50"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/211H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129lmu9pgk97ye6plc4g5esng8n9zjnw82xt894je7en8rqh78ud6rk","displayName":"Account 212","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fa63385f4387172eb4129d5c077eb3acb3eb5d41bdaf075e414a31051ba22218"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/212H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yj97uxg8jy40gryrz75a5wl69rh7rxlywqgdyljwxe22hps0fmnyd","displayName":"Account 213","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"767cfa8fa6bc0a7dfdbeb6c948d5cfadccfc89ac55a640acbc88ddc70b419587"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/213H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9ar76j6gprv7tdedg745yxj6e9jg85w5txhergxnl2pvqtjk86fq","displayName":"Account 214","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2f0d68c129a7077ff358161755e50327ceb8b881714456fdd857fdde2c40bef2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/214H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9n3t3hehjcjzhcjf4jh67erpmkafgdk39630cs9f62x7kuq0lkcz","displayName":"Account 215","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2bfcea81197deb06d36cc843489ba6bbcc4e0e670c977e85b2da40896d8535af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/215H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rm60899zd2gxl0l808kdzsrqzdpwjllst7vxjx9jj6ufnvx9vw9w","displayName":"Account 216","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a861cbb4604cafa06c0ed194c5236aecec2e76b5f42bd2022d6d11d19befdd77"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/216H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128r2nw58avemhw56l280c57xrz2l84c98q9nt5ukrdt945q6h6fn2q","displayName":"Account 217","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"be62688ddee8d8295a217830a29bf1238ae9002e71f5984f6c46fd93373a0675"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/217H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpdksxgrm3nelxa626mkyca9nv032xx6s9jz47g8s9qphnauzc7sw","displayName":"Account 218","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d38b2c58f340b83d658b37b29ada605c6752d28e1c165aaa3c4493d17cebba85"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/218H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296nhwh6cacefk8el48yf5fnwevgmvncr83sumukt395thattfux4p","displayName":"Account 219","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"095d8a285d5f84314d724dcfbc44ce7f639c56e99166dcbc01afe42bb9b196fe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/219H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kwmetark6nts50xyekcqwpxe47wwrnxankeuwhx8zmjnh23flwwv","displayName":"Account 220","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8cc64c122c01753cda101d12ec8fc61977836e381fee3e909bc873337f944b9a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/220H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1290mquh3shu8l7ket34hh7gckyz2q07znrfztkzrqyx5hwpfca9gqd","displayName":"Account 221","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"abc9431095414015c710ca65adea5422314f8bd5dda4cc50ec05377880218f42"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/221H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129de90esww40j4z7rmp9hhsumh25e4uujmc69fru5ta4756esp6mwk","displayName":"Account 222","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"35e378a782a4ef66c7ab4363439aa6c232893cc36b8494d3bc899fbdc3254a3a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/222H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpe4zga7f0gr0hhe8n5jpqw39waganmeca3sp025z4jznsa7vvw96","displayName":"Account 223","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3eada4fecd0a9db2fb78bf36495ac8c8b8ce6526439db179e2b4003117cdf0f4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/223H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ukrg6t877dcjp2sxc7x0a4hq2ntu6gxy5wyceq3czs9a8p0r7ml2","displayName":"Account 224","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b613acf165cdbc703c91dc8363be549e14fb7de3c900ea7313ab2cb3365710b7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/224H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12946znzj30nkfgkd708yvkjc8pm7t3m8hmdm9tgslyr0age5lpjhgt","displayName":"Account 225","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d4531964230d4c1f0ab176a7047d1e45cdd4dca28fa6c925e9c62dc580cd21ec"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/225H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128upyl20tc9ltekqh42j8xj3mwneq482tzsd8rdl55pau0ya5l4uqx","displayName":"Account 226","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7b799028a719ae997a849def13ee82571db9d3fdba7da3830db45ec9eac00459"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/226H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1293q9vp7scxe99g6ved0ryg8k3xlyg58nxmnrtzzextnx0xyjk4n54","displayName":"Account 227","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eb870426460ef7d883c3e9d6d41ef9b14a9c6c48e389fc28564574516ee5936c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/227H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128avwu2y227aq4d5xjwqfzaxfvr8uh4q3huclv43ke9nwzsgv93mxz","displayName":"Account 228","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"efeebf3e728319c82a2163d3998a2e22b6a519a8373bd3b45b12811dad949724"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/228H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128gdua3c9l6jrhv2nhjl0y274khuuhvu95vr2tve550ugamquvxgkr","displayName":"Account 229","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0b3780680670add125a415f825591a7dd72a35de8e725a1dcdee743dd343bfe4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/229H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ek90f6vhnpeyvqmzk3mg23v3d72k72wgpskpcwsyxxgsu8w3445h","displayName":"Account 230","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f3bbead6b71653f6cae512b8c15a05bd7353bdba9e0faa1f5df6d22c7ab0ec1a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/230H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129897m20lx636kqcx2phupz9jj68hv5xjz0y4l049quhdhcueapd5g","displayName":"Account 231","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"642be59c5925f5e4097c00daf829da5822bcb178bf7441dd15336dcb83806bc5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/231H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ycgxgn4j6zz2v3hdz06vq5hd9h4aghau4e6mms3yw7g73jz7ywjtv","displayName":"Account 232","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"43752aefd9bcd853f2421aab091a4dd383a7a77df1a9b69ba0b7fbb544e58685"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/232H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ypvfvy5dp4lpqvw7jvrft6vuvtzw4mswrv7eegj5yn8fy4cfqdhnn","displayName":"Account 233","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c5942984642de1e5ac1ff7010dddf5970a416b42184155f054ca7b81740a372a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/233H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq77g035dpcgt0mhgl88fvv9a2zdmzaxj947yut6hkkvkzj4ay6rz","displayName":"Account 234","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ad8979d5169c0954d5c535b72b103b00fbd1ceb9d13812d76c30d199bee461ac"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/234H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ac6ngu36n2ydhwcv2n7w7q8zxqw8wp83nt73hk5del77h8cdjw3x","displayName":"Account 235","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e8eb4601e6476766bbb74aeaa132f719c497f59f49a48614f60b61c24ce3e890"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/235H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xs8y7r6cjcfjfa3z32puxg2dyukq3ulxpccn360g8kr6adyx7hfcr","displayName":"Account 236","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9a2b00f85214112789dd22bbe7d0166a941b2b8c541d882883272804f71d8cb7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/236H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jkwhfn27hpud8ct87tayjlle7m0d4vddzzcaj93jj57vhun832gx","displayName":"Account 237","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"001a94618c39ee8a6e64c059499259e7cf97084a09992e954fceb0263b6dd7e8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/237H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128qjk4979qcghp26has3y7jyw4eswzaufrgvy82r039z2g53w9x5ce","displayName":"Account 238","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6fcaea5897356de7f3678025dba4f5e9c2ea6182174d2b6543859a9be7d1316f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/238H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289lkpxqzfazw2n9vetpynnlewsul87g6kqu9x87qd9n3x0svsvwdh","displayName":"Account 239","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e188d214290b034d6267c1180a2dbf50081e045b643232efdd0a95595aeb116"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/239H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129sk6xqrwxkrnjkwunh9284p9a749c9tzrkgzj2hnhqq43ef4nqlh7","displayName":"Account 240","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b02c61ad7d6d4d9676995ef125121fc34221c472bf237b20a42f27a5ba95ff59"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/240H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128tm66z76njjz7sn08kf7tct4q7ynuwyxg0lfudgnc46ue6nurz0u3","displayName":"Account 241","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"74c9bf0e4e40b0886d89553e59030660e2473d8f47036f396954ceed4f3b00aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/241H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129esvrp8yll2jg48y9sz5ck68qyckaw59448ydvq4h2juv026qv0c3","displayName":"Account 242","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f88d14aaa83084f4eb476c1289e22f8e61a86c7e74b9979a957f49e53640b87"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/242H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zuzw48r6gs4tst5kk7ygja8mld3l8g9c4u8lsth0vwyzqm4ung07","displayName":"Account 243","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"304b90fefc1293001a273bbfa2fe4802146080f924bc80d9f5d7f5d300eba0c0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/243H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytsd4hu6yaddx8zawzlhtpzqqshrwvt5uky9kjkga9zr6l4q394qw","displayName":"Account 244","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"129ff82ba9d094f481ee32c9b3b44a78d29a7f5ebed457ad127fe045e6c56047"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/244H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3qj8t528spez3ahu93sqxf9un9e54lwh5sqlld3d952j3ct8yvh7","displayName":"Account 245","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"11ab87eb0a744def7566db387572a2b74443f1c2d2e32bf1c4e7d710a933addc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/245H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128lpa7kqf4d2fegqgeht8wgu24684vurdumfera7udyhv7tdwcw9zc","displayName":"Account 246","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ad4e1917764f1a89616d68407ed8d05ed9604b24196562f7f964ec07f24e0e84"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/246H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129525wxy8x5qga2ze33wrc2u5rnrm28wa4gx5vx6fcj4yqr9mn2vt2","displayName":"Account 247","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fc02ab5b1d34e17a440319d79e983624677072f5744e4a7888d5104bd8df1a28"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/247H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xt7x45rlujvd02mx0kpdt4m29lahn86y6j7z5axz73n05486jj8qh","displayName":"Account 248","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b0c3f9180363c68f6414dcff86306072832ca255c66fb6367613ddd15ad0d91e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/248H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128l8cryeaxr3zv6wr7qj22h3ppr2r70tt8335qnr2y05xv0ned3pua","displayName":"Account 249","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e1eb4a80537866b61d37b572ad9ff8eacebfdfd7c967002299684a1370b3bad5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/249H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qjakykah86jlvqd9f745pkchv96m8f423mnynw48aj64v4vhljd5","displayName":"Account 250","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fcd615c948f04289b8b2dcd1a3304122d0c5cde63dd2a1b9e4ed22a51980587c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/250H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x789h70zc9kl23hqnyjfhkr4helh995684c7wnz4cfraucpxhlm5h","displayName":"Account 251","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"39a10d4f44fd1592549f10b81e2247753ad5841db2aa7a295373b9547b4e50bc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/251H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xegm3kt4dfkprsjaa55h838e68vepg3af5fgw0cxmhglp89urvzr3","displayName":"Account 252","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"305f178bc25c2cf2e992c057bca776a6a41bf21fff026aa8b8ce5387600d4199"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/252H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn9fk0urwqv4xdc34ey3wj28r98we9adx6xlwtkrqdk0dwwc9x4dm","displayName":"Account 253","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9fc0aac5549760d6b3df9911c852c127a76818d8b72994fd77ad69fee6138808"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/253H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286klu2llv0uysak8890lakj44p2ap3en38w9suu7l4ealetk8deuy","displayName":"Account 254","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c7bed8656140dc39e59377a50221ce78dfcec1317c450a39ce6819b88496d426"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/254H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280glejer4kq8pznucvf2l6ty0dr2xahsqggv2xg7xhmlsrjla9x89","displayName":"Account 255","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f687d78120c1bdb6e63cf0fb1b6bdc3951d9626c4e553167b073aa9c18fbc751"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/255H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqvptptry092ztwkphnncgpksrjukhamwnya6j8ydf3m3sywmfaz6","displayName":"Account 256","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4cc0e3754d1c676d3f23fd15cd916f200b5eb07392f2ffe58d83b7e713f2ff6a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/256H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uj80ldraqgh9u0e6e3r4crfrx9x7epmsxe0k2a57296x569q37s3","displayName":"Account 257","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c4fe4995fbcebb72d136a031b30480b3ae6b49d913408feb6395a980dca4e02b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/257H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129yqt4nueyahhnm3w4s67k3zawgpfhekv0rvg8s3drfqw869qxyk3z","displayName":"Account 258","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ad228d69b6d9c34a88752a0029a76902813071ca65730a947b7bcd2a6309efe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/258H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsws8k39kpm8fpk5mph329xvfzz4k3wykvvm56d8kkrrtte0zl60t","displayName":"Account 259","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9b602c27ab051c09e47c300361a940c1984f3d4990e335ffbf03c3af6f882878"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/259H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12930duxg3dzx94jqh8e3rf7n6j0ggy682zdm8ghx9ludqkl95aguyw","displayName":"Account 260","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"baca2ba2ef615f69f4c050a1a2b821b3d703e866a55e809c312ae7e5c00d59ea"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/260H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ftc08vnxqu5zr57rqg70knuncj637vqgh4kqy2tq0hj95qrwwvq6","displayName":"Account 261","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7313bfd3426deb6062b7de2acaa23e7a657c8e011a5f40ec4185c480b0ed2cfb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/261H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xrf8cwxvxu4560eaplzu2z7j2aln88j9jxx60kdsj0wsudvyy2q6e","displayName":"Account 262","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"efc5f055575908ab1a4ead891b3682185fde9c442182641f2efc2a9f80ad0ee1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/262H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yucx8hscllmwwazp9tumd534k4qq2ujcxq6r4gk7csjrgk0yzl4sz","displayName":"Account 263","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bbd70c530bd94711d00c0ef59e3e6dbb79f3a162eced4417cbb51b98c7e14a2a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/263H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wc3skf0tcg05uudyl6rqgmlyc0efdtkadmnl4eve30kkqcrqu3ey","displayName":"Account 264","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f533d1d983f41c13eee72bef0f01842ab9b6c6ea47a6e2c2ee684a57fd8f5481"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/264H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129m2cetgsdu6ru6p4255nqmyq6j94g67q6z660fnlczl3wh380fgfn","displayName":"Account 265","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"721f3ae34c4249e5d4659aeec10f36a1a2e1ee69f5d83ef68cd4b78ea890d35d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/265H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yyhxp0w9d8gdfhup7xgu0y0zj99lk7737yms2ph0elckd353p4e65","displayName":"Account 266","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ae8f4b5e23444b5436371fcdb0c112f7b2dc1e7d9f3f76937408d5cb451aeded"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/266H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3ykp37w44fd3xaalqtmzed3vqdxchs0mkak4j5vhadd8y82clath","displayName":"Account 267","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"584bedf76e19f47ff8f8eeefdf3fbad30562810c6e225800dc213f16f50f56c8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/267H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nzq8j98ku8uj74dqxfywsr6ek75x0xmdjryvylugyv8mrmp08u8v","displayName":"Account 268","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"353cf5b0815b4ccc52329568fe44cd98df397bc19915e7034f64febf8d7a90e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/268H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yw47t4czyslxss3594t7kstt307r93nwhc6q95rmrwy0n38dqejt5","displayName":"Account 269","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"948a701ed3277e8183eeab140ca6e59aefc54e2db9321e7375fee56939c63e74"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/269H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yd0j4lvpngpxv6u8cpve6n3t08mtz8jt84tvkfst24gfpyywnccj4","displayName":"Account 270","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"14c1581ea7be29f0a55a53283ec7f50e9d86fd09832c9e26e44badae69f797f2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/270H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292ezfr9yjluazryg33cpp26we923fw6wa7fpnah6kt49g62jsm7pz","displayName":"Account 271","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"af8df9c110a68272c1bbe06c2f2eda56c2ac597c9b0d6faf673c7f042d38490b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/271H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgmflfvjjgfqr4ueg0nx654ggn6seavkfd7mt5zs3tmfu2szm9zch","displayName":"Account 272","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4addf7faae3cd9c75d28bbe920272105fa15f8d14439fcc410b04e174becd3e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/272H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dszw950axvq8sv5uxvuj8rcnzsl0h4a6tc9jvvvcpwkwvpfmkvqx","displayName":"Account 273","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8417a359ebb1d4a0235f0769a86e3c931376ea679971b496ab97eb6b3d89021f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/273H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yj8qk34lehx0xzt0gt7yjr5dkvdkr3kcszhx6j8aref88900vavdj","displayName":"Account 274","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b81b2d8486038863a5c41488ba0148ce242eb224db5ad2b13ef7549f444060a8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/274H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yztzz4cxdyfye2rpcfw549vx3mltas8pjw3uxmy28km439rg0m527","displayName":"Account 275","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b8701d956332b6c9730897799be9c3a1d7907837d928a01735ecad915126a3ab"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/275H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yaxx2tz4cc36p2d42w8nr0zl09vazte8edcmplu55zt0meq7xtp6w","displayName":"Account 276","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"74de54adf7a8d34ead47b784bd99d1fd5a26326c4a91b3462658d3f62c3cedf9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/276H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129stv76sxrd9xagwq40acn2j5vgcsvl2y3vjha6s4u4yrnj4v097pw","displayName":"Account 277","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b1d9ecf5eab02edf1b7351dc2627b3c4bde0eb644179d71609b25fb32b07e824"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/277H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295jn7mmas9nv3lw6d43p0r3ruay9u55gpm8u5dpqv40sn72unj6qx","displayName":"Account 278","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8d206f212906883a1a8c28868e297c0c49ae747fc1ff3bdfb8a39383f708e563"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/278H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129lcw28aef6hrupuruyg3h5u322uggvz9xnet3dvp8n2en0akptkh6","displayName":"Account 279","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bc0f9a31e9870a7f3415548792e3675bf03608f7071efd8990c69e23e732bfb2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/279H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgyuavneut3hjc59r88zg97084p00v437p4tdnecg5r93v6fd0qlq","displayName":"Account 280","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b9238c90fa490c14756b14408628b9e70d9455a6975a011217105857efeedb99"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/280H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yj4c0j68agftd850uygcvdeumx3avyrk5w2mgelhdhzcly2z646lz","displayName":"Account 281","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8f54db3ec19e008b645764bac51ab74058b20e4b6e878207abbe8370741503d9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/281H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yrgrmyaa6xqf289q8jmypu8e5l72928a9ytqe4jmgeve3dg7m0s43","displayName":"Account 282","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec59fcecdc22c9333205f563e39b4417573958181f905e15a311bff01baa790b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/282H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129sxp9tjdn78g4azle2grrv60vqwwwsyt4yu4qvjkmw44mrcv7x60p","displayName":"Account 283","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"110373b00ee97775afeaf6609dee7abf2f34c1e3f97cc18556d44aa26d607de7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/283H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yd4w5y7gycamt5082d8dnprezyu8u7l4ascvgumce2tl7x9r3r4ha","displayName":"Account 284","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"daee8a2c3f0f870e703a019678068a7dee14e83881fe2634d58e08cda879e198"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/284H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1288dtn8t6974udswzl3pj4r3q0ctd5urrhjzzl4u5lvlfaa60am69g","displayName":"Account 285","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"94cacaadc29219602587f218524a086444ebb365969cc6a4ddb5d7561214ea9b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/285H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsgv2x7k024tfk6rv8jw64rzeh4cumweeujtn0vpylnh8sn55f27s","displayName":"Account 286","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e623c5d0be72db9991d38918ba5a4b3dcf0c326d999f1165dde06b93eb587520"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/286H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3greugcm2ft2chpmqyff95aq2fck6heqsrssfnuv9m6jfx8prlcc","displayName":"Account 287","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"76330e4814c43247a1b14ede523d94a6ec498d41a718403001bfda61f1017dc5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/287H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128yhka68rpj554zgkrswn5y4p8xjcfshtungtmdm772789rc0d3eh8","displayName":"Account 288","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5225e6c3437be2697390aa0c66e39967f69a9d4ff7a75207a541a572abdfde72"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/288H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128msagx7gatl0dmdk5mjq0ct2dpx0jwz2m2nrghzms2a8dvnwqkwqq","displayName":"Account 289","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08be16ef5b4ac60bdfbcb6b3a4dbb6f0005ee0c52ac342b03cbf238e3db14273"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/289H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128r4v4p99k3ycpamp7zvjzv0r6u0d0zkxullehs7tzkcful39k2v2l","displayName":"Account 290","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"89cb83776240b3a651b3e21fc23325895e43f4ad8abf1c34ee7957bde7b41031"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/290H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xrcymhg7gjy8cwmqp7f580jpz5nqchryjm00hn0ppe482rcq8psfe","displayName":"Account 291","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"88ed9a8b2bb4a4a73360cba213ce9a077fd8b959a8b845c08465fa3caedff09a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/291H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128qu436kx2x8v0lqzy82hswpl99ky2wn56z0d3q9v83pvfkdey5zee","displayName":"Account 292","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"517c6ce843bbb57635940fca3392c7cfd9c113f253ac0ec3b6709563083f3500"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/292H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295pt4d35nm6ul6tzu9xp36ep5kpeve8nysydxusrls6fnetx6vm6u","displayName":"Account 293","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b74d1120e31e9efa12f882febb2dc82c1b209f312f0fc0314a0662664fb30635"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/293H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128yul9f5elv8mt0mqa2pkdw5gz8yvaqzhfz4esqaq7pmexvjgk0jmf","displayName":"Account 294","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b985e6ead09dd2370cebcd07209da25dee1a203f24689eb6a24259a08d712596"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/294H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yahz0j9lpdseem8krqq63vwvmvcvxre4vmrj727kd2v5a9sephs27","displayName":"Account 295","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c29eced58934272e3af4a92804ea8a113ff80c7a20ee9050f9b750d9c7915ba4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/295H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ug9cnl6lanzvguw78gdetmkx0duynj048eaepmgdyfrtgspl67j9","displayName":"Account 296","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"82d85d46ed458bc319f000557023dfd96839e1c3bc61e2f1959d1b7d993df755"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/296H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kt97j4v3zy8s25tkn2eeyrjp707dc00xmlmfkf2ssudayahcgefp","displayName":"Account 297","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"59b8b08265280a6687acd62b21405f170c149c170ce32fcefdcea499fcb7a923"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/297H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285n5hafqdsjqnq9mjvqtqcqpvs30spygfjvtnz4z4gwypd5rtasqc","displayName":"Account 298","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de956a11b1c91d18df72275811871b1fd56d61f822e743d2a141190f2f9f2f8f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/298H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289vme7rxp05j4nqt6j4he0tmf05lvsyrfyv35kahmy66hj9de2ltg","displayName":"Account 299","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7591c356a361d3320b64780f76afe65a9abf9ad12e27d294f132a6a87a5fa2dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/299H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129u4cyt8rez8l6n47wpex2e7qmevs4zrqea0ds9mmzx5lchzn4088v","displayName":"Account 300","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d1aa6d07d59c8a9845ca8afbf2fd9e3a843dfae2605ac5c6fc0d56169ff2a380"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/300H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289gm2ftsdd9l7ap8stakc9vk02g3rmejyjk4lpta93tv4q7vqyfqw","displayName":"Account 301","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d08666d6bb22b376cc3ad3bf339d1898bc68aaf77f4906b7f6be4b3eba0770da"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/301H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8ylu9dhextyydzjyljekaj0smsmk4qnwuf9kudn57xz9etdp36kz","displayName":"Account 302","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"989e498b833a95ddd536918e3a1c6388c94dafa26d8bc7cce24fe05e2c1512ca"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/302H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xts3p22jqjqryujjez3u749q9jxahn3ears27ktej5cmrgzezs5zu","displayName":"Account 303","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4550c285f9dd08d54e5b70365c900013dbfba04a1f0bd0257f3dae691be236af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/303H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jv200p3esxmsjd5ngjg96ve4ncgnvw6f58vnwk00nttf2h7m9qmm","displayName":"Account 304","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dd173492b6310a3cb6b32dbc7ae7eca49c4f591e718d831fd82ac4eaf67a69c0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/304H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y5uunlxg9h657jhq62rcy380xv0ddct6q3el60pyh6nzvndww5awa","displayName":"Account 305","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5c2ecccbb78cefc31a1eac570d5fa2f7f4ab1a4816fb095c081baf63d6f97323"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/305H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285pel6qu2guufzapa6zszv72quzyj8r50p3p3cm04a07jhzrr50z7","displayName":"Account 306","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ebe5cd99815165e87661bd493123bb771cc3344529459d92d71aa3f5451e3055"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/306H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygepy75pmmezjzdajf3cr3ta75gtyrxfwldhq879e0lkhwexjjgrk","displayName":"Account 307","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"10f869a95b7d68ca5e61544e8e510db18bd15e5f1831836f1881cd2af44d73fd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/307H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128mrhl7jmhwjztvduq0d2yqq0gesr9pk50ssf3knnnf2dcet6ksmme","displayName":"Account 308","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f7c39ccbc2ea9654303b5dbfc69bb398e65f57a91d94aaaf8978e6f02a173af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/308H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x638nka08ndafh3xvkenwsyme6ted4alw6vr3slrym4vmltq3e5yf","displayName":"Account 309","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c7b632a05a019a05dada63b54b97406daa3ac9fe15b3bbe0d569400684905ca9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/309H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dtf5egpplwh69ejvmaa2fklcyxut2jw70p6924jpm7r3chf6dkts","displayName":"Account 310","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ab2b32cd1d2e979727de30374c7f319a8e665e62f03b011fba67245ca38a5f40"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/310H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xr840hj35wcp622f06le78ze7cgquzm7nmzzkn80s6muj955ay0aq","displayName":"Account 311","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d0a021a38e29316d8e876f980522ac51d3e27049d2e6754d074858ef8ac0506a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/311H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294jq6hjyuuwf3c9g48aely7x2vaxffwlq2kd79grl77a5gwgzp0sc","displayName":"Account 312","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"beb4a9b11faadafc7e821fd1a2b473b06e7c4171354988856ba198d85c84ceee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/312H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vfy02npf0k0yutswfkyzwq5hyn4qepn26mhn4ljj83dknl3gwwn2","displayName":"Account 313","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8d8e57a745f4c64c10cc33816e2a486fa99a3fa26b79ce9425c4262b661f6d67"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/313H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0nmk4kq5nuxn8gus0r8dywdwuzu6kwxmcjjsdwnmaacfxav5gmrw","displayName":"Account 314","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7611ce0b6d5c0c0061320c58c68767c86df7d75f077459d24524fb6a3828d15b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/314H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xnrep45n4mws63p8s7ks4wn6hxjmjfa3c68gw490tckzrgv3juchj","displayName":"Account 315","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"310907827090570e2ef8ef1a0713f89e8ca2a87bbeb97f37d1471507e657e46f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/315H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvm3r6c46kq2mlvcmrg77kwx23xmw8xjf2lddqmzkrzw4y0fw885j","displayName":"Account 316","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f5f218f72c92f5bb46be3833284ba95185b4fbacedf17a5cea468fa501aeea42"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/316H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128xzh55jza4qmrjyrrz304n097k29fxm3jv22473r96w4nqepmvxgj","displayName":"Account 317","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3fb9099a3004872c6cc66f8b4c1057e479b3a14d05feb5c66a793d5d33edf5ac"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/317H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ykjlqcp4dk72dqexms32wqrmv85pczfrqxshk7zw7md0ca8tdglsl","displayName":"Account 318","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2fda3e57585fffb2d731a55b479cc550fa20e0ef4a2dd2ad8a451cab5d25d6d8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/318H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x7vg53894v8c0s6eylr9ya4c0lc8zsa6t02erxl8fwql8p5umqvkg","displayName":"Account 319","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"05ef2a8ff893cbe0c404c5330bd815993f58babe3467a36bc64004ed19dc7742"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/319H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4v4yrwqtyav5n22puyl2jnt8ghljzhxxxld4hr7wge7zmt6mhrdh","displayName":"Account 320","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"560dda6a2ee4665f9d50025ba057a7b75ed0a10cc18d73f9cc71f7f4bd26dd74"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/320H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tsqjeu2yvx359vxv8q3zhm0xyghxaqeg53806zqfd8k0zrdkmn60","displayName":"Account 321","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"65b256bc9a720cd9cce45c2a8f457a1f487b951ac8c522ceef10e67cd6698ba6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/321H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ypkplqcscgt36p7g6706aqunmd7qrymktyh5f2n5t9nf8sew25ak3","displayName":"Account 322","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ba3fbdfde2af853d08f60f91ba0248c6ba1bb7da42ae8a593b5f2b9b10f6e2f9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/322H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ndaqm9u3eftn7gnjggwmykah5rk84tuzculjhjnzap0s9f8qmc3d","displayName":"Account 323","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bc0c8663bb12ed161061322997a0c242a9c72f6b951d7b147f47ee73b842ff37"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/323H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1299a9ar66zesdzl72h44dy2y0ty63s78g2y6yvnpffzzwk5us8a0h2","displayName":"Account 324","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c7f76c85bb72a9403a4e1eaf71a1fa615f9e59a611c3a96a4c7780294eac7e03"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/324H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128a3qd2xwyu0reyz9r89uk3eq3492tehgpfc7tshxw7n6kadhmuygg","displayName":"Account 325","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"70e72a5170e5b67f01706f8930425cb89db5a4fbb35a3c38ee2a873f15126126"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/325H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vu4l544jn5w2vxclr94zttmwjmnynxe0mp0d04mfc4yqg97rm8k3","displayName":"Account 326","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"31533d50bfa1b609e3ace55284d4aefe1e6ea619273503001918e579ff98350b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/326H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129l3mw8zpagqveje9x52kx0d3rpa7tp93m5reknylyzsx6k28868us","displayName":"Account 327","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f168146e19545b067afbb7b65d4d02eb6b16e0a9963384524c654e27558010fe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/327H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12892hp35d7fhkyh2ettecx63r3k6zssmr47rvsc2x8wha2c0jdxrp5","displayName":"Account 328","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"37d69b7800fb2ee2f37c2f39777b1d87a643cd9dc8790773fae1c844b269a2bf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/328H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ylh5a07s5wa7057kae9tngnh2e6sply6lvykqnad72nyyjtdm4dcj","displayName":"Account 329","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"961bf9369c9aa0ca9401d5ed02a90da2a4ce814f63edc825988a5b45de681401"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/329H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128p8d725d9ckymm9tck6x6wggy53jqzv2jl0ex9x8hgtks65vuuu0f","displayName":"Account 330","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d58766a0d18f5fe760a7ec2eb9dea5ad158b9de4dfb9b4a9711de3ffede212bb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/330H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4xrwm9juzmp20kxc890wkknm7c9hfk30y66fa9cmnnyg3ca0ylxm","displayName":"Account 331","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8858849aadcad5317655101c6cf02086987a4ac8a6ce4839c1e950a8d2583e21"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/331H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ycwmgektew4w2lx8n2dzd6h3r8lk5hsjnwdy5qtlg52gamlekkw0k","displayName":"Account 332","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d5ee8e9b69c6cb5b89e24128547962c3c66419d7e60fc79c700b5ded0f56d861"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/332H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128h8hexd45fe6xx00nawl2hfd6699nsp7aqndml4357vmpntd407s5","displayName":"Account 333","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5e2ad39b01e232037502df1145a3e4cc6a0e3e283339945b9cd361619413c489"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/333H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhf220dj0sxq52m9lfg7ppx0s88kkmwhgm9kj55jp6rs3g22sve3h","displayName":"Account 334","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7fe2cb4acfafdedea650b380f8d5c43ebeac20facbee10287b684df595ae8e55"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/334H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xf0q5u7wr3avg7j9ame4dqkgc6par2yk33dyvp3dkucfejfsd4p6s","displayName":"Account 335","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"266f6d960583c91fe385e591015af71ffed1a76b7d308be1e1964256b5a8507c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/335H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjw4yqc7x70jdjnmkmm72karhldhsma73qfrufh99l0wh8nzd2mvz","displayName":"Account 336","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6d3117deed9c1a5b3771de96bd8617bad483ba50f8ffec326394c11ee231a951"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/336H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xu5j5h94dju0ettytlm7tteuqcx3vsntneehgqdmkx6f4tm0yjeaf","displayName":"Account 337","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9d508ae3e7227293c4cc576e0e372d54d9e348c5f6a4f23cf229f7589a1452a6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/337H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yedh6uqzj3nuc786pvvvmwg3tay47v8anwzelj7uakuqff8smlm4r","displayName":"Account 338","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d2472e45e0256045bc52c37db0b38809b99c2e05d0b88126a9482eb5a34e8d12"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/338H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12899sg3mr0s0x6y5jmj8a99ecsaehqsrhy2guzt0lpxqm8qg3xew4q","displayName":"Account 339","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b9b2c9b1795fb56cfa033198bb000d008dd14751d9928573299610503c72b868"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/339H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zk2xd8cmg5xn49dy9md7mfzn9s3vh300ur678r45x66q6z5h34sc","displayName":"Account 340","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cddd07bb422274a6883837daecb6b6b94e02d658e6f713ab4f64265cae66132d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/340H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12889cvqrr2esjdlac5arr5gfaevv0snew4pkj40xuavgtsljrypgrr","displayName":"Account 341","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c054fb4958290972587b2c91de2d3ae6896e6b36781e8db93d14e78675d26c95"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/341H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128r3qpjauqxpx0et00y5rwpd3n3n6pcattmm97ycjjja2j5xuwml6r","displayName":"Account 342","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4784b51b2b5a860eb8c0fcb84b5bb19d081468cd789cf9972d7d80167e151796"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/342H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y8y4zfut8j0ldmcjx7243glykr76t7y788umcglgn4fstty0fuzcl","displayName":"Account 343","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bc6c6fccb6473f9236a189ea3e3742ab48664abca653b86d3aeddbc345b274a2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/343H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xnapvttkz3ah6fvjy9txfjrsnzxjf3ym2kapc2ax6vh9katw0nzev","displayName":"Account 344","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5cf1efd6f1f3a4844aa37af250b43f50a0eae1ed88b8297262492e7a6387874a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/344H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x5sznmug9n6sm29vtfrzjtpx0ltx3ratylycarlclxrehgvzrscuc","displayName":"Account 345","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1de64a7dc5c5ca639a51bad70916cfe7ae95f13086ef911834b9ba46296cac0f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/345H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3us9syzlfmm4fuah39cg5flp0rmzm7ej8urd6t6xsfak5e48pkyv","displayName":"Account 346","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0d218f036c02045c786e08c59f8f1018522a7f1e6d376d248dbedd41185690c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/346H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yxl0j9cjxssz2ldg9etqe4054nnrl2g6umzte8tf7722v70cp8amy","displayName":"Account 347","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cff039401116ad2821fac0178fbddd9c455ceff474d7714699928550fc5b970d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/347H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvhdc2wmc4wfx3nfqspws80v5m2gynztjvwt34cfvl3ve64pntg27","displayName":"Account 348","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5415cc76cbc7eb7fb698a1547f151ea9de86fc1a88df38fd0853d0728c458fd9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/348H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzh6q96hsmmcn45x9hvznhcdayxcmg7kdgljzjamgutmgw9quk0vq","displayName":"Account 349","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2108c5488826face6d6a1ba3c9c08d83ca3f5bf6a65a826ebe47b9cdebdd35ff"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/349H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128s800xvgtcsaj78zhzsmrmmq4fk56gfd0a5s7etpjg0jh77g0fyty","displayName":"Account 350","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0b9ec70da7b88589dd6ecc99f7434b19c156a99f48eda3cee51ba8caf96265e6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/350H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ytzg6t6v6zvj33unxzanjl6lyy6t5sfduvlx28vye2te7fa06t52","displayName":"Account 351","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"712fa9e67462b125436da015a41c7979f626d1bb7d28b743c896d4a56eb61f8e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/351H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129x6efprvpx32nncex6qqvr85xh5vw8g506f43l0z3fjadesfg4hm8","displayName":"Account 352","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"aeb475ee74e0b7b4ae16b81b7c1a008d839dfb5b0df5ff0b1f96f621f65bbbaa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/352H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128txgusjxenzwcmug0j0gpjpvkqr42d0ts8km20m57d7wqmuppc5nx","displayName":"Account 353","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6d1050732c94628b0b60d3f05508cef82ce8fbf4ebd078d6c161965e4ab58597"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/353H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3qjkt942gsu4pp33dsjt9ulyumec0fzdmwtrlf9w8vem8cdnmkff","displayName":"Account 354","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3f6748ee9ccd038fc12a7a365cdcf6236af5dce800660d15804c89892eca6f1e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/354H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yj0hgxn0g6qcaaysujwnx7pn9g4g6d0666fxdhg834rskvskwk702","displayName":"Account 355","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b4787608dbdd6951e9a8d34c12c0ea055250da7c00287faea2403a7a05406381"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/355H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128mc0flvr9xzjar4lve5h6jr99m03g0h3jrz49vs7egnn5cyh8dwt2","displayName":"Account 356","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7082c9542f6929454737f2472597160e5c485105062ef0e036b73481a93839bf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/356H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129yrky9j6jx8ed0xxs8mt47walmnswjcv764zfpau7mweg2wal566p","displayName":"Account 357","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"50da57a0d6655f5c1947a44dff8cdba465b4c9615c7d3e2c4457c73fb4afadf9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/357H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ptyd0kux3emxh68apzzexvz2gf3v2la7weszku7dnw95zxn7vnlj","displayName":"Account 358","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ea42c171148148b822113796e0cdefa56c7130dc3eb5e5d9f858045366c1d59"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/358H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yh5706ucmzwhcyf7c2dedcepqgpwjg82vckfcruwcqc9szuf0nrvw","displayName":"Account 359","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b12f969ae2980a282749bc98b981e036c5ab4c40e4628484fb3d49f7d8952580"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/359H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129gec5f7ha6s6l7hy8e244053gezkcv454k4skkc5w9qw620rfmkcp","displayName":"Account 360","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e8428a4dbd2521d56321f4f1e4efd68de97d557034f2b60b69a59fe9ea2dbc38"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/360H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y46aqqwhmzvtdf6t4man0xv0e6ruywe0psxvgnce4q6ca7dyf89m2","displayName":"Account 361","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c2e8d0cfba43624c1a0f15a38d155a9fefcfbd0cf174939ec8de7a92a7c1e6a8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/361H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129mkxt2ufd0s4l2xclegcl0zpzyzae2vauex8rjq22nhufmhjlmx9v","displayName":"Account 362","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bbbed41e6541e75ea2dac95e18fc63011ad96b168efd28a8b623072b200729b7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/362H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0ev6k6ggs04azdck4e8tdwx552m5pkt7n5t45zxg2y2uk4dnm8q4","displayName":"Account 363","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bb442dd675affbb774cae82f4d6af547b513272ddceffe787e7c5341788a1aa7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/363H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlpzamagyhgvxcp0jm5dfsgvzn7g5gpmwnu8jnv0v0pygprp2w5gc","displayName":"Account 364","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5e46a5bdc599da3d9211508cee04854700448fef98dba6fb11206c04fe8e6972"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/364H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpmu7e0lpmrurmlnfac8rlsfe6en06rncfhf85he8q7mdmlmenxdh","displayName":"Account 365","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"991ec7a723c7df1f2c64da1b02c88507fb686f23e530326bda82a76d87dfcd92"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/365H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128tv76x0l98symz8vsz5y46uzmyzppwl730uwtyrfalafhgvw0c3nk","displayName":"Account 366","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7e2859f484ad5b5cf22ae786d770bc6e8e48c966c23757ccfa71fdf5bc33a557"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/366H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129h8k387j8khz2f8fzekujc2te0y0eyjfe87tcnzs56au5pw6gws9j","displayName":"Account 367","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"460f7266e4079e375130718fb5c3b7ff8fedde74afd9530bea7b857b875d48f1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/367H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hq9np068k4rfjuhasltmx4ycwcvnj3472kte8meyj4vhcyl7ju5n","displayName":"Account 368","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bd07dc5daf1608ab6c9045dee0d042c709126ca27e6ad269f408cab22d15408b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/368H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128s4hnrqystwxgcqg89np5ut2a3p8azdyzktdpyzxz3v0697mpryqf","displayName":"Account 369","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d67a5a1d69ad8c2c2d6eeec26412c89a0ea01de41ee698a3e12f3d39811625d1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/369H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xrqypsl49ysnflvjk7g75xrm500dyclh09tp7vgmrwv8razjkgp6v","displayName":"Account 370","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2096fc2ef9d076aca38f845b9f69b81731cc37e3b732341b2c75fb38cf91d306"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/370H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129a6x5x7yyrdcjkde6u7gsjlwx04chfpzv3ad2w96mmpk2pfwfyrgr","displayName":"Account 371","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ff583bfcdcfc11c4f17fbe941c5cfb36228f9378fc13a570e4e24ae1f597174d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/371H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ysr9x8kaqaqh9n4dx5jxapyu7knxl3x807cyhptr2z8gnflmn7797","displayName":"Account 372","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"93228b18cd6c42dc6faead5851a39b328b5956cc8ad0e894a7c5ffac055910c1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/372H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128faanqvwwakqflglrqs8l9jfqqsjrpjh2d0np7m9g6se3fdad7xaz","displayName":"Account 373","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e13c7fed1bf82bba2498953f1579063a1aaaaa7718128c8031ecc351bca7b5c7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/373H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uhcwytefqx5m08pgtq42jg5zc5ukamflev6f5pf8kxqww66yxclz","displayName":"Account 374","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"71c88d35083973ee365feb91c5d09937b37c18ee135f74d16582b4929ca0764d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/374H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ys9deyvseajxaus74mf4na8gaawjcx8hz6j4y8kyl6dcyq0483543","displayName":"Account 375","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0aea219940d00bae80e2f5f11dcdf3a9c33245e53b7c7591ad08f5aaf853323"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/375H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vqvf37ah3htdj9hw955ufecf9synctx78l6q95te5d06hlvxgn05","displayName":"Account 376","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cedefe832c65355f65c80d9836f711029dab6cb6e7f9fd9b7c3ae3bbcbd5d1a0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/376H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y06mtydx9m2xsaplkhuu6a9zr24pscj4wtayhmrtauye42yeztd2p","displayName":"Account 377","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0c1ac58dfaf05e7fe9fb4b1b6628a9bc003d84542193f0d58ad067d655e32696"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/377H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9e3lytsw9snnjhcva27a56v6efx8e4ycdy6tspj9aegu2shjhahk","displayName":"Account 378","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7c83e73dd5c2701ae3b641e26837ac89d156e8c7b07c5418db5eefd63c334a1f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/378H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xalay6t6pn42qcs6ydyxf4vp6nenradwtwajj8quu9m7s2r5edvdu","displayName":"Account 379","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"45fa011e6bc14603cbc551530803b09e9be85cf85f215d662a1ffd32be8fcc2d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/379H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12993hytaw43uc9txztcw3rrpmsss88zmkshfs0agrl9dhtu2txz24s","displayName":"Account 380","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"413ea561258960146053269eab2bbc72efba327ff289d279cae4f33474a62dea"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/380H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dyl56lcy2knw5quetjj4v7jw92h2z8zkck0z9a7apx64yqn85ps6","displayName":"Account 381","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"639e5a2309aa8baa5f750890d6ae4f15c53d026630652e558a3d3ee3d909f5b0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/381H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128arfn7cwmjat0739fnyqusrgwfrgdpsqfuflysj66y3yzkdwj4ha7","displayName":"Account 382","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a8238b5fa3bae70672b43e957495eb68b0d2ef9ebc0e0b80e453a2b3723220e1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/382H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y5vkgpsc0mxm8yenc45spd42k8y8kh28juq530lmlv2z7z7wqgwhr","displayName":"Account 383","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a75c4a876e69703eb9a39d606b138550c774013bf9bd7987be427d71c8c4953e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/383H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yez52dt44t9vr34k7njz5flaeqylnw0pckcq2zjzuakyufgsgpwqg","displayName":"Account 384","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fdf1c418638b5274bbf52f0c85405c38f4c043d3f31fe89c6c3e55cfeabbb3a7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/384H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydv80kx94nnkf758nrqt7m87fqz5rn6nmk28l9hm844gjmhtpjqcd","displayName":"Account 385","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fe6f9ef1d8eac2e502ed7dde09cabb777fc113ce61a854a61292c68f125489ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/385H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yuxk0g3zppg2ctpa8x2fzwe69ua6e72f4ykgg09fyqtehdtcuygju","displayName":"Account 386","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6ec09467f1fa16b9f524a671e94add1e4aa1a292a81ff9a3a740a35435b70075"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/386H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjtguw5xqgacjwue0czgqst46ywy5lx3c0gwrtm9wadm2schk6nz8","displayName":"Account 387","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d2921e1bfddb1c43943c0c1a6d371ab35a7f8a4e7aa47c1aa47e60566dfbbc6c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/387H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhha30gpy8e7vx7wdscv048m7urp78tdw46v55drz8g99d26vdrqm","displayName":"Account 388","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0f52b0beb933e5f3a5c8e3ae77dc9f1e9c6a2f9815d17db0f76e810a85f10286"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/388H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vzf4f8xgdu6q9gesl36gqvu22nkg3lqp58lagpprka2ccqdgg83s","displayName":"Account 389","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"23b707be3a4b0d793984b7df82f56b0ba0be24b483a11979357fd65cce7333bf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/389H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ym5205vg3h65hl0g588zcv9g4tjtwgz0rn3d254dvh6pyztp0afze","displayName":"Account 390","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ac72954cc2a299e7a23bdba08dfd7e6306a6eedef97c9bb7d536bbdac3c13b6c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/390H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9alvlh09pvewewt6m3qzg25ze0q0pkmjd3zvdc7sn7gytwpynqj3","displayName":"Account 391","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8217c6cfb741928639d00060dc1a614f30aa3f9ce3f0389657ae0c4381f0b4aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/391H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhx7wdr9c7msfs7lj424mf6luwqs5vapvuu5mcqjellv8xgfzdc0n","displayName":"Account 392","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0a127657ce9a886c6c664a2001f8f3137d60d8a8e2d206567c7632af6c61656d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/392H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0wxzhvu0mjn6fet356gn53nzn3yc7knfv7de76363lr6t6yuzmcx","displayName":"Account 393","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"12ae0ce1a7f8d4bf1b934ea236dc9ad33625a50faeae2018a12517357da78451"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/393H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dq5a7gn5ytwytftlnvck26prug0e0v0gdhctvcv3f5adyme0s9k2","displayName":"Account 394","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"740906912ebde54a1227fe48984395e59df1ba12d2a8c76f6842cdfe8d1ec5c2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/394H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x7jlwqxrytscdag8dy86lw2gnspwqqqnk7ugc44jrwhg7zm3jhxjd","displayName":"Account 395","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9aedd0ec0adeb1492f2f82845949cfa8641c07f5943401b23dcf0588d69192e3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/395H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qa7lcrwahzea3qk3kvkh59pzku7uunxfl8fgdp8qp8k358sa8ypy","displayName":"Account 396","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c4d474bcc03b96a584ab7d159362030b871944a0aac704a1e2b6d968bc11f3fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/396H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dym8zyg3h0k2zcgd6jft56qel43g6fq66p2n9pcnm68vm3nlxpj5","displayName":"Account 397","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d4114d94fe1556a9106a613d59f9b8ef398e8d3dc918c798b4f2040a8222a34b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/397H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129k7lydpw3utw7c6jf30j7wrxlqa7muskdd3r85j97eaj6r8ywm55g","displayName":"Account 398","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"15040a8b820134d659c18f390e5cfa67908704f19ff9a5b45066be9cb86957db"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/398H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8srctks7zvc8wug5zynp8x5fyel8cwnflvmfk9pclezs3nv9zluf","displayName":"Account 399","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"209ea469e0a993d749f0631556979f4671e0723d1046371091ce075ccba340d4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/399H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128xz4hza83gthrl7lsd65pqxx9n9mr09dnulxh9s30zscr43t9eene","displayName":"Account 400","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6d1442a488c00080cb37afdb8eefcfbb694b4153a394d4883f6768782564c4cb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/400H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ekdy368d36ax907a9ae62lhu0nfmt7v5k9qjyyaqcwlk22ypkj8t","displayName":"Account 401","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"80a0e5b524620861ae1f7a4a2fe6a286e0c4ae3a2ff4702cc72ca299245b686b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/401H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yl3f8me0x2c9c957u6rt8gk5wc4t80a2u426jkjpe7yh9vrzfdqvn","displayName":"Account 402","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ac5b99808958201d376643af69910c83473c90ccfc855c9035c4464c6a41e2ac"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/402H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygr6yyg7rq9qy58tr58cgg07mnnrn3mu78wjh2s70s03huwrq49t3","displayName":"Account 403","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2d956f2a7ce16f356645ae9c4b92470691e046425e2d205cf4ef4c0159d501bd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/403H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hts4l6hncyaayumcnm8hs2jpgvn6hv7sv034dwpgme9vprvfwpa0","displayName":"Account 404","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"feb4ef74b56da41639e444cfe3889eee4292eac7a3148047ae1dde1e1d091662"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/404H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fuuusc5anj4cacsg9ujrmut70sdkpclr0yvgfs2zpxhf09sej4dd","displayName":"Account 405","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b96dcc241d4712cb9fef8c97410270d809f5ada49105870a2909e19e22ae2ee2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/405H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytmv3h94mzxkl69za4zwa0u9mvyzrjn6salqdt2n8fgze4ux99zwm","displayName":"Account 406","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0c88e44f0d26a83b90780078d37ae83966841829eac14f17b1e337f8bb1f9230"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/406H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xc6du9cl6r6dkh5knrje4sw8fkj7jvmr080h2pnxyfx6h5gckplxq","displayName":"Account 407","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b376193be0bc6876ade47f96e1f35277a493638b74e7ba567c68b1c233f8319c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/407H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xmjrqwtdd4z8t2egghnudfq9xatxp5whuwcwwd4saz9zlx2wn785y","displayName":"Account 408","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a3b5f03a05c467847e8d2a8b49f7cd2893b42cc05dcc3453873735747edf8fae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/408H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285kkrpx6c9262epj3p59a6llwtugzenh68nsqqr6dct82p4ca9ena","displayName":"Account 409","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"639c48ac26d7e20fc9883308f3d16bb5fc6e2ea39c7f11690cdf6bef1153c4e3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/409H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xefgmuejgykz7a95396x6ec4lcay2sl9hwu95u5jz9xygkpwnugh7","displayName":"Account 410","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bd9c80864a06d080f25c350fc9b88b4db0af67bfaf203c69a99168188623005c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/410H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9pck9eqpaap5a2fuxu4fvhf3dnfkf907g9mvqpdn87c37zc7hdr3","displayName":"Account 411","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9000736503530cd7edf1d9ac742bb10a633f1ca75d064ed570b31b5075ffc1b0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/411H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129hucd2evy5ae06u6635ck6229u4aeqh65tjdum0jmx73n7swjaqn5","displayName":"Account 412","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"20854f536afd7d5bcead1ebb7c06ab1650c64767d48b610410e6a3b5c7454c34"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/412H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhw8jnh0pqxkancs0cmzeh20s74hpqz00cw2nfvmv2zj0n6srr7u2","displayName":"Account 413","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"419f4f6d55620085e51d50b1669add66314a0b3341ab2ad8bd36dca6d2e4eba8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/413H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xk7xydsxfcnya7gra4pjcl3sflkxt3r74dw7q6nlf8repn670pqfw","displayName":"Account 414","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"31c964eaf43ff457381d86a1c0929d9f4b74dd2675096276cabe99f41fee4437"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/414H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128gq2mw4kjnz7l8mz93zn8cplgllm2edckzp4wx696907k3jm6l2ym","displayName":"Account 415","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f69dd2169bf9e4f63eb00b0e4cac1daadb07c3e5881c805bd7d92f8c1dcfeebd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/415H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x595f7herk4088cx9eht0ap4etfpag4dfdps809c7kmcgjp3cfwu7","displayName":"Account 416","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"211f1e01f673100ba6d9380ff58840420df2d6efb0c630e033eb85bbbe6aa2a9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/416H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129g5pht3ghuc9q9sav2w6806wxr6l09930c63chuy7tm4nrmd8zy7w","displayName":"Account 417","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a518104a4869f0f7b3ba4f22dd7e1c4e1406014b20059a027b7fe3e2e1761319"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/417H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yrtmzdt7wzy0w8sct4j03z722yjzl4cqsxmcve5n8crkgnfv037mj","displayName":"Account 418","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6dc08bd36a333b69ee0d6c026115cc614a8ef30484802df853a066a96b46fa66"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/418H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128qf0fnqpz4nanpyk4cwd5w3v9qczlwr4tpme7p8neu0jwjaxj6gg9","displayName":"Account 419","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8b05b39769aedc498de638235f1611e0c8fbe62cae8ff0ff9819272a719dd306"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/419H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2n9lx524453eypn2ny538fgjyrqe0uhxfgemj9jmvcw8t8d300m7","displayName":"Account 420","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"17d29f5fa452fb8ce312f402b9ab549e0b2eb1614b8167bfef08dfa9c3d4148b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/420H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128py97gx6k8g76wmyleyzdghzkzhu8nppwrckqc45p4rtl97l54v05","displayName":"Account 421","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6bed786b15a7622f2a758353687655f2ac2ba549eab17710fbfa502186c299c1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/421H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ycr7u84gqpwgcuwj3cky4lrwcm9zsqs0rqr7n2wq3up7e4nu47cry","displayName":"Account 422","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3ce91b6fac8ca11cfee0d7ff082c879e2937b7842a35285b4075ec23e92996ad"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/422H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgxf5zy220rrywdfykty0c7nwzu55w5k8rrljk0nfw9g4dhkmqlkm","displayName":"Account 423","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e807689788e7b57de3e36c282fb8619a7d69bc9180759966e7e15515f4e4772a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/423H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uv6lpxj4qzvcvs4r9r84038xkwt7hu7e48y6wmmzmxas0qa3wshl","displayName":"Account 424","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"998ec731217d2173ae3d8782192bf91bc5b4443e107f82f133d28ee21166ebae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/424H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128umr4du0u6grzycedu0rxlvsf7rfw0w39g5q2ej2xxftzhgg2cx2f","displayName":"Account 425","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1cf7fa7f60e9afc0b3237d7327fca29f878a44b953aa07a406f623d1f23c67b8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/425H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128nsysmustcjlzeyqlxg8fa9pyht35vcka34cnrxrpru8gse4hcq6k","displayName":"Account 426","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"55b7ad746b67fd72f473fb51a33ce38894703ab391f06f2dbdd1050821ec6bbf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/426H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqtg0x6q6xpxusyfwqev82gj60pkqye9l309ux24k59pxttg5egzu","displayName":"Account 427","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"025481bcacd33c4a40d78322fbfc307bf0250f5cc5b5709424014311dc34e55e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/427H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymk4pgh246t7z57txj8lmxyslkn3utgca6xtk7l2jp6xqvgj3z0j0","displayName":"Account 428","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cc75e1a21e9caa86bfbf8a8c8328542c27ff723c433d96804745395731f8c69f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/428H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289v3wkmzz7tg3r7hpntxmltnlufj4ydm43dufshcegr3glwdcu2hz","displayName":"Account 429","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1099e2d6e12eb6fcdd41b0e8bb521e10cabba66fc57bbaf96a9819b64a8a803c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/429H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsg22ehmds8xve9hl0qf5s04czqktyqxau5eg6cyuj677p6n7l4ac","displayName":"Account 430","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec96f182f5e5e7fd8fc87b1a578bb4c30ffb12efa64c382e3d80d9dcb1a66b8c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/430H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x6lfwspvkc8gjzmdp082stn7fyzregkevy0tr6hr4syy3te2cp906","displayName":"Account 431","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4065c5b0b30a625d785d8a724103523386e981a263c97c893c08aa072469ba93"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/431H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hx6tx7pjtzad229px30mpm5h5xgl3rlnu7rvx0ce46cjlstcljmt","displayName":"Account 432","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"74de4e066f735b1d16a9da97aa182f54a3d8c612bed7181fe071c03c2e4b0c11"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/432H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128264pdtjnnaud3d248vl36eh9zfgvke3fqx9ncldl24xqc7nq2vkr","displayName":"Account 433","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4888f6a916516e898ae3b406df1f4c06d1122dc2c1ed19788a88dbdf7f57140a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/433H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pjc9a0cu2a0rm8ldvs0qdm25uk9acwdlkax3vndnrxhv9lcuet4l","displayName":"Account 434","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec48cb200566be0dbb4cbe6bad355f8cfae64938980b69a57f21be5415730bee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/434H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0vap7eazpz9f6xlmyq9y5u8rzjtxuaag2jmlsj3xfqpr6usfurjf","displayName":"Account 435","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1779ffd26c58569a0dfae9f4a22617196a0d6db19b2b83bfda86a0fcbe75644c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/435H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128v4m0jg40z6n4t3du9lc4m8prsgg70w2ffsr229mzet25qtkrex6q","displayName":"Account 436","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d4263509ece44b12d7d32f8a441c919ca4245fd508f3c7bb2a3781a629068d3e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/436H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129m67dqgdux8t3hn832pry4a42dsjlphvwjj9d0g44h6luqjejs4ft","displayName":"Account 437","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a5237dff118404e67ab6794b2927a467bbe503746e54bb646bb610d86cbec838"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/437H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hvpd4ppmsj9hut2nvnuypggl56afgrdwj9xm4dn985xds27a6uwe","displayName":"Account 438","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"808328f5e508c0ebf133bc8ff6d85e680b54b40f0540210b9047115006e4640f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/438H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ya4m5nsw7l2xy63phe5ugl2fud6xmx734ma7rnwm28cp0strjxzap","displayName":"Account 439","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2c1159cd91966e9cedd81a93e6e8c5e52bdf89ea93143d5b3e267321e93c6c3b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/439H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yr5vu8ey86jj90ysteyj6wxhkx0r5yuc38wkqcta4h4wwpfnlezv7","displayName":"Account 440","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8bfa62d8f9c3c00d3cab4249e7cc55d4aea8e49e1371170c8e0dfa31e9bb078e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/440H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zncdnaayuv88k38453natsklj6sm39grf548e35xeck84jdttk6v","displayName":"Account 441","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"59bbcbb09ae83621b73659c9135fb8458544fb4f8bdcea84f3ede3a1d80b2059"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/441H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xej7qd3yhg2k3shvlcfrjr3nm42sq98t6sm6aauk6723clyfatt4x","displayName":"Account 442","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"829f8f7bb3734a5a6e34731459345810af66825bd6ce49b74714aee1e4589629"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/442H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129mkgc4ukv2wsr0fyvn99s6s6ut4dewgxcueqek87z0wa9huap5eqd","displayName":"Account 443","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec327547c0caddd5485de4403a6489070ff46a8e1de0ea59b3028a6d25d9e5e3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/443H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128wrmwk3shseknjfygdm83lppmldug0qhd5f9dgdlzg64twl8qv4d2","displayName":"Account 444","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"55fbccb7775bb54849bef4215c25f7f47ec5d6048fa4b3020c9d252ac95a42ab"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/444H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yuu53ll5u703wvqcav90sma7gdhr4q8e7jss63mjrpw2wekv7sj9r","displayName":"Account 445","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"311adbe5a60dffa3326a6a75ed1899d13eabac8dbbe0a62acafbd79e88d2a374"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/445H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128n3w343wmz86jlmq6utkweeqdyk2k8fz9d8axs2w972e9nszfw7te","displayName":"Account 446","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b3131e15b6e1b1b84fed1ffd3c889d7422cae59bc7760b114429c7e64a79fe3c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/446H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq3wqm4p74tw43q83yfuy4e6zh2m27800kvstjlrqvewjddlwxl3l","displayName":"Account 447","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"670f13551b1ebfc1410d8aef49b138c6305299c69d350129e8c45ea6cf9a56b3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/447H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289lfpxl3zaycpsxh4x9vafq3rclcg9sgzsye5sv2xmfqueuex80p9","displayName":"Account 448","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ca1f6b00b63426495b7730accb85fcae8cdcceb1e3bfbd2424fcd7c6f4c8f141"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/448H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yg6l2d8ukzkkwzzf433v8kaatx8wmn3afh7tsh807ahpqdtxuqnvm","displayName":"Account 449","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"df6d6f532d1c165890ae9aa0cb680cd229e55a04f7b253beb11b639a43167cfb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/449H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129q83huc5g8q6eg232gqz358qgpznam9c2mg3hsdg6ehdp22274654","displayName":"Account 450","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"412aa509c8fb26063db43f47f0f98fd98a1b0deb5376be7dbc8103669ea28fd0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/450H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4k6tvj7yfw3sj8l4az9qgks4yhheedt99ktg45ctd4nmm9yf4e9z","displayName":"Account 451","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4c3f0cc34ee8710eea2eaa153be3971576231156b7dd1b000be092473b63bc89"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/451H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhvec2dawpm0hx3d69a80kd6kctl9kl5z7xe68q5lh9s7gay5t9t0","displayName":"Account 452","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5246b885417a6e7294d74437b93010a9f9db54575b7b4be818911b49a30b0cf1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/452H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dkkgrkfvagmpwgh88msfuccxcrsvuwsfury6th8fsk55frgzrf54","displayName":"Account 453","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f6cbfb9d9a15736d2fd0124e16074e0cd2391992335882addd29aff425c6a1fc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/453H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128k2ak3ygpzxkfu6h8pqd8ds8s886u9rx9ae5437umyhpj06xxj478","displayName":"Account 454","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"21bcef3c065a256f31c33605d0a773a8cb825e89f6b0a678157eb8e3fac060f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/454H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xl4jcw98ktpg2huqn0u9yr7qswqtnz87k5x7ssd5zlfer5v9u9fmf","displayName":"Account 455","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a80814a1dee3e6c9c27bcc4dafbb0048074d30e0432210a3a8910d65c6017a73"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/455H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129p90gkm4wqqwvffjx5chdxqwch23ne5vlte2aqwnzu48wdvseyrsy","displayName":"Account 456","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cc55527c72b9ca5d82cda594b0e5ddd0a0422bbb70683deb017bad6ab6e4c60e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/456H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nesm6we7ntdcemf890tsmhm6mm6a9my7rx3aqdwvdesgkszspvka","displayName":"Account 457","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"42276c28a0e5d57ca9b93c9dcf8b6a0ce8b608adbe920cb0395bd75fa151aa21"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/457H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjwn0zekjj847czmma895yqrdw29fzrwv7l7pettx7gtp67cu85hm","displayName":"Account 458","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"830904097550e1e3c522ce72c7a506da0c2ae37ef832492f68ce5df0022a9caf"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/458H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvtjxnkphdq8vldtnqa50x9v74n3ya6d74pqd8hzaq4hlng2aajps","displayName":"Account 459","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"97184f219e81f031b7f783ec019b3d8f4e8de4f0f2eadc51de56d3894011e871"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/459H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yydvda98p3wcdfsuj7de5d85sc08u7jcwq9daqyeg9ha5nt8lv0fn","displayName":"Account 460","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec6d5fabf34ea3b888bfbde52532aedcfde694161d7e6c5868a2017fd163f43a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/460H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8s6hj6sv3ezdnhyy0pk97qqlaxgkcgkhfq45zrn2hgvwy3sv39f8","displayName":"Account 461","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"edad2ecea67cd517599311e6e7342099500378d87929cca5b054fb74553f4d6a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/461H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x2u7wy94dyw0y9gvtxjefvz3sa8m8gnz2wc7679p0mnpd8u4sd0xj","displayName":"Account 462","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5f4d807b66aa14b61f81f3a4fa339aa95efa554436b5ccb17fc2c61017373d7c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/462H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129sk5zrm3gvvd495a3gklznvfe4cvr4rg726pduza4hlgcf5vf9l2m","displayName":"Account 463","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d3c547d9ae57968dbb699f05d666c2e6182f4847a18be1e40e7a0cf76a0d70f5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/463H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xccz09u5rqvx83hlynlht44nmz3us0n064elstggqe7t6sztwpv92","displayName":"Account 464","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2667bd7ae029a1c7fda35b75cbfdf5d7350a660d273b05e2893d644db55eb4e4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/464H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12894segwruvhwll0vf6gmfz7d0kyw2sed6nruxu3wwj04l56hhpwn2","displayName":"Account 465","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c934e7d584c045f6cb37dc1130621b79f008619a6d562a66739bdf69e08a9e2d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/465H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ysrr46scx0tlhpv90pj09zjdnnnk43q03245jdfunetmu05z3tg5q","displayName":"Account 466","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6fc08c0f6f3357b2035f545bba8a95f097c0be83c5d93c8a47aa052c998be99a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/466H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpg5wz5veq0dvplklmaucpxtnp9e57rlepwm7a493z28fysr3hp6n","displayName":"Account 467","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3260e61682d71329466317c15b23b07cd0b302483bd88786d44e98a3892b6f3c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/467H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xa8e9kp93sca2xxrgurw0funglvulxrhcsmx62dp0q328s88pw97x","displayName":"Account 468","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"adc89e40337bd5c8f988f74d03b5f116a32094815eb518d55727176511427efa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/468H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129afr5wun6j0umtdaw6ffkgp8wxgxj4yk06kcem7myxcsr7ay6x06l","displayName":"Account 469","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8a01bb20b892ee4cb6ac5113091d5b4633c327cb3e9bfb0dc4c4645b22237453"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/469H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xss26gaazvu8g6y5r4q96904cftgzeu5ny9y59zk9f6pfy7qwk34c","displayName":"Account 470","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"80cfd13e212ca54561f7baa008844d700c11b5901d5163a92083ac571a28b3b5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/470H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12836j3539dt0t2tvqz5mdamj6cxug9k4lsrynqjwhfppe5alzhsg3v","displayName":"Account 471","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4e3121524e4bfd1147ffdbb01eaacff86f4302830ca9eea08656f86327221384"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/471H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yn0kak3wpzy8fyj9v54a8yqx8zvq73hhr5luzsq26thw62qqp496w","displayName":"Account 472","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"60328a6a9cb2f2e881fc3dd6651dab251825260250fa68db3ee5b1a31aa4ee90"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/472H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xuzsqllfx3r5xlntkkvhqx4ajm0rsmuv9s3k7rc7s8uzrau63ct74","displayName":"Account 473","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f9359c4b97c81201dfac7bc21a40febcd99747050e8d9ec31162f6acaea71a34"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/473H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y07st8utfcpppqd76clnl79qpld3ymcynq9pty7aeg236xm427llg","displayName":"Account 474","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e0fdd6f66b5178e95d707c0cb1b62f3ab699cb7d92e330075f6e08858cbfcc73"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/474H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x62e7aje0ta25f9r30y0qlqlxnppu2mjd3xdtzj82kxld26d3tv2y","displayName":"Account 475","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a020207913f7ec7899cd2afc2e1044540488555131bef048a0ea80a9957aa312"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/475H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rdkep5z6pf7mpmkxnjrnhr9ur0s8u4cujrwfepffj04t55hzvv4w","displayName":"Account 476","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3eb72db351dae67ce7b11095e1f28b30baa3dbef378b81006048823115dc12c1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/476H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ylrsypaeex3mda9cxs998c8nzzvdse2ke03uhr0ee23mpsfzfm25s","displayName":"Account 477","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"68e27473b8eb60d975bd2a064afd1a5210ca6791a68c14fb075f3888fcc8156f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/477H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y29urh79z6n7fqr4qsd2jkyxpltz3tmr52u4ksdeeg23tfe0lex60","displayName":"Account 478","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fa734edb895f08db56bb9794e0fcff989e06c8b4e074ebe6df047d5c2900137f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/478H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zqrz9ry7zkvvnacg8fsm3pez56vt47f6xkryam4yhm5w3adqqcmz","displayName":"Account 479","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d8e15889c2d8b189a99bd4e8d383d04b59c9adb19082b8677167d524b5c64ed3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/479H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xcwkrtw42qp854fmld4lgylzyvfua4769sd069acw5hvp0j892py0","displayName":"Account 480","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d468133979228f5b23e2ce97a673a970e774d4636822da50daebf451a206eeca"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/480H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128jgqpp63szmdd2z2g955d4tz2qm5lcnfjdpvqhqv2lwstm6awu63m","displayName":"Account 481","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"df23abd6ca4c61a3b668411688154267508be9214719fe4dafc317e13513112b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/481H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1293wu0hugkx7vhs58eux0a8xp3ukwe583uymnlaslf346v0uumlq9c","displayName":"Account 482","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0104c7dd6c5c2e94fbaba8fc692948a6950275f472a44954b8c2289da34e7722"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/482H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjln7766kwc4yrj0f7lhffnva8qtalh4yhm8lqqhuf3dfprawmydf","displayName":"Account 483","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"56551bb42d1915bbe2dffee4783c135e25077b7f9a25ea84876dd7d56182b343"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/483H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvylyxd87mmdszj8uc9zvx666ya4d5wz2n5yqlzdkplcjvvy52yj0","displayName":"Account 484","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"88c7d60a9cdb9b0797ed713283d7c1daf5b3b455e517b4ca6626cb9e33550f23"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/484H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x2zfld3r8m5c8ecm6vpg9dmdkww6kjqdshrkcd6l27y4rmu2gjwuu","displayName":"Account 485","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b49ee27607ae755589352af21aa1f030ec2383413e298583e901c7c2d1755475"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/485H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x094vqm0z522xhq3ntrttd54p02rgyszzan3xzceec8h0la468qqh","displayName":"Account 486","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7e3283b698ef6a8934dc7795fa7bb639fe4a2e9144e5c73ad3d529a12c5269a7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/486H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xf8fv85k0nl8jvy077uu5yl7cyj5zpm5pdgcw6jzg7c3vw4cgjenx","displayName":"Account 487","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c82c44ccb51de6b03e42fcdd0fc3c79bc6d619695b3a3608f310f2f51ca111b2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/487H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129kdz0hpv92mxsuseh3yy8esvz7a6veprp9se8d7jkglaazfswmrxn","displayName":"Account 488","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ddda91f0d772fe930c4e4ffabcd5a8d3e26404ef0a7a7712425c28907bb0ab36"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/488H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129evyu0sjy0y99mxcmn94gxn84wn3sdly4ppesf57p59476xwkz86l","displayName":"Account 489","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0beb924ac547c2bdffbe286c6fbc94e6da16cc7eb1dedc8076d4b3854e17f631"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/489H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129p23fllx5xrc6mgaxeupv0flk2yryzfvj0zqk9dyx2d66h8rfemex","displayName":"Account 490","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2ab684fb1923a2e7b169e8dee77935ffe1518ec2530c1988c80c684a7b319fb6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/490H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9kvgk0ssdt3h6jh4lnevydr8wp9jglfj5j75n2dc3xa8z469aqng","displayName":"Account 491","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"32630b366e46ce1e896d6299310ba43ecfe5adc5ceaf5a78de00d5e083a57731"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/491H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x5gs2clxz93xsxwv2z3qtqksn7zzka96m52j7rczxhth5j7xf7e34","displayName":"Account 492","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cfbb80cb4801a0f4d943e3472e3f020a61b8017a0a75efa1cd7a73be098deed0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/492H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296wdwyky7jg4l9g8qt8f69m6nzxfeegf7zlchnyaszjzmnnc5enwt","displayName":"Account 493","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"010c9d804384b1b9d1815510253a7b83c82667ea0d08ae8800d1fbd2a8bac8e2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/493H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qn7ypr0ha74ll3jde4zw45vk80p93af6qr27w0m3w38jz8yapkj9","displayName":"Account 494","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4fb51667a919be74dd5df6c61f5146604ee53c721914885cdaab5e00f92ce5ba"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/494H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yv3f26vrvadh3ah8fky6mtww50c9dyrpvmmtlfkjucm5lpnsuylaa","displayName":"Account 495","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7cc11b76e392e5ed709272bd43bb9be43a1f8fa4b3d80b3a075943fa71197440"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/495H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xt82mexh8fx76uzkq5vtwgpcgx3fhq5q9nfjgvuw4wvft2msnt2ur","displayName":"Account 496","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"215d75e1c489d904f0307d57d09586fb50dabad5bf8264710f5380ee1f135173"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/496H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286gh58rekkvgrjlhzzky0f5ddsnj0xr2ydk4dfxaqrgn5tlm3qcv4","displayName":"Account 497","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"891b247ea3258a82a9afe0fe5b932647079f42bf713d099c2d83a303557cff96"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/497H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ue7v3y9mvvpccl9584cyyh4m27ncvzlje7xye9sj0vx2cfz3xnte","displayName":"Account 498","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f36c9367fe85d93cf6c60c9ae0e4bba06256897313fec3a50e3b614e189be4e5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/498H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xs0v8ns86z9772wekhcud6dfztllhtn5nt7rk5w24suxf90mag4lj","displayName":"Account 499","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7839e0420b27578b2645fc459e13e795edda06e1f78c08ee287b0348ca2e6f61"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/499H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rsue8hm4zgqnyelxp43m585hnkcgq4s7a98svwc4rmsap2mzuv6g","displayName":"Account 500","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"32b6eba763c0279b1fa70c9cefdd70cddd9fab2082a9d22f183cccf2126e4c96"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/500H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284cll34yakve2cvadj37ke63s4ua2lfr0czm9w7ff9490qjdqen7l","displayName":"Account 501","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e01beb5dde3412215888b00a7409e5c5413b38df94fa646e07a0ba786469c8d1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/501H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wpk8ugkm8t4f9hkaettwfrweyy56n3l8ahvzwalr5svwl2txwhzz","displayName":"Account 502","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a6c764f01c882becebf08dfae666ca2636814e36409f0b7093b390b0d2326b52"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/502H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ljdgr05atwdfffjg249qz5mn445ruh7hldh3djsgszf5e6v7unjk","displayName":"Account 503","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c71a0cdde11c89eece650d320f43ff971affcce346286b00e00624c2ba41ca0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/503H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xxd92pcqjx8thgeqtvd7x775z5vyujp5dr94r8l9r7cxmkuhauwye","displayName":"Account 504","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d77d4c9e17857e7f4230a4f39e8cbb4ede12583025a9a7afed6f51048afb19d3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/504H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zfhacu3a8wdgz6rucvvtxg5y3k0ml74w33e4rztjalw7p30cruxm","displayName":"Account 505","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ac6fe691f9b9044a94b5f0796c73fcf191377c2b9d8164642c65910270d2d4da"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/505H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1299v2vlrnyyuja0evwxyd396pwm7dv40myrkqys8qvpnn3terlxwan","displayName":"Account 506","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9e4a5031060ee9aea80672ca91b8c22466cb504566599be826bfcdaf1d8a823b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/506H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xc5lkccpmcnpqxsne7ejf4wdscat244kyp6sljh5tkym73mwx86kn","displayName":"Account 507","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0ea9b18320ce9be33b796676b1fd09fb63dbea50f4782a530a250e347888c340"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/507H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4gkudsf375uhjzv9lafmv0l2kldqchdzge4cd7fke74cs5ae0zwu","displayName":"Account 508","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"41a927b93f9e9f57add0a6c409e9079e80b3577a676a773ae22c31c25a8681be"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/508H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywl4292a4r9arehuf5lp7nnq7tq7hpzgr092py49u66t87t7avery","displayName":"Account 509","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e7021fb12d40ed2576239bf3d56bcfc093da91be7221c325d3516b07d16370b6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/509H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296yfyteh26d0ukvzlc78dyr2saayrghmvqtfhqjqjgxv4y9z9985n","displayName":"Account 510","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"964b662e3651b89428247e877a669c788d4df484980fecbe4d2f131e2853873c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/510H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129jjxjua509mu3u7698t0h26phnqy8u5lnm0c5erp0dx8utlwy75c2","displayName":"Account 511","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9611807536542ead618fc5c8fd74ad796c70b949018752050c0b3afc9af80e6d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/511H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129540tdzpjjcfs682y5xh527ydzxvg86lrwtrn6pghpcp29m5ln7u7","displayName":"Account 512","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5446708892656e75bdbd0ea2d59cf8ab6101f1d8341104024b9146c706a51a0e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/512H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280pvu67yd6ya5gmu4lyw0qpjfd9hlhsgrcc4new4xvhdcnsnftamr","displayName":"Account 513","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ac62d58b0efe0ce79ab71300f428ca5cc9d7886249d3fc4263779c881cb11576"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/513H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xa86daj0crrsmtxff0ag8jhljqxhew5ujshg3k9jpn0e4j6gcdl3k","displayName":"Account 514","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2b5cb8cb29bec5d0c5b03ce1666abec24b9474bae426b46f7645154b93e052c9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/514H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295v8pdvvt6epm3fa8u47yjvegk7f82qd37sjvlt8k9ltsqvqz3jwu","displayName":"Account 515","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"48402df0dc9ffba1e4a6e0aab4e09885c2e9fe8d8235a8b5e75eebe6db7a3150"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/515H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z3tc8m2c4g966nhnwn96przna9dszudskatwucdf0jqhamswv7a6","displayName":"Account 516","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a9221516244b5c7352dd17ea39ec9c61b71953972964f98124c3307b8156e13a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/516H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12845t2p9juyg6w5486d36fmsp48tx9m3n0nf03lfryfmvweru4es36","displayName":"Account 517","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d10f862ed4b72d19b9eeea2d0286454f8fa7d7f600282176a5028098b391d187"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/517H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129xukmuqf8cz9ek47st8504ntr8sfx6xfjnshdj473z8snwgmpmer7","displayName":"Account 518","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d36369c2cc6502733339f01d1aa5f421d80349fdbb0f4ed237d9b10b49359a6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/518H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhx7zle2avr6ugmglf5s7dpl08t5f5q3sulgt2qgd62lx24n4trr6","displayName":"Account 519","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0e8e3a614988afec0412ec5d363f2abb958aaa317e95e9058d30dcf13273e230"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/519H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129sz9e3tmjkr0mcqypueyr7d5uh0t6dc8n55npvpy25x5e06jlj8n0","displayName":"Account 520","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e2920fde1d95497abd7a508591342baac54995baacb91b95cdc52d599e95360e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/520H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yudkscs7e8yys7qams37jytq86u25m0f9wvav8tr2g57et8zl9m36","displayName":"Account 521","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"24a6ae993718467e4aa61e21da7b86456826dc817bacb29a11c03b91ff023d1b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/521H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m00ef5x7tr8n3u4umywj2rwkv8a9dqe09n3t780ft23ugevsck76","displayName":"Account 522","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"347f91d5c97fa474d782caffa73cdda6689fafbfa26f2cbc80f75a220676114a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/522H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wzrhrnm5gg4k73gvemu7ccl4jc4h9hd7lltpr8uavx5tw5yks82q","displayName":"Account 523","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8c20064e938a768954be2a09ab7b8f97bd17228a3569e183897f0e7ce34d6570"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/523H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yn46w8rpmsdalw4l9k48sx30xapn4z6h464n7ze5x848fsqq2j8pf","displayName":"Account 524","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dccd09ac1ad49e0756441c870154f2947ab8d7c6348cf7bddf1e41dd3f6f295d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/524H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128yhqce5uxrsfjxvsmusn3q4g5ch3h4gzekysj925apxqj8atkgmkh","displayName":"Account 525","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d7447575f43ab7dc30ded0b3130d2cfac9b646047950e3e80e1f3ce6ed7f2523"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/525H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xm2xmp4kdajuecvls6jcl63fygj2hlef685yql6c9thff7u3auhvm","displayName":"Account 526","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"25e8d385b973b3729ce7083f940bc5a79d59adbc2dac21149bc1b3f773287b51"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/526H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yq7p3xvtq7cfy5f6z5yv0lf2kf9dv6fz45pw6tywa4525l39httul","displayName":"Account 527","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"43ecbe7db65b9c4a6e91229eb3f9685ff79ad641b7ff678ab75c83004995e815"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/527H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vqvf9zydk3dh4ls6xvdzp84ez5eg5jar0rdqz6x6n57502n5ku35","displayName":"Account 528","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"99786c8d5844ac73bce469dcfe592b4183edbabb294c2437eca2f16efea1da7c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/528H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yu25uze0wcep0y5g84zy0lekmn0vtq7kqj6k6d3206m5hvg8nyzgl","displayName":"Account 529","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c909cec1a53fbf42fd0b9dece9fa2d9b97783a14d524d2eeab18fc091b6952ee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/529H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yc40k99frx4t343e6qg4vz9na40mn5mtwucxxl5wegsltzqt0h2qh","displayName":"Account 530","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"35079ccdfb2f9aa5c1266a5d4e0eaa4e9debbca4bed8fb3e974e6ccbff8008bc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/530H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280tahvxzjcaur3ky9xmnqanqfrgsdtv2h46agsa7aapsrkyh5vw7x","displayName":"Account 531","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d1a31deb3e42817d3a4250c2f856622afb6c98ba905c728bae156530d017d58"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/531H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ye9f8uwvspyz29ekc0mv67uwkvlle9ewgx93wuk9wnjrvw6sg7j6v","displayName":"Account 532","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ca6f815e9045faa744a9b1cacf8bca91b6ac23405a05f9df89fb1eab52ed24b9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/532H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwnetdat8et4jclrky6y2ahz8prhk829669vv472alwcd0uazn4ej","displayName":"Account 533","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b8ba0be2c7c70703ff2b1c6f35578296279becdd216ab241a36876e516c493f5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/533H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289ssgrvtuvfqv3vsaevs5lfsx46h2p3qaluy77r2460843yf7mvx6","displayName":"Account 534","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d87b7b806bad4f49c738ea7228c556b3901598b21b7eebdd18252eede020948b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/534H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yv5s939zae0qgqvuvdkeg4kcdzkx6ja3mza6rn5xxdhusp7fvm09s","displayName":"Account 535","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b3f2a92181f295e007813853e5ff6547dcfb53b4e1a4fb1576da55d067bf7a64"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/535H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129stf7w8lwne4v466lzty78dgkd65n24smy9y89zhvx84aawzlhyad","displayName":"Account 536","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ecc5bbe4e42178c25e5ac94f03d1b333397c1b4128aff79c23c01633d349d581"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/536H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yswdlas3vzpqt32gcdn0j4lkx3wm6993xap6r0ds4mllta0j6waeq","displayName":"Account 537","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ce16ab3ae812bc49e926a802f5e23ad37a2281a65274fb1d413ea8ca33fbfe61"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/537H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zclv4kqjxjtz2uadqlzthw9ld4kns0zce8xfvh0seg3xyudu6l9n","displayName":"Account 538","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e3c4359727a3762c50ab7da23b3ca611d2116759d073765be8ab9c22bc5ffdf5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/538H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydy6cwkt6rct3p0xtce02h5kam2matjdf680e698zg4ndanfyy7p5","displayName":"Account 539","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d2d94752fbf0b91487c332b0dc2c45b63479b0c9382160ff61c2d8f1cbced5b1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/539H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128tmz8c5pwk2zyqda9x2xhmull3fca30t92hypj9q3dcf2697lms8j","displayName":"Account 540","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"44e37590561f6c430e3ec3645c6678faec12dfc75172c7827d74a4ee2ba8aa89"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/540H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128w2zunfwvx4x8psqs7vyc4a9zvpasv7urn5p9uxlykqp6p3gtvp6p","displayName":"Account 541","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3260fd3b67a6ce76942ccefb080b69d6e4f9eeb0ad93fcaad084e36093e7d968"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/541H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zw9ay8f8w7at04as6mggpzsm3q9clvayv7ygdd5g35q095dt5x77","displayName":"Account 542","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"87b9e01bd3723213503189cc00196820a55f50cb6a49dfbf9903a77dd751dd59"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/542H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yearz5tpqeu5ng3g85vewpeg9n254efluu7crmke65fyah3yfnjyt","displayName":"Account 543","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9549f224cb0d6dfab84cc71b722761c3c2f3888e64314c16a8de757b4485a730"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/543H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129n4jnecppusnxq4vk9mxkuxvgx9ehsvnf0c7y2a2gvjjqx0e0ej3u","displayName":"Account 544","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"70529c925a72f82b8f70d94d40711a074297812a58377cf3da3e2784364fc17b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/544H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129aapgdgenqjcp0wdpjm8kkagd854azgc8vx8gjg38xrey9l8xj8pw","displayName":"Account 545","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"60fd7ed66a8240822e3fac5f98b9f6b895e41b7318f4f784591a1cbb9d51f1a9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/545H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286qcp4hp2rnw8w83a6tfrs5jzpfsg4382tfhfh5rklza2tcgj7hul","displayName":"Account 546","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e24071cd85db22311aa6870fa72378b5a5b7409e8f41c4fb8177922d35632178"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/546H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295g9vfy2ph7krh0efzfvcxn38yfjah3j8zs67wql46edrupw4anx9","displayName":"Account 547","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7093a3db35b5255478a79cad7540e1a1eee29900f771b2c82bf3c1e47de30e3b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/547H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yye5afg0natcjq59lnqeddu4yflgqdclagh4g7z00egu77x9wyfdq","displayName":"Account 548","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a20e621daf551d53b44e58aded637d7842f8f2376f32d54964b922d7d55f1976"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/548H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ut46cquktvsuzh0z2ujd7uwyzqn6rfyuk5c8hfnqeucm0hfurhf4","displayName":"Account 549","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ef7e0c63fc3687c690e06e2223093186addc2b5fa7678f6ac1e9dc843e95ad13"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/549H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ac9ns009vdfsfe0xm6j279mka6uln5r7schrtxtu83afa8p6ql6z","displayName":"Account 550","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"94406e2b5cf9b4aefb34dd66dff657d582522a5e80ab9bd649a60581a890c6de"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/550H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y429s3vqw62y9lz4mt8nhfvfpjf78zqlnhnk3p5ct6ev9cqp6ptpj","displayName":"Account 551","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1cd9715928e3b084aa8b4c4c5264e2fa248ef7dd818f5a7d401c67068467ea28"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/551H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12948gxghg49gudsa3zw9dvl774v58jzlmjjccgpjyxx0g27p700urf","displayName":"Account 552","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"40abe074db982f7e0eb64eea65f9a83454e735898f7ace3c572af1d38972d74e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/552H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x05fgm0j0yccvxugj48jps9gt5gajevxe7qeqat8d9mpnp4j0dawh","displayName":"Account 553","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dc55f6e2014f4e247040cebfc762c436fa85167354e40b1e298355a3f902e83e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/553H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uz3xzxlykqg88srmxsh8ay9mt9d46lxhwa0npswazj9lzspl60zw","displayName":"Account 554","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"878b3bdff7a7a68e0abdd15da7c70ba2fbd4747e3c08f3a2dca259473d26393a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/554H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129y5png4nzfu4y4c0x0z7qlm5pxzsyrtferlzw9d5umwrykw5ytvfn","displayName":"Account 555","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b016e5c5693183fa6e773b7f95f0be2e53a5add4987613f05f1c43756d1c3208"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/555H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dmw3pswj9twcn2ptup3d3p6y4lz68m7ff8f49nszxx60vj3ymxkw","displayName":"Account 556","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2fa7174b682598c9fecc474befb64354f26a7d6bfb1f0030101093b8b40f6541"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/556H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286ddua7kqfrkg05ruzxvu3jnxcgwp0szcwh82qqcre3sn9ujxeuyl","displayName":"Account 557","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9cb083d10888bd21c4a44139eee4b2598cf3fd55b1b040aa2d0a86661c0aa07d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/557H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjaa4rmsmn4j0fzvsk72rs4qf5433p8mk3ky7dqpqfew4a8rl7p94","displayName":"Account 558","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5b98f2d8b4976fe99f2a3c896bad0b16964a6299485a6ad17fb4ed788d09c9e3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/558H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292q8klxxa4lgch43cl8yhy80h9ne7r7em6mq2sl3vtwv3lzgcs8s6","displayName":"Account 559","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a36393ee98a1d613dcd3a9f90e679e918069318ec2c6bb9df59e00818b2e7f26"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/559H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpmwl47lmeaz53dz3u2hh5j2s9rpufkcmllrzms3mvlylpvv0y0ny","displayName":"Account 560","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3089b7a289dfe02e5933a3d8a0c4efde4219c96b4dd7935604fd2f4110b95b79"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/560H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284eq7r335lfhm6t26l2l7m6da3xs6799tk3kec4crqqgvvn54qha5","displayName":"Account 561","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bed31c0ce88218a125f12351991f1541d185b8547f9b0c74f95da57efff6098c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/561H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128j4hfcjc7rmqqmegyd45u0qd68ud44728zgqxauxzrsfdlxc4522e","displayName":"Account 562","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d836f408a598a5741d38652da7b839aef5d7b0d3e7cfb78d8159c0ae327d1a14"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/562H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128cjy8xvzsvw2y8m4fqrtc2seetp7v244mt8p03ssvhv2pv93scse6","displayName":"Account 563","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7c527fdef2b4f11b976b5c52648c448b8effd1e01def2974ca18c71f8a6ccede"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/563H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129c0ga5ugt0aq4tfu9262dz48fnt6a68su93msv2xyyuegp4zyzeyn","displayName":"Account 564","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"627d33db1c77cf4e923e5680849aaf37807d92ef1edeb375f565e7f6e9d44cea"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/564H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xp5xeqcuev723ad746g6m325vg0r7yudez296cfafj6ndcp4yszny","displayName":"Account 565","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dfe33b21fc97bc363fcdfbcd42f5e7c7a1900ddcd6225e6aff868143edac7ea3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/565H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128z3kux4r5sjtmelstszahvtv2zvhjcm5jp8kqqj8g7v3w9t79cc58","displayName":"Account 566","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"16639683e6342d501510a054c0215f9fc3d4a7fe81c83284bffc3ea73d41e5e6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/566H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yasqslcrql04cp7ncnqpumapnq2chcff2l6k0s7qlz4ysfh39mgpk","displayName":"Account 567","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"96355f6d9b90039c2b8648b13de853b309f121179f8f427a70025dbcf5bdc08c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/567H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nmj8d24a4jujkcwpaavu3q3j6fsw99nahcc9rwc03zwyn3fs2h63","displayName":"Account 568","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e845c38808c5883d02c646e110331211a8259a067d1ad772e9d5068f41e6724"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/568H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128463yhsa8v2f9wrfukkexe9cnqvs68pga4avtfevch2l5d060gkvq","displayName":"Account 569","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3d8e859e1f3b566e3c57d1efe469281583a48e19ea936dc2842c1c2c79cf7fab"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/569H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yw572lly4qsjk4unhza8f05c76lh2fyqplhjezyukhkmtzlxttfaj","displayName":"Account 570","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2a1d0afe613e795c0a78077b68b922d70cdf0172ddc58d34db080f02e9076dc7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/570H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289z8p6q4j7fsyftqdsvz367ufx69qmhtjcccawh4k8rapps0upqq3","displayName":"Account 571","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2605ee1d71041e5576ae82e1ab5c5e7688c9cbb18f8dbc550d1546d3352c32eb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/571H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12854n9ecaey0u2rt82eer8q07aashh7w9c703far6d2ak00udy6l4s","displayName":"Account 572","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0e2e02a9b6ed10017df6c9e2f7cdd49e633a19d32f4c3cfc5a628b93b81db6b4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/572H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tu0eqv4v9gwjtam2wvss8fj38hzqpyarefz8vnm6ae7j42qee9s3","displayName":"Account 573","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4b5704d371e8693d9e4352647a8df357d140c8839bc428fb3533f95df1aec97e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/573H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9hwpewyvmu8rwd7rcnr526a3z7k4wxg4z9dyzmjewxfvcnv9rr2k","displayName":"Account 574","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f79f924a36c69434499399b1b37a14cdd1e1708fcbcd5d031b26b98b479da06b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/574H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zpcsjvtm309x7w86aaukecwrpvx6hgdgvat3wuh60zekauuc03uh","displayName":"Account 575","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2d03d04a9b89a59996cdf9a9b6e7147b9b1c3024c2d7b2b538e776c1eb7c86ed"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/575H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xafh0zd5fkjthza9trzk07qwywm8xughjzs3yrxv9nc7xj2fuz7df","displayName":"Account 576","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a5135daefce519ef1ef7247e5de06121ab0e4122c71a31b8240e32fe24f2f8d9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/576H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nt4ukftws52rec530yluzjmnz62mw7yuhgl0dg0vagch3vwgrpcq","displayName":"Account 577","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a59729855deadb124e3e8db4ad813544d143483022d100704f6426b2cec89f7f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/577H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpsurjk0eem4rvyp9unkjw68u42sf8q5s5m9tcqkfm7jma25kydx5","displayName":"Account 578","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ede63db65c6e61cd1a234dfc01e49a9f0a7cf1a51b860426ce96063b875f8d25"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/578H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qswp3jq7lzz29tac5pdzckhr8sutt3j9rpa4gtar8jsdyzmgdpv2","displayName":"Account 579","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"392c97dc510743eb4f25a7d5d0a8c8461f7f69a468aacd3fb45be85399a190f1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/579H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3x7yds5xd6xd883eqxq0q842f5699fx7nxu764dzflu7lwcqs0wp","displayName":"Account 580","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"07f2e95fd3da84b4f18c74edeff43bd3713862b7120811ebeab7f87b8c6f44f2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/580H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vzya45hlgkrk2r9lpxtlq4kjkyw66qgc2r0z2md6kkskl92hd0rq","displayName":"Account 581","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1182c666a0d9ae3ac06ece6ae7a3ffca955c3efdd0735e2352c6e626c3625aae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/581H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xka592yvmux7ad96nu3t05mdyyd55fec3lwxxmzcqy4mvhsvqzzax","displayName":"Account 582","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"572696e433e4a28389fb6b4b2b0d2638ef850c593ccf8e2620dac972c06cba6e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/582H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn4xad3yuvn0kfflm7h6k9guen6yugvkf5kh3q98rl72r7x2m6l0k","displayName":"Account 583","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e9c445789ca8b0f41e69c7d07848234725544f723118eea3b3b0478f61913d09"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/583H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129t8mdh7nfs4zw2vl90lg994sazlfaustu8mrynvp3wut8j76dkzvf","displayName":"Account 584","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fc9bfaf1b45e317704ef63c3ad56575e203f7bdc8277fc513e0e515013d6d2e3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/584H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3ywcfj32mdu6lpupjqvsslj9ptc94rh2lpgdgt7c3yfkjtgksxhc","displayName":"Account 585","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eb61511b56f67691d8f96f1e0038b97819036159b9709e0639c74ce979255fde"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/585H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yrl3jvc9uddslhfmk6dwma9mkmtml733faumk6rg9xuvpa67lde2n","displayName":"Account 586","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"949e867efb7620cb71c1e08eb46b0211c4b3349c811ec16309ccff34e2fec8bd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/586H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128npyr59vh4r44rwq4smu4zrd9ygyu73q8hrkd55lnsq4pp8yp3xqd","displayName":"Account 587","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a48d4bb332e819cf77cac07b80c1a0c555308a7dde6ea18ccc7a05af612e7b66"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/587H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129etdzh4fua0zclr7dkjjhaaqnvaspaj78radvlnuhygwnmaxlzhm6","displayName":"Account 588","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7549d3102e5d26a00387491ad7d70b5c189b4a608df83893b6f3cc9d2078c1dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/588H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12999pxgh0e8enmhegu4kplevqs37xwdr888gnkyy6q02vqyn96n24u","displayName":"Account 589","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"01986230d82950bf67cde2a285b985cc36b4bc42879a32d35363290490e9a28a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/589H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129genzeu2tegyfh6xwute24kkrwwx50lt6z9u7haqczdhn5z5ypl8x","displayName":"Account 590","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2b48cd80ed404e955bfc702ba74f06813e42f5f61de5695ee649630e68218965"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/590H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294hmk3rla6uyag9m58kvwjs6y2a3gguhwk8cfg3d8yl8cxkzgs0uz","displayName":"Account 591","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ab0eff4ab20ff46c7b33e704d7fff024f20cbb459f5737044c522bf139510902"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/591H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129eccqns5r6q47v4k77jntwm945ez56037qa4m72x6gnyn2pm7lfgk","displayName":"Account 592","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6ccc53aaadc14bba4cc85d8b7b86b9ec0fe1ca223336a8c118a82a06d204b538"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/592H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xm5q3t0gzq9hr4wpmn35kskdvzsk5ewuhp7y8hkfnak0nj9xl4cyf","displayName":"Account 593","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"453f5d42a8dfca16d9449c23c1185d80cad5796c50a7e1931d0bcc3a2c71576f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/593H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xs0pqd3ndn2vy4dw9eaacmgsa3t78umy7l6ufgwzl0da4ar9g89pa","displayName":"Account 594","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e890d91cf34eed7893dacefa5d60644a378f14f26e9403dcebcb5e3129e0fb40"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/594H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129npqz3ua09h6ajhmrvk0sjrqfxzjmjlws9vpn4wxd4c3jslwdq002","displayName":"Account 595","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ef5c76a546f933854fa5fca5fcfcfef2bdd74667589d1fe54933f6280cbb8ccd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/595H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128tvv345n32r5gszx5ytfntknta8e2ejwatf0pd9pp6rw7v8c6zulv","displayName":"Account 596","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b8f64fa1e28869b8c1f736f43502fd746580e9fe9f7adabfe68414378867840f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/596H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296stpfrhd6ysm02cdasd08q00jk99p29vylr7n5pfe8k939jav0sx","displayName":"Account 597","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eafe9fd2c8dc60cb85614757c3e1e98742b8be0a21401c4ef5dcee950b065a15"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/597H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xtendvhywflz27wmvj6qexd99y34xywfmqqtetugd5yafj9gr8wxj","displayName":"Account 598","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"255f526cc5d29b4c689880e1ee5da47a12b5c429093560cb4bc8e3ccc7ea070d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/598H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128f7j7dwuakrwunkpj74v3ak5sx6m7hlktxqcqeptmuh07y4v6r9cj","displayName":"Account 599","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8c1a988e1f386d330157d6f1c767f5dedc4c86dd9024e0a6b77d9c895b59d310"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/599H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ykfarl9trdwcg3tcrrxvq046ap87tmntu265h3zvp2p9xt0y2swvc","displayName":"Account 600","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"061ba400bad3c2a7ee6c1fc749d64d4e1e03547eca4b9dfa2e44e45c66bc3e09"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/600H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdt3khkyd9ps3gtmh2x0qz69mwx95kdkg8z8j3ydfl72yrzqafdch","displayName":"Account 601","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cefe7735717392cea9f7d7bfc90a08a3845bb2855b6adc93b6cd666c7a7f15b8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/601H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129jj2jg3wegk96yms88nyr7ps9c0623fgew07kfadtam7pcul5f8cl","displayName":"Account 602","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"60d55f91c34c7f6f08cdbedcfc9cd81bfbe913d894dee0386a64242796c49406"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/602H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywdfz860dfxvskdfcwwk5e2lvjjqhwfms4qv8l9nv8dq6aqz4vlt0","displayName":"Account 603","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ea845fc7817476b17f2a7d3c2250952801cb499cc03229c79e609a29bbc7dc5b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/603H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m0whctfdavxcklxres4z200ghvxykfprdvdhk9pnm4qg6jkp2n98","displayName":"Account 604","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7c1cf9f708c4b73286b9ded1ce9f1e2768aaab4270c9cf8a0ad3d10abbb363ca"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/604H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn7j9y2azu48rsph54cu07w38c7rrc8p5qc9msdpuzgp2u0snrde9","displayName":"Account 605","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ee31515383072a722ffcd2fb05796cd2f856a2bdc55a7b9371e0a461cbca64ac"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/605H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128f9rn3505jr83p77wlsrp9hqdt8x874nczs6f4vl297779rnq49zf","displayName":"Account 606","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dc9bfb8fe0345df1a7e54fcb8ba325556a6a6c4d6c9b4997adc91d15ac094064"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/606H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ela530t69pz23lk69cl6gkgkwanumsd6w9frs8l0n6yf3ec8gudt","displayName":"Account 607","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6762ceacba32e453477b5d5b2f9f6a85a8c91a811a54b13cc1cb1fa3315404b0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/607H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yj7dls3ssqmwklm83jsxn63hlgr4qsx0ew53v0je93m9p4746wvm9","displayName":"Account 608","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4fd33e1bfed5ab87777f0615d47c855fee03a9d8b15a863d589a8d4d3ddcfff8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/608H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygg7y4kmsl6u8676hwf9uarn23m9vezw8lqq899lu6jvxjcxf2f9x","displayName":"Account 609","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fe9367dc700f8aecd2d63acc7bfa3b63827831a4c6eda7a4877ce8f7b2878919"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/609H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128umrv2vhzxq4twpgze2eqjm3g3ul6tsg72hz82akgmpvefk3hvwu3","displayName":"Account 610","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e6d3a2ac9ab4512c1f08d910d3e3e58bc642174e4d7600ed896c57a09c0dd55"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/610H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3zeq09a0zd5u4mdrtklaglkme6054m2dk8l033mqelz57vc0vyry","displayName":"Account 611","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7a2cf8937315ffda30183c41623530c18994872a87b86d12148472ce8841550c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/611H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y680nxfjennmurn7yupprhndwx963zu6da896ksk2tm4c8hgkxgnq","displayName":"Account 612","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d270f1545a6f93b1315600af0370ad0fd43d17ffb2cbd480a4bcb4693b1bbb1e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/612H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xrvc8t4ca44glkr9gvedzhfj4rp4e9uzg7rpaeap5w8ctc4tlut24","displayName":"Account 613","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0e517be3bf12416e38491810b7bfdb3cc28f1921cedfc296e13751c5f5ce4014"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/613H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yhx88geup2dg2xvlk5qtccm8r5ae4y0tk6rwgcc9yk3v5xuj9d9d8","displayName":"Account 614","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2bea58ccb950857f748765702cb32baf311260c1eb0e3571ed6c556cde245a7e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/614H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywxe880n9gpryefkpjlv3m60pdnxgjrmvght6p3p7fqacte5c60gt","displayName":"Account 615","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0cb9ebcdf46f84ada298eedf9722e2e0f0c5e856b383d7c4d5db1644068b8253"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/615H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymx4jszl7w7fuwtv882tdu3xg9he7f6nlqnzgugllc4gvypsr4ufj","displayName":"Account 616","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5b420fdff355c3a251ac79df6374187eb7d51e6390b9b4392851d1fc272c01cd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/616H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xs2uu5wn27fmulx6efzy2c40fh7pp0z7q43xt6avjqp8fskc44pq5","displayName":"Account 617","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"51f41117b1596e7d3f0c673315302cca97d0e3d7421b97792e36970937da448f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/617H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129hvdjf3utv3spy6a9pmndrw0zj6rfmkwyl4uvw9zgu748u59fg02r","displayName":"Account 618","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5f00fe65bc812b52363e6ecdfab089292bc5f1919a0278985c7f593a57d94db4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/618H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zr20w0ehlpfycqyrmsxuc9xgmla6dddkcpj0zujf73uxq0ej5a5z","displayName":"Account 619","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"59018feda6d295faa4b6d3650f88ed69bcbd3f4cc0ab3b7d78c4dd79cf01a5d5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/619H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yp5ca08qshq5xxf8txvvntezkshn8jmz8sll22cmcmhc5fxhwuymk","displayName":"Account 620","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"156cd83034ea04f016b3231b0c132947d94843f4a4bc1c36a1c73d6e3dfc7e80"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/620H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129aqn4slx8az60c962xtg46426krfavdwkgh0yyfjz7mjmr7us32w2","displayName":"Account 621","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fa1a00404f3eda7cf4b6c31d3b2180dd9d0b5eadde154f617c6ba681f62a9304"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/621H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294ll0rlvar6gy4mk34rhlpnr56vn20a4e3lntt0ffjk0yj6rv5y89","displayName":"Account 622","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3d3b0456640be373142cb17b0a70a61656b288d00f2c366f8fc534f10ab5feb5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/622H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1287tj2gheqht2zsfp96wksuvl7sdjky2x74q078w7dxc6wlup88l6d","displayName":"Account 623","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1f3a7a35d27914257524791a3906b33be93d80501270e0249f12c4aa65a40a1c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/623H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7sgh4jmxmcqll9uw4n5sqvd3zw8pwq8922c97sru5ute2ujnsf07","displayName":"Account 624","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"63bf90ba7ef43907f999b66220b17c17d18ad40c2b51a8350154e8429f182304"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/624H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1296lfy09wa44k5jnmhe5c0rezs37qse334wjpk7n89274d3zuaym80","displayName":"Account 625","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d67d4e2d883f0ac748514f81269782c832c4ebc400fa8f165bc13b22d3820089"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/625H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2fh5l4sr6h6djx7s2v9d2lgxtkuxuaenccrmamfjhwmwud8sutsh","displayName":"Account 626","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a4ff70db3372438bf451f26dd27f9a4b9ee87ce55cf77aa7b20c74791515d44d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/626H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xe7m854c4w3ru2ee497ycm5cdx2lvjcq6y2syvludanlmsz6v5423","displayName":"Account 627","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e6d263be799ded119e977a5ad217b60d79b1f693663a5d29f8b2d6bab740c3a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/627H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xq64qzdnjss3c5laerycpvpa0rlpz23ddcnkl5uzv9f384gmm5y27","displayName":"Account 628","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"356ad0f913a305bcf3599ddcfa11169c271b4f3f7d96ce6697dd843dc8316545"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/628H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129t46q0tnlv0v6ngh65ygqz5789zemx60a7n26mj00gk0exf7np64m","displayName":"Account 629","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ea65e4b4de43e187b0c39be5b07e473fc6ac03d7e8ce4ff2f6468ea4cc4c83f0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/629H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zu7sedgcvycrqr8tlnge7cgwa2azxmmeqmztt0chvtur4kv0skmj","displayName":"Account 630","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"afb12b654081cc7e20483042f9def6261385141b477e319fdb5afaa4e9b04f79"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/630H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129jpjfsrcglt6juhv4mcntqn44dm8xznsax3cmz68dwfl548nsz7v7","displayName":"Account 631","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8ca460794f02bcfec7e2d2c2ce56e384c4c5a8aca91868959f32fb203ef6a75d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/631H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4q9v3zwv3z3peytx2z2w3vqwfhu5c46qh69mn6puh4ml79hq9te7","displayName":"Account 632","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dc8f43ef776924fc83dd742c206641118820169b18a98d291c7473c85e34677c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/632H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ttudlmcvgp26vau8l9eqf4tpky5ydz7wuurtvpeqhw8qjvq7u6fs","displayName":"Account 633","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4296cf82cacdf99a481745ba6cc87f2030aaff12a3231e71330d26e173a2d249"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/633H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydgz4f4lktd2d3eee6euxs7xasgk069ctat7auur266wsx5c7v7h6","displayName":"Account 634","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3a2b017b25f29d14a681e5dd3df516448bf792ed6963106452d4925f33ca91f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/634H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ykpzvp67ejn49xe45xqxqfx5d2jhrcs6v8lmwdmr3376fmjv5pg7u","displayName":"Account 635","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"91911a96f91747b4df1e4316a2284055c9d4bed373f270a7ec253f1e65c86c00"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/635H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yp9fk5h53yr658225062aeaupu6hn00yc5zv90r70eevtlezyu5ad","displayName":"Account 636","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"896f9894fc4085911f9567e6039a3ef17711c35184ea09514ef6c89a510a0a35"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/636H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128f9cdxt8k5cytlu9esu2zmxa2vnc52xfrrgywc4ljln4huzpj6a5u","displayName":"Account 637","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"41369bb70872ef3ddc6d042c6e0051798411022bd98b38e982841727a58300cd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/637H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kcsaknhrdj2j7s3d8c0n7n3f4jhx3af0yr4p0q6pcrv23f9v7h27","displayName":"Account 638","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0d8981f966e179f42220aa2a345b4d07b79d891bac38f4f02d5eef68ebae501"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/638H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yr94llufhmc742n3y03a3k5h9wpnvg77wr8e6sh29lclupgap203q","displayName":"Account 639","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4ff5dbde8a577f0c814626104667c08d2fcdc629b13e204bc6e9bffb9f58c134"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/639H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xk43rs65tqgt47ltmu59gnsapp86pwhyew54mtf2c4r7ep845eglt","displayName":"Account 640","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1360a4941c52372fdeff829159d64b0eb6b8e76866d62c3a5e8929b189b05ed8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/640H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294y5e6laguq5tyw2xav4a8fn5jng69qt2seu3kf24g2kel40axm7e","displayName":"Account 641","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3d6d53ceeb2b0af32e118713b247bbe5277836f3f3b03a5fb60c57cd4a715d41"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/641H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ccztqjg0tk3rlpx8l8kmchhy9hpplcg4cmzdetq3fj2tr027dfxv","displayName":"Account 642","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"86312b58df034a96ebed68a4e739c4d0ac1021a299c05cc1412dd4c99c5f556f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/642H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128e03ufs5j8tzs0pyns0k00depxshm5ga0k7xcymcw3p75m940rycl","displayName":"Account 643","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6ea5269f82ae35a5b79d644550daf7203d0d289cd22a8fd6d0dc5a4ca1168fb0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/643H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fllefnjj6hgstr8zsnp9rw0u0h35ukl82jhk39yrw2gjh995sdav","displayName":"Account 644","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9a9ae4e3b9a77fe9140681816d20aa477b7cf01e662bb5bb334137e69f5c79f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/644H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128eu5gf9y6gc0arfqfyp3m7jkf46zppzt6qajckcxtaqajg8z5t206","displayName":"Account 645","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"167dd3a2a4923cd1ccd356396020d8f4d41fc127e43187a3daa2b1456cd47b87"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/645H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yl69dpqgz0lkn9vfddwl7vgwy50a79k9cut7r6zwy9dudyzz0l5nj","displayName":"Account 646","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8232e663ed0d8f2da80eaeaab6cb21286dd3cf38247a1cf6295424da2e864093"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/646H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x5xlacwzj8h6uy9nvvm4xap5shs4jr5kf925c6wsf7s0ktm0j4tyf","displayName":"Account 647","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"519f432afb7e23eab9d0a7a8525d0aa820b0a943f8243fe41be56034dfe55207"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/647H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xxcjpsg5htk5987g9xvh90cq2jru75y4rc8c6ccw7x8tqpkrzcuhq","displayName":"Account 648","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"348b037d77e2c345ae73cf59bea08eed2c6edd324346f818d81fa5e111ad446f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/648H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xyxmg7xyyneqlus8e8uh4e9asta47lpd44c0le57z529yv3tkgg2v","displayName":"Account 649","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c4f9766043c22a01c200d9b9c36c3023811877cefc5877372b52758d8f3597e1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/649H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xna6dvw9kmg5lhfqa9efxmv48y6zhzyrgpz8mjfpjd6ejzsaruz5p","displayName":"Account 650","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e58f6b5759afeea757095b4bb270a768917afc162f4e32cac8b0207cf56e5753"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/650H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xz3j88yl5q84numwfhevh0cgg2wvgg4fkpqdwn8gzxggu0vap8lq7","displayName":"Account 651","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3078e32f9c65153e96da11a163f160bf4e63a6b3210fcfabb163d2acd717c4de"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/651H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xp0hcvx4kjvjazdg8clxfuq8srvga3h4sp84eeljfey29fpjpt32u","displayName":"Account 652","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"04645df86f55f0f45bc359770d7992814106e80f4f66e271c8dd4271850112aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/652H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xd7uv33jcl6xutyfn7jk29nj2z9jkzh6tgadz8n9a28wqyty02p4a","displayName":"Account 653","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8ec32e3ed102696fdb7a84215bd165dca0c6f2c2c8dc7513ff7fef20becca711"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/653H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x665naevlu9plmf786ww8cuaxpu0tw64s5zwtc3u0qxehym93d40d","displayName":"Account 654","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e353cbdb2d24e3e40a0a4818ba2f9d2871ea488849cc318d48990eee03f67e89"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/654H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x6zn8n87vu60ng54je2a00nd0y3m9e4aj9970nky478lwcstgdv0w","displayName":"Account 655","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f561530831ce44f157388b975b92434ae346c3cb32a3f1a52e891dc0ea785e77"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/655H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4xw7lhy4s8evwlf0euhys20htxqnzp9qesnsf3pa5eqqq8jfgdhy","displayName":"Account 656","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ca2b1dec8489d8dc926c36f28842611e916b4bebac26a62f89d11455f73160da"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/656H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3f2ppt0acujeefrunxdy6h0k0x32sjenqfwah4s6x2fs6hq9l9rs","displayName":"Account 657","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"53a5cdb77732cd8df462cfa9cc615d4ec0e9d0d76838c4cdd420e6e9d6526dca"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/657H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12833plaqmrwwzzd7gd8j2h6a6dct403x6hkq0cgw48u7thqeuym0vm","displayName":"Account 658","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eed565110304606b7b358cf449c633a41565d763045296cfcd85b9eae8075fea"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/658H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xt8cnklthy3qt449nawshg9hjy3237s9rz5euzewg7gnvek93vld7","displayName":"Account 659","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ae7041ac4b0a567e2e447a9d182845c55596cb10b0fd605c27ad792a095643a2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/659H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4md4nq9gf5lucdtmj03pvs3m770xk8hzgr5jrwmdqa0480v75pgd","displayName":"Account 660","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1366aec035a5597230d5813628d407480b8c3712c7e24d53d7025dd0069b8e3f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/660H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y82j2r07286xmks75ejrsyfpkqmk4t9cf4aymfaf3c87nvsh96lg8","displayName":"Account 661","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c76ec9d81325d52350c7b7cdb39569358e7108d6cec65f0019105f0d70aa9be2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/661H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xap9p9l889e2z5n5fmw389gs00apdncy2zgmm4x87ge5yhlq84dxa","displayName":"Account 662","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f6f761ae822034efc017fd7b09d313fa314f6984755f2647604f51277b688a0a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/662H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhk5fc9x289ys7el9j2zlkfmrjl350p0s39fjp9qx2n5vhvh8x7xv","displayName":"Account 663","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"85ff1ce31dae51e8d314bc0dfd775ec64f334c7507af9a8b203efbf100da37af"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/663H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128l8c4vwrl3jxdufw55dneyn22ea47cturw9pyzsmrlazzgek4rx22","displayName":"Account 664","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"df128a7c9ea1894b2626051ab606a8ee7b46c9751ff4e64d9a6e8d44261eea0a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/664H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129d85av6k0pc6ufwum52frpdj38gpgqezjpzxyc7z3p5fy7j7lek2r","displayName":"Account 665","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7c430a295dc79f216687a0235a14de2460046886c79ceb41ad31a0a752afb088"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/665H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128p2gdq7qgldvgwm05z8m9p8ukf2u3pzkwyc58p4mzjcm0mt6mngw8","displayName":"Account 666","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a6b5afddc069a65f7092aa64ff73c9914ebe8ea07bc66e27eabda2c79c929ce2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/666H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjgvw0s7fe8fkqnmrcnj6dl5xetptal8wmlu4u7tjs987gtn0p46a","displayName":"Account 667","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"95c7472f12005556475bd7f783512ec3c3727c0c13f41d7ddbae7c6a9da83e17"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/667H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xp5xkqf6v9xr6t9lmhxgmtfd4eymnjem9frma2z506lervj6zesex","displayName":"Account 668","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a1d0b87beb0b2831ad766d4e992f8caebcb528a45f4f45f5fe7d62297bae3c8d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/668H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0c0pt0yxccueu0ay7788varkzqlpwnyj9re96l73q68e70g2v6vd","displayName":"Account 669","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3991fb7efa621b1352ee47c140c4b75fd35ced009be1e0b0607ce4c3b7a0090b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/669H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12846z4km3ny8hr7r3dl8wnj56f4ar8jv9r6datpdfxjgkv7sa654un","displayName":"Account 670","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"17f841d75d719aeb2927c1b6b5a18536f2c26b5622a9ba9a81116bc1cbdfe37e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/670H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yv0qsykny2kr3v0kgnzt8lr0q9l7qf3a22sfmrwgmz6yhv7ndj0lz","displayName":"Account 671","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"80f1d998dcc4be3f3b66d5e97140170b3d1a7c9670f5bd0cc2dc7e2c35f31df2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/671H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uvepa3km4q99q4snud9an6ymt4nvevefr0yac2clu794mzjpsqe7","displayName":"Account 672","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"313a7e84b996963ce80b1cbe571ebba1be055c22c7be2653ba4db23a4461158a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/672H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1282pv543eh3lj6tteneaslhwvh56ht4t8qmp9scxc6436ccdx343h0","displayName":"Account 673","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3505fa181f34b084260ea73eb484ecb16d57c15fc1f8eeae4a86238c803f4ea3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/673H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9uwz5zjs0sxxren3ukwa24dk852euh2ky3pu4v8s40jushc4kpkk","displayName":"Account 674","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"13f3356cd18804d719c27a29d3d978d3f28b9fd7e444582f302d83bff9f5a7f0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/674H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128xl9sajvazk44g0pww58ghche6q9xfjgxnd5wzv3lv2dgwqt4xq2e","displayName":"Account 675","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0dc34ca8527326d906eb8a4165692844da00078c4e492adee9829a7e60455289"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/675H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yd7gluunxqlrshzavxtvx5wcyasf5ascp0tha86fmmkgn2dph7h4k","displayName":"Account 676","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"21be10c2fc8b6a3a0df2ca3876bd5382cce6c90f577f88907cb3f1064f79d0d9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/676H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129287r3dphhccajrp7fkm7eu36vp67am762k96qh24v359fuxqkpyw","displayName":"Account 677","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f2bbb769654691c230f6241ba931228b568d608bb49875cc752d86201c9de85e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/677H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1297ywujmxrmwh3xtd3e8qdagut5wzj4rxz0x7gl0sggr0mnpv2dskh","displayName":"Account 678","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6102271d9058d35530e30bda8fa1248781041de49e3186e4a8f427ae6f1ecde8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/678H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xk80q3pjcw4ez2hj850tgrhsjpch4y0gc2a7qk6apkj4ct9ndl975","displayName":"Account 679","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eae3359bfde7286e64f658979ae325cd8a9049357a5883639394e7fa83d1a915"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/679H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xkrzxy7c34qy82t7flsynazyg685unyfdm00ztt4ye625v94ksef4","displayName":"Account 680","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f9a34bd7276c45f714b0d6f25fffbad2c2750e4d67d7fcba409df8145292a13e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/680H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjxulzttta8l7k30sxqt565ahvfc55gxedy4rz264kzf98xtncjcc","displayName":"Account 681","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7999a23ccfe8cd73fd48c7ae034a6bdfb951d435dd15fcfb78736eeae7eb1867"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/681H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129d9l0nvj560farl9c60uaul9gnsmgkpnz2q9k5h474lssth2ftwrk","displayName":"Account 682","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8ec67154b163eea5a542cc4ef7bf1f019957566222b6a57f913f5a14e38f0fe0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/682H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294yy6ww7d4vfxlp8pvf47c3nn5fdy43sgvdu6nmra22skdq6ay2mp","displayName":"Account 683","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f0c481bd6475d3b2ee31c4cc9b11140ad63c9466fb9b184d72ca8b1ebaac2069"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/683H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128eqvncvdeuuz5lrlkvpghdjs5q6m056ctlgmrlvj3xpxer6s3dwwu","displayName":"Account 684","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"64ad77f1aa139b25cf869f5d92ff3f29f51dc56855d8667e57b5efb7b9917099"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/684H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygwexpts0j6jt2zey3647suya37svzhy6f6w536apt60y8lzv0qcu","displayName":"Account 685","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c610f69773fd409801e64295f6e0c83ac1bbda04e196bf99a4f16009d0af8add"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/685H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128h0ejrw3jyjahn9wpgwd8aqltzt9x990jj6nz0tlrv7fef2rvzmwj","displayName":"Account 686","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6fdc09cbbdba442e78d0268b4d7e05a3eeccf4d20dcbe569ac619f3282564a43"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/686H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zguvw53ruj7w0469228m4cy2k99k5rch5jpzfq4a5vedp645x85p","displayName":"Account 687","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7885a9c1f296b813065f050c1e797965de05403d4f8f1a967e5c98245e31de5c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/687H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ywwtzp2xffqlwsqxljn9dq8ppk4c66gwe53pxsr7pe0n256nqx4w3","displayName":"Account 688","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"026d6972f847604fe605171757dcdd10d492d01947e14d8930a2aafe2ce023e5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/688H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1288f25sjpg5tn6wq5svkth7cjtn8j9gq96r2ztclz9ff05n6a0szqe","displayName":"Account 689","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"04189fe11f55f176ecf1923feac454566f893831b86c3302968eeff1b204219b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/689H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129uk2clfmegqcn5l3s2k2zr63sfqwz4qggyf2yv9ce7w20mmt2rdyz","displayName":"Account 690","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b92c689141e7d552769e1dcd048aade0ab65b520f8d2ba5195a8fcef4f01df6f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/690H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pfg4sdklzcs9wdwhrtzljpcm7zn0pa5ujq05kqsf5fc6nuze4y7m","displayName":"Account 691","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"87529dd5bb40ed824d5fa28ca386c15396f46f402480b0c48cf7c312c4198e4e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/691H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4fmrp90rwffjapynnvdr383007ljk6xmgtz4mh98276p98hnaxcd","displayName":"Account 692","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fe1cdba16c460d78acf77c18372346361ff9a082fafa6fffe42332f9387a9da9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/692H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3zlt4tn4c9cgj4dar9yl5a9zdzvmy8nk7upa4fgs44r9cvgqdm9f","displayName":"Account 693","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a7d5370c3a05f6b9244b6301a360c0ad90b00ba103b44203c8ce44401a0d0439"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/693H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xmqsexh87v0lnja0w8zh2jtpnn4vw628l4h5qjwjqermkc4p9qa9j","displayName":"Account 694","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5709ea55a78f74cf95e471765ec6241baa0de406ced0f2d78035724ac85afff8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/694H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ek5k7hy8chewek8vxxl6chl02jjathxazzh20y2y6gh5gky7jzyg","displayName":"Account 695","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a4e3dc14249902a4afb63ff9f36ef640b033cb9e731e4a0a907a75075dc6f067"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/695H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ju7w3n6tnkz08a2yllxnvzcyh4wymyfapemc67ul73qgzrzh3sjh","displayName":"Account 696","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a9f3ef7c69e7b4a325a90d1ae986e9e150e521083c386b2923e24ae940f8a620"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/696H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydgg3q7wt4mn332fqrxy94szd3zd9xp8mda520hfef3xuxzxz82c4","displayName":"Account 697","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bf757efa8a5fc1036b3b2c3ac1beb60c1dfe2539ef01c47928b80f296400f5a9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/697H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128zdy2040hl2vfdycsu3wk5hh6px09krwm80k0fn8ghapdg2d969hg","displayName":"Account 698","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8fc6074f7c6534c0d56c80459fb6cb399f467f9accd00adfccde9d7087a2d01d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/698H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129aqz2z8972ln3fdfq4xvfdcqg35uw92lxd9rhl0rva6l7hwtmvdxf","displayName":"Account 699","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2062a420f6be240294ed800e4bf57f9bc892f60bf2378c133bc63a30a02b28d8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/699H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yzn7tctjl7ja6ynzmmwn8gj5evpwa86wy442whvyrcuv4xcfstu9y","displayName":"Account 700","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"93f04f558ec7bdf66d022a212fbc5fe53faa523cd7781750d790efb10244fde0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/700H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129j9sntyq3rnj3vc4rm4mw45gjzguqlcag0qvqqtu9axsj3rx5tdwr","displayName":"Account 701","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"06c6dc906ff356885353290dac3e3586679ab6d0303524b29d01b72fb0219a89"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/701H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xmqlc6zmqu2ervnc6ad595dyfgzjs6zt2nzkdx55qdgf2q4cx7nxw","displayName":"Account 702","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d1ff8166d1c116e340b35ede39272c70c6e1bb4f798eed21315119e7ddf5da22"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/702H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pw08ju9kuwf5dr8rtl84hz0y0wqfhkmsj59v55jx06cndfej8404","displayName":"Account 703","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a0ace7ba650b2df6d44df790a96894346fe8d2b11d5c27b1dff051d3cc533c94"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/703H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x3ygqc77gataqe9g53qy4gktzvqaatqk4tr9kdqc48tacw4l2hqvu","displayName":"Account 704","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"76839185942bfc0608e8ee130daec6dd1cabaa222a2e8327cb2ccb41abb5ac47"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/704H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qpzngheqgtl40ksl4qff9qexjdz6g5sv3hpnz60lrtld34yqz30s","displayName":"Account 705","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f7b46f5ae81002c12f83337389559e6f11a3fc4053d02668626c571f767a729d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/705H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128gqtxwej94nj7qnvnp6v55t53k2hf4rfz306da6xecxpd84rrr5jg","displayName":"Account 706","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b69da24454bb5f9035b52a849fb55bfd77b88d421aeac83a2a75d95496c4e009"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/706H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rd2e9ynxwd8fyttnavw5w7emvtlrlsfed6h0387vvwc7ejksatn0","displayName":"Account 707","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1ce79f1c37950fcb41c82c6a28044f251dbe112b291009356fb7354f1d89f6fe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/707H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ynj3p479kwshdvvhu9qkdgu2z6ukfug9evwd6wg4scmm9ckrxv67n","displayName":"Account 708","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dcaf34a569ca21e040c0925b795365e102999ce3b795110d8df0aa420110287f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/708H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlqdmhg3qeghd23f9g3mgey3kqrfs32v85aqaf5phr6ddpn4laxpk","displayName":"Account 709","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"67b9a9949318c59b177d4107f964d72025d14d9dac0cd92b58760fdd108876f9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/709H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ke06f67wsdt5fpd3lsl2pfteugwq2rlfun5d6mdvrwe8tz27vl48","displayName":"Account 710","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c4577e3e392c2d508ef1a7b9ab67b0f9b51fa3b744c6be7446bdd81506695674"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/710H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsr92z7utkxuds5w3extp50dvp4lpaxwnnsr7vu8mftky3c9qe4ld","displayName":"Account 711","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"436aaadb3d1c3d8bc7fa4a87cf58adc28dab30856a242258ad3d22bcbdeb8c52"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/711H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yx34e3ycc7fx2h4zu0cxucf60tu5hpaqd3q8q8c0khxdwfzgfmrkj","displayName":"Account 712","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8b041dc5274d540b269d282f1486092caa786af13f1e17b02d43932815ed846b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/712H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1288gx6uerlfjxw9rzg3gdg6fddeh39mlg559hy4jpjq737ery525gu","displayName":"Account 713","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5d124ec216cc682029d9ec0cc7eb6ea7a36a272a9a88cf80c95adc27a5777104"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/713H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x0eaxec9pq9v0wy4eyy0x7tu5a3gmhv2w8ev2n5g9l4wmuyn5lggj","displayName":"Account 714","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"016d01027115d084524434ec512436a7568da8ad5b7841f0236cf2c09f13b8ac"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/714H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ypvrzv2rh70g60kn2swajwyc8eaeleekl0m2v8fujcrrhlmjmv2ls","displayName":"Account 715","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d0e73814792bd0ec3b57da050217d8d0483185dbaebe4785a532f17f0b1ecf8d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/715H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2rr7nttj4r50dgkpz8nrn6wlky43n9azjn3tktmqe0uer3y9d9f9","displayName":"Account 716","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bad6d156606d471d5974ee8f92c134d894da904af9b9cb5bebb403365f01bf95"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/716H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x47yrf3rm2lakl6lg3kqrsdkmtk7xlfnslstjuvf2p7xsczdmql7x","displayName":"Account 717","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8174affa0c5a8f4e3f6bd801cdd9bfb5b4fca674837b483fb247bbd614853840"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/717H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhvenjqpt80vfnqs7gmkw0s642cq2wxk6ysgz9p8skge6haamuct0","displayName":"Account 718","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8ede6efb7aeb5c7af26a43e788a5d2c4101081bbca9e37c289da77060a23a2fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/718H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yg20q0saeexra7ky8py23ajsms3ssxagjfj6ejv855ykf795gh83k","displayName":"Account 719","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4826929c1ffb3812c1dad2bfb69fddd66f4563837ad645decc83ed993ffaa43d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/719H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgeumrzy23sp472zdjkhuectn3w0sh2zadsf24f35m5vktclmhh3a","displayName":"Account 720","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3f0a76eb63ca075e0c5e73d85b4f846286b9bd2202230f2c4582182d1bee9d9c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/720H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yeduefjprdmfq7x9fraqwcaz54wus0w4merdnghah4see7skvh9tn","displayName":"Account 721","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fe090f41ef4ebb55c327b2a4984bb19bdbf2121990816f0c086895b1f8711add"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/721H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129xp6spr98e8c6n8putcf5ajjjyu3zaap6j8ug2vxf62nsjmnjvkc6","displayName":"Account 722","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"219c74473536f260d3b9f512a03c1f80070e391d202cf2439b99168cfb03e680"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/722H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dkud9aqptsu5h29rscw2n57wk02hhslldrju220a3vpdrxfd64ad","displayName":"Account 723","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b731646373f491783f58495efc878fdc8c781d07dae2f4c8b921c3a4aa0e8c17"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/723H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129cpyhrdp6370p8llgg48chjzxfxlnn9e483yc647juezxjwxpclg4","displayName":"Account 724","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"007c70e521fc9695a187626c4aae38ee139411509bc67edae9a0e3eb87340527"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/724H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ylqrdpt3wmacnt6fv2lr0xhu6enwxdvjtef40zu4p5cref8n585rf","displayName":"Account 725","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a50685b8783d5a4aac9df2df72cfd2f3736c0719b853628129841c5e7fca9409"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/725H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128pjk6zxt3s8qll0u36wdcj6yzrcxzy5zxws5q37un4dujf44axzcr","displayName":"Account 726","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"925d3b53719baee9ec8b13802a3f968ed3e2c0767f388e5babbd0593a4d9c1cd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/726H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129jr3y5w25xew06e0eemrjj40argdyynaet88p2g5trcaqq7rt2nvv","displayName":"Account 727","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a67254afb8ad25cc69220ff2358cb77ce8e423961e1755a9ab5f7a7f0121afc3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/727H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129exyecz0fftjqhh7c0kvzm3a6s4e2d3c5mv89j0g353vkuknph53s","displayName":"Account 728","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f7061e5c28d8a313322443ab607356707236e6661e2119f96f3db2ce9c10886a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/728H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128m04xgc8d96crg7zqq5470us0t3rzlcxzghwx9f5cvt0gaug7nlhs","displayName":"Account 729","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ba7a30cd994b5ed88b9b1b55a76a36bd60d4d2a90cff8914edec29704d02c758"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/729H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qedrwkng7t4vcuuyfxxwxkq9jeffn959rklu57rdh08jx8uel6qq","displayName":"Account 730","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c40e205998dc0b32169f512e572d88a0467d3a577b46ba6ae5d10f2312e92195"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/730H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ck7n86a8v0wwrj9p5upmh58mv2wewuca0kx329umhaknd4j8p0ry","displayName":"Account 731","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"644797f3cf1b4f9308e1072e7d5c80c1769cc108eae3d2b1526eac91dc1cbea0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/731H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1287lnpm0r9x4ujdm5h62wuh90uneca88zj48gkh8q9sqmkwj3q4zt3","displayName":"Account 732","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"48c102e122ab777217d218b9a982ca4b390f882f522a0cf631498023645451c1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/732H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpx3w3xdau5f074kcmpsp08hefk0kya6puw5a9a4zne62dh7r74eg","displayName":"Account 733","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"df5c56b49103ad020faabfb781f97d9036aa334063943cd946127c5ffd035606"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/733H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xf0u6fq5652l9cjxukg4daj3257t79l3rknfl5jkntcnhlmfsr84r","displayName":"Account 734","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2f0f8e68a1c136e81d95e4d736fcfaa59f6bbb3deb0c29f0770ec7f32a131726"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/734H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294zura8qgr9n3fqxr6y6cg4az5vrhqmh0rmklk65x2dfjyvtemc9y","displayName":"Account 735","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"513cc116744d6ae78093d4a37d06d9177732b6e0d8babae23a6dc1ce8f0fceb2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/735H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yng76j2uh0v4xarazxukx07sz7ugalhcytg7t9m67xrqj64nymf3e","displayName":"Account 736","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9ce2d542ea8fc5f33aad4b794b1acfc466d356ba0bde9865a2e245990771df50"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/736H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1283cg6fhey6dtnqxwcmefs2ch0v9y0ukxlcty0nez0605964y94wc3","displayName":"Account 737","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ad3c45dc857ddb170aceff6f08d86417679745f11d42fb364aaec59f2a1727dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/737H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vsx0kt5cvczpepwafwdtkar300kz6rkdz2s42r5flur7q4lyh6kk","displayName":"Account 738","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0f70529e94645c1bacf0aead47f805295b39f947418d0f872f223e8e6716c3ab"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/738H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4qftzc0vsldxsznw43unyy40mxxf46njyd4lgm8g76kgpvx7q87m","displayName":"Account 739","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a8cc156eb02cc3fedf1cc67bb2809b9b60452dd15e2fa93ea3c25a83dec7ab22"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/739H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128l5kgw7d2yn7en4yrmatdhp0rzm098ukyddy7se0zr99m639lugvz","displayName":"Account 740","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"618694504177215edb2008ce9c54600d3a69a790098a6c0d71858981a69f3286"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/740H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjsl5j69t8wy68zqqu0sdjd7mzqh8nn0azxe7mneqjvu2p20gx7w7","displayName":"Account 741","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5be7efc490d3240d5528e61e2e0e38430e1605b1497641cc3c8b5993d1f5bef4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/741H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qg34zx3eez8lv9jr2wzvkmwxr5yzk57qp59gnetpnzrya9np5wxy","displayName":"Account 742","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e9d221b69217978d655b1bf6d32a75f299b66acdbff010c569e50ba1f879826"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/742H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xg7v94ufcrrenxclr3kgppa22r9xwfspzzj3nze2kman6ukvm989n","displayName":"Account 743","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1bbaeb74b7557b4b62ca50479c75e84bd9bcd5e5e172b54cee97970aeb272e59"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/743H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285dry4a7ssw6a7d82w8ymn9qsjystgmt2vhqr7ugqcg7069zsc74s","displayName":"Account 744","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c85e8edfda480c12b383180981bddf1da2a20d88f35637ccfd7935cda0ff17c9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/744H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128yulr8sr64ury2djv0vtz7fq9sxk5gpde5ku2q07f62tfsk9xlhc8","displayName":"Account 745","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9d7b73d07137007406db3ecce14fd20391f544bf4b3775aa6b16d2fbc319805e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/745H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1299arfjw7cpvyxmelm23ju6q2tpqygslrsxhgh9cjglmmcw80tcpfe","displayName":"Account 746","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fbef83db2aa348aa10191a64229ba56b13b1770789661e9932026b7d448f4312"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/746H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129h2ydydxn0tntj0ew4sx2a596h4uqvrnsgjg0pd5fl9m3yh3wrwmr","displayName":"Account 747","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9d99bf0fc243ef05b553c1dc8ac9e69dda1b8805f27235ee26624e6ebb89610a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/747H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yf693w3kvkv8azv2k04qjv2er9vuzpsj2w4gp330trn54wp7k224x","displayName":"Account 748","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bf5a184f800ed4370f9738ee832d1b8adf05ed9ab947e16d3f4d5717ef9932e4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/748H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1299jn0xe7y055xn4hv4ekgactn6x34rvqu6ppfqwwv8x9pk7w4qmd3","displayName":"Account 749","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ea97824a5943db11ecd7905d85ee895e4f9ca2c4da3f6b08efc4a3a1ea112abb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/749H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xgag6hccp0vkn6n0mt556mugz4je3wn83gss3lqzuqs46mvpgn3nc","displayName":"Account 750","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3c7035a4928d0a652e9460947557e50e39e137330168036eefef3852847821dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/750H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjmf63ucvp54cr3qq5fdk355k443ljky3085gyekpmvpxz7qun9q3","displayName":"Account 751","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"95329472bcca86e9827aae1ae8feb25ebd031592a34799ffaa1d4f4b40f3cd49"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/751H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129586s248c0kdugqp429ad99gahdaw85kj0r4kf2l226yw8aa92223","displayName":"Account 752","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8dc9db9590a208b936f35d85357887a8cff1ab362c5c9c634c1c0330dc29522b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/752H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yp0mmes9hc3dqq4tushjmwyvmzyhthu8zm4dre0elrg3zrqhyh8hh","displayName":"Account 753","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b780027d5e18a7e2c446cc09eda7e53eedf7b80d046b7e3ac7b4b16f3d4a425e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/753H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjf6jz38ju9vjvwugf8zur29qdka80d48ecwv3luu5qrtnacu46gr","displayName":"Account 754","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"869c227c77f56fd731c070308870c54d46988241944348f12de112b59b2bd429"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/754H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ye83hk0fgskk0pmc4kp0j3ht737xqd2s6t779h06rh20ea5htjfmy","displayName":"Account 755","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"11bc7faa779019193f5962dbf9d39d788c392f28a052a88b94be6a3ba1548511"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/755H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1295fwy63advthpjsujqchnfjse7ladty6dv2q8spsy3098zefnf2a9","displayName":"Account 756","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fa547b46f362dc6ee898ba734a244af81f7191bfd339983ed3a6320df30398d6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/756H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128k8pw3ryzfk86ct0fe6t34ljljlvgqyuke558398gkr9w9qdar2a8","displayName":"Account 757","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5619ccc8e2462dcb296274da924200f4f2f589f23f69fe0a04fb5bf2dc1ef492"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/757H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8ukq2a5s7da70mgqv9ee4462gzj02spxz4c9mmrh3p5nay3qr3mw","displayName":"Account 758","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"62caba4a39d56a4e92262dc35794a812787aad126213a6f3adc5851c8250a971"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/758H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ys9hw79d47np754zczexr6sx84grzc8watzh4audqa94zqn7f80cr","displayName":"Account 759","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d4c0994be8a204e474e1f2a1b10ccc88b487544b3b16d839b108d5eda76379c7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/759H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wdmd05fmypjdel5g4ure0gsksjkzra0893qmzaaghaedz8upp7kj","displayName":"Account 760","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de686df32759239f3b83adb14757c3e525d251730704ec4142881846aef90be8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/760H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12885mtluyfnsfsc4r07uda9wswnqug4k4xg93pntrmpc9p37v7zget","displayName":"Account 761","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4692e99a34a0f18c3840bd46ccb0b3240b74561645ed37b93d30f6fe89bab039"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/761H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128vc722ts9sfeegyrn5zpwhm40rtpgp6jhytgfvhtprr24klzws0hy","displayName":"Account 762","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"894f2acb1059ade52674ef01c239e68e71417b9caaab1934365343eb3053fc42"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/762H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xnpv3jp9tzcev9gst5u8ky6rmcl0p53dx5ntt8cmur83wg5wnlzpy","displayName":"Account 763","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5d338c2d56143135e084c98860a48e171bb6a82b7bdb401a28d32549e2645342"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/763H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsvlvs39jsphht9uzttcf6fjsj8kcperd3hztvq0tx4fa3lhwa098","displayName":"Account 764","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"17229d376ca03f3e031bbbedf8f29f534ff258094aa21d33cecac5639db7b7a8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/764H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xdunqr6309xlajtut7p8hu69tmvwneh425azp28jjskltul8wd4l6","displayName":"Account 765","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"356b6b715b3b3dcea94d532682b6000cd483d618c30e9ef5491739bbe5d22c45"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/765H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284ewyq66p6dvcfjamry3saz6uce4mlj3fd7l382gma90hkj87f86k","displayName":"Account 766","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"79465c7239eae14972a8fe0e7ac2a082b29c8e8c21edfecc669ac6e929d07e7e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/766H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygjuvzkw2fj3pqv90kc9dexd68hl7k4sg242mp3hcfwgv7persua5","displayName":"Account 767","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"349d6061d17bcd9359745d5f1e2f8eb12c26284e0f623895e7bf58a2f73776b0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/767H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y576cvrqwyn6gjj3kjny5ucn05qzqdk4quj2tyssz4a6kysj2u7yp","displayName":"Account 768","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"338df1319497cef2f47e6ec2c83a6bfca56fdb2592ad4802ddb5c25ada98ef38"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/768H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128guyc2s4spkksnjh8jnxsknqh7qctwmhtwk2grgayqgpnrkqfl4l8","displayName":"Account 769","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e9ed2b95231baafc1f7353da0bee938ca7969edc859692bf81d5bea7456a47b4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/769H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xkpngf5kcdrd5yyeekgzdyh22d3k746vwtsccyt9paz04gth0ww0h","displayName":"Account 770","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5bef5aaba3ace3767b0d9bab32790455d94b2978bce0883a4d43852918b823ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/770H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z3sawfpgyj4hvcpg5udenqfxp09esxtjecyqf3xnsqaydf52yqn4","displayName":"Account 771","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1c4037835d12174d0395676ed6a9cda842ec5f6125d3e11e2f6d0b575098f7e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/771H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128trcanj75zsdt9r9wqpxwkva4s9wfysmqzwxpnkevk2sdrpk54fdp","displayName":"Account 772","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"67ace672740c2800f79180ed977c4fb54bdfeeb3b2a51d2b0dea5084ea70a0c0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/772H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xx9eayq3258tj8304cjk08n74enu9jvztkndm0sm0e3heanj9wlnr","displayName":"Account 773","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5b9ca231c2690810b84358dedca137cb159b79ad95ee44d08cf66959694a2db8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/773H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129c8p95v08xfg8ld60rjz5ndsdmgq8xgfz9kz83kqz9plgdgmjxg8u","displayName":"Account 774","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3a4ca6711ec8c1c2691d4d62cd93a3e92ee29e71e495e4560250e5e11c8b4d0f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/774H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128gxz4ppfe9gye06hznutjuc9kccwpv35k8qqw0h6v0m0rephgu9e8","displayName":"Account 775","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ffd0e6db523d002ef72f0cbd0627c87dca7fabf9a90218707c896f0e981302fc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/775H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129wzq40yht2tk396kzzvd7cvh7d6axspy2fetz4202eymdvx2f9vh6","displayName":"Account 776","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"76d6f9d09c259c5e9141550af64cb7da483e439c9fa6f65fc09f5c790e5c0839"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/776H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yz2tscar45jw3um8ucf6wv8pfh7f68vu9qnrhajkz6cvupxz3sx2p","displayName":"Account 777","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d17084e416452faac3eed788d2c88efb0184a42e22e1356c6735d3a3a2536bc5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/777H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xe77pec0dcssarmeck62ndznvps7k88zjytzu0ug0jdmsq9nguck8","displayName":"Account 778","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bc97aca09dc5ad78b3eb04f91358e774d88163bd22cd33467522fbbd6abe534a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/778H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ygex7ueyj0xrpqmt8pr46fkpa7jxe53re89gz5lzj0t8aqmtfzace","displayName":"Account 779","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"dedca6ee098c8d9dc5efabd84d5212a4aedaed36446cd03d7cd7d650fbe69cb5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/779H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8p3xmljc94qtjcal4w9hj6yflfs96zmj8akr64twfe3h2xhfnz9x","displayName":"Account 780","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"32dd6ed4149cb5f9a133d3b9cf1f75cf44b9162409228300445dc5fe1cabd219"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/780H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y8hkq0v5m2gug7tft8arnj2qjqy77d3u4f34skhvwtyv56maqux8f","displayName":"Account 781","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"85c163fd15e09a34968e095472a3bc075b2bbe57f7e95464906dc109238a249b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/781H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128urgrz5azntj84mz6yg2r6w0sr3xuggjxnfzh8j4vhsc6cjnlry5e","displayName":"Account 782","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f148e89d227e73a326d60e4eab79cfaada5817983ff9e7be5278ffd88eadd26"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/782H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128nr6f08d9auk44j6nfxe0fw466ulhugpz2zeuzjz689a0fy9xya38","displayName":"Account 783","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"40976bf045ee7cf5c34378249b0a7d733d556aa4d5699d4cbd9ffbcfe74d4eae"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/783H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yxjmg2a7zvetgmmk3e57u0apxunq29qmwajgku4hprghwnmrqzagr","displayName":"Account 784","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0e30282b9e4ca518c5a3aa9f385e2e94a51b53b86c9d433f22eea6e56223717e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/784H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytzpvjcpxm3pa8fv9use6f80zem8ayhrr5tzjh3a5fqdk9fq9p0wv","displayName":"Account 785","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bf4f2acf6a6ff758a8d2be11d33d4a520d41be503b2b9bf8ce7618b828abdf03"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/785H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqcjvc872772au9z2xw8kfx785s08q7k0macjdrdxswa90c8ezuy4","displayName":"Account 786","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a80ff294089020f4766947ee4e726ff5f3e71ef1338e92e0323fdd4f58cfb0e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/786H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y06pz4dawkku96l3ev7lepka45fz9un2y5dmu8g0x6ya2gx39nasz","displayName":"Account 787","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d50c06748836a1f93b1c0dc4c52238a34877168118b4a57edb6f1a9fcfcf4408"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/787H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128shkn9y3f3na9jsd007ar434n5y0dh6dagmrhu33xrg4mh5fhkvke","displayName":"Account 788","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7630787ef0b015a7acd7bf269aae19b7a5bcb4e81f76fd1797d457a5c3577405"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/788H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ypk7wjyntm4dxskdprrvfm5knedy2h0407ryn9kfpe0s0t9grq9u3","displayName":"Account 789","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"38f0a5c250c35b9008be80fa2917dc893bbbb10051895ad207fe6a3147fe7bb5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/789H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xd5fdupcgltvv8xkm3q3f55e634r7yr3xtgu3yht0cjlw7q86fu38","displayName":"Account 790","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5238044bba823ed0b16b2852aaefd5c55d76038ada0f2c0eeee65d6c0afeee8a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/790H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1283t3furdf8n6f8hva3gys90smg8c87yanmdalwgtcq6yzjwajl0ne","displayName":"Account 791","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4ef39f688baa454b616b1e9c05edc0a132722cc8330d6993f6f9e8eeb2237f9e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/791H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x09fw6qevg5rg2y65z07mzynxnu935efgkxsssy3v3xmcl6sajv3w","displayName":"Account 792","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"657a97008541aa1c5d0b13326d3546dfcd5f4ea2d0504d06b2429c7044e354b5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/792H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129gzuuj8rn3chxc58wthg8jpt6tc28wqwm3lkx6ztjnwjlgj5a83ta","displayName":"Account 793","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"551ff462c6ff18f0fda0ccf5366024a0d8697dae14230bdb53c7a4efea8ee17d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/793H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ls8msch50y2j6wcjn6l8gs52wc5vqfxvwd7gfv4wv0n0z33a2t4x","displayName":"Account 794","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2f27e6b40b0073ff3c443083c640f853336ccb5bcc4bd13f58f02cc2f9eef036"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/794H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yf4rheglnm75u0grt8v6hjega5ph3d3pv6sld7mjltvk0xzcxtkkd","displayName":"Account 795","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"caaa32cc570535a78788a779a5fbcc03499c4212e1068fb5429c44b50be78dc6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/795H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ysesqt80e004rzxkcuaz5lusxr2mqguedt3lyhr8anpmgqwhxh7r4","displayName":"Account 796","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e23767e0d8193b02e36f7f7bbb1dfecc40c91466e357a04d8cb9b30e76e4a682"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/796H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x28tn03cucu24u3ywv23tyluh24g8t02kuqcgpcn32q7mj0ynh48y","displayName":"Account 797","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2a29b73ac8e6820c3157713593843201e2d4c9ad8dd7314d40bc67b2ce8e31b5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/797H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1293jku6dd8xf56dg64d3hv9fenyt2ht05syystlmv294zttz6qglyp","displayName":"Account 798","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d55f6b8abb44f21b32703d4dfc501d781d856c863328175e79a97ea79d30931e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/798H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129u9hg40kkaxsr5fkllt3mgh299ledspk8elktha40yrpuayzk434y","displayName":"Account 799","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c85d6302cbb7dc31c2e01a7e2a1b933a758bf6da6183b0db352422a34ffd5f9d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/799H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yazc4px6w894fdlupy39z00mx4pjf3kw38cs76hru033s5965s2yk","displayName":"Account 800","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"27157ad7162133635aadfd66238eaca879719b8cb839d571d190133a61fb4410"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/800H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129xmw3z6rzmf0nqsrv43r6vrwck2skpg6ct9eapk9hl6acwz6k0v7z","displayName":"Account 801","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d32d010cf64c20f0cf3fbabab4589e46012249b29ad3841dee2afaefab9b284a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/801H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0qezdz052gkzl75pvq9x3cjypdtr02ep8cjt9q4x8s963l7juksd","displayName":"Account 802","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"233914c939c0b0186136771b5ecef68252d579321c1c3563a15c851977c1c1ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/802H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ulv230huq04th42qgnaaytp20p0nxk77w34y9p7wwuc8wqx78fnz","displayName":"Account 803","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0b23587ab09a133265c6e9a50aa1b43df51ef40ab2bfc73ca5b6e3dd8d24ea64"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/803H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2jvu2lehdcfrxps7nxlvz3emrelyqmfz73gs3fg2qttqks4s98l4","displayName":"Account 804","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4ac33f8a1e1001a07cde973a63a85732358878d0b26deec4d8f7525fdbee370a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/804H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129l0tvd7hp8h0kh5hv0f625z9ryf0qhepnpxc2yh04tnmjsnjhq2wp","displayName":"Account 805","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4a327763b1c18e9e2c1976acf2b9efdff14bfcdb6bbef10b95b388db218084d7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/805H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128at6dtw852z5hhhmlus8p0ape7h65tahelk0q7ve0duxdfj7u3w44","displayName":"Account 806","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"660ffd75c6417fe831cc5b24649c5c264fb1dfd57fba9f844090b9e63538873b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/806H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yjka5m5t84gddcrjgmj5zhpdeqfkeg3zvwhsvfvrcq0nx93h8laqj","displayName":"Account 807","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d775a520d74053b91b2ab5dd7b44e48465ea827da36ae90ebc943e055c4086eb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/807H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129u7e26urx2gpu6hywmcd4vsvcaqup0y9j3ccrz3mfptu3q5syugqk","displayName":"Account 808","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8071531cdb26e216d3cbc9ddf1525ce0894092821d6cf5d9d79b4ed477e244eb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/808H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4y2xzpydm55t6c8wcuhzrd8lwklmvknnhnnjwja8z47n75teq275","displayName":"Account 809","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d33f632ab28e4fd5847c7da70759412dd797da5b6974e7a6547294d27103c725"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/809H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12978m4h7p9wpdgenknmfw4t227w3tw9x8704q3dfp700sgu39w8pg8","displayName":"Account 810","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e5d4017b01fa49faa8e1436860d2f73e08577468f96d4feeb9b63e0e23ff7eb1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/810H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12953fs63mrdtylh3vyw56neukj5vssa4k0vf5w3ssjmepajuf30fw8","displayName":"Account 811","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8c29cdc2b8f5f3daac6c2ad9e9ce37efe7fb18f0b325988146a79ed3c7d03c08"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/811H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ymzn9y4nmyjdlrz9jvmk29exu7y0fk3v0zd56rtn40xe6xaa704x7","displayName":"Account 812","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7ed1a4013ce67cc0d65c24916d932a772036a7b951de2c0e8287ba6afffd70c4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/812H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129nlnjpy7qnz0ez2cmuetrykdhvenjgzhvpzx4lvdsgstweu6ckte0","displayName":"Account 813","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e2c80b9d3419ed784b77f1bd3d26264e9807963db503fb3b66eb294574af82fc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/813H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ytvf08l8hfgltvy5j6fjdy45y52e04tk7a2pppcjjevth0dre5hpe","displayName":"Account 814","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a7993ff4143a544f88ff2bed8d1de46cff93e9d5f45eb5b758f08fe16b94508e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/814H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286kpf6g9j4mp26prwhjkernhfpvq2kvfgnglp27hn7g0jz9as5t3n","displayName":"Account 815","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b56a1b94c375a464c424b87313979411759f31e401d5228cc96e454b5c8e6226"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/815H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pd4mq8ts7phkwypspqutzas53c7qkkx0tj8dvc9q9gzwmzrh0fnd","displayName":"Account 816","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9a7b40eb7a57cb18946473749da362e28c8af60178d7be8fab3455fb8fc3b9ba"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/816H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0gxd2vp2yd7z3w5eye5dtp8m2fj6uglkd8exzztrdvgdq5h48vs8","displayName":"Account 817","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c964aef4b1da9478f30e6c9341864390f0acc104a105cae90ae024382ec38e2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/817H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y32qh8xa0xwv2v34yzh636hchaaehwm5sdg3yw7xffscuxsnkk8dh","displayName":"Account 818","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2fad435f897b5e6128538aafda247820a1e2f4012249459d19fb2400b6a4bcc5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/818H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289vwf80w23e9mxc8vaeeu9srfuxt6nxq7h43wkgqgjwxczpu9tfzs","displayName":"Account 819","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d3fd0f17af0bea89411b8b1a96df94c40b501562706d38a862557f3a0be51bda"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/819H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129kn5h9t8a5q3gttmx0wyafhxu6fh6n44hxfnwm6yzfez67j238guf","displayName":"Account 820","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1b48a9fe39bf43eb7df428a7122b4aa360808234c43ed707afc4833a21115c11"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/820H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ys8hz298347cfvela4sn52av92zvkxrrvzztjznz68tw2v0xtxr7d","displayName":"Account 821","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f2bc84ebc56605fc7fd8469bda046de66147e582fef1d5988a0d57989dec7667"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/821H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128949zh9njgfdx9dy7whdgxzegc6vpurfa8k80f8vu5tk6rsgsve06","displayName":"Account 822","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"70b443e98a34b5e2b92b560a7a620cf0bc4f587a042f0e28a71796fb05114336"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/822H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2lxann5kchmayh4882cd3tnxd4jldsn4xgrwudpcs24j442e0v60","displayName":"Account 823","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"017f9bbe1aa4dfd9ccc2e80147d6e2d1af81cc226b4bd989424226f576f6200a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/823H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xw3yn6paqk4jwsq2a9ewvwmuz9lseru3sdk3q856x6r6ulddwfsre","displayName":"Account 824","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3cadbcb92a3906c3e9accd2962f25fc30eb7cee52dfc1569d5e7f9e0927a8b3a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/824H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128c2e2t5gvqf34e4yhgvtzqwmaw7wwccdp85xr6nq2atwhdlhm5gkk","displayName":"Account 825","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a1ba01f6171eb0a520efac9e44595824bf8ea0a5a0dc678aa7f616275825d12f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/825H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1283e9mt4lptuucnwxamtvqu0ruh7hdnuknu4y32sh0hzs2jhsdtfsy","displayName":"Account 826","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c7e6f2393950bd4d08705c62a70f90ca30a253b39a9088d2373a1ba5b3857df"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/826H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128623dqny97mkasne32vmevfvzkdtva4ew7qaz52wavapmyy208vlq","displayName":"Account 827","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2ce247ca08511d761a066f06f1c3941eabd6d378f22253fa3c58c972bac7fd84"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/827H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y5kumkth4que80tk4wtyk3cjd02vceuekzjx7qn7pjqq6n8zw97dc","displayName":"Account 828","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b14af17e0bd2b56c1d9d0c14e68c92788cedf79ba077af4c76ebdb0150d40d40"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/828H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yensal5yz43juhcnlmrpv3xukrn94gz5cyvnyu09sum9lyxemd0sl","displayName":"Account 829","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7f977f8911746d0422d82d6894f504bb884d9dd1d1fad7ae7ea304baef0f11cc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/829H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128pmuxwrlda2g5ep59sfwkf4n6kj5jqfj4p7xn7ed0thwcjw88dtwr","displayName":"Account 830","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a46030abcc82bee846b13234497693d40a6b73517d09a90ab9a10a2711e4e84e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/830H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yu7svkq0lmkwfyav6y3n09ssjnfy9270a5gk0y6zfvsfc9v8tv6tt","displayName":"Account 831","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fcd2ce9329fd4de25de8c89cb7021a5c9ed752a8ead1aa0b5230a077faae244e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/831H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xl5n26z2642a6yhvmgamvvu0nqrqjc0kmlrkquc8qvmm26775vr9k","displayName":"Account 832","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1eb655241e0648270a92b48c5891f371eae751002ba320ebed7c4813255a6650"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/832H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xsjp6h7u5xtskhaqhsnsjv3q6327chvavclj9phk9k7x9j5qnrssj","displayName":"Account 833","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"21e0e621f472a972538f4ecb428dd377e280f42b22abfbbe657866c68ff902ef"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/833H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12944jm7c4tm0ql2s7sr59345z46q7d23qwu8al7tgwqfe9fe4pw60e","displayName":"Account 834","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ac949f2bfb72226ef562a19ff51e52d030470031fc90917533ca9a35be9839c1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/834H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xmtakme4t40ftr5vwaew96vnuva6vj6u44papgd6x7he3uaxc2dax","displayName":"Account 835","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5ea13147b4d642185d1b1dcbe3eb991785b2cac99fd41a19a37d9c244b57fdd0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/835H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129039r64rzzs0tefdztfrvjn8l9kscwx6mcgn90fz2kddjrggzjetu","displayName":"Account 836","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ad5472847137f341c6c587ccb0f21972244f5c16ab7202014a1c4ca7f4521b3c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/836H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129qkr8k8jm4px9k5qmjk8lcrl2cnjyvcjtfg0nx7mmdh6jcx300jnw","displayName":"Account 837","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c4861b5b2669162ab1462db485734fb6426130c0c804c9672b440358a77e2ddc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/837H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129lc498w9dev32h85a624jlnkatjjlm49xwef4tn778z7e6dkz2r6p","displayName":"Account 838","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e18566c664eb839739332bb45d5b7e7795e8517b30272cef52f00bbf67b7830c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/838H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128adr4ldx5m7zmtq8e0824zzagye7ff305g8u4hfzlt5c4ah9nxykw","displayName":"Account 839","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5b62cb4b0f78a3ed3a59f8c0c18eb0fa63b838895f8726620762d0796486f410"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/839H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128xlssm245cpg2n4t6tpm4cy65ua4s9mtdcx9twe0x9wjgu7p44qgn","displayName":"Account 840","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3756971d07fc300ad8407d5b867828f485dcc17ac89f26709b1e886bf179fd55"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/840H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y8ja3ddl3s8hd0xkp6yazcghns6y497ukqrmmksxpzull4gm3wh3a","displayName":"Account 841","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ab1695131ec31cc1eb905e1cda05e6408d85d5abe31ba80c58a80e50d66aeb12"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/841H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xqndze00g0tlqtwhugje48wmnkhjxx8m7dtehgeq3nm8m2aeycf55","displayName":"Account 842","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bc31222e1f2c6679bc9661a4ca43331190269d425e91f3aca1f243db97cfa626"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/842H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128509tf5gyedtfdplqvq7h6ft4ww8k9zpampdjm0yqup5dp8rca7uk","displayName":"Account 843","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"13296eb02e9442cd902583aae52b0bec40f12e8b66455082900fb677664611e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/843H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129k5sr2vxxmx3f0q3ljr7x40ecr7pt5lraegw756ef5udnuk9y0q8l","displayName":"Account 844","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e7b2f6bfc5226d352e0b13426771421677d80c9252272655b0af706a6fa1d79c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/844H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129anvaee8k794p44h9q3w7pdx4jm6ssqclypj2ec6scddtpff2km6l","displayName":"Account 845","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"11e46cd879c6288a20ceffda8e0a6c5037c5b08ac26bab85a9c39ad13979f69e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/845H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xllga5wzltrrx2gr0eqtl0jl7tczrtkvl6nepfaq249m05fay8vxy","displayName":"Account 846","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3c476421ee03a709a360cd85c6c7c925f92a647310f5f122d29e26369bc3ca19"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/846H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x7ncm6kuhvw7ts4rjju2uqahqgmh6guez3pxzd5qsy0nhu2kph7fy","displayName":"Account 847","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"24b5909f302fd8a93ef486ec8dfcb3ddba2d21808527fce921df587f26dd8adb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/847H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129eyhu6rp5ef7q347tcfgka290tg98h0a75ef0tgnu9s5w60ftzav5","displayName":"Account 848","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d02b1e834717a6287c82ed4baf662f4c6ab8ca890ee5b25975fa94db4bead942"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/848H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129fq8fmplnackyv6sytjkqk6m52gsg4lu4nvlnepu0g6dacfuyz8d7","displayName":"Account 849","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1d02bf4b60cb109b4800586a20e95020c851bc471fb73e338b20141981587f53"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/849H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y62ttmrv4ce6q377mwvqskklgnaf03nx7t4dtfcvyepm20uy949xy","displayName":"Account 850","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ff0a26496c3c4db70162317d45b95817da508167a4e790ce77770ac8572f5c4b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/850H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ysw2d6d2znqruvqhktrgch725esvj8p4nf4yvy4rme7h8qqldxvy","displayName":"Account 851","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"852bdfe6feeb61a6fbb8de07809c83679a1d4d2be60d4fb533b1a3b9e2d2e877"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/851H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlh9v5stan92wv56svdzzpedtxra73dhkyds2ezcf6jxssem8wrxw","displayName":"Account 852","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3d68a1e32b44c4ce4bcaa47528bbae08de13a28cc2e152dfbf9b7ff202a431b2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/852H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xeqatr54ctfxwe8lpl9dv4hwua6vw38nzcdrn5cfc6r5trxfp4nla","displayName":"Account 853","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3e7fd62198f80ac1ae9c2d7261b6df8870c23106a1d779cd965e048166389479"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/853H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1284u2npelxm8k8asrzzc7jmjg9fwqnlmz9scyecutrnm0l50glcwqt","displayName":"Account 854","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"766c526a261c448264c57773431e284dddbda61424b25ce032205ce0b808c894"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/854H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128tsh665x5funvfn6x3krpl7eaayw86pd3df0ljdkjq9753dctk2tt","displayName":"Account 855","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"513b0bec08a7dde0a4d807bafc935a541ffa91efe2c43eedf9e84db998aa380e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/855H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1290ujzhjtqrn74ml6l5urpz3tuprt83a3p6f24s5hcas724nlflwqc","displayName":"Account 856","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c49b23a0315c689f42c6221dd42dc903dbcdb709ba54b35b27543a69d2300152"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/856H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xggnjyhz7xjq5qrah9z2p07t3xska5af22lhhjwn7zs73anyfa4e6","displayName":"Account 857","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3932138876420b070bd7bbebf67a382d7141a7175c14c6f054f298310f7875ee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/857H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292649urtlef6cdw3esfkzuxnrpzedpmtt0yeexjmkq76s5sgf3286","displayName":"Account 858","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bda572b7089f3b72c75005268ef6cdc62147236e53bad3c9138986baf840130c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/858H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7fsyerd5gua0k97c3ws4982jqlrqm34glhn68ekmh4hj4p3pflmp","displayName":"Account 859","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1ce7eda592c22d5a92ed1622723e49daae2c2d1a41b5c2f21fdc361d075b8e35"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/859H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128fyc9ak59tysq5gduexem7fp2ynrclcrxhhlxje4r974894m8m380","displayName":"Account 860","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d0c5142cb53da512a0bbead9448bc71c60167b7023eebf54dc10334634240eeb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/860H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128klmnya474a8etn0fk5m3h5ge2c8f4e88ms8zqmhjzwd90856j0sg","displayName":"Account 861","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"27b519e8a3c31edf71b4379b10758d61c94732793d6d519dfa60e48b6eb7169f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/861H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xaplhhuc80u3j8sn4zw7gcnhvxhjzrtzju977l6elrac9v4ud20wh","displayName":"Account 862","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fbf5913a71b99d71dc0f75edffb4874db04e8fab217d40765e6268906ee39ef7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/862H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yykfcp258e965syangssenuk43v0wcs6w68sk7gfx3evtavvlrls9","displayName":"Account 863","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b90d04dd3be856b51f0e7409e6375da8480e68e15fcc8b6c1353c3304bf1659f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/863H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xfu0v9zckz0z5pn0mzu2xv8effrc074tfy75kprkgzultu8lrgrw2","displayName":"Account 864","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"74a8cf0372542e86db46b710d22a1f67b5e3b753a50daa2c38a6675f8392b3e4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/864H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ya8j4s4rgdduafaf5akkte0h4r8ncdlcwvzwauwkmt5d40f77cj0","displayName":"Account 865","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9c238ec99029fe7275924b9fcf19407aad288a664860531a5e4ea032f65a3ed9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/865H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1292r0fp0zvd7gsc88crue0nhw2j85x0acasqrj2gjrjm9jjnmpj39h","displayName":"Account 866","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e59ca2cd6e4c5c76d4aaae0e32f2782c157b1485e971c534c6bf71fe08aae86b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/866H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128stw8wcn275guewt8xfgtqnsvxv2e9rvfsqgxmlanfe7fkcdzp8sl","displayName":"Account 867","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"51351557a9461ee2ec7207c1237a5777bff150ce2c2e7a489f4ed75ba6761ce2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/867H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xk963h5de2k8k4rrd255ty2vs9t6qgtvz7q3uaj6zf5sewhtqzqw3","displayName":"Account 868","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6d52e0396989a121b23fa05c9c583590f67c2095786acba577861a91c76402ba"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/868H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yeucamtdazd6kg7f5a6hdw4c3eur6ygnw5eedcrt2hgqv4uy7n47z","displayName":"Account 869","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"378be1a950949457fd3caaf8ac2e0a4af88a9fccadc01f6538b4bacd1544b375"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/869H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280f78zg5u0x089v4nj9t4thpt7wars24xgy96c0fgat9l2aylrwmh","displayName":"Account 870","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a2d9c20b01c4a5a3bb63d2965dd61467bcf834be2bb1ad267cce3f72683d5299"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/870H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129tusyt7r4q8qur0mqpc3mt87zx4gs9m4ux8g0v57vuzya4zhdn0dy","displayName":"Account 871","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6f88a0794f152a946b7d7b2cc4dd086b06465a59a2c471a22b18ec9e4509b97b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/871H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1289l059fdyksjnsyuafs9gw9nf83r8zt9p4jz0yxuv9myhhyc459t0","displayName":"Account 872","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"65a2b0e33257f3bebafc69e28c14d5201dffd14e829394a4d4cb63c7f0fbd6f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/872H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129q70dleu3scs67h2qz7my3zl5k5a92tufy2met9hghyzteyusegm7","displayName":"Account 873","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"82f8db1de3ea8ba39a9154f8d6524fc6a046df617d5cc17bb5740fc2e1c052a1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/873H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128sdvgetxc3rd2zkgznwhh9v0h4uamljcfy95vle0dwhcx4nvwxvrc","displayName":"Account 874","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a39f410cc3218462b0c2059746a53250b6949274683782d32236941d798078e0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/874H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xaesk8u8vqmqwrg6du65vmgvsw9mzudvm8tfs7zglzwymu477p4jr","displayName":"Account 875","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d0e0de607c544bb03828ee8c96184f2570b08f1671dff6b11b3d20783ad79470"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/875H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12923vzc3nun6237083jd3pzw2uua0c6scnennrsh0urda8660lzsxt","displayName":"Account 876","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4000fd04142a074fd17758d628379d13eeb7bab3db71ff26ceadca0930d7e3be"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/876H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvk5nd8s8hczxs06phy0zzs5s5r2rkej3yf27dkv9ylkxgdtg2u3c","displayName":"Account 877","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b2f832bd9be83ff873592f85b13c304dc925ae423cb6d6686a4a39923aea053e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/877H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yp65nl0gayd573gtkfa8xrxedft07jqd45xxfgzj7neudr75zuzlr","displayName":"Account 878","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"699c6725c2f93afd6e2b954422ac67bdc3e2da75fdde0cd3d7eaa03faf21aa33"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/878H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3pvd0wxelj5cda9wyrwa3ekukeystnfh238u90krc302dpxhn3ne","displayName":"Account 879","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"73fbae3077ed8bbb0f255ccf3466ec75a153123370c5407f1cccc594768758e4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/879H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128x9grpgqufvc4k9udq2zhn77cun73kl6mp4sddtzsmkke7a9qd0w4","displayName":"Account 880","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f7b37cdedc3dd8aa19dbb2dbae32aba4b8672bc155b8d670be480c4177ee4fbb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/880H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xvzkdhp29mjm5rj0kmsta83tv5nj9ux4jk642y5wg3nqagf0epyd9","displayName":"Account 881","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6c33d95d58c56f8ec338bb5472b2754ada220f5804b16dc7ed849c1a1520bc07"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/881H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12862525k4s44f9w0wqkn3u652kgwld7kyylmx0h4vylnnrc3ls03dl","displayName":"Account 882","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f38dc0f4aceac1d21b636cef04a835d03343135d67abd579135aa7840255267b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/882H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128quuknd9h9yg32ectc8vsdzvp5ffc3antqqsqddwr4mdv2z8kxqfp","displayName":"Account 883","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7e9bb44acadbab693fc5072d8f788c1bb2fdd6183707c97ebe8fc366baf2c774"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/883H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7rhz7ax78k5nk8w5vfeqw28n29snefl3e43ep3yzac2vl4z4dgcc","displayName":"Account 884","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7d463355f9140a50006f8b1f8c7675f16321c5d809d53b0b4c638be4f6d042f6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/884H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yurdpxy269yy7nhduthghewxjgcuvk58fk3l8a9f236jka4x3wdyd","displayName":"Account 885","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2a8158078ff240c65163a3db0fef1fe70b68f0a377326b5852272913a1300e0c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/885H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129k45srajrc5tjmhceq59d4ldfycclfx0tne0ht5ll9df9mmy9fkh8","displayName":"Account 886","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a8797582b3670786947ecae079e4e7ff3f92db2d61ef5b8a9cf3847041e2d3f9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/886H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128w5xsva485edhu4390jzhthuckdpjmzk0gwjkm2ah8pt3frj4t6wn","displayName":"Account 887","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"34cf47b530ab373ec06adad367daa4d8ca2f05d739d01bfc401b362fcf87cf4b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/887H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yntk9vsl3dwhkfjkmqp0sdml60apwmnrmf83xpzzfmmcdph045quy","displayName":"Account 888","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"be7139376cade3db530fd69cdeb2bf82e221b26fdba530488e5ee097b5889149"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/888H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xphvsxexvhhaj6c7r5kdrvkl5jkn26zk432fkxrkx0dyy9jg3rscp","displayName":"Account 889","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"98483ad1a12eaa06e899736e4241a5a4c6d71e6c987cd74a1354e03178689ee8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/889H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1299wy4mj3ezw4a8ul2js3gp90xa8ljgkghv5l5us736g627xrs5czx","displayName":"Account 890","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"61f016bae1f6fd383bef835e8131bf7e055ee38b833c9bdb9bb9f36afadc5de2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/890H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xjgq0eh8s2av4fmkmr2de3ukddv57qflwjdjhvj0d50y8uxgjuye4","displayName":"Account 891","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a7038f166818cdaa1ae6070953ad7c66ee138619cc525f310f0988c7cac74bdc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/891H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128emlxlgzm2zm68zy9ehc8rt2380t36etq793vd49ywvqg7g9cn4xg","displayName":"Account 892","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"20cf190387d6fc8f6a95d7c76eb6aaf608ebc5d4ed8ca2e5db1a0170ff43382a"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/892H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ujaya6pn79nkgalwhzgjljtkn46l93ypvkp7el7zlzgkq4qdvqhw","displayName":"Account 893","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bdd02ed754897e179e7eee680c5ada3ee3714a4550413cab5f67f44785eb993f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/893H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x2wdj5m6c33wu77ycu0c8rdyyvvwhfxfxeseyh50tlad54h89zt0m","displayName":"Account 894","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9917aec920a42e08588f914daf12ce297bc65820fa78d6a51e47a59d42aa38e7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/894H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129zrr6gd40fq9wqakzv9d6yn9ydytuj4a7r99rpfwdkna7xek9js32","displayName":"Account 895","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8fc63100413ff1f52ca2ea0335abe7f3a149fb7d3296f7145365740e659675c0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/895H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xajjx8p3jkss8z99p5xkqdae7l357fsjgypqmp4v34aw4fznf0wga","displayName":"Account 896","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7466c57fd8c77902f05b961c9712eb9dd5efaa3ba19e49a0d14f3d9d63f388a2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/896H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xcr36uaachu43e647wknk5h88rqk3ccrd9e3h8hg0c7rzk5zrfur6","displayName":"Account 897","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cdd14a8e6eb77a35a3c0971a4fc94be19ae92309ac1e495e61f26e51051e68df"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/897H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x894jcu0tfd5lqcnkckt3rqw44qrgrrutmkxu3ec6wx7ffw793emy","displayName":"Account 898","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"840e58189f894b946a4d72e4b679fb63291f78e1a3cfe3466ffb36e3335f7763"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/898H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128lt8mazmppyn03nh6mwpaa0maqvff88465y98h360rcdjh0qrlap9","displayName":"Account 899","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4cd63849c2e515376c122690c97c3e38e340640b7cf4df505d326aca58e6d3fc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/899H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xzxhzh7qyjeza352klxhdj2qmsnf0ex7kkdj60tntgs4u7e88q7kp","displayName":"Account 900","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"701501a430a0a25cae7c92bccbb8a80ec9d955c26bf1fe061234c76bb8839933"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/900H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128nchxzltzlzrdzjkpua5vqc4y6my0hlfp8tm7t6yslteurz576u95","displayName":"Account 901","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"91ba1457b535ce545b116688d49cbb3dd9a142ea9de8998ac87a8e98c940d6e0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/901H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vt0w74s5cm8vm722dj708t6umwn4x0sq9am6vcc5khqj27damg27","displayName":"Account 902","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5024c9fcb03ef267afea37920758c6fa0401dadd0da76a2e9598164a614f1a2c"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/902H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128e6d5vk45gdhql43c7qy024x9pqh76pstmsd5yl99ch3ngk3gp8yd","displayName":"Account 903","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2d8c095453ce13872c1c2e3602c55e6bb337f4d11e08ff4df0abe0bcfedd195b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/903H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280ntmgmfe6f44evvdfxhq9gv6jycvtfgw3nps4mlgsvaurkjwcdv4","displayName":"Account 904","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9e354c2f8eb28da79c72a19d5b7a2c7a3307badaac0e39d1616966d3c5385917"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/904H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129ywlcxyucam2my5n6gnvvnlts305gwwvuzc8sa7u2cfsn2uu2y60v","displayName":"Account 905","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"79b8c0365dc592cb6ecb4ae63bf94e692489f722d880216142307ec5ae0fbbd4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/905H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xptuxcl2mdraqfngjp7jm6udcynj2q7fmpvczsc0v6xz4lvxtrtdp","displayName":"Account 906","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9d8ffc425453cea1a04824ee38b1825975027069a56483c7f9135dfdc0a8d039"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/906H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129yw83qt79z2s6dgut3vx5hgqdqp9w9aptegpln48tkmdt8exz6m0x","displayName":"Account 907","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2d12949427af7473e70d66830dd88cf2ef2a33e50e8de4b5246410e5ca0d452f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/907H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xn68h5a5en2zypmv9z6nt3kfkcp2p6kr3qv377rg68s9end95emxn","displayName":"Account 908","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"6a3ed532e2d974c61bb8e22f98b5b781c6fd856204283fb13d15155d06925514"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/908H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129j8xshqdp66m6admp3fpw52dwg9pr95yau0hx20tp38f6lpuxfqug","displayName":"Account 909","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"2344f9db54d724eb3bf97ce4056f42c8155cfa2a4b24f96253e4c1db84024834"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/909H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1294h56mxzjxhufrn6qjtkgm45ckrj6nwpd599jm2glkhkfz33c2p73","displayName":"Account 910","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1ff2275a01187c2b9b298d79f44bff7b3f33f2185e096613f106afe316cc25bb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/910H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0f093t8z83tv3rdl4zzehjvnwyt7pkyx0p2xv5wwlgg987puwquv","displayName":"Account 911","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ef2490a47b3f2553d47b7bbbee1be787c84a098411c1f942f6a9aaa87d51bf44"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/911H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128evaneq8ysdas3x3s8awm7p9s940vqd6e2y3lt3z2me0jnkl00zpe","displayName":"Account 912","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8f349e2b9df2be8fa709469435ea73fbd268ae1462663b19c5f28cc527d186fe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/912H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129rvkfw8ar0j763w52mgz3h8xcmnl0k58tchsm2qawslfl2uuqppcy","displayName":"Account 913","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"95863a7708128729a20b34298719717179810d96827fbdb4ac1b212ad8b27493"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/913H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129mjxqakxmykj9n8a5mhckljx4sxfzkk83yqrxzmljk50m5wx80mqt","displayName":"Account 914","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1cec02e59c43ea0de8cac576a399626dfa61e0412973d63b257b67bc8e31d4ee"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/914H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12986anmgc70ve6af5lh2zmp4x7fyt7nn7ctdjtfn39ar60mnyfsd5n","displayName":"Account 915","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"e69c17fe82f6dfadfcd67da56668ffcfea4788f4783d185835a0b9e3bfea24b3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/915H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xa0qfhevun2x4pyujvy73h9zv4x8yf5mzf9kqrqjyv7aj3hu8gpmt","displayName":"Account 916","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5e068b6ff0deaca50b80142cbbf5838bb3c6d6cb7859dcc83b4049d4295d135d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/916H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128eua5mnjm0n0am7aftxr8cnfevcguelc5faz6frgmtrgp7qlxqk4y","displayName":"Account 917","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4d52dc20215648dcff88d75b9ede5a3b94381d5c8bb27c4e01cb8d5786fe5793"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/917H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128qn6ekadapx5m43cy08x27cqvf425lzhjdhxyjwzk3npkdfh2ppd6","displayName":"Account 918","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3475a1beee7f8353e6512b64657f1985dc0e190a297d8cc48f9537cd49d31e48"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/918H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129rh5np8uc4t7nn5ekmgrw9k8x6q8zr4s5weclyqctvxx9qufnv54c","displayName":"Account 919","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7da36021c6f81994bb4433703cc7843fa305e990d3af351bdeb25c57e3669a72"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/919H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129pqg57hhxevqfpesjg7mx0xq6pqmfsdxqh8402ur84vx9k2h6xm04","displayName":"Account 920","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9ffa0298fb4699effd79a1cda7a1676f42d3fb4e3c7924c24cd58bd51ac88e9e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/920H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xd0gpr97jep98dy8jj2tja2vg4munt4mjk9s5rusycwzwwjkqxd27","displayName":"Account 921","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"56857561f8964343713b81ac928a1322aff7962e953c41d273b36645d23b2217"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/921H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y29jkseh9vl55eevj9cjrcu8yy96cm9mj3fgfpgu567cjme6slpya","displayName":"Account 922","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1223bee9a4ccb1776f0618c4e76d39780b52cfc3de222500b4fae0e6c0b78055"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/922H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yqf6nn384znwatf8y5z6qg06chwcrwkn7x7fzmml0q36cf35mlzz3","displayName":"Account 923","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"9a0b35966630e9cf708e85628e0462891b9d4d3214447fd83cd7c51f78c8b815"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/923H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yxn4n8fv2jp82hdln8d0rsmetqndjwz5yzxecey6xex2rfy97u7pg","displayName":"Account 924","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"84255d77835f8c60a96dcd15320887b68bf0a530fc33dc730ed4764f55f155b0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/924H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129d8pdhw9hutktxyvs0uu2calwxnax7fmxkx93s7asyyp2pm54szpg","displayName":"Account 925","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7ecf197a4abcaf8b8b9adcb04b8e5db11464d2c33c33671a7c018e3cec821143"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/925H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128rq86vja2zwnn4qrptdhsxssd3ctjxl30pt3cykvz78pp34q6xh83","displayName":"Account 926","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8c09e41721f7866048dae7e484011a8e26aebaef57857c72794ab59101fe4265"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/926H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y7jejex6vxqywz0nq5626zxz9v6th4en28krlf4vnal2g6zwqdun3","displayName":"Account 927","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cea17a4741be70cdc0fa7c848e544e561d0fe754205e926b309b3e7344b60efe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/927H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1287d3qa5kjvhyzvh6pdp4km8t0dt7aj687lqccp0h0e6zrnzdtezeg","displayName":"Account 928","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3ca5829beca490f511da285a4678aaf6713c1900f9a294cbb4cd5edbb115fe79"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/928H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9cghsc089lke38dthskf7h3qa5ey7k8gcc3n6ckrdtgm75t2dhu0","displayName":"Account 929","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"8c490e1aa16dca17e4149a25ab5379d84bbb08c38d3b7506f0f03671172efc45"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/929H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y4whur9wwxdcdj4n7zpafzvhjsen7krjs64ej5rasvjs0hmp02unt","displayName":"Account 930","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7fd717e76a0e2c99c625bd545f43683c7e694f5f61e1e88dd775f4b99e37e0f5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/930H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129w5u7xfhkq9mxzfhe94pulvhlcnk0r66tctpmkjzxrr7e48pt2gh0","displayName":"Account 931","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"81556efa244f1ade8817068a84dff20ac69cd9593c893ab4a6e335da06d56c2e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/931H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129gg69dl7wexhe9kr8vly82q7dgfnwwjgmj3897mfw05ejakfvha3w","displayName":"Account 932","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"71825987d29316d223ac11acbfff7f490c1434c66685cebb190ecaf06c97e4fb"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/932H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yx8k5sqv7kw2223x0utpu8pej8nreeu8c8ep97p7lnwrndp4z9nkp","displayName":"Account 933","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"42e6926d822b2cec42187d06d31bbd5e94a37c4572622c6537d371566df94147"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/933H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dq3j9cukz37z78z47csdfa64j7r8ky7m6euglzjsw66jpwevd4dh","displayName":"Account 934","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b6f49752475b480dfecbae51c6cc7ffef3910e004790303e29c2bb15197c76f4"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/934H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129vpmkn5d4sqa6805xtfxd70fqyfs7q26cytnlzjj3mgzsrutjgv47","displayName":"Account 935","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"5e74e826f1e82fe3ee17b3c19d3fb16b5f696afed64c8e0d8757c27a201b8274"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/935H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128pdfl4avq69xlstcxq6hmqvu9gvu4ufxukvnskqch0ctxh64d2jz0","displayName":"Account 936","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0658d7cf5efb6acc19f1ac36b11423f281bade0c49f7925dcdddd2636c958aa6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/936H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yu29mxucp4t70yxflwe60382qrfzxe2zxsuk2pazaalr4ql79erng","displayName":"Account 937","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fe3fdae3273e2c9ab2868f1e6ad490b8a3b9135c6ba4e0f1f80eacf7b53ba8dc"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/937H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xx63v23mmpk3f4nwed9yq793fr62h2hyar0gapjw3qx86a4yvn7h5","displayName":"Account 938","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0b80a37df79bc04aecec62507d674302529c9a73a6b513215060f3cd91f72303"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/938H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ynlstn40vs7edgwzmqqv94gdnqxpp9u9gyl2mreses2fqhhkvep49","displayName":"Account 939","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"7847b6af4337ed3cb297987415fe1a6993e635aa66f30c52875ae3718bcfff91"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/939H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2x44r8k6s97md0g357vq288h5ysf7k3j5de4vwn6juqly84l99rc","displayName":"Account 940","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3b6c19fbf4bce99c322f3742382a581ad56b4e2198068990511394f071e265d6"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/940H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yven8n42tremulsz8e4tcl2w4mzpem5rdjtvln4uaqgycpr7kcta7","displayName":"Account 941","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"99fa4b7c226b67b19f0db9c648c768d976b9eace89ac3758402def980bb4b2f7"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/941H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xw5g6deflnxat3h68fz2kkkskurezlxy0t2ajx4df0y4vrgusnr0p","displayName":"Account 942","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"577ebf0ad504e38f7b78ae25cfbea86d5cedfa1d4f5430599abf7ea27f0e42ec"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/942H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1285ee6uaedvq7p79rzsuch4sttvctty9gx4u6l52yzta3l44mft9nh","displayName":"Account 943","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ff6efeea70740fdb3b8845455d8cc693787679401462e0fc0c4eafbc0c61df4f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/943H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128me408k6e0v0p0tcfvrmrpwuxhuwl0fd95z0gwlx4c8qttckq3jz3","displayName":"Account 944","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"62e2bea2ba37b3a001dca218ab0d4ded9ceee7e37c27aedc41dfcc2407b3cbf8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/944H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ycsvcgmp24pnwjmp63luxlkcuuwjp62hev0y84g6trxexdg8xj3c9","displayName":"Account 945","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"05f9120c181e243cf2baf35fcef57c89632016f9e65b41b47e746f4f14591646"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/945H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129fjjda5a0my5e37kcxkhuj9rw2muwt0el0086j967xpurqrzngufp","displayName":"Account 946","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ea53487eccd5fa5a7481299d4b36afa2160513945e7d0cac1b5689b9e7ff265b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/946H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xku5gm8xlzhymwnv8pk5zxhjpg6un5tpvsw430fhunr99xt73suc3","displayName":"Account 947","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"98bcafb8d894184313abc6191fe9c37e1ca6737d5a5feb06ab9d4668904c1362"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/947H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12880duf0rzsuua6xx2kdy5s5tr32xum960ykx40gxazrw6jrlk3x67","displayName":"Account 948","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a999a20fe6963e43e01becb7f7682e45ab176ccc60e96f074b59ad4fc1d66cb0"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/948H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhfkkmjlau3z6yd0kq973yk222qsegg53hy62ukm4j7gdweyhjq90","displayName":"Account 949","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"54c403bb79fb0e2621ad09f04c1e9dc855639f6cc9e6c6c558ae80f65d1ae383"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/949H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xcuxh2vasw8rw5ty9zzhr544rrtv5nwfk97zmlxmf0j7dtm9py6tv","displayName":"Account 950","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b5d3cdfcf0c3826a35e2cb4457e25113569ccab4a17d45cabf3926341cf89657"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/950H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yeq64yfvp0nkwac52et49yxven7ltyd9yx0vueavzjlzfnfjgcpr2","displayName":"Account 951","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4f57e0e2402920698511136cb66fab8d2696f3d913a1c430c5fb972c57582dc2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/951H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128p7qnd2nkh63dha7ad4vcgxahu2drc98qva039tfls8gcflxduj7j","displayName":"Account 952","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cd5dfdba73c56ef07c64e2987d3452d2b68a3c1b4fd893209412d022adab58db"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/952H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xlx7ertlt5f7lku0rlrlsjg7lyeagzzwf88596p5nkvn54l9ddtk2","displayName":"Account 953","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"184c3445ecd51457f15dd022a954a4a39428cb4e08ba794e48d20b06a2435fe9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/953H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yvp3trg9yma7wvhpfqzxdfesvskzllzdemycjc8h93hnu3mgpe8wz","displayName":"Account 954","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"bd21a70a519333c82eda86e3f35626ff33bb946f9cb35eaca73553e89c765144"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/954H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y2dtkwdp5frxv3atn6n4ecs0kn8sqywmyvnnqm7cp33cqd2fxsa4q","displayName":"Account 955","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"756fb9fd5e7b23a8a37afb81f229eba7ba56a63ccb5e865630f3ba38f5735917"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/955H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x4cvwpkepmac8umg3vs36eytwwxkwqgwz70evfa6gcxfxcjd5vsxf","displayName":"Account 956","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"d39105db1c9f453ef9cd3fb5115faf2c6d859ca011ec328f9fcbeb0683da6853"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/956H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xfv660308mpwmesm3jhvp0fhkc08x8ajq0p4nr5xk2m457fyuj5ae","displayName":"Account 957","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f9b280975567fc56f20889407ca80261c81bbc6bb2500555cdecd7a84485a03d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/957H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yu4ehg37ww455zr5yvm9mf7apshw4ng8une2hj9qnjmgtc2l9453v","displayName":"Account 958","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"08095edd45e29e2cd1dea7c5502fbaac52a3fa7f4dadc076e2e08651c882f0bd"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/958H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y8q7ylm4q6vsq53gn8tw0pp7lwgyy5rkwzqgx788utdp6n8t85r69","displayName":"Account 959","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1c6095756ab6f73738ae59db87b274370cb40318300cc7d12366bcf350ee4cd3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/959H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x2phhnvyv595xlv6plechu59d8q83wre5snmc4g9626axyg7zzp8c","displayName":"Account 960","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4f3e829fbea076729b823858635d406344721a007868c47a6ae90622006afaa8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/960H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xhf97h9wunu8wtm24p22yvq5rdzdpkjcm0n4fw0920frjan7ng23w","displayName":"Account 961","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c20371bfc78686125d5bf7d64ca8b9350889a201fd695ec3864e38d7a437f2ff"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/961H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1286nae6np8xwszfnr2f6pqrucvaqmcqeat9af49nxh566qlrzd03vu","displayName":"Account 962","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"91d321e7d83932ff4d60a64ac29c0eb9a5befc93ae245873673513398d7f3e9d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/962H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ydge8re9trznlrc3nxpfy9m9mny0jvad9856h33fd8crdac989h8g","displayName":"Account 963","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"3188ad9299c0a58de9a7e93099052d793e2f426d5b38da6eaa38f738c35144d8"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/963H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128uc60wvjdtfk466pje2zw5ej43ansv4ec3hwl0q6j9uhwvkt0tn76","displayName":"Account 964","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ecd194a41f4c835c8bb9c4c68bf99c227c4192253b001c5cfd2005446f925752"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/964H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128hsfc83xg7j3pjgnvyhsfrkjfjs9uhd2xvc42y23yrr7y3skj4wgk","displayName":"Account 965","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"271f43e70ffc0808ce25e75115bba1106fa493607cab22ca1248061ff8b24a0b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/965H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xe6xzvgzpp5axge3gjwn69f74t6hyj2huq893l8ur0lz34z973mf8","displayName":"Account 966","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"54ea64e8eea4f02293f443ff985d4510828070dd3597d4de44596a4e16769eba"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/966H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128r3qmtvqt8my3f8glh95wk59myv6340hk8svyv0f8ukumger9u6ze","displayName":"Account 967","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"cb4fbdb6b89b03bd537d72a6700a30cd6deb111fb0331c598dcfa3b8173d03d5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/967H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128kc0znp4knktewhdezy96whl6a2nryrfqw2y0x8k34yh7jjdhxqn7","displayName":"Account 968","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"69ae7fc27ac23d31e40cfc27a59c91bda7391fd2740f73e41eabb8f59a138fc1"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/968H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128dj9ahj430gt3vcgr337tyejss544gehkqxq7egzqcmjfv0r8vvnu","displayName":"Account 969","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"846f20a795e895059d3a9b79306b4baeb5cb470eeed308093a6cdb13fc86e8ba"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/969H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yvz9c5dmaxescrmfvtsnskex2wg0v7hgs2ppe74d2h2hjfm4f7naz","displayName":"Account 970","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"91393e5341b472cd146bb16eb4cd0bf8c316a46b08a175f6c79c842671f9ecb5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/970H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280vs8e8rw5h8syvzm4h4clx2n80qvvz508pgueg3huaq4sf7km0sa","displayName":"Account 971","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"88839727947b9abc00afd9d193d5b4b7b8a7e39d4a6b005634eebf9a3a09d51f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/971H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y0jtwpyk8x7x6tw4f4wx0p4edqldglv56utlggcq6h2c99z4ek0xz","displayName":"Account 972","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec466d3370555c78383627d03e69bb2a20d8bc4ca488459b07bd711ac00693d5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/972H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x9kfzcg2d7fz7rze3hanp2g9ppwrm05z55vqx69gqjx3p0cwqfk8r","displayName":"Account 973","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"1e431c44240e3c40c4b79ef27a209925c6c673aab645334a1a1a6ed7edf88a1d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/973H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ck8nt9fjf8krhfdfyqqpe7sq2j3tguh39fax98ufu30nxvdq7jnh","displayName":"Account 974","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"74b2a1b044b99a0c4c3b7f0c6faa722f612bb5cb67e264703fe788bf44e2f545"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/974H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x7gjetaf6pdhhuqkjqxdv5fn2te0wvkv4jy9zd2mz4dvhr6jecmqe","displayName":"Account 975","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"4cc12680af7e1864ec4f02e1f884224c0c38991ea924101d1d9c3d93a1e47b30"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/975H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129dxruzjgkm8ll8j0phws6y47mwmp5factlg8rcqah2y6sd3hg65zs","displayName":"Account 976","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"27e49e55f5bb6e4db6d713dd08f4ea6615c79c2e0a3e5d26357385a836e54ffe"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/976H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12ykd2n0fhmz6uuj6uv7ff3v5s2mn9uxfyhqeqjfq5g85v5prmzrdww","displayName":"Account 977","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ecdc161dc532ad58fab35ac4e87b955969bad98e0d59e0997fabb69277600293"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/977H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12yf3ktad2y5swqcy7y6qkwlr3he5p7jdvn64z392wkxly4ke9qckyv","displayName":"Account 978","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"fba38815dc02ecdc914cd4684bd1d646e6820a33cfd1c20b1afa1c632d0fa5f5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/978H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1282aq8md8w2jaezhx3wumqjdfr6vm0udd5wcl2ftt8uqutxn3vccjv","displayName":"Account 979","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f93c7217bc405379011f92ee5e5286f575ca9446edb1a7db2b4afeec5076e14b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/979H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x02s9m9gusuync87ywzjy3ueu0sl46da387tkdpwsl0h7t44m043h","displayName":"Account 980","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"140a177b6eac60b31489e0399596d1161e31734ee29a889b21f444d6b036fa1b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/980H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x8zvdp742l9zrsts20v6s2z2zyn0359t4z22s2k32l90xlt50capr","displayName":"Account 981","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"eae00acd8454c20a7d30e4e207498d0d7ea25115891080a086ee2e3757dc1914"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/981H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ek94tpvulnd402k2qy85yyshqjrswtmmqepjqutl9vm9l2aff5ph","displayName":"Account 982","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f2c94e63a185e4fc559e1fe321cb998627796bea494646d517735f759f082cf5"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/982H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129kyputues6f3uped6pmekdpts23alkln0r4fwmdtwdamx6kspwgcm","displayName":"Account 983","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"c52a5cf1cad71789061edfb220b4dec16d11d5146397c214d437bc8e0f73c862"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/983H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xyh2f8kavmm694zffgck29jlr8lglsgp5t9elr660dltajpf6x3h7","displayName":"Account 984","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"f223d3814e65c4d2f0a817251a41aeb636af256f65d0c3182f0fa0afb46176ad"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/984H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x694cq3zke2c2j8w4ff45zqfypjtvp6zu5p9cer0ywsyytzhh9wys","displayName":"Account 985","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0e97481106c8023c8959d4fe4221ac883f92a8f141ddd5a4e7c65c08ef916f95"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/985H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xr7w79dde8trkqqr95zh7ymx4tth3hg2vsa7ehu8ph6u0xa7fg0xh","displayName":"Account 986","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"282a13caf034626ac7a1cd2a903f226b4b5dce8f931223abb1031eda9a902e2f"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/986H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128ez0z3jf3khf8amgucmfrwtlxnv7jg7azza89e9cc9c2h24r49wr3","displayName":"Account 987","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de6946f93fccc7be8445afaf005e6b20523531ee5d436823365687284e4fa27b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/987H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx128thhhurdjfw53h23gmq4tj0379az7sh3998n09p4nyjzetqzmhfft","displayName":"Account 988","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"de4109cdfd4018cb8ef7c0b1b20004a1a9056ac56b956d23e160c4812fd724b9"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/988H"}}}}}}},"appearanceID":4,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xudfzq9lp7fx09xtvchphc7zc2ayjd24rnkx7gs36erm5r83dld06","displayName":"Account 989","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"0842d8dbd4c7928b685b2cc3ba944aab88e28990d7feae24ca5e0c1d81f4e802"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/989H"}}}}}}},"appearanceID":5,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12x6qc2d6rfaenqpy0vz80l07u7ras66kwadjafa6wmzuqusjxml3y0","displayName":"Account 990","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b2cf9d97bd2b0a4abea92806c44d31741c3f15af1058a975320c11e94a6174d3"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/990H"}}}}}}},"appearanceID":6,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129z48qtl8a6gchqfxwcrh4n362j7zhqascgknjc6gxzx78elmm3zfu","displayName":"Account 991","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"b142b4d157c5c774c47415c92f8b3249655423b1e1566c4caa06abd182f34fda"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/991H"}}}}}}},"appearanceID":7,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129767sedv8l2aq9vvcqdz442rwu55qlka04dx4vj74gy7hjtnepwed","displayName":"Account 992","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"600486efc8b5c13fe25152e29c09517376380ae5039b712668f3b15b835f8a6b"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/992H"}}}}}}},"appearanceID":8,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx129mzewjnxnqwkl93y73y3uuwydy0luapeg6spr5k8gxct20xksh7yw","displayName":"Account 993","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"65b23158eb1ca08ff0c5c566f2d1be095e7e0c5ea20eb17b2c0bcef414daa04e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/993H"}}}}}}},"appearanceID":9,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xwejv344y69dqc0tuk66meruvkqyutruqlvcwwd30myyhpwmhy2kk","displayName":"Account 994","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"a184b230550e3d9dee007f2569a8c2a6b6546ba4e9d237bd2b19b63d3c4d26aa"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/994H"}}}}}}},"appearanceID":10,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12xpf66pakxaxuktcl803g4ey58f857qqd287u4hr0hpd68n0ynje08","displayName":"Account 995","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"ec168b466c616a5a0ba97a82a17337a2575af13758a83328613e756d3358c3f2"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/995H"}}}}}}},"appearanceID":11,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y3yp7y9zdd2tcgzf0228m346uhj7rlns4j3643p4lv0qqg9px3q8g","displayName":"Account 996","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"01a6ccc82c56b4655e6ad9599dafac989e865e62f0228603cc0e94ef947f85df"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/996H"}}}}}}},"appearanceID":0,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y9q77nwxzty8xs6s9n3xssuztf7vy556cnklwyctcm4l5a8yu9mn6","displayName":"Account 997","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"004062f7b3a42b6d0af0b7e60db8ad5ed63deea5c525f8f55396ad6954610e59"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/997H"}}}}}}},"appearanceID":1,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx12y37vls7mmrart63te6z6fknz4kv9tfqn2xq2z3ztw59jur0humkky","displayName":"Account 998","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"add80d5809550c955611d91ed9f6cf642e38583ce8c0a0665e2dfe775129f54e"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/998H"}}}}}}},"appearanceID":2,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}},{"networkID":1,"address":"account_rdx1280kukz0ne5zfk0zmd9nh505gev37fwzzkfjknzp082hj75w7kpcd6","displayName":"Account 999","securityState":{"discriminator":"unsecured","unsecuredEntityControl":{"transactionSigning":{"factorSourceID":{"discriminator":"fromHash","fromHash":{"kind":"device","body":"3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240"}},"badge":{"discriminator":"virtualSource","virtualSource":{"discriminator":"hierarchicalDeterministicPublicKey","hierarchicalDeterministicPublicKey":{"publicKey":{"curve":"curve25519","compressedData":"faba3a3fc503791a93f1a511e7e01a9549982891e8bfe2fbc46d120c0a25850d"},"derivationPath":{"scheme":"cap26","path":"m/44H/1022H/1H/525H/1460H/999H"}}}}}}},"appearanceID":3,"flags":[],"onLedgerSettings":{"thirdPartyDeposits":{"depositRule":"acceptAll","assetsExceptionList":[],"depositorsAllowList":[]}}}],"personas":[],"authorizedDapps":[]}]} \ No newline at end of file +{ + "header": { + "snapshotVersion": 100, + "id": "f7ec13c6-09d4-4e7f-8ad1-2456e38f5290", + "creatingDevice": { + "id": "0b5d1a15-a132-4fe9-8d64-8d81cb3c57af", + "date": "2024-04-29T15:03:20.953Z", + "description": "Test - iPhone" + }, + "lastUsedOnDevice": { + "id": "0b5d1a15-a132-4fe9-8d64-8d81cb3c57af", + "date": "2024-04-29T15:03:20.953Z", + "description": "Test - iPhone" + }, + "lastModified": "2024-04-29T15:03:20.953Z", + "contentHint": { + "numberOfAccountsOnAllNetworksInTotal": 0, + "numberOfPersonasOnAllNetworksInTotal": 0, + "numberOfNetworks": 0 + } + }, + "factorSources": [ + { + "discriminator": "device", + "device": { + "id": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + }, + "common": { + "cryptoParameters": { + "supportedCurves": [ + "curve25519" + ], + "supportedDerivationPathSchemes": [ + "cap26" + ] + }, + "addedOn": "2023-09-11T16:05:56.000Z", + "lastUsedOn": "2023-09-11T16:05:56.000Z", + "flags": [ + "main" + ] + }, + "hint": { + "name": "Unknown Name", + "model": "iPhone", + "mnemonicWordCount": 24 + } + } + } + ], + "appPreferences": { + "display": { + "isCurrencyAmountVisible": true, + "fiatCurrencyPriceTarget": "usd" + }, + "gateways": { + "current": "https://mainnet.radixdlt.com/", + "saved": [ + { + "network": { + "name": "mainnet", + "id": 1, + "displayDescription": "Mainnet" + }, + "url": "https://mainnet.radixdlt.com/" + }, + { + "network": { + "name": "stokenet", + "id": 2, + "displayDescription": "Stokenet" + }, + "url": "https://babylon-stokenet-gateway.radixdlt.com/" + } + ] + }, + "security": { + "isCloudProfileSyncEnabled": true, + "isDeveloperModeEnabled": false, + "structureConfigurationReferences": [] + }, + "transaction": { + "defaultDepositGuarantee": "0.99" + } + }, + "networks": [ + { + "networkID": 1, + "accounts": [ + { + "networkID": 1, + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "displayName": "Account 0", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/0H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", + "displayName": "Account 1", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/1H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x", + "displayName": "Account 2", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fb97ffd1ee33ea7378bd4de6096371bfd7bc4ffcec3c99f959e8e238660eaf5b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/2H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x6qearl72520hj8p0ppet8tcyh3jfwd4qd0a5qn522e0xeutunc3l", + "displayName": "Account 3", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "57d0e188922c1d0342df770466c21e2235eb617bbe7f3ea8f524794e331920e5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/3H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yx8prkr8e3rtuxpl7grqv6vf6vy6hsmze3qtl4n08uya4padnu7f8", + "displayName": "Account 4", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "28bf9fdb2bad0500a3141314810f5f3acdda275bdfa0eb27b8f3bd8bf80a54ed" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/4H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296mvkzlzmyke3mvdf0e8wngtv5hw076gt9lf6mfdtncxp4eqmyt5c", + "displayName": "Account 5", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7efdaff52f3bd99f954fb6e687a43210171cf3704e5d7a804c57d576e4da5ebc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/5H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128e706u8c58yqjut5ckczwts5s298l3cljf444s65sc8gnfpxhgmd8", + "displayName": "Account 6", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "669a7c3f7c9c9fa1c687c0ef0b912f339119469b45ed087738eedbc0090217fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/6H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128un7clxuceztd85apdwnsy3geq0eauf83d00nuhk2s0k9n82tuyd2", + "displayName": "Account 7", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "455a6e3c56d8095648c4097738c44d5fd386f5511eff941122b8bc4b4da3bb9a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/7H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jcaqc4p5pmgulnnez4c8vnm4qy8l9kvtg8a6ekttnp89vkquqsc3", + "displayName": "Account 8", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "68c8bc7c23089f6451e61395511a988fbbf97bbac93d5dda5e00036c74b9e68c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/8H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwdjvetd5r7yfl5qhenmaz2wvdmw4tzngla33lk2gnksrx8sql6jp", + "displayName": "Account 9", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ed6761e65cbc0835a33f3898c6890c2095de32ffb80e9fd41a7f0b81b6e29a70" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/9H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12833x30kj3hex5tlx45hx6k8taug48aayc2u3k8kg3zhla4r09ha4q", + "displayName": "Account 10", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2a08f5aa1045064d41a832f52033b5f21d67806a81b79afaa304400244ce0ce7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/10H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dke694mupmyuysal25jj8tmml7fqmm2rusmaf3pew4s6kw5dd4hl", + "displayName": "Account 11", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cb7723df969d87c27906788045166f993b8ebf34737ea3c47c883c3abd4fa822" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/11H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zc9sl539kcu7qqdav4sr9jtwgm0r5xx4uak54vdtfj5pex2jmtc7", + "displayName": "Account 12", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5691bc11b73178ed7f8ad1d8b09f42267abbd3c27ee8d61813e36cb9a355bedb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/12H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kgdy452yhjqql0dead9v8xgh6ctxlasx4t5ut73w0r92c5djr8t8", + "displayName": "Account 13", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "363848aebfc8f393b583980071bfa93d8d381dbc14a3c2d683eec34703aca200" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/13H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128666mqpqgvwx39leq7wjnx4dk0ucpg09w0erj68wn3znmzkryr53n", + "displayName": "Account 14", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "389e865c93785043427a7889b8922705a447e82c4f75f4e4378f92ab0811aba5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/14H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlwqc93yfxgrzktehyjpuve0frk260c6p6scjnmg679zpy0rfvyx0", + "displayName": "Account 15", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7b2ce8df18bcfcb94695b0fc76053fed448de192454a75ba29c34b75efb47712" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/15H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fz545qp2l68y5vvkuhmfrcdwqrkkzusmygvfqvxtnkxeysx0reel", + "displayName": "Account 16", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f055f5611e158d70d378fc8381f2f3c9a15b1f33096aa62df86cda229b068f90" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/16H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128had2ef24sj7wgjzcmw239crqct4hyh2lxwewyagpkvu3tlv3s9mp", + "displayName": "Account 17", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b54896ee1049fd4a1ac3deb618f8c3fbe16042b391dcac02c1e4085206771db3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/17H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzf9tgwvrp4crad856vshvuhasrdzq5e28phf3236ggvdxu9xxjmu", + "displayName": "Account 18", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "882439de53048eccbd4ddbbe61cc04524762f22f29c6b3fe4e217b878a042fd9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/18H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1282pquu8czj82el770qjlzsjutfcmezx0jcm0vw4eajyxdg9tt5uca", + "displayName": "Account 19", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3b80cee5e24bd0c7820841957dc3f38ef4482546921ce80a16dcb8482cfd4117" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/19H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296rsdttnudwpjkfy0htskunxkfpks9fn8epz9e4y8hy02veg2nr8f", + "displayName": "Account 20", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bb4c50dc68269aa53fd14c1f3de8b3fb322e714498a6005ec63d254305f0acf8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/20H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z6geuwgqgqagu5tljmeqc8llp5smwgkffqf2cm3juextw848r2cn", + "displayName": "Account 21", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b377a9f9c9efe3d5924ecd66494db44b7c4cf387fb47ea2626eb2b54f7d452b9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/21H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129camasdv5jmeuv04xcxltqlfry2dgnrarazvnqtjkwxvzaeud0njd", + "displayName": "Account 22", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "345540c5c63a2e9d3397b539f22221231cd83650b2dd11c46b8fd3e2384e587b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/22H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ye9cd37e20ea9v33pxjjxe7gr8qwq604vyqjhzve3zts48sjuq5fn", + "displayName": "Account 23", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cdaeb21a2a49f1e280fd9afd1c9f77c0b51973f11ac275e1cc7b6fd13d44f5a1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/23H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1290a5lus9h340csrsl2m5rxsgqdv97y4zmqsfzw8kwzp7hatv6ea5r", + "displayName": "Account 24", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ed1a2591bbfe8df4aac1d20eb5b0c21f3b9e9813dcc20b69c7817a194181db7e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/24H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3dzym9wejdl946gqxjp2pdpzkylqmr7xpmgqma9cwmlkp8qdvrrg", + "displayName": "Account 25", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "70d80a78d62f80d339b520a74e5f09f8326303cbe314ac3ff1c4f4788fb0f7f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/25H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128wy039tee6fp9y6kptz3zmvphvya04xjjkm3uk8j7583cs355n4vk", + "displayName": "Account 26", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "29855264d9fe2acf3b12481e729eaab06c66ec3b56657438b9c1a1d0901be1d2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/26H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhsvu0530fjymcaqmsqamcgr6dmud20azayc2c8jfr9rve8safttj", + "displayName": "Account 27", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "26f725bc0f9f193fc2326989f1bb2cf0a69bbcfa39f876e2ef81cb2da69de9a7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/27H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128pfngrm5sax9ax58nddmmrrjka28d20fwzru4q4rrwfm8m5nnjlcn", + "displayName": "Account 28", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d28823ae567603b18832c809c0e246953f79e17c0910502c1c6464693a3f785" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/28H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywvw632uvx9pkx8enxhruhka5pxgwzu8huyqzmx87pmen0g7dp2tu", + "displayName": "Account 29", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e65d674ba760bbce1538ee70d79a3be8ca7bf3a8359e02890af201f35defe90c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/29H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdlaua2swqq0txcsld6snvk9yztc9uqrrlldrrca52kkurvxv9xen", + "displayName": "Account 30", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6ecc81720489082be58fb22758833c5e315b70ba76db32f7d2c903814aaca049" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/30H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzamrfhu8cdp59aseqvc89d73fnquq8a7tzkmfn7hn8ulvyjnvss0", + "displayName": "Account 31", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0d80278ee7339ff4b19112f010728c02040c11462afc0c8d0317ca8de36e7b31" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/31H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwcmqva3f9ycnfg7dv3upd37saafgeuq0kypcx4n9gn8hclsfrdpp", + "displayName": "Account 32", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3eb35670db98a5a16495953d62964a142afdd5cdf79a1ebd23009b23b34d64ce" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/32H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129er3y5geyjrcw49v47y9mct0574gqc3lk03r98ap8wkaatkn28475", + "displayName": "Account 33", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9bc77e38a56cc407aa1d458e0945e67b4a44a6b194d33ed4bc65002c0afcc957" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/33H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wqzgu0pukjwf430s2y3wkj6q0dwu3d4h6pdhjugwuljujx3er703", + "displayName": "Account 34", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9e3c7a34ec5279719a61f788131338322daa6379c97b13a14f2e9b9cb5d5aed2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/34H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yuvpn4kz9wj8c4rg9cwzryedpvms3cckafeca90rjj25fdak0krww", + "displayName": "Account 35", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3ccb06806f5ea69aa9a02b9861de061ea595a5680f54885f664fdc4796d97227" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/35H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xezazunkp99ltnd9hyk2jg6fjwpspevrdqna7h8ate2c72lczuhzm", + "displayName": "Account 36", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9f41bf20bb5a78f7d0e0b180de4e25d0bb8e99da3da9413cbf66eba9a12da614" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/36H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9qrru0084tjfg5n3hl9xc4pkaamq4nmu2y4kkfpamv3hn8tyjfjm", + "displayName": "Account 37", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de1811c9d577ffbfd1c3d2b3465eeefd0b8bdde344c89d9360ec25eb4591b07e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/37H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3adlu4ayscqqgtm4dmugzejaxelsltcjzn30dadf2pzq9pgpujh6", + "displayName": "Account 38", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "08e69139c9347e7b53c975052ae65b179a055cf6ce1d7c522cb13df1276c67bc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/38H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vaedutdfk9a6fmmfl6xgc3gj2wp07cd8zr0arq6eyyannnywtxkg", + "displayName": "Account 39", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f6bf10a2a4388522355fe9dbd4241ada9cbc121fa8c71acc16911d7a1e7cb647" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/39H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2fnh8905srym63l80x27sxng3wpj667jj9f2qq8lg4c8rhsjk9cu", + "displayName": "Account 40", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eccd2a4d74202487a237cc96a065f3a7fcb7196ea9f002f94228fc6859dc752e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/40H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m4axtr8wrelsqmyujdpyjcwjku58ydgy6y2p7k8l9ellq6977dzx", + "displayName": "Account 41", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "86c2052a3fe9a44501bc3e422eae54902912ed7474ec5d32b97b9f5daba8a7d4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/41H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xr9wc5npsmvs3eup9mnwh6ssh98f87nh7swxgetxjyqp0mum7x4cx", + "displayName": "Account 42", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "680eb162e315e47637c106ab6eeea28c4b93a46955dcc7c1284c5153897b9184" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/42H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12820t4zhl0yn5xjwgvulr6fmk36hh382dmqw6j7vn04umhncdqtm9q", + "displayName": "Account 43", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7a1571a12e8938e05b5a6c43bd357ba1accfdde06d41d18400cf72fd4078945c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/43H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128y2h6cmf3axlaat8828nr7lk4hxyey72saksum4kgew8gwvh2y7p4", + "displayName": "Account 44", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "56b48477d310bcc4b2b9684dfac4a82339869ce6846a2215cd05a835daa1c47b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/44H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128s7xzavt4rshrg8yvyw73p6cqvv9r0ywtsxul8cggp6nx32xe2tja", + "displayName": "Account 45", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "acb6a155391612c8e1503516913bf39787758b828c2e5ae5f7c15ae73fb4c7af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/45H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xzlpc2a8t7xrtmjq3z8z3lgy37dtq50vvqkqqgh5n2ktyszdcsrae", + "displayName": "Account 46", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dfa7f95e0f67c1336dc7dfe5b86965ff570d144b7bbe98f110aded5f0fc2c63d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/46H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128k6zcylyejtwrkhgyxm72pymuj6txme30jppgrj8wnfxlde83a332", + "displayName": "Account 47", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e66e64c7729e5d12b7638996f0a611ed2ce333d8bf5e261bb8834c86154bee53" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/47H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128meygx0wqz2tv92znn6r3pqdl8jlkyuwcuhwvyr2npjcu72y5lzvz", + "displayName": "Account 48", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ae0f9b0035f558b7ae1f4a9b0d3d2b3cd25c6ba9fadbf93a39c5e9a6bc217123" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/48H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yg2h2jf053qew7vj5ysruefuk280ye2m9rmy5mje804rqphv92jfu", + "displayName": "Account 49", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "939e8364393df844e551bc38e584f0f0244bb9fc7ea05b67dd5ec4af8373e5ae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/49H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129rq2qnukv8n9hhrda7su80ude9ql0kd93nr4ud08scvt3qk7u3zql", + "displayName": "Account 50", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ae4d1762ceeea62b2679463369b3b4491ef167426499323a86949906bf941c5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/50H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqk00ex4sf2j3jn9z7gscgc9jtzzvdf8fqxkh8yh5vzee4wj6khae", + "displayName": "Account 51", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ab04fddbb5ed94dd2a1fd65c0cdf8a3cb290b219570174e1522299bf28e45d20" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/51H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yyrat9y239mey9nvfzctdwzl2fn0wxwkz9jcyymcend6wm5vp5j8a", + "displayName": "Account 52", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7a5b8f17954dccdc1b5bbaef0dbb098bb22103b0f2649cdfaae8d125d675bf46" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/52H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128c63cza84ly02f3zdhaxgy9t9u8nnc7fhgsqspq3vsahlut6rmwcz", + "displayName": "Account 53", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c8e4d1be73dc1af108005d4c504f35469dd327c776f21d14f087532981a2e851" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/53H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdjnn8kfrl6qhzrsx9zrswqh2klqc8l0s4x3lx9t08w7uu7vkc2f2", + "displayName": "Account 54", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c5a525fb5fa55ae4f71445181ecc184b97624589e83f7ffc5ac1f73104c0e0f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/54H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hznpt8l66mdckfwjkcdg880ulzz600jzx4uyvm4xkglu8dljana2", + "displayName": "Account 55", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "091b1426a64042ac980466fc78f904d01864b9caeeca6f3543ace5265dede25e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/55H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12876gkzv2at4ctg56g7j4gehvhjfvufkjqfh6jaak6g88a7sxr63dp", + "displayName": "Account 56", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a508af656037f05a7bd9494192ce1ff43c2f53f485dadb27d286bf39a0eb57eb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/56H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymwul899nngh634ehnl7e9d9w9fzm385dhxfuqcxyhus3tzg806v5", + "displayName": "Account 57", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d5b5da8447042114ec19a89b868081c11a7554176253c8e7790d6b1751168f4a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/57H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq2avq8gnhtchyad4ll7rf8lm9v9wj9hykh2vydqrcrh3ufu7enju", + "displayName": "Account 58", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a5b71de2a5f68ab4c03aee47dc118f1c56515dc31a4dcbea1263ad471e3354e8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/58H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytcg246jw44hnrmndf3xu5gyx5ff6q20srct6xvs8nhta5y0uv7y4", + "displayName": "Account 59", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "813a685daf8de406eda741806d1cbf8390da65db1d7e16b3880afda117c8b466" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/59H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xqky0n5hy0feg4p88l22h43r367mlr5f40kxe32dnrfvud2r9vs7l", + "displayName": "Account 60", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6a814380c90872c2c1f8f395e37c1f0d64de65187748b6fa48493d308101f27d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/60H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nyv238c0sskxql93q4ve0ljevql20eyvgan26ktdfwhanc6hpxft", + "displayName": "Account 61", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "42830831cf5fe0e56c4994d4f58b23797df2f4f1d8df117ed973e39d6aaf8d3c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/61H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn9hv2fszcdfgdhm9ks0jmtcxl53zfqflr0hdefa0cfdqds7hvuw8", + "displayName": "Account 62", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c8eb78fe95545222b0a43498314dbcc6b2a8981971b2699bf37191981b4909ae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/62H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xm0t7m37kj9s8ant6gzax7mrkmedk5thkmsgccxhlafwj0ljq5s3w", + "displayName": "Account 63", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "35bc63901f8a3028f98010fbb885ead1fdd559765c125dac3a6ed5cf790b0b63" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/63H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128y05mhlupdj7j7f6luj6jyygqdwzgvflxazskqdu34zec2puq70gk", + "displayName": "Account 64", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b5a1b8b7d662dccdc6e6d0b71548d68a7312c18b4d7995afe8fddae636942201" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/64H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129amht2lkldjkwdyarmp44wf6dven6d67fzzkw3nd55nuh75q6crcu", + "displayName": "Account 65", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d9e7c78deb2821781373bc86a004f1b54738478b439a29c0d13b55fc4512d6c8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/65H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xa2y0t6zdh285shuxa4npqwv7hx3fltkefeknl39dk76ct7gf690u", + "displayName": "Account 66", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0c236395a3f1c80674334e22165534dd0240cc478bfa01c8f6c08affa37201d1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/66H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284am526meks3lk7ffvtdjzqtxsyk5t3crultu7zgqxg767xnlx99q", + "displayName": "Account 67", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "aa3ba01d82d7533d1d0729f168a19224504792fa8ec9c38df1ff0fb9b206cc08" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/67H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymzm2c5vk73dg6vcvspqae752j5l8jyd3d7azvwyrag6fhs68nvk8", + "displayName": "Account 68", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b816a599a2b6543f0b21e4b3de6ba0b01772d6284e7d701ac277d9d7cf800b4a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/68H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhvn6hhvgg9rey4p3fdstx3e3gm3c6wcmjx55xeh5x5y4xnul5yht", + "displayName": "Account 69", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d18541b47df5138809a3ae113e92ea44e6d5a1216caaf8eb9c5dedb64b7ac4dd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/69H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xued97788qq6jy4h0yvyvyq28cpcs5qc3vwc96j8lj0cnwmrnrtra", + "displayName": "Account 70", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0d3483a25057a22b2db1e283cad8a639ce689123c87b4aabad79673bc90ed75" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/70H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yk7fj5c02f44x2mztmqg33qx7l2ukr84kukqmlpvgz2qx075fu7pp", + "displayName": "Account 71", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eca680ad0bb07e8cb48995d9621c8422ee22f702577268f836a98b33650dc0ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/71H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7n4qdd2upgpp7x4jmph4amak32pp4ftenjqthkr4jjke0h5fpe03", + "displayName": "Account 72", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5024e1dbaf4bc4cf76b4329eceb6852ad5823ec286888029e2bd40e3766b4a48" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/72H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xts8svsfncg5tdrdm7fj54ve403n239duztd2n7ecqdlzdqlrrz65", + "displayName": "Account 73", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "271cc35ed91d6413dea70412462c8478b0ddae63dfa7ae0f338e3830defa521a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/73H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12860tf7hnrlgt6mmeeeg8j60uumstvj0p2me7hte0hyvwlclklke2g", + "displayName": "Account 74", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c6004390891ca7556fc12e7adf9d2d4360b461ba6627adc8622986cc7a865e86" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/74H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128d09txv9nj9ke73e9fe70ecda3j0dtgc70vva83aet0r7qm8j5uny", + "displayName": "Account 75", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c37ef94bd08ac7983fee50f2cafa30c907f02ceef6c8c434c1e39e712ec95f7b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/75H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0hf758k428p52whty3s6afunj7ptqjgvfu0jt7yle5rsw2xcncv4", + "displayName": "Account 76", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4477ec5ae587884cdd858e84702925efad40581ea9a7a9a05d5bb435704509f3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/76H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tj5pr3ky0lnqzgft82g6250vdr0qv9p8eturayechza5l5sl87ay", + "displayName": "Account 77", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "44c18d16cad6cb9f74d0c3e691da43c465f9d9155d287f5c2f3ceb7b5d976bc7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/77H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129cmakdgn3dryvx4cz6n6ghg2r8ns207ny58vwwnqskesn77g7xllc", + "displayName": "Account 78", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9b7fa0c43c14a180d0c309b740cc3da8214ab56b863ebaf96d83db3a66b8726f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/78H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgcyjnv6ncdn4zspd6dh9fvz7jq45c7td09hfw5wy88q39d84t0jf", + "displayName": "Account 79", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a34cd357d8643ba3749b1e07b3b11710d6fabd128e8fca851e01bbf1acba7eb2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/79H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12983u5qyke6rlh5mrh259ac7pwhmdxz7chyfd63esz6j204qg7lgya", + "displayName": "Account 80", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d6a2c42e7e7a81bbfd8f6f1cdcacc6756bb2c2146e4635bf2fd4b14035e2c592" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/80H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdmc0a74m7ahj9kanh4fz07nye8uz7r40adrtwc6e58vjdfyuplkq", + "displayName": "Account 81", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0a03a79a259d62c58d9ac57eb2d0d2fa61915403780e32b01584c53ee1da2998" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/81H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vqqqm577un5v5c6xhvg5jkf3llajy5fzwd9j87pmqgcv8xx9mk8v", + "displayName": "Account 82", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f0a60da8e1d5564e9fa5740e7ffd756048f4dcb8911ca6cc32d813c5b5dc275" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/82H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128n2uzfaca4qu4la93dz6xwrhhe8n0763ljqjstnfw8rk7d97lq4gj", + "displayName": "Account 83", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "40f0747ce685a534cc4b5c2f0b2a9e766872938da129cd80540053bd9a9519aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/83H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3h5wvhgwvesetrwgg6357np3lw4sc0aygedqx98r3hwdsd5myexs", + "displayName": "Account 84", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a18b9d0cab8ace19970fd919d6c73af7db3b1485b65a6be2f236975a3d298f4d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/84H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9mz7x65qltcnhy6d56wvhgdnz6u8r8yf32u5dmdeep9486mtc8ut", + "displayName": "Account 85", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c1d41e17462ccdedba82b823220ce23ecccb35d492fcdc0ba77c2e02874a26da" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/85H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129gdut7n5n3tmu34hkyr8ahhas7pk0xw5t47t926nvp8evqgfs5qal", + "displayName": "Account 86", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "da406d098fcc7cc84b34105ce65b911d08c79508d73db36a8a59dfb1c9cb24ee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/86H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qvnvptxudvwnsgvekfsnpcfddj5590jjzxy4j4cjkqvkhrnf6mtl", + "displayName": "Account 87", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c303114cdd9c043736e8d063f743bba6e22f5b09de741daa000b8a35cf2dd54c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/87H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ufwtlnhlpq459d36y572jtvke2223hzr2rafndglzuahp4wh5qen", + "displayName": "Account 88", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "203e06a16b4bfaaa6223ffd6aca332ff7d7973bf8d2d65339ac9eac72b5a5c33" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/88H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xfrpa9msqczg34wnq4xpfpu6lszu2dshhct7wuc262f3adwzygxhy", + "displayName": "Account 89", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6166e18b799ed3f016a6c82fd0e7fc2d2767f9620b26a6bc0016928a4a1f618d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/89H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128alfs6x6gzumkdlqh8rwht44f043mfdwyle3dnzeqpf72mvzz9u8z", + "displayName": "Account 90", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eebba9c9cadcabc71907ebdbdb878d4b037be976dc33dfe1339cb79f96dd51cf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/90H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z6czydnqc64gu4ncvrsvupcntg27d8hk9c0kqymrezvevr7lc635", + "displayName": "Account 91", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6c3ed45aa46210961fb871cf2ca25a71cd3a9c777289e4f50e3a541eac7cc041" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/91H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dduatx6jtsrfln0f9exgx0pvvpmn6h4nqa3w7k3wzwk3lljeeeyw", + "displayName": "Account 92", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8e0948203c3793ecee22215b2e9a232f2bb959e1cd827148c64a9f10c16e62fa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/92H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymnu9h44a7phcnzen6jfxs9t49ne5f0rpc2q4uhhrkknjg8vp9mpg", + "displayName": "Account 93", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "445642dd3256f25230e8aab3b969870ed927255b060850ecbee7b59fae83bc2b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/93H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128x9wqvlk3k9m53j7a7qaf9mrtpujjm00h27n252fl6vvz654ux2mc", + "displayName": "Account 94", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "505580e526466e5fadbaa53241e86a175b7fa0d96115d17d6de7520f24d99874" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/94H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ev8m9wtdcttqzkesnk3tlu870qvw76qudu6vqpca7yyz4qya4734", + "displayName": "Account 95", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7f3b16507c7d720ae146b5a8ed52163dd42527acddd108603c910e04a5efd931" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/95H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128u6v72jylu9xfyzxfcgwpj3kg2ewvah5gdqkr77qtmun2hrm3fdp3", + "displayName": "Account 96", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c5c76cc0154749b657536db22fa41dcd471675aaf9857fae671fccd92cf20b2f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/96H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129y3zzlhtt06n9yfm3ge028wl88ard4r4xh4q2kyx92ar3zzt0z235", + "displayName": "Account 97", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "13643883dcd700a642a2f27db18b9fae474f807e3821d5f0b70ee5382ba6044b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/97H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280ws7uj5gnr7dhutwt75ccx02jva45m6n7qzss66397s4hxx4a3us", + "displayName": "Account 98", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4ff0d6e356b2821ba3c8f9d253d062b3bd500d3a7a6e2509b85c64809d259428" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/98H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xljsrujmlzgqupz3zxujusldt257tcq980z4hvktmuvxljf76z72g", + "displayName": "Account 99", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "938d1a0e1e8e3550ef2a4c74d7492d9b04f48e93a382d476628cb56932ccf008" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/99H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129f4jltjxtl4jmx8x3hzx5djh0468tzhlgp40jn6s0sqep9eqgekpk", + "displayName": "Account 100", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fb6303ac8264b475bb53e35af02e7d7f8c21eb7a20bed679d08d78bf6bacec80" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/100H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284elcu2222q2g7zz0wtwwdky387htrsw7d0ldtsy5madflzvf3hac", + "displayName": "Account 101", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d748ba2bb25654a0d72a92359485ded51ee8843c22695a18df979380429ebe56" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/101H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128r79hjn7zwwxw2x3794cfe3qmw7n52m4s72wv2fjwhyj9f8tn5u58", + "displayName": "Account 102", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "95d2b6fca7ac6c300dffd6be44b467accc01c3019ef8673a93d1503c5c9b55ca" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/102H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yn9vg9h2cetcv9hf32g0p3a85udcaj45whjc0twc4pezsn2rgjtxh", + "displayName": "Account 103", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8418c2e7552a633a9468a0240fc232d4d84cb4999b48ef4272888356cf3b7eb3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/103H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlj9zltt8wuk4qwqpxzylawmulj9jl62memyyggnuvls25skp5czx", + "displayName": "Account 104", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "25407ae2014bb2718dad4a70f6a04d2fcdf0a557fe8f0e6e7c27ca79e0c63a7a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/104H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12967lrl5krag2rtqtephpchcexkxne964s6605mwnlny83tq64yhv5", + "displayName": "Account 105", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fd2043317c6554da1f4330c3aa0905379f21713f8af4acb63e2be22f5eafa0cc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/105H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xfnucc3sqzkuk6acnntm3uns67pngqdnxggtw2lp3tltdwgaklkkf", + "displayName": "Account 106", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4f61b143412cc59521733c91cc119f5aeda2a539924735939b08ee92db681ad0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/106H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x70h3nktm2d0eugpuh42f6auhppsfltv5d67qjswlg2uy4nx596ll", + "displayName": "Account 107", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dd67381913a55768f7eda4090c6160f78b1daf02ab2de7c7f40fa347034a86e2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/107H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y20w967lvlh2u3vzfwpvzvp8twd4mjgrknsp5ylk609735ncc53fx", + "displayName": "Account 108", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8d6bb502c45bed21d135de960e79301648e98f2aa31521b8aaeb6a852a7c2d3d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/108H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kyw3ht4ehahkjg3pw5p0p7fdze044x0xjq0q5ec96egq27x9augg", + "displayName": "Account 109", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9474e7b8b201bddf6e43265d184307c7f0df1fead236d9fe8e29e60c4f91ca6a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/109H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vft3fqhr74nrf3ydvwkum05sp4lt7aclgd8x2gps7fghmlhqvktu", + "displayName": "Account 110", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3a20d5c533bd835dbe0e4d4ea197194b8fbec9b489fee9301d0ab6782a0a6f80" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/110H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yyvagffvxtxlj7mp06mwtf0vktssp9ksq8lygwh80dnr2hj9vvdsy", + "displayName": "Account 111", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bfaf082e41e590e14afafa26bcacb57ee09e43939d7c80d829a6ea0f5b57a7aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/111H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292n3l9njjwzq7m8hqygnnx5cm3ndynjuf4060cscumm4drxwhdwd7", + "displayName": "Account 112", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "365eb7e08d78ee65f994d06da2e90141818d460e244803ea61084650492dd369" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/112H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xd50s4ghryufrgd3zgj3vkmkwucwfj5209sc48600uc8xaa6y2hyk", + "displayName": "Account 113", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "146ca11dad4f43509e6bab1c11addb0f04e485f88679a5e2e5e6e3fea23a99fd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/113H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xe00qfjdjeaydxtlxkl24w2r9e4saegdlm3ehhwnjh0wl5vtut329", + "displayName": "Account 114", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5fedd8f5dc469a5c8b6d73af9c4bc1bd73804c9e71fdd54bfd80a0012a64ca2c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/114H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1288thck47wnhqhz0fv42jhea9dy77wpjn4w5tfm9rlugh4j4uwdvuu", + "displayName": "Account 115", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4a94bd83ae2a28901a58a67d62242280f25d4b2a12b22d2de18552af69295056" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/115H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yd7a0x2lrpnvrhcj27fz5z3f4793ky5445gstp5x3u5xnn78n0q25", + "displayName": "Account 116", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5fb879e5a9b06f13dec89c3e261f1908e29debe5b8e6dcb82bf3200693972f0a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/116H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xcvpps4zs643mjnvnku40qpzqygmlgsqhgva5qlfmsp7wss4aefnx", + "displayName": "Account 117", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "abb76c75a7f124ca20aec4277c86ab7b1f2d64f14be5019e3de8fcc828f921cb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/117H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285q67aw70xh3hz0ja2z0sjaxmzjp0seyavm0rqk7cnnl6pneyl4m0", + "displayName": "Account 118", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "78cc143b7a32cf389cc4def4001d438d99c68c386ecf71d7abc77777ae0fa793" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/118H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128e48v6l6k0nk45kwuffm2eawwv3pkteysqfymwpgzt7ck92haqzau", + "displayName": "Account 119", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5aca3131ef4ee1dfa96445cb19af3391dbdfc92f25ccf80e2a7f8d3bcf6490dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/119H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0lr5s3nnnkuvp7jar92thmp03pt5676x3kgf3qszeq63c7em9sav", + "displayName": "Account 120", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2b3dd0e89d95fb7ad9f74358fa312799d92947b9e3a7e08ef94f9f4a55a21bc6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/120H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yc85yzwxddcmps2ph9pmvz0p0clapp3lj0x9gjep73sxmzvngr4qy", + "displayName": "Account 121", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a297a8b0fa4bd9d355c2d73a71b453260d6b8c1ffd5a5e3142fe136cbac47539" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/121H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kwdnhkevu6zpxztq9xykhaqxssw0ga3ur3fmmqjkw0xucmcwksdx", + "displayName": "Account 122", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bdabd79fa90232b924d52c26d611b94e464346201734cc55b397cd031cb5cff5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/122H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgmafsxhr4pdhx6hhjv3dfgcwhh627th7w8fnz7c6y5qzaaqwxza4", + "displayName": "Account 123", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bf5e02b7ac7eaeab6af520fbaeb0b77a53c5d6b50f3391dcf938ab6b7efd4f47" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/123H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdee8c8evtehvl34m3f65htfn4klravr7rryyldnc437wzlrkhds2", + "displayName": "Account 124", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e50576ca5e4d2d59eb55315dc2864c129ded2f2bcd8dbdd47123233f4fbc95cb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/124H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12998q5u4r0dd7ll3ze0enacmykgvd6gnnrxm4leexqhy6afzxzel5f", + "displayName": "Account 125", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f17763778ed54d72ebb4bd02223684ca38193080712ed3cc5fcdc350f337393e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/125H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128qwsa89amkcca6vq7ntpxmhkzc0gzhddsqalqe5zfu34khu6zsv2j", + "displayName": "Account 126", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1622a7d1ded4a3a33f4bb0a2270076c9a8caf40caffea487139f9ca59e09c4d9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/126H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywnjez7uykgzg28l7pr0dqdg8u8yvhhgfczgc6zyegdf9l7vj7hdh", + "displayName": "Account 127", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9b9fb7b4e9cbc1a0b5106527c0a4a95f3c0e0040757b3fab5e08f1974e31a4f3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/127H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ynn0a252jmefge3vf6q6k45cx8dlu4ggqu40r3rfvn8sawhm0m7pl", + "displayName": "Account 128", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ba2076c828f31271f42df5c243196b4c956cac94cc6da28e1a05fef485ec3535" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/128H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjvznjd22qpcggzmn0fzped4066vxxfp2qq7ngur2nwlxt2rvxdve", + "displayName": "Account 129", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f46cf45de9eed8e5255cafb8b688a53fc1cadd8825dfe2d1483f55656f87c2fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/129H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128n2h0nh5v2x3r7luxfqmj52526yzn5skhzs8ddjy9kxy8826768gd", + "displayName": "Account 130", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0310fd7a5743a62eb9b7342a161d9fdaec6945863624b09efc834986d10ed8c4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/130H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1297usj7yfzj0s8qrqk09ehzz5ygd98e7tvsyf3s7r3r70nv9q4vndy", + "displayName": "Account 131", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "913ab020b4544c99216a249a87b95d7876bcf9497090715031c1a5705a4f7fa2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/131H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xg7ke28eyt8pppzaxh3rj7dkuz3m7qxcvzm46hpz0sjw4szw3hc2r", + "displayName": "Account 132", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b087a8e84d43c9e7233f706945e9c59eaaaafe47c08f0084695205c8d2495681" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/132H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yh0epn2yn2ukhxepye70myzky86acg2kym5quxxdlvqa78lx95xaq", + "displayName": "Account 133", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6b47574431a76be48410fb550d77a46002e32174bacdc8731bceaeca2ac2e04b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/133H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ekq786e6xgscq9wjxeknyl2ccspshfedqda4gcuu4k2jvq25y6a3", + "displayName": "Account 134", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d28bdc5a04a27044d685ec295433df7ec2b63197847736d64dd39739c81d22a0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/134H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xavr6wc78wak6rehqg9vlv3pcqn76560r4zdmyfcg5098vw46qshq", + "displayName": "Account 135", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c2aca617986bc48199651cde8ef3948e34b5626f107879d15979f26a786851c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/135H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295gzmwwvw5lv36l3c054qrdnceg9st3ggdyxe20v9cytxjktqzl6e", + "displayName": "Account 136", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3761616798cbfb9f240ed25417bec212caf05651134b291ef3a3522ead8805e2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/136H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhax9p7sxgy8pgnumq7ej47awqh6htn8erhegumac2pephfk9uyfk", + "displayName": "Account 137", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fae55a8ca536a140e4b70fc9724bc9b09919b9e31a834450934f86e91e146ac4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/137H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2xf6qx3ujdg7rf98t3ujyjsn8l5f48lv9skctr4pwe9sywxyfjhh", + "displayName": "Account 138", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c9726d7f2ecb5402d49018fa309b6243b1f9b5f1264f4f9c9004ea017965f7e8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/138H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3av6q4cenms74ppwr8j27chvrsty8ddns6vejzh9hwwh32ktn6qj", + "displayName": "Account 139", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2b25e0a8f65ae3cfc531abb5f173f7916ffbc1d1c98989d035196bfca87be274" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/139H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywjxhm0cpute526yeze5fmrlq4m5xyf3fx0wqw2vxy3cdfdzcvkvn", + "displayName": "Account 140", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "766f13f759b96c9972e3dc7454415e3b2d086933f32419a8a42d5c3ad907f0d2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/140H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pkdfyf30sr9z5v627n8usq76yc30wl4cqw5nayvg70k3g7rw2s37", + "displayName": "Account 141", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9958ec0928fe4db581eac49653b6210df8673ebb4559b3bce7a65603c7706af7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/141H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zlnqzw02cd2rgpzxg6jcjt7fd4zg3wf9une22pzln4z66cw28ek4", + "displayName": "Account 142", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d5a32335ca2989b3e03a8fe6146b0cd9142b7d92d86a15ef88494b4f6f4d0726" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/142H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1282p5gschg89kg06w660p0dyen8p4knmym4pa0dfufca403v5zwe7p", + "displayName": "Account 143", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5686513ac662ef1f1a266bca616206a462202dfb1745928bf702413bf2ac8039" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/143H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4qas7ensnjf8mj3ncwhf7cvfp3p62kedauehdfax5n2ukl6x4s8t", + "displayName": "Account 144", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "04f4150acbcadce07a2b3908be0cfa50e8bac89b4065a5d1852cba7f7f533083" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/144H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1283ugsz7y3tmkq0663wm6lj7jsmhj9t4mq7fwll35pvcq98xaqzmg3", + "displayName": "Account 145", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3567e1551d630f4344b483203bff53b8dedd4723d06f1b26d773b26793258543" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/145H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tjyndamswsllyvx8lvmlaepp4rkza7g2f8rjvqrqqkqwwqq7x3lz", + "displayName": "Account 146", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "02d9714b0e702a738434c1655dfea0e6b10393b28c4e4a8df4099abf13332857" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/146H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128k90z32dfnnjqgn7dqa2uz9j4ttj7zaun8hx0ae8t8uwasj8y9gel", + "displayName": "Account 147", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "af579bf70c3a8b0dee0414fb07cb50e96bcefab18145d85590e0e374f4b7a139" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/147H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jfudgzr8gca5esaczprcfz4af3wzy8r0pzx2k60k7m8v90qj53c4", + "displayName": "Account 148", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "97492d558c5abd9dcadb7a8f61b710f3e057a37932454b5bd95ab4118668e86d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/148H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296wp6ny7wjeguc857dfae8m4kthrmtswmgg08dacqkanaze86m0um", + "displayName": "Account 149", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "10d7fdda4cb2a5325b4c60c6fd241ba04b29c8efffa19ae48a2517db3c7a4d7f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/149H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fy2wh7lue6jgs3hu9u2nz3phlay09zkkj4cxzjj8u9uxxn5j2g0j", + "displayName": "Account 150", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d22d053980f36f87ceaa09f3a9d8cc41c8d1ebca73145664dedbec77c2861e71" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/150H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjlnf0dqsms6yslglyhyyvdursykpgv2227m5nsedy2muc4pvm2an", + "displayName": "Account 151", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bf8a3092a896377649aaa40ade0a404b4681639a8089de639345edc291d9067a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/151H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymfq39mnx29v9n27v27mwuk8r5l50htwdg7zrvvqlls5t9w5pvyt9", + "displayName": "Account 152", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e17604e9cc6a29a2c34a4349c65866539894fc7883d439f9d591fdd1bdf61280" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/152H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yd84q226uecsfxa0ae52kgku538d3sa0dd7gw0w7zhzrvwkwc0wyp", + "displayName": "Account 153", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "05c1e40ed23ac266ec289d767562df10823e52775e2054803f169bd6a51aa40e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/153H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdjghwqlsscauf6jx4dv3369lprync3qw79qhg63n5hpqtscuzpn7", + "displayName": "Account 154", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1987ba70a5b7b69c7440ce3435db743d4f6c4adaf299846a2623471108cdcdf9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/154H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hh3ztcr9tjtr8s9ew9a6a78w626xzfxguqa09kgahtlmq8tqdudf", + "displayName": "Account 155", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0933fd889eb02f8b0ce8f09bb4ec6f3dad71e351d26491d965eb7c3a3a19714d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/155H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9y3xvjpf00wtce4q70qy5x99n5r34209wxrp2e9sngpwy6sd79vu", + "displayName": "Account 156", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3bf20690f9430d900105a85286a7b365f4c7b0acadb398cd33a3a91180835f6e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/156H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywt07sm6yp8n63ezm53dd0s3dy633cc97spsluat4ahx0msdj6220", + "displayName": "Account 157", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0db2476c48545d3a3cfad8158cdcc63e07fa918760950bb6ae98c8e16c2df3c9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/157H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yuhas59acc653agf0mzu6pzfajlj3fmklnr68vdxr5685p256j7fz", + "displayName": "Account 158", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cf2e792c58e3a9dc55efdc7c90c9379e15f8fb051fdf2aa77c3e68b204590f08" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/158H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yc2px2mfrx8wsefkk2gg5s5npudd0kqp6ahvwgpddgjfxzx2qmz96", + "displayName": "Account 159", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "60cd9fdf23df43d89c44266be17cb1c180786104a24260be746c2e9d05eafc9c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/159H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jgq85lc3geh2wtargej0nl8000q0j876w2nzf4q8m5ygu525su8t", + "displayName": "Account 160", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d3c1df9ccf438064570b5ce5390c6d483dd909413701fd3b07a8a8eca420d3f1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/160H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129a4jq9gnwvljyg4xnrepgdutg8vav0gl7yydkx357qvj9jgcemgpp", + "displayName": "Account 161", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ecc5417b6a48fe4d888cf9965ffd2a5b939224abbc85247e30adcc3666edfdb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/161H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yehpmctzkxuvpq9knkevgghgumdkpujla34scr2zu4rxhx5g02lck", + "displayName": "Account 162", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "90d04c8c2f02eb709c562dc65927820aaa5c7fb89e0499ecc6a9f5dfe9f337a4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/162H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9gew5dmgjjtdhg996u2c286u4l7eyy037m4fhtwu5myvt8fe4adm", + "displayName": "Account 163", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "288e3dad4ee61ec64df226543b0c474f6d9272adca895a8a27284bc1c186d3d6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/163H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8csnh4atz04dhkfqau2zjpgwq0rjnu7uuaqkfvfle0qcqj9s6ch3", + "displayName": "Account 164", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d84fd0c65dc22ae35df96073eead267acea98fe84dcbf4a7257dcb4898a75bd0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/164H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129av50ej27kwld4pjzh59jcyeugdc0garpwqaf3cvhvvg2vl0ngcmj", + "displayName": "Account 165", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6c56dbd5d23adb6c835cbbd950da3cbac6e104f66578998933be13de8082cdad" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/165H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yty93sullm8e862mgt2hkymm4gga20yvklwxe92fyhgvyfahf9p9c", + "displayName": "Account 166", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ea2b12ae08f2ce4a01cc3d8b80ddb589a4b5aeca5fa02cfda27d3a0d9038e3af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/166H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yc5q2huelr7pwjvnxe6mrx6chuegwatlde94w8f9dp90nszmcl63m", + "displayName": "Account 167", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a99029ab741a425dc5ffbfd7e001c540ca1fbbf56966302589f7e0887564fae7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/167H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vdgy3zlxdm6a26l89tuhtl2tgx0n85wuaygngfw9fv94zkp920h5", + "displayName": "Account 168", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "37df16b44c9c484feb9c04610f0b50c8c2f2546a4d61ad4e11b5e92f326199ed" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/168H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128eswuucx4mhejqc0y8guyx57m3j0ht6h0e8wp3rff7656v2u89hac", + "displayName": "Account 169", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5095e2c16658afe82b88b9653ac59156dca1b18a4c4f5306650079f3fe36290c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/169H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294t2vyuteac83502xe3eksmjgvujl0um94lt0esc6np7260u83xyt", + "displayName": "Account 170", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3c1b94dd2a3fa720dcc91d36fbe0531d28aad12bc7d2b8ec22c655af34362707" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/170H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285s5h6grkd8zs9v684z78qptp5tx7d5n8sgrrlzc8g5739appru6g", + "displayName": "Account 171", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f6a5f1b3cbf0253e90b52796bf773fcf159651aeb731f8b201a9ed1621a12a39" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/171H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xk6nvlrdu9yypjy3hhw5xxju3fv37wak3gyrcu633k330xpkfty8j", + "displayName": "Account 172", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "41d4f91490ab4b5c198c47fc297a463bd40656b7c5feb55e20e6004f275169c9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/172H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydpr9cm9958mk8ph05utkrcwl40ftgagwmqg3egwgqfe3a5euwlze", + "displayName": "Account 173", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b9c690593fbe1d62a49d0dd895191baaf6f4d54357f75ec723b716c5cbe04294" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/173H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdm62z509xsn7frqs7llnz5a55yqtl6w9aps9dpmjjam4j9vy8y4q", + "displayName": "Account 174", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d5961bdf3f811e2efade9948889f921d65c7f9026a597633a6ba3aaf0c4cd2bc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/174H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1283h55lpme4l08d6un8awq2pkw0nzdzz2se4elv63rqkk5m5wzjcm5", + "displayName": "Account 175", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "37865b70e8a30682dec3f12f2d860d933524bf989285ea81bb5ff9be42c1431a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/175H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ya8tdvm9c4msqpmc63a58hlhzx70unt397s7t6nf9ufam47yp8wwk", + "displayName": "Account 176", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2dbee6cd13ea486b3321146b023969b7d5efb6625085a1bbf962a162e6a3df95" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/176H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128gn6gglyvz84rjqt8n6m5vkhgtuuzv7ytf2p88tm54fh9ajxupvfu", + "displayName": "Account 177", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3877c8e5ffd745066d84f69210244556c9277432ce93f6be238c7377c47e1c4d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/177H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rl62krfmsx0699jas986g0njpjjgtpxz0pxsxa6n6nmmhpavwag0", + "displayName": "Account 178", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d2dd3b1ff4585e2b86d624639b0b43b217a64dea98e940f1fc6523a6295d8424" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/178H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128j5fux3qakrttg4ruk2hczcfrkzzmqgxc68x7829kz6y2fknqlvgr", + "displayName": "Account 179", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "981ce2cea02bbee49222c5cd7643249829ce3502166b55f6234df2258a7e1725" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/179H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128aa5vxwfchhrf7v70jszxy59uu8rantdnu4spegv2ffeg3vtysceq", + "displayName": "Account 180", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "58e5a07a31019d44d09d3c56384e1f2a08fbd8e2160e8b01720bbeae1a75091e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/180H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7jgsm9u208kgkq5350k2dwejauje3slme4c0zc3xddxj0nxydz8j", + "displayName": "Account 181", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d51001e2a84f426303a5ffd279e048bb28de9e9df704a29ed58065e26f83149" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/181H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128xv5hx4az67eup4tpcqe9zzefd8g2j0x07f0qjvdx2jek948d4uv8", + "displayName": "Account 182", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "57ba6d49b74e62a0a38bf4d12385a38b4e45435dbc12bc31126faae84dfab234" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/182H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xt229h8ruge07tfg8p9rs6s4f2kjzn8x5yulk0k2mnsndc58a25sr", + "displayName": "Account 183", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "56b929d4b0711437c4675e69ef51cd45ae843642c81629c008a39738cf412c73" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/183H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128p5jfwwkz8sqq99vcmpqq29zavllkrgfp7853a8cl5y6gxu3mystl", + "displayName": "Account 184", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c0fad7286845c7a28ac428736b9718c1e16114745ffe0f9ad07d35515ad38598" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/184H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x5n570l540fl45f5gg389x54rj8mfjsk2yq4tdfdjhke9kuryylr5", + "displayName": "Account 185", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "40635ef300d6f85eeb8760ab03457f5b62f8906bba4ceb644da355a18b54abf8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/185H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgqdyqh2mh7kkjycjypraz7m6a67wrsmgw0r6l6kzadc5ulues2yu", + "displayName": "Account 186", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b9a80a5a8f0191c68ea82d8f67744ce646538f2dbe30066de4871b98cd1e8505" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/186H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ysre2tps736p9z7a964qdnt7u0hh0zre85y65ssxfkc33xmsszvje", + "displayName": "Account 187", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cb75d580003d5c5e8139db0aa33f336b9c6027e6c7601d50007d34257814381e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/187H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292769f2egm5ne5uejwp2hajlrp6tamdlcxdmdxc9wvppnaelljn62", + "displayName": "Account 188", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c6824bed1327f14842487d4ce0862e7c843f1f250dcfd24b5a4100922f44d38f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/188H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dykj0zdx5czj9xdanxeyfmx4fj6efz649hkm82l4wrnlhr4j8luy", + "displayName": "Account 189", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8ef07b32b115687fdb599038ce69f5f6c05e615042f38607c01aec4280181a42" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/189H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128lx87na2m43uhwaycjt20xnjvk8ew543xau6pdaaxra5tsf0kctf2", + "displayName": "Account 190", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "09b6c6f34f3d0d905de87f6b576eb72d5259893fcde5fbf0adaa6e16a1e5be8a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/190H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9srdljc5jcv7u0ykpuef5mzf3cxce5km6n4wxh6ylkz480p3l3a9", + "displayName": "Account 191", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "43ecb37856ef1cadf8c9f84eec93e115b71f8103bcc172f6a3ce53de77a35efb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/191H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129lz2j37afwj06twc82rsfd5kg0su3p9a36gapt6h5h9pcxqe4dcvg", + "displayName": "Account 192", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "124015320c1a7c6dec7418175ca4bea803279d74d7e5c0c94c371d67abd45760" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/192H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128nqfpvduh9hukmz29avjndd57gjnywzraajna9fl7kttggnf5zgpu", + "displayName": "Account 193", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f8841dafad7e383629a15e579162a8a98dfcecdf7cf2ba15af9df0540f09349e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/193H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqm47u08edsdc7v2cm4eery36j5fg8rvdun2h3w2wl73yqv5gtkrw", + "displayName": "Account 194", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d72bc8b25079e5627b02c5c4579943350cd3f70d49b8f9f6eb05cdc3c7fdf9bf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/194H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129hdx47g02hxdh2tstc3z0q4dys0s0mpm3w57nlnf5smj5jlgn5tv7", + "displayName": "Account 195", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "968a9cb14c8b6170dab0ea1ed9facdc8fe31942d85ec7bd00b13f499d991a640" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/195H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ahk2cnerp4js6thqfmlk56xdvwk0h00hmsfpry0clx80cevzz94m", + "displayName": "Account 196", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d1ca0e7d43678e23821fb97c0790547be12f4024c89e873572c8771234110e12" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/196H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128favvcvz5y5m7x3jfkeew4affqxal2edx4plp2hr7wqtph53q2kr4", + "displayName": "Account 197", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e31a0260fcb585eb4855d47b6875b99a85f976ab8d984d3b6dce55b91feb83cd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/197H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7fnys9qxc3mrfg2as5khjgnhggnrzp6j373f7l3q4gx46hdntemy", + "displayName": "Account 198", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3cd75d32c63b45721bf710416f1a0aafc6f8970bcf125059c2e80967c6c15464" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/198H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq42zpwnz9n6tqc5w8xc94ar09gvszlx8zujt6uv7k0r0ykxns46j", + "displayName": "Account 199", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0affd80828f53bcca1216834cf8eef5a83b26f11d2cef548ec21e4ed4aa612a8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/199H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128mspyhpagj6gfdl5w90zh64m8lrpfptraaxk2ajl4hmz83vhdyhnl", + "displayName": "Account 200", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "164d46227015a0621acf9bd949e608062e48972232a472ecf427f2ff1cac5b37" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/200H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xmcycnt7y4pqukn840nszwfawqsvzzpc55wx8dk5dgt9ql8wnm0wk", + "displayName": "Account 201", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "04bc01d63716d01f77da7eaba1e1d2cd715d900d0c4ce58ce42fa7331b7d9cad" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/201H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8zzu3qm2n282r8jddnpmylw3z89fwdk7x5e9yteg8fnmkyyv8a4w", + "displayName": "Account 202", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0ca67fffdc0f4cff3c77f33a1fdb4c503b26c4f22d66108fc4de27fc07b79353" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/202H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x50z4pkam8770g33mwp2vz82md2uuag4wa3xswlzqg08fgh2dy7z6", + "displayName": "Account 203", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "93eec539cc066caa0867dc362945e59f5354c90a25311299d2f97b69c076a3bb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/203H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7u4a7fea7nsasul8xdjmcsll55p3mfy7s40gy03yf2g9dfjvpvf2", + "displayName": "Account 204", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fa49304bea68f5944b2ed192251d2689a7c0f395e59b56f5d44b7e4551b5f929" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/204H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y6y2547jw7ymzuh0ytrz93ejm662kuqguq7h042lk6p4088lh4nkc", + "displayName": "Account 205", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "563335238903182ac79ed7c08d0a0b45a11c0c994cedaed1f0e87010a37d8cf9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/205H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydd6fufwznfdrd9cne6hp6nv6jtamafmnpne0987kcx6wtgh2ge2k", + "displayName": "Account 206", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5819877a04e09e58175cd3b58075441678246131d2d9574be6fcc69e4efe86c8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/206H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xrd5a6tfc76mzm7axaz4gl7sjnjnu88l2adsmrl47m92yvx7mlny0", + "displayName": "Account 207", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0b44545297b51bb2022cc428175a06198bf1b5444889cb37ff9fc336ed49b10a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/207H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128um2jnt3t083gulzemr2k68jtf6s0ag3628fe4hd5pwjg3x9whnd7", + "displayName": "Account 208", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c1d9ae15e915feb73793bffa1b2524127cf7a63fb4e625c3c8267164ec7899d0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/208H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129cuy5gn6t3k52km96ltnjasmw22urhn6myyjkljeg26j8cpxxu5dg", + "displayName": "Account 209", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "da691a2b564a6aeab59ace68e17602ab166d68568d3c2515fc99510e49c73f83" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/209H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m489sz4g2m2h04w2hup0jzrqmf982d309zzlvlyl94m9t5ze2t22", + "displayName": "Account 210", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bb70fe3a19ef7add068bd15bf78cb8f905c2a4242e2c91e5639e86265f29afe4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/210H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlpxy4uascwpnvyveuea6zv7g69erc0n5um5g532jgyawg3pzqt2z", + "displayName": "Account 211", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9038326b18ae75afaf52bded2628a00cd61d297808a9fddb06ab66f196dcac50" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/211H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129lmu9pgk97ye6plc4g5esng8n9zjnw82xt894je7en8rqh78ud6rk", + "displayName": "Account 212", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fa63385f4387172eb4129d5c077eb3acb3eb5d41bdaf075e414a31051ba22218" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/212H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yj97uxg8jy40gryrz75a5wl69rh7rxlywqgdyljwxe22hps0fmnyd", + "displayName": "Account 213", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "767cfa8fa6bc0a7dfdbeb6c948d5cfadccfc89ac55a640acbc88ddc70b419587" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/213H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9ar76j6gprv7tdedg745yxj6e9jg85w5txhergxnl2pvqtjk86fq", + "displayName": "Account 214", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2f0d68c129a7077ff358161755e50327ceb8b881714456fdd857fdde2c40bef2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/214H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9n3t3hehjcjzhcjf4jh67erpmkafgdk39630cs9f62x7kuq0lkcz", + "displayName": "Account 215", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2bfcea81197deb06d36cc843489ba6bbcc4e0e670c977e85b2da40896d8535af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/215H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rm60899zd2gxl0l808kdzsrqzdpwjllst7vxjx9jj6ufnvx9vw9w", + "displayName": "Account 216", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a861cbb4604cafa06c0ed194c5236aecec2e76b5f42bd2022d6d11d19befdd77" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/216H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128r2nw58avemhw56l280c57xrz2l84c98q9nt5ukrdt945q6h6fn2q", + "displayName": "Account 217", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "be62688ddee8d8295a217830a29bf1238ae9002e71f5984f6c46fd93373a0675" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/217H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpdksxgrm3nelxa626mkyca9nv032xx6s9jz47g8s9qphnauzc7sw", + "displayName": "Account 218", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d38b2c58f340b83d658b37b29ada605c6752d28e1c165aaa3c4493d17cebba85" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/218H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296nhwh6cacefk8el48yf5fnwevgmvncr83sumukt395thattfux4p", + "displayName": "Account 219", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "095d8a285d5f84314d724dcfbc44ce7f639c56e99166dcbc01afe42bb9b196fe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/219H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kwmetark6nts50xyekcqwpxe47wwrnxankeuwhx8zmjnh23flwwv", + "displayName": "Account 220", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8cc64c122c01753cda101d12ec8fc61977836e381fee3e909bc873337f944b9a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/220H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1290mquh3shu8l7ket34hh7gckyz2q07znrfztkzrqyx5hwpfca9gqd", + "displayName": "Account 221", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "abc9431095414015c710ca65adea5422314f8bd5dda4cc50ec05377880218f42" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/221H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129de90esww40j4z7rmp9hhsumh25e4uujmc69fru5ta4756esp6mwk", + "displayName": "Account 222", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "35e378a782a4ef66c7ab4363439aa6c232893cc36b8494d3bc899fbdc3254a3a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/222H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpe4zga7f0gr0hhe8n5jpqw39waganmeca3sp025z4jznsa7vvw96", + "displayName": "Account 223", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3eada4fecd0a9db2fb78bf36495ac8c8b8ce6526439db179e2b4003117cdf0f4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/223H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ukrg6t877dcjp2sxc7x0a4hq2ntu6gxy5wyceq3czs9a8p0r7ml2", + "displayName": "Account 224", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b613acf165cdbc703c91dc8363be549e14fb7de3c900ea7313ab2cb3365710b7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/224H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12946znzj30nkfgkd708yvkjc8pm7t3m8hmdm9tgslyr0age5lpjhgt", + "displayName": "Account 225", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d4531964230d4c1f0ab176a7047d1e45cdd4dca28fa6c925e9c62dc580cd21ec" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/225H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128upyl20tc9ltekqh42j8xj3mwneq482tzsd8rdl55pau0ya5l4uqx", + "displayName": "Account 226", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7b799028a719ae997a849def13ee82571db9d3fdba7da3830db45ec9eac00459" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/226H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1293q9vp7scxe99g6ved0ryg8k3xlyg58nxmnrtzzextnx0xyjk4n54", + "displayName": "Account 227", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eb870426460ef7d883c3e9d6d41ef9b14a9c6c48e389fc28564574516ee5936c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/227H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128avwu2y227aq4d5xjwqfzaxfvr8uh4q3huclv43ke9nwzsgv93mxz", + "displayName": "Account 228", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "efeebf3e728319c82a2163d3998a2e22b6a519a8373bd3b45b12811dad949724" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/228H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128gdua3c9l6jrhv2nhjl0y274khuuhvu95vr2tve550ugamquvxgkr", + "displayName": "Account 229", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0b3780680670add125a415f825591a7dd72a35de8e725a1dcdee743dd343bfe4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/229H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ek90f6vhnpeyvqmzk3mg23v3d72k72wgpskpcwsyxxgsu8w3445h", + "displayName": "Account 230", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f3bbead6b71653f6cae512b8c15a05bd7353bdba9e0faa1f5df6d22c7ab0ec1a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/230H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129897m20lx636kqcx2phupz9jj68hv5xjz0y4l049quhdhcueapd5g", + "displayName": "Account 231", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "642be59c5925f5e4097c00daf829da5822bcb178bf7441dd15336dcb83806bc5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/231H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ycgxgn4j6zz2v3hdz06vq5hd9h4aghau4e6mms3yw7g73jz7ywjtv", + "displayName": "Account 232", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "43752aefd9bcd853f2421aab091a4dd383a7a77df1a9b69ba0b7fbb544e58685" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/232H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ypvfvy5dp4lpqvw7jvrft6vuvtzw4mswrv7eegj5yn8fy4cfqdhnn", + "displayName": "Account 233", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c5942984642de1e5ac1ff7010dddf5970a416b42184155f054ca7b81740a372a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/233H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq77g035dpcgt0mhgl88fvv9a2zdmzaxj947yut6hkkvkzj4ay6rz", + "displayName": "Account 234", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ad8979d5169c0954d5c535b72b103b00fbd1ceb9d13812d76c30d199bee461ac" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/234H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ac6ngu36n2ydhwcv2n7w7q8zxqw8wp83nt73hk5del77h8cdjw3x", + "displayName": "Account 235", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e8eb4601e6476766bbb74aeaa132f719c497f59f49a48614f60b61c24ce3e890" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/235H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xs8y7r6cjcfjfa3z32puxg2dyukq3ulxpccn360g8kr6adyx7hfcr", + "displayName": "Account 236", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9a2b00f85214112789dd22bbe7d0166a941b2b8c541d882883272804f71d8cb7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/236H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jkwhfn27hpud8ct87tayjlle7m0d4vddzzcaj93jj57vhun832gx", + "displayName": "Account 237", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "001a94618c39ee8a6e64c059499259e7cf97084a09992e954fceb0263b6dd7e8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/237H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128qjk4979qcghp26has3y7jyw4eswzaufrgvy82r039z2g53w9x5ce", + "displayName": "Account 238", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6fcaea5897356de7f3678025dba4f5e9c2ea6182174d2b6543859a9be7d1316f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/238H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289lkpxqzfazw2n9vetpynnlewsul87g6kqu9x87qd9n3x0svsvwdh", + "displayName": "Account 239", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e188d214290b034d6267c1180a2dbf50081e045b643232efdd0a95595aeb116" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/239H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129sk6xqrwxkrnjkwunh9284p9a749c9tzrkgzj2hnhqq43ef4nqlh7", + "displayName": "Account 240", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b02c61ad7d6d4d9676995ef125121fc34221c472bf237b20a42f27a5ba95ff59" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/240H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128tm66z76njjz7sn08kf7tct4q7ynuwyxg0lfudgnc46ue6nurz0u3", + "displayName": "Account 241", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "74c9bf0e4e40b0886d89553e59030660e2473d8f47036f396954ceed4f3b00aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/241H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129esvrp8yll2jg48y9sz5ck68qyckaw59448ydvq4h2juv026qv0c3", + "displayName": "Account 242", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f88d14aaa83084f4eb476c1289e22f8e61a86c7e74b9979a957f49e53640b87" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/242H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zuzw48r6gs4tst5kk7ygja8mld3l8g9c4u8lsth0vwyzqm4ung07", + "displayName": "Account 243", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "304b90fefc1293001a273bbfa2fe4802146080f924bc80d9f5d7f5d300eba0c0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/243H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytsd4hu6yaddx8zawzlhtpzqqshrwvt5uky9kjkga9zr6l4q394qw", + "displayName": "Account 244", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "129ff82ba9d094f481ee32c9b3b44a78d29a7f5ebed457ad127fe045e6c56047" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/244H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3qj8t528spez3ahu93sqxf9un9e54lwh5sqlld3d952j3ct8yvh7", + "displayName": "Account 245", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "11ab87eb0a744def7566db387572a2b74443f1c2d2e32bf1c4e7d710a933addc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/245H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128lpa7kqf4d2fegqgeht8wgu24684vurdumfera7udyhv7tdwcw9zc", + "displayName": "Account 246", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ad4e1917764f1a89616d68407ed8d05ed9604b24196562f7f964ec07f24e0e84" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/246H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129525wxy8x5qga2ze33wrc2u5rnrm28wa4gx5vx6fcj4yqr9mn2vt2", + "displayName": "Account 247", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fc02ab5b1d34e17a440319d79e983624677072f5744e4a7888d5104bd8df1a28" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/247H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xt7x45rlujvd02mx0kpdt4m29lahn86y6j7z5axz73n05486jj8qh", + "displayName": "Account 248", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b0c3f9180363c68f6414dcff86306072832ca255c66fb6367613ddd15ad0d91e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/248H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128l8cryeaxr3zv6wr7qj22h3ppr2r70tt8335qnr2y05xv0ned3pua", + "displayName": "Account 249", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e1eb4a80537866b61d37b572ad9ff8eacebfdfd7c967002299684a1370b3bad5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/249H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qjakykah86jlvqd9f745pkchv96m8f423mnynw48aj64v4vhljd5", + "displayName": "Account 250", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fcd615c948f04289b8b2dcd1a3304122d0c5cde63dd2a1b9e4ed22a51980587c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/250H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x789h70zc9kl23hqnyjfhkr4helh995684c7wnz4cfraucpxhlm5h", + "displayName": "Account 251", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "39a10d4f44fd1592549f10b81e2247753ad5841db2aa7a295373b9547b4e50bc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/251H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xegm3kt4dfkprsjaa55h838e68vepg3af5fgw0cxmhglp89urvzr3", + "displayName": "Account 252", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "305f178bc25c2cf2e992c057bca776a6a41bf21fff026aa8b8ce5387600d4199" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/252H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn9fk0urwqv4xdc34ey3wj28r98we9adx6xlwtkrqdk0dwwc9x4dm", + "displayName": "Account 253", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9fc0aac5549760d6b3df9911c852c127a76818d8b72994fd77ad69fee6138808" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/253H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286klu2llv0uysak8890lakj44p2ap3en38w9suu7l4ealetk8deuy", + "displayName": "Account 254", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c7bed8656140dc39e59377a50221ce78dfcec1317c450a39ce6819b88496d426" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/254H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280glejer4kq8pznucvf2l6ty0dr2xahsqggv2xg7xhmlsrjla9x89", + "displayName": "Account 255", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f687d78120c1bdb6e63cf0fb1b6bdc3951d9626c4e553167b073aa9c18fbc751" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/255H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqvptptry092ztwkphnncgpksrjukhamwnya6j8ydf3m3sywmfaz6", + "displayName": "Account 256", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4cc0e3754d1c676d3f23fd15cd916f200b5eb07392f2ffe58d83b7e713f2ff6a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/256H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uj80ldraqgh9u0e6e3r4crfrx9x7epmsxe0k2a57296x569q37s3", + "displayName": "Account 257", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c4fe4995fbcebb72d136a031b30480b3ae6b49d913408feb6395a980dca4e02b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/257H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129yqt4nueyahhnm3w4s67k3zawgpfhekv0rvg8s3drfqw869qxyk3z", + "displayName": "Account 258", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ad228d69b6d9c34a88752a0029a76902813071ca65730a947b7bcd2a6309efe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/258H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsws8k39kpm8fpk5mph329xvfzz4k3wykvvm56d8kkrrtte0zl60t", + "displayName": "Account 259", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9b602c27ab051c09e47c300361a940c1984f3d4990e335ffbf03c3af6f882878" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/259H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12930duxg3dzx94jqh8e3rf7n6j0ggy682zdm8ghx9ludqkl95aguyw", + "displayName": "Account 260", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "baca2ba2ef615f69f4c050a1a2b821b3d703e866a55e809c312ae7e5c00d59ea" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/260H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ftc08vnxqu5zr57rqg70knuncj637vqgh4kqy2tq0hj95qrwwvq6", + "displayName": "Account 261", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7313bfd3426deb6062b7de2acaa23e7a657c8e011a5f40ec4185c480b0ed2cfb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/261H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xrf8cwxvxu4560eaplzu2z7j2aln88j9jxx60kdsj0wsudvyy2q6e", + "displayName": "Account 262", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "efc5f055575908ab1a4ead891b3682185fde9c442182641f2efc2a9f80ad0ee1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/262H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yucx8hscllmwwazp9tumd534k4qq2ujcxq6r4gk7csjrgk0yzl4sz", + "displayName": "Account 263", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bbd70c530bd94711d00c0ef59e3e6dbb79f3a162eced4417cbb51b98c7e14a2a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/263H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wc3skf0tcg05uudyl6rqgmlyc0efdtkadmnl4eve30kkqcrqu3ey", + "displayName": "Account 264", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f533d1d983f41c13eee72bef0f01842ab9b6c6ea47a6e2c2ee684a57fd8f5481" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/264H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129m2cetgsdu6ru6p4255nqmyq6j94g67q6z660fnlczl3wh380fgfn", + "displayName": "Account 265", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "721f3ae34c4249e5d4659aeec10f36a1a2e1ee69f5d83ef68cd4b78ea890d35d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/265H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yyhxp0w9d8gdfhup7xgu0y0zj99lk7737yms2ph0elckd353p4e65", + "displayName": "Account 266", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ae8f4b5e23444b5436371fcdb0c112f7b2dc1e7d9f3f76937408d5cb451aeded" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/266H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3ykp37w44fd3xaalqtmzed3vqdxchs0mkak4j5vhadd8y82clath", + "displayName": "Account 267", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "584bedf76e19f47ff8f8eeefdf3fbad30562810c6e225800dc213f16f50f56c8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/267H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nzq8j98ku8uj74dqxfywsr6ek75x0xmdjryvylugyv8mrmp08u8v", + "displayName": "Account 268", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "353cf5b0815b4ccc52329568fe44cd98df397bc19915e7034f64febf8d7a90e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/268H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yw47t4czyslxss3594t7kstt307r93nwhc6q95rmrwy0n38dqejt5", + "displayName": "Account 269", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "948a701ed3277e8183eeab140ca6e59aefc54e2db9321e7375fee56939c63e74" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/269H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yd0j4lvpngpxv6u8cpve6n3t08mtz8jt84tvkfst24gfpyywnccj4", + "displayName": "Account 270", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "14c1581ea7be29f0a55a53283ec7f50e9d86fd09832c9e26e44badae69f797f2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/270H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292ezfr9yjluazryg33cpp26we923fw6wa7fpnah6kt49g62jsm7pz", + "displayName": "Account 271", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "af8df9c110a68272c1bbe06c2f2eda56c2ac597c9b0d6faf673c7f042d38490b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/271H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgmflfvjjgfqr4ueg0nx654ggn6seavkfd7mt5zs3tmfu2szm9zch", + "displayName": "Account 272", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4addf7faae3cd9c75d28bbe920272105fa15f8d14439fcc410b04e174becd3e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/272H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dszw950axvq8sv5uxvuj8rcnzsl0h4a6tc9jvvvcpwkwvpfmkvqx", + "displayName": "Account 273", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8417a359ebb1d4a0235f0769a86e3c931376ea679971b496ab97eb6b3d89021f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/273H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yj8qk34lehx0xzt0gt7yjr5dkvdkr3kcszhx6j8aref88900vavdj", + "displayName": "Account 274", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b81b2d8486038863a5c41488ba0148ce242eb224db5ad2b13ef7549f444060a8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/274H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yztzz4cxdyfye2rpcfw549vx3mltas8pjw3uxmy28km439rg0m527", + "displayName": "Account 275", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b8701d956332b6c9730897799be9c3a1d7907837d928a01735ecad915126a3ab" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/275H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yaxx2tz4cc36p2d42w8nr0zl09vazte8edcmplu55zt0meq7xtp6w", + "displayName": "Account 276", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "74de54adf7a8d34ead47b784bd99d1fd5a26326c4a91b3462658d3f62c3cedf9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/276H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129stv76sxrd9xagwq40acn2j5vgcsvl2y3vjha6s4u4yrnj4v097pw", + "displayName": "Account 277", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b1d9ecf5eab02edf1b7351dc2627b3c4bde0eb644179d71609b25fb32b07e824" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/277H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295jn7mmas9nv3lw6d43p0r3ruay9u55gpm8u5dpqv40sn72unj6qx", + "displayName": "Account 278", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8d206f212906883a1a8c28868e297c0c49ae747fc1ff3bdfb8a39383f708e563" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/278H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129lcw28aef6hrupuruyg3h5u322uggvz9xnet3dvp8n2en0akptkh6", + "displayName": "Account 279", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bc0f9a31e9870a7f3415548792e3675bf03608f7071efd8990c69e23e732bfb2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/279H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgyuavneut3hjc59r88zg97084p00v437p4tdnecg5r93v6fd0qlq", + "displayName": "Account 280", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b9238c90fa490c14756b14408628b9e70d9455a6975a011217105857efeedb99" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/280H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yj4c0j68agftd850uygcvdeumx3avyrk5w2mgelhdhzcly2z646lz", + "displayName": "Account 281", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8f54db3ec19e008b645764bac51ab74058b20e4b6e878207abbe8370741503d9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/281H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yrgrmyaa6xqf289q8jmypu8e5l72928a9ytqe4jmgeve3dg7m0s43", + "displayName": "Account 282", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec59fcecdc22c9333205f563e39b4417573958181f905e15a311bff01baa790b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/282H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129sxp9tjdn78g4azle2grrv60vqwwwsyt4yu4qvjkmw44mrcv7x60p", + "displayName": "Account 283", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "110373b00ee97775afeaf6609dee7abf2f34c1e3f97cc18556d44aa26d607de7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/283H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yd4w5y7gycamt5082d8dnprezyu8u7l4ascvgumce2tl7x9r3r4ha", + "displayName": "Account 284", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "daee8a2c3f0f870e703a019678068a7dee14e83881fe2634d58e08cda879e198" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/284H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1288dtn8t6974udswzl3pj4r3q0ctd5urrhjzzl4u5lvlfaa60am69g", + "displayName": "Account 285", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "94cacaadc29219602587f218524a086444ebb365969cc6a4ddb5d7561214ea9b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/285H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsgv2x7k024tfk6rv8jw64rzeh4cumweeujtn0vpylnh8sn55f27s", + "displayName": "Account 286", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e623c5d0be72db9991d38918ba5a4b3dcf0c326d999f1165dde06b93eb587520" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/286H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3greugcm2ft2chpmqyff95aq2fck6heqsrssfnuv9m6jfx8prlcc", + "displayName": "Account 287", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "76330e4814c43247a1b14ede523d94a6ec498d41a718403001bfda61f1017dc5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/287H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128yhka68rpj554zgkrswn5y4p8xjcfshtungtmdm772789rc0d3eh8", + "displayName": "Account 288", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5225e6c3437be2697390aa0c66e39967f69a9d4ff7a75207a541a572abdfde72" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/288H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128msagx7gatl0dmdk5mjq0ct2dpx0jwz2m2nrghzms2a8dvnwqkwqq", + "displayName": "Account 289", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "08be16ef5b4ac60bdfbcb6b3a4dbb6f0005ee0c52ac342b03cbf238e3db14273" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/289H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128r4v4p99k3ycpamp7zvjzv0r6u0d0zkxullehs7tzkcful39k2v2l", + "displayName": "Account 290", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "89cb83776240b3a651b3e21fc23325895e43f4ad8abf1c34ee7957bde7b41031" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/290H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xrcymhg7gjy8cwmqp7f580jpz5nqchryjm00hn0ppe482rcq8psfe", + "displayName": "Account 291", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "88ed9a8b2bb4a4a73360cba213ce9a077fd8b959a8b845c08465fa3caedff09a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/291H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128qu436kx2x8v0lqzy82hswpl99ky2wn56z0d3q9v83pvfkdey5zee", + "displayName": "Account 292", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "517c6ce843bbb57635940fca3392c7cfd9c113f253ac0ec3b6709563083f3500" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/292H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295pt4d35nm6ul6tzu9xp36ep5kpeve8nysydxusrls6fnetx6vm6u", + "displayName": "Account 293", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b74d1120e31e9efa12f882febb2dc82c1b209f312f0fc0314a0662664fb30635" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/293H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128yul9f5elv8mt0mqa2pkdw5gz8yvaqzhfz4esqaq7pmexvjgk0jmf", + "displayName": "Account 294", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b985e6ead09dd2370cebcd07209da25dee1a203f24689eb6a24259a08d712596" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/294H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yahz0j9lpdseem8krqq63vwvmvcvxre4vmrj727kd2v5a9sephs27", + "displayName": "Account 295", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c29eced58934272e3af4a92804ea8a113ff80c7a20ee9050f9b750d9c7915ba4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/295H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ug9cnl6lanzvguw78gdetmkx0duynj048eaepmgdyfrtgspl67j9", + "displayName": "Account 296", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "82d85d46ed458bc319f000557023dfd96839e1c3bc61e2f1959d1b7d993df755" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/296H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kt97j4v3zy8s25tkn2eeyrjp707dc00xmlmfkf2ssudayahcgefp", + "displayName": "Account 297", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "59b8b08265280a6687acd62b21405f170c149c170ce32fcefdcea499fcb7a923" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/297H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285n5hafqdsjqnq9mjvqtqcqpvs30spygfjvtnz4z4gwypd5rtasqc", + "displayName": "Account 298", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de956a11b1c91d18df72275811871b1fd56d61f822e743d2a141190f2f9f2f8f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/298H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289vme7rxp05j4nqt6j4he0tmf05lvsyrfyv35kahmy66hj9de2ltg", + "displayName": "Account 299", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7591c356a361d3320b64780f76afe65a9abf9ad12e27d294f132a6a87a5fa2dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/299H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129u4cyt8rez8l6n47wpex2e7qmevs4zrqea0ds9mmzx5lchzn4088v", + "displayName": "Account 300", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d1aa6d07d59c8a9845ca8afbf2fd9e3a843dfae2605ac5c6fc0d56169ff2a380" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/300H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289gm2ftsdd9l7ap8stakc9vk02g3rmejyjk4lpta93tv4q7vqyfqw", + "displayName": "Account 301", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d08666d6bb22b376cc3ad3bf339d1898bc68aaf77f4906b7f6be4b3eba0770da" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/301H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8ylu9dhextyydzjyljekaj0smsmk4qnwuf9kudn57xz9etdp36kz", + "displayName": "Account 302", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "989e498b833a95ddd536918e3a1c6388c94dafa26d8bc7cce24fe05e2c1512ca" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/302H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xts3p22jqjqryujjez3u749q9jxahn3ears27ktej5cmrgzezs5zu", + "displayName": "Account 303", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4550c285f9dd08d54e5b70365c900013dbfba04a1f0bd0257f3dae691be236af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/303H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jv200p3esxmsjd5ngjg96ve4ncgnvw6f58vnwk00nttf2h7m9qmm", + "displayName": "Account 304", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dd173492b6310a3cb6b32dbc7ae7eca49c4f591e718d831fd82ac4eaf67a69c0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/304H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y5uunlxg9h657jhq62rcy380xv0ddct6q3el60pyh6nzvndww5awa", + "displayName": "Account 305", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5c2ecccbb78cefc31a1eac570d5fa2f7f4ab1a4816fb095c081baf63d6f97323" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/305H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285pel6qu2guufzapa6zszv72quzyj8r50p3p3cm04a07jhzrr50z7", + "displayName": "Account 306", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ebe5cd99815165e87661bd493123bb771cc3344529459d92d71aa3f5451e3055" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/306H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygepy75pmmezjzdajf3cr3ta75gtyrxfwldhq879e0lkhwexjjgrk", + "displayName": "Account 307", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "10f869a95b7d68ca5e61544e8e510db18bd15e5f1831836f1881cd2af44d73fd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/307H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128mrhl7jmhwjztvduq0d2yqq0gesr9pk50ssf3knnnf2dcet6ksmme", + "displayName": "Account 308", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f7c39ccbc2ea9654303b5dbfc69bb398e65f57a91d94aaaf8978e6f02a173af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/308H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x638nka08ndafh3xvkenwsyme6ted4alw6vr3slrym4vmltq3e5yf", + "displayName": "Account 309", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c7b632a05a019a05dada63b54b97406daa3ac9fe15b3bbe0d569400684905ca9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/309H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dtf5egpplwh69ejvmaa2fklcyxut2jw70p6924jpm7r3chf6dkts", + "displayName": "Account 310", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ab2b32cd1d2e979727de30374c7f319a8e665e62f03b011fba67245ca38a5f40" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/310H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xr840hj35wcp622f06le78ze7cgquzm7nmzzkn80s6muj955ay0aq", + "displayName": "Account 311", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d0a021a38e29316d8e876f980522ac51d3e27049d2e6754d074858ef8ac0506a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/311H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294jq6hjyuuwf3c9g48aely7x2vaxffwlq2kd79grl77a5gwgzp0sc", + "displayName": "Account 312", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "beb4a9b11faadafc7e821fd1a2b473b06e7c4171354988856ba198d85c84ceee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/312H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vfy02npf0k0yutswfkyzwq5hyn4qepn26mhn4ljj83dknl3gwwn2", + "displayName": "Account 313", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8d8e57a745f4c64c10cc33816e2a486fa99a3fa26b79ce9425c4262b661f6d67" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/313H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0nmk4kq5nuxn8gus0r8dywdwuzu6kwxmcjjsdwnmaacfxav5gmrw", + "displayName": "Account 314", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7611ce0b6d5c0c0061320c58c68767c86df7d75f077459d24524fb6a3828d15b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/314H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xnrep45n4mws63p8s7ks4wn6hxjmjfa3c68gw490tckzrgv3juchj", + "displayName": "Account 315", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "310907827090570e2ef8ef1a0713f89e8ca2a87bbeb97f37d1471507e657e46f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/315H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvm3r6c46kq2mlvcmrg77kwx23xmw8xjf2lddqmzkrzw4y0fw885j", + "displayName": "Account 316", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f5f218f72c92f5bb46be3833284ba95185b4fbacedf17a5cea468fa501aeea42" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/316H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128xzh55jza4qmrjyrrz304n097k29fxm3jv22473r96w4nqepmvxgj", + "displayName": "Account 317", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3fb9099a3004872c6cc66f8b4c1057e479b3a14d05feb5c66a793d5d33edf5ac" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/317H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ykjlqcp4dk72dqexms32wqrmv85pczfrqxshk7zw7md0ca8tdglsl", + "displayName": "Account 318", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2fda3e57585fffb2d731a55b479cc550fa20e0ef4a2dd2ad8a451cab5d25d6d8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/318H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x7vg53894v8c0s6eylr9ya4c0lc8zsa6t02erxl8fwql8p5umqvkg", + "displayName": "Account 319", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "05ef2a8ff893cbe0c404c5330bd815993f58babe3467a36bc64004ed19dc7742" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/319H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4v4yrwqtyav5n22puyl2jnt8ghljzhxxxld4hr7wge7zmt6mhrdh", + "displayName": "Account 320", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "560dda6a2ee4665f9d50025ba057a7b75ed0a10cc18d73f9cc71f7f4bd26dd74" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/320H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tsqjeu2yvx359vxv8q3zhm0xyghxaqeg53806zqfd8k0zrdkmn60", + "displayName": "Account 321", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "65b256bc9a720cd9cce45c2a8f457a1f487b951ac8c522ceef10e67cd6698ba6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/321H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ypkplqcscgt36p7g6706aqunmd7qrymktyh5f2n5t9nf8sew25ak3", + "displayName": "Account 322", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ba3fbdfde2af853d08f60f91ba0248c6ba1bb7da42ae8a593b5f2b9b10f6e2f9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/322H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ndaqm9u3eftn7gnjggwmykah5rk84tuzculjhjnzap0s9f8qmc3d", + "displayName": "Account 323", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bc0c8663bb12ed161061322997a0c242a9c72f6b951d7b147f47ee73b842ff37" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/323H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1299a9ar66zesdzl72h44dy2y0ty63s78g2y6yvnpffzzwk5us8a0h2", + "displayName": "Account 324", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c7f76c85bb72a9403a4e1eaf71a1fa615f9e59a611c3a96a4c7780294eac7e03" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/324H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128a3qd2xwyu0reyz9r89uk3eq3492tehgpfc7tshxw7n6kadhmuygg", + "displayName": "Account 325", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "70e72a5170e5b67f01706f8930425cb89db5a4fbb35a3c38ee2a873f15126126" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/325H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vu4l544jn5w2vxclr94zttmwjmnynxe0mp0d04mfc4yqg97rm8k3", + "displayName": "Account 326", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "31533d50bfa1b609e3ace55284d4aefe1e6ea619273503001918e579ff98350b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/326H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129l3mw8zpagqveje9x52kx0d3rpa7tp93m5reknylyzsx6k28868us", + "displayName": "Account 327", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f168146e19545b067afbb7b65d4d02eb6b16e0a9963384524c654e27558010fe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/327H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12892hp35d7fhkyh2ettecx63r3k6zssmr47rvsc2x8wha2c0jdxrp5", + "displayName": "Account 328", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "37d69b7800fb2ee2f37c2f39777b1d87a643cd9dc8790773fae1c844b269a2bf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/328H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ylh5a07s5wa7057kae9tngnh2e6sply6lvykqnad72nyyjtdm4dcj", + "displayName": "Account 329", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "961bf9369c9aa0ca9401d5ed02a90da2a4ce814f63edc825988a5b45de681401" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/329H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128p8d725d9ckymm9tck6x6wggy53jqzv2jl0ex9x8hgtks65vuuu0f", + "displayName": "Account 330", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d58766a0d18f5fe760a7ec2eb9dea5ad158b9de4dfb9b4a9711de3ffede212bb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/330H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4xrwm9juzmp20kxc890wkknm7c9hfk30y66fa9cmnnyg3ca0ylxm", + "displayName": "Account 331", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8858849aadcad5317655101c6cf02086987a4ac8a6ce4839c1e950a8d2583e21" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/331H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ycwmgektew4w2lx8n2dzd6h3r8lk5hsjnwdy5qtlg52gamlekkw0k", + "displayName": "Account 332", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d5ee8e9b69c6cb5b89e24128547962c3c66419d7e60fc79c700b5ded0f56d861" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/332H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128h8hexd45fe6xx00nawl2hfd6699nsp7aqndml4357vmpntd407s5", + "displayName": "Account 333", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5e2ad39b01e232037502df1145a3e4cc6a0e3e283339945b9cd361619413c489" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/333H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhf220dj0sxq52m9lfg7ppx0s88kkmwhgm9kj55jp6rs3g22sve3h", + "displayName": "Account 334", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7fe2cb4acfafdedea650b380f8d5c43ebeac20facbee10287b684df595ae8e55" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/334H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xf0q5u7wr3avg7j9ame4dqkgc6par2yk33dyvp3dkucfejfsd4p6s", + "displayName": "Account 335", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "266f6d960583c91fe385e591015af71ffed1a76b7d308be1e1964256b5a8507c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/335H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjw4yqc7x70jdjnmkmm72karhldhsma73qfrufh99l0wh8nzd2mvz", + "displayName": "Account 336", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6d3117deed9c1a5b3771de96bd8617bad483ba50f8ffec326394c11ee231a951" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/336H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xu5j5h94dju0ettytlm7tteuqcx3vsntneehgqdmkx6f4tm0yjeaf", + "displayName": "Account 337", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9d508ae3e7227293c4cc576e0e372d54d9e348c5f6a4f23cf229f7589a1452a6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/337H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yedh6uqzj3nuc786pvvvmwg3tay47v8anwzelj7uakuqff8smlm4r", + "displayName": "Account 338", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d2472e45e0256045bc52c37db0b38809b99c2e05d0b88126a9482eb5a34e8d12" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/338H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12899sg3mr0s0x6y5jmj8a99ecsaehqsrhy2guzt0lpxqm8qg3xew4q", + "displayName": "Account 339", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b9b2c9b1795fb56cfa033198bb000d008dd14751d9928573299610503c72b868" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/339H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zk2xd8cmg5xn49dy9md7mfzn9s3vh300ur678r45x66q6z5h34sc", + "displayName": "Account 340", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cddd07bb422274a6883837daecb6b6b94e02d658e6f713ab4f64265cae66132d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/340H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12889cvqrr2esjdlac5arr5gfaevv0snew4pkj40xuavgtsljrypgrr", + "displayName": "Account 341", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c054fb4958290972587b2c91de2d3ae6896e6b36781e8db93d14e78675d26c95" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/341H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128r3qpjauqxpx0et00y5rwpd3n3n6pcattmm97ycjjja2j5xuwml6r", + "displayName": "Account 342", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4784b51b2b5a860eb8c0fcb84b5bb19d081468cd789cf9972d7d80167e151796" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/342H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y8y4zfut8j0ldmcjx7243glykr76t7y788umcglgn4fstty0fuzcl", + "displayName": "Account 343", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bc6c6fccb6473f9236a189ea3e3742ab48664abca653b86d3aeddbc345b274a2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/343H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xnapvttkz3ah6fvjy9txfjrsnzxjf3ym2kapc2ax6vh9katw0nzev", + "displayName": "Account 344", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5cf1efd6f1f3a4844aa37af250b43f50a0eae1ed88b8297262492e7a6387874a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/344H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x5sznmug9n6sm29vtfrzjtpx0ltx3ratylycarlclxrehgvzrscuc", + "displayName": "Account 345", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1de64a7dc5c5ca639a51bad70916cfe7ae95f13086ef911834b9ba46296cac0f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/345H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3us9syzlfmm4fuah39cg5flp0rmzm7ej8urd6t6xsfak5e48pkyv", + "displayName": "Account 346", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0d218f036c02045c786e08c59f8f1018522a7f1e6d376d248dbedd41185690c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/346H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yxl0j9cjxssz2ldg9etqe4054nnrl2g6umzte8tf7722v70cp8amy", + "displayName": "Account 347", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cff039401116ad2821fac0178fbddd9c455ceff474d7714699928550fc5b970d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/347H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvhdc2wmc4wfx3nfqspws80v5m2gynztjvwt34cfvl3ve64pntg27", + "displayName": "Account 348", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5415cc76cbc7eb7fb698a1547f151ea9de86fc1a88df38fd0853d0728c458fd9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/348H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzh6q96hsmmcn45x9hvznhcdayxcmg7kdgljzjamgutmgw9quk0vq", + "displayName": "Account 349", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2108c5488826face6d6a1ba3c9c08d83ca3f5bf6a65a826ebe47b9cdebdd35ff" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/349H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128s800xvgtcsaj78zhzsmrmmq4fk56gfd0a5s7etpjg0jh77g0fyty", + "displayName": "Account 350", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0b9ec70da7b88589dd6ecc99f7434b19c156a99f48eda3cee51ba8caf96265e6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/350H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ytzg6t6v6zvj33unxzanjl6lyy6t5sfduvlx28vye2te7fa06t52", + "displayName": "Account 351", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "712fa9e67462b125436da015a41c7979f626d1bb7d28b743c896d4a56eb61f8e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/351H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129x6efprvpx32nncex6qqvr85xh5vw8g506f43l0z3fjadesfg4hm8", + "displayName": "Account 352", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "aeb475ee74e0b7b4ae16b81b7c1a008d839dfb5b0df5ff0b1f96f621f65bbbaa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/352H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128txgusjxenzwcmug0j0gpjpvkqr42d0ts8km20m57d7wqmuppc5nx", + "displayName": "Account 353", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6d1050732c94628b0b60d3f05508cef82ce8fbf4ebd078d6c161965e4ab58597" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/353H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3qjkt942gsu4pp33dsjt9ulyumec0fzdmwtrlf9w8vem8cdnmkff", + "displayName": "Account 354", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3f6748ee9ccd038fc12a7a365cdcf6236af5dce800660d15804c89892eca6f1e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/354H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yj0hgxn0g6qcaaysujwnx7pn9g4g6d0666fxdhg834rskvskwk702", + "displayName": "Account 355", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b4787608dbdd6951e9a8d34c12c0ea055250da7c00287faea2403a7a05406381" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/355H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128mc0flvr9xzjar4lve5h6jr99m03g0h3jrz49vs7egnn5cyh8dwt2", + "displayName": "Account 356", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7082c9542f6929454737f2472597160e5c485105062ef0e036b73481a93839bf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/356H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129yrky9j6jx8ed0xxs8mt47walmnswjcv764zfpau7mweg2wal566p", + "displayName": "Account 357", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "50da57a0d6655f5c1947a44dff8cdba465b4c9615c7d3e2c4457c73fb4afadf9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/357H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ptyd0kux3emxh68apzzexvz2gf3v2la7weszku7dnw95zxn7vnlj", + "displayName": "Account 358", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ea42c171148148b822113796e0cdefa56c7130dc3eb5e5d9f858045366c1d59" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/358H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yh5706ucmzwhcyf7c2dedcepqgpwjg82vckfcruwcqc9szuf0nrvw", + "displayName": "Account 359", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b12f969ae2980a282749bc98b981e036c5ab4c40e4628484fb3d49f7d8952580" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/359H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129gec5f7ha6s6l7hy8e244053gezkcv454k4skkc5w9qw620rfmkcp", + "displayName": "Account 360", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e8428a4dbd2521d56321f4f1e4efd68de97d557034f2b60b69a59fe9ea2dbc38" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/360H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y46aqqwhmzvtdf6t4man0xv0e6ruywe0psxvgnce4q6ca7dyf89m2", + "displayName": "Account 361", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c2e8d0cfba43624c1a0f15a38d155a9fefcfbd0cf174939ec8de7a92a7c1e6a8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/361H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129mkxt2ufd0s4l2xclegcl0zpzyzae2vauex8rjq22nhufmhjlmx9v", + "displayName": "Account 362", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bbbed41e6541e75ea2dac95e18fc63011ad96b168efd28a8b623072b200729b7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/362H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0ev6k6ggs04azdck4e8tdwx552m5pkt7n5t45zxg2y2uk4dnm8q4", + "displayName": "Account 363", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bb442dd675affbb774cae82f4d6af547b513272ddceffe787e7c5341788a1aa7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/363H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlpzamagyhgvxcp0jm5dfsgvzn7g5gpmwnu8jnv0v0pygprp2w5gc", + "displayName": "Account 364", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5e46a5bdc599da3d9211508cee04854700448fef98dba6fb11206c04fe8e6972" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/364H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpmu7e0lpmrurmlnfac8rlsfe6en06rncfhf85he8q7mdmlmenxdh", + "displayName": "Account 365", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "991ec7a723c7df1f2c64da1b02c88507fb686f23e530326bda82a76d87dfcd92" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/365H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128tv76x0l98symz8vsz5y46uzmyzppwl730uwtyrfalafhgvw0c3nk", + "displayName": "Account 366", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7e2859f484ad5b5cf22ae786d770bc6e8e48c966c23757ccfa71fdf5bc33a557" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/366H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129h8k387j8khz2f8fzekujc2te0y0eyjfe87tcnzs56au5pw6gws9j", + "displayName": "Account 367", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "460f7266e4079e375130718fb5c3b7ff8fedde74afd9530bea7b857b875d48f1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/367H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hq9np068k4rfjuhasltmx4ycwcvnj3472kte8meyj4vhcyl7ju5n", + "displayName": "Account 368", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bd07dc5daf1608ab6c9045dee0d042c709126ca27e6ad269f408cab22d15408b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/368H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128s4hnrqystwxgcqg89np5ut2a3p8azdyzktdpyzxz3v0697mpryqf", + "displayName": "Account 369", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d67a5a1d69ad8c2c2d6eeec26412c89a0ea01de41ee698a3e12f3d39811625d1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/369H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xrqypsl49ysnflvjk7g75xrm500dyclh09tp7vgmrwv8razjkgp6v", + "displayName": "Account 370", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2096fc2ef9d076aca38f845b9f69b81731cc37e3b732341b2c75fb38cf91d306" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/370H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129a6x5x7yyrdcjkde6u7gsjlwx04chfpzv3ad2w96mmpk2pfwfyrgr", + "displayName": "Account 371", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ff583bfcdcfc11c4f17fbe941c5cfb36228f9378fc13a570e4e24ae1f597174d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/371H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ysr9x8kaqaqh9n4dx5jxapyu7knxl3x807cyhptr2z8gnflmn7797", + "displayName": "Account 372", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "93228b18cd6c42dc6faead5851a39b328b5956cc8ad0e894a7c5ffac055910c1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/372H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128faanqvwwakqflglrqs8l9jfqqsjrpjh2d0np7m9g6se3fdad7xaz", + "displayName": "Account 373", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e13c7fed1bf82bba2498953f1579063a1aaaaa7718128c8031ecc351bca7b5c7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/373H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uhcwytefqx5m08pgtq42jg5zc5ukamflev6f5pf8kxqww66yxclz", + "displayName": "Account 374", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "71c88d35083973ee365feb91c5d09937b37c18ee135f74d16582b4929ca0764d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/374H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ys9deyvseajxaus74mf4na8gaawjcx8hz6j4y8kyl6dcyq0483543", + "displayName": "Account 375", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0aea219940d00bae80e2f5f11dcdf3a9c33245e53b7c7591ad08f5aaf853323" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/375H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vqvf37ah3htdj9hw955ufecf9synctx78l6q95te5d06hlvxgn05", + "displayName": "Account 376", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cedefe832c65355f65c80d9836f711029dab6cb6e7f9fd9b7c3ae3bbcbd5d1a0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/376H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y06mtydx9m2xsaplkhuu6a9zr24pscj4wtayhmrtauye42yeztd2p", + "displayName": "Account 377", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0c1ac58dfaf05e7fe9fb4b1b6628a9bc003d84542193f0d58ad067d655e32696" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/377H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9e3lytsw9snnjhcva27a56v6efx8e4ycdy6tspj9aegu2shjhahk", + "displayName": "Account 378", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7c83e73dd5c2701ae3b641e26837ac89d156e8c7b07c5418db5eefd63c334a1f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/378H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xalay6t6pn42qcs6ydyxf4vp6nenradwtwajj8quu9m7s2r5edvdu", + "displayName": "Account 379", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "45fa011e6bc14603cbc551530803b09e9be85cf85f215d662a1ffd32be8fcc2d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/379H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12993hytaw43uc9txztcw3rrpmsss88zmkshfs0agrl9dhtu2txz24s", + "displayName": "Account 380", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "413ea561258960146053269eab2bbc72efba327ff289d279cae4f33474a62dea" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/380H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dyl56lcy2knw5quetjj4v7jw92h2z8zkck0z9a7apx64yqn85ps6", + "displayName": "Account 381", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "639e5a2309aa8baa5f750890d6ae4f15c53d026630652e558a3d3ee3d909f5b0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/381H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128arfn7cwmjat0739fnyqusrgwfrgdpsqfuflysj66y3yzkdwj4ha7", + "displayName": "Account 382", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a8238b5fa3bae70672b43e957495eb68b0d2ef9ebc0e0b80e453a2b3723220e1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/382H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y5vkgpsc0mxm8yenc45spd42k8y8kh28juq530lmlv2z7z7wqgwhr", + "displayName": "Account 383", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a75c4a876e69703eb9a39d606b138550c774013bf9bd7987be427d71c8c4953e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/383H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yez52dt44t9vr34k7njz5flaeqylnw0pckcq2zjzuakyufgsgpwqg", + "displayName": "Account 384", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fdf1c418638b5274bbf52f0c85405c38f4c043d3f31fe89c6c3e55cfeabbb3a7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/384H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydv80kx94nnkf758nrqt7m87fqz5rn6nmk28l9hm844gjmhtpjqcd", + "displayName": "Account 385", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fe6f9ef1d8eac2e502ed7dde09cabb777fc113ce61a854a61292c68f125489ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/385H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yuxk0g3zppg2ctpa8x2fzwe69ua6e72f4ykgg09fyqtehdtcuygju", + "displayName": "Account 386", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6ec09467f1fa16b9f524a671e94add1e4aa1a292a81ff9a3a740a35435b70075" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/386H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjtguw5xqgacjwue0czgqst46ywy5lx3c0gwrtm9wadm2schk6nz8", + "displayName": "Account 387", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d2921e1bfddb1c43943c0c1a6d371ab35a7f8a4e7aa47c1aa47e60566dfbbc6c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/387H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhha30gpy8e7vx7wdscv048m7urp78tdw46v55drz8g99d26vdrqm", + "displayName": "Account 388", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0f52b0beb933e5f3a5c8e3ae77dc9f1e9c6a2f9815d17db0f76e810a85f10286" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/388H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vzf4f8xgdu6q9gesl36gqvu22nkg3lqp58lagpprka2ccqdgg83s", + "displayName": "Account 389", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "23b707be3a4b0d793984b7df82f56b0ba0be24b483a11979357fd65cce7333bf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/389H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ym5205vg3h65hl0g588zcv9g4tjtwgz0rn3d254dvh6pyztp0afze", + "displayName": "Account 390", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ac72954cc2a299e7a23bdba08dfd7e6306a6eedef97c9bb7d536bbdac3c13b6c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/390H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9alvlh09pvewewt6m3qzg25ze0q0pkmjd3zvdc7sn7gytwpynqj3", + "displayName": "Account 391", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8217c6cfb741928639d00060dc1a614f30aa3f9ce3f0389657ae0c4381f0b4aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/391H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhx7wdr9c7msfs7lj424mf6luwqs5vapvuu5mcqjellv8xgfzdc0n", + "displayName": "Account 392", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0a127657ce9a886c6c664a2001f8f3137d60d8a8e2d206567c7632af6c61656d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/392H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0wxzhvu0mjn6fet356gn53nzn3yc7knfv7de76363lr6t6yuzmcx", + "displayName": "Account 393", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "12ae0ce1a7f8d4bf1b934ea236dc9ad33625a50faeae2018a12517357da78451" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/393H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dq5a7gn5ytwytftlnvck26prug0e0v0gdhctvcv3f5adyme0s9k2", + "displayName": "Account 394", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "740906912ebde54a1227fe48984395e59df1ba12d2a8c76f6842cdfe8d1ec5c2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/394H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x7jlwqxrytscdag8dy86lw2gnspwqqqnk7ugc44jrwhg7zm3jhxjd", + "displayName": "Account 395", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9aedd0ec0adeb1492f2f82845949cfa8641c07f5943401b23dcf0588d69192e3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/395H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qa7lcrwahzea3qk3kvkh59pzku7uunxfl8fgdp8qp8k358sa8ypy", + "displayName": "Account 396", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c4d474bcc03b96a584ab7d159362030b871944a0aac704a1e2b6d968bc11f3fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/396H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dym8zyg3h0k2zcgd6jft56qel43g6fq66p2n9pcnm68vm3nlxpj5", + "displayName": "Account 397", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d4114d94fe1556a9106a613d59f9b8ef398e8d3dc918c798b4f2040a8222a34b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/397H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129k7lydpw3utw7c6jf30j7wrxlqa7muskdd3r85j97eaj6r8ywm55g", + "displayName": "Account 398", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "15040a8b820134d659c18f390e5cfa67908704f19ff9a5b45066be9cb86957db" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/398H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8srctks7zvc8wug5zynp8x5fyel8cwnflvmfk9pclezs3nv9zluf", + "displayName": "Account 399", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "209ea469e0a993d749f0631556979f4671e0723d1046371091ce075ccba340d4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/399H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128xz4hza83gthrl7lsd65pqxx9n9mr09dnulxh9s30zscr43t9eene", + "displayName": "Account 400", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6d1442a488c00080cb37afdb8eefcfbb694b4153a394d4883f6768782564c4cb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/400H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ekdy368d36ax907a9ae62lhu0nfmt7v5k9qjyyaqcwlk22ypkj8t", + "displayName": "Account 401", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "80a0e5b524620861ae1f7a4a2fe6a286e0c4ae3a2ff4702cc72ca299245b686b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/401H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yl3f8me0x2c9c957u6rt8gk5wc4t80a2u426jkjpe7yh9vrzfdqvn", + "displayName": "Account 402", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ac5b99808958201d376643af69910c83473c90ccfc855c9035c4464c6a41e2ac" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/402H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygr6yyg7rq9qy58tr58cgg07mnnrn3mu78wjh2s70s03huwrq49t3", + "displayName": "Account 403", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2d956f2a7ce16f356645ae9c4b92470691e046425e2d205cf4ef4c0159d501bd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/403H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hts4l6hncyaayumcnm8hs2jpgvn6hv7sv034dwpgme9vprvfwpa0", + "displayName": "Account 404", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "feb4ef74b56da41639e444cfe3889eee4292eac7a3148047ae1dde1e1d091662" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/404H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fuuusc5anj4cacsg9ujrmut70sdkpclr0yvgfs2zpxhf09sej4dd", + "displayName": "Account 405", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b96dcc241d4712cb9fef8c97410270d809f5ada49105870a2909e19e22ae2ee2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/405H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytmv3h94mzxkl69za4zwa0u9mvyzrjn6salqdt2n8fgze4ux99zwm", + "displayName": "Account 406", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0c88e44f0d26a83b90780078d37ae83966841829eac14f17b1e337f8bb1f9230" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/406H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xc6du9cl6r6dkh5knrje4sw8fkj7jvmr080h2pnxyfx6h5gckplxq", + "displayName": "Account 407", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b376193be0bc6876ade47f96e1f35277a493638b74e7ba567c68b1c233f8319c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/407H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xmjrqwtdd4z8t2egghnudfq9xatxp5whuwcwwd4saz9zlx2wn785y", + "displayName": "Account 408", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a3b5f03a05c467847e8d2a8b49f7cd2893b42cc05dcc3453873735747edf8fae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/408H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285kkrpx6c9262epj3p59a6llwtugzenh68nsqqr6dct82p4ca9ena", + "displayName": "Account 409", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "639c48ac26d7e20fc9883308f3d16bb5fc6e2ea39c7f11690cdf6bef1153c4e3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/409H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xefgmuejgykz7a95396x6ec4lcay2sl9hwu95u5jz9xygkpwnugh7", + "displayName": "Account 410", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bd9c80864a06d080f25c350fc9b88b4db0af67bfaf203c69a99168188623005c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/410H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9pck9eqpaap5a2fuxu4fvhf3dnfkf907g9mvqpdn87c37zc7hdr3", + "displayName": "Account 411", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9000736503530cd7edf1d9ac742bb10a633f1ca75d064ed570b31b5075ffc1b0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/411H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129hucd2evy5ae06u6635ck6229u4aeqh65tjdum0jmx73n7swjaqn5", + "displayName": "Account 412", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "20854f536afd7d5bcead1ebb7c06ab1650c64767d48b610410e6a3b5c7454c34" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/412H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhw8jnh0pqxkancs0cmzeh20s74hpqz00cw2nfvmv2zj0n6srr7u2", + "displayName": "Account 413", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "419f4f6d55620085e51d50b1669add66314a0b3341ab2ad8bd36dca6d2e4eba8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/413H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xk7xydsxfcnya7gra4pjcl3sflkxt3r74dw7q6nlf8repn670pqfw", + "displayName": "Account 414", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "31c964eaf43ff457381d86a1c0929d9f4b74dd2675096276cabe99f41fee4437" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/414H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128gq2mw4kjnz7l8mz93zn8cplgllm2edckzp4wx696907k3jm6l2ym", + "displayName": "Account 415", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f69dd2169bf9e4f63eb00b0e4cac1daadb07c3e5881c805bd7d92f8c1dcfeebd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/415H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x595f7herk4088cx9eht0ap4etfpag4dfdps809c7kmcgjp3cfwu7", + "displayName": "Account 416", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "211f1e01f673100ba6d9380ff58840420df2d6efb0c630e033eb85bbbe6aa2a9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/416H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129g5pht3ghuc9q9sav2w6806wxr6l09930c63chuy7tm4nrmd8zy7w", + "displayName": "Account 417", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a518104a4869f0f7b3ba4f22dd7e1c4e1406014b20059a027b7fe3e2e1761319" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/417H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yrtmzdt7wzy0w8sct4j03z722yjzl4cqsxmcve5n8crkgnfv037mj", + "displayName": "Account 418", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6dc08bd36a333b69ee0d6c026115cc614a8ef30484802df853a066a96b46fa66" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/418H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128qf0fnqpz4nanpyk4cwd5w3v9qczlwr4tpme7p8neu0jwjaxj6gg9", + "displayName": "Account 419", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8b05b39769aedc498de638235f1611e0c8fbe62cae8ff0ff9819272a719dd306" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/419H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2n9lx524453eypn2ny538fgjyrqe0uhxfgemj9jmvcw8t8d300m7", + "displayName": "Account 420", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "17d29f5fa452fb8ce312f402b9ab549e0b2eb1614b8167bfef08dfa9c3d4148b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/420H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128py97gx6k8g76wmyleyzdghzkzhu8nppwrckqc45p4rtl97l54v05", + "displayName": "Account 421", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6bed786b15a7622f2a758353687655f2ac2ba549eab17710fbfa502186c299c1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/421H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ycr7u84gqpwgcuwj3cky4lrwcm9zsqs0rqr7n2wq3up7e4nu47cry", + "displayName": "Account 422", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3ce91b6fac8ca11cfee0d7ff082c879e2937b7842a35285b4075ec23e92996ad" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/422H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgxf5zy220rrywdfykty0c7nwzu55w5k8rrljk0nfw9g4dhkmqlkm", + "displayName": "Account 423", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e807689788e7b57de3e36c282fb8619a7d69bc9180759966e7e15515f4e4772a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/423H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uv6lpxj4qzvcvs4r9r84038xkwt7hu7e48y6wmmzmxas0qa3wshl", + "displayName": "Account 424", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "998ec731217d2173ae3d8782192bf91bc5b4443e107f82f133d28ee21166ebae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/424H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128umr4du0u6grzycedu0rxlvsf7rfw0w39g5q2ej2xxftzhgg2cx2f", + "displayName": "Account 425", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1cf7fa7f60e9afc0b3237d7327fca29f878a44b953aa07a406f623d1f23c67b8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/425H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128nsysmustcjlzeyqlxg8fa9pyht35vcka34cnrxrpru8gse4hcq6k", + "displayName": "Account 426", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "55b7ad746b67fd72f473fb51a33ce38894703ab391f06f2dbdd1050821ec6bbf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/426H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqtg0x6q6xpxusyfwqev82gj60pkqye9l309ux24k59pxttg5egzu", + "displayName": "Account 427", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "025481bcacd33c4a40d78322fbfc307bf0250f5cc5b5709424014311dc34e55e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/427H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymk4pgh246t7z57txj8lmxyslkn3utgca6xtk7l2jp6xqvgj3z0j0", + "displayName": "Account 428", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cc75e1a21e9caa86bfbf8a8c8328542c27ff723c433d96804745395731f8c69f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/428H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289v3wkmzz7tg3r7hpntxmltnlufj4ydm43dufshcegr3glwdcu2hz", + "displayName": "Account 429", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1099e2d6e12eb6fcdd41b0e8bb521e10cabba66fc57bbaf96a9819b64a8a803c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/429H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsg22ehmds8xve9hl0qf5s04czqktyqxau5eg6cyuj677p6n7l4ac", + "displayName": "Account 430", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec96f182f5e5e7fd8fc87b1a578bb4c30ffb12efa64c382e3d80d9dcb1a66b8c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/430H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x6lfwspvkc8gjzmdp082stn7fyzregkevy0tr6hr4syy3te2cp906", + "displayName": "Account 431", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4065c5b0b30a625d785d8a724103523386e981a263c97c893c08aa072469ba93" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/431H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hx6tx7pjtzad229px30mpm5h5xgl3rlnu7rvx0ce46cjlstcljmt", + "displayName": "Account 432", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "74de4e066f735b1d16a9da97aa182f54a3d8c612bed7181fe071c03c2e4b0c11" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/432H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128264pdtjnnaud3d248vl36eh9zfgvke3fqx9ncldl24xqc7nq2vkr", + "displayName": "Account 433", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4888f6a916516e898ae3b406df1f4c06d1122dc2c1ed19788a88dbdf7f57140a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/433H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pjc9a0cu2a0rm8ldvs0qdm25uk9acwdlkax3vndnrxhv9lcuet4l", + "displayName": "Account 434", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec48cb200566be0dbb4cbe6bad355f8cfae64938980b69a57f21be5415730bee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/434H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0vap7eazpz9f6xlmyq9y5u8rzjtxuaag2jmlsj3xfqpr6usfurjf", + "displayName": "Account 435", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1779ffd26c58569a0dfae9f4a22617196a0d6db19b2b83bfda86a0fcbe75644c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/435H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128v4m0jg40z6n4t3du9lc4m8prsgg70w2ffsr229mzet25qtkrex6q", + "displayName": "Account 436", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d4263509ece44b12d7d32f8a441c919ca4245fd508f3c7bb2a3781a629068d3e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/436H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129m67dqgdux8t3hn832pry4a42dsjlphvwjj9d0g44h6luqjejs4ft", + "displayName": "Account 437", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a5237dff118404e67ab6794b2927a467bbe503746e54bb646bb610d86cbec838" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/437H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hvpd4ppmsj9hut2nvnuypggl56afgrdwj9xm4dn985xds27a6uwe", + "displayName": "Account 438", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "808328f5e508c0ebf133bc8ff6d85e680b54b40f0540210b9047115006e4640f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/438H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ya4m5nsw7l2xy63phe5ugl2fud6xmx734ma7rnwm28cp0strjxzap", + "displayName": "Account 439", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2c1159cd91966e9cedd81a93e6e8c5e52bdf89ea93143d5b3e267321e93c6c3b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/439H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yr5vu8ey86jj90ysteyj6wxhkx0r5yuc38wkqcta4h4wwpfnlezv7", + "displayName": "Account 440", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8bfa62d8f9c3c00d3cab4249e7cc55d4aea8e49e1371170c8e0dfa31e9bb078e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/440H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zncdnaayuv88k38453natsklj6sm39grf548e35xeck84jdttk6v", + "displayName": "Account 441", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "59bbcbb09ae83621b73659c9135fb8458544fb4f8bdcea84f3ede3a1d80b2059" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/441H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xej7qd3yhg2k3shvlcfrjr3nm42sq98t6sm6aauk6723clyfatt4x", + "displayName": "Account 442", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "829f8f7bb3734a5a6e34731459345810af66825bd6ce49b74714aee1e4589629" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/442H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129mkgc4ukv2wsr0fyvn99s6s6ut4dewgxcueqek87z0wa9huap5eqd", + "displayName": "Account 443", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec327547c0caddd5485de4403a6489070ff46a8e1de0ea59b3028a6d25d9e5e3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/443H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128wrmwk3shseknjfygdm83lppmldug0qhd5f9dgdlzg64twl8qv4d2", + "displayName": "Account 444", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "55fbccb7775bb54849bef4215c25f7f47ec5d6048fa4b3020c9d252ac95a42ab" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/444H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yuu53ll5u703wvqcav90sma7gdhr4q8e7jss63mjrpw2wekv7sj9r", + "displayName": "Account 445", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "311adbe5a60dffa3326a6a75ed1899d13eabac8dbbe0a62acafbd79e88d2a374" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/445H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128n3w343wmz86jlmq6utkweeqdyk2k8fz9d8axs2w972e9nszfw7te", + "displayName": "Account 446", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b3131e15b6e1b1b84fed1ffd3c889d7422cae59bc7760b114429c7e64a79fe3c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/446H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq3wqm4p74tw43q83yfuy4e6zh2m27800kvstjlrqvewjddlwxl3l", + "displayName": "Account 447", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "670f13551b1ebfc1410d8aef49b138c6305299c69d350129e8c45ea6cf9a56b3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/447H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289lfpxl3zaycpsxh4x9vafq3rclcg9sgzsye5sv2xmfqueuex80p9", + "displayName": "Account 448", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ca1f6b00b63426495b7730accb85fcae8cdcceb1e3bfbd2424fcd7c6f4c8f141" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/448H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yg6l2d8ukzkkwzzf433v8kaatx8wmn3afh7tsh807ahpqdtxuqnvm", + "displayName": "Account 449", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "df6d6f532d1c165890ae9aa0cb680cd229e55a04f7b253beb11b639a43167cfb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/449H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129q83huc5g8q6eg232gqz358qgpznam9c2mg3hsdg6ehdp22274654", + "displayName": "Account 450", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "412aa509c8fb26063db43f47f0f98fd98a1b0deb5376be7dbc8103669ea28fd0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/450H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4k6tvj7yfw3sj8l4az9qgks4yhheedt99ktg45ctd4nmm9yf4e9z", + "displayName": "Account 451", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4c3f0cc34ee8710eea2eaa153be3971576231156b7dd1b000be092473b63bc89" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/451H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhvec2dawpm0hx3d69a80kd6kctl9kl5z7xe68q5lh9s7gay5t9t0", + "displayName": "Account 452", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5246b885417a6e7294d74437b93010a9f9db54575b7b4be818911b49a30b0cf1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/452H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dkkgrkfvagmpwgh88msfuccxcrsvuwsfury6th8fsk55frgzrf54", + "displayName": "Account 453", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f6cbfb9d9a15736d2fd0124e16074e0cd2391992335882addd29aff425c6a1fc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/453H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128k2ak3ygpzxkfu6h8pqd8ds8s886u9rx9ae5437umyhpj06xxj478", + "displayName": "Account 454", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "21bcef3c065a256f31c33605d0a773a8cb825e89f6b0a678157eb8e3fac060f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/454H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xl4jcw98ktpg2huqn0u9yr7qswqtnz87k5x7ssd5zlfer5v9u9fmf", + "displayName": "Account 455", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a80814a1dee3e6c9c27bcc4dafbb0048074d30e0432210a3a8910d65c6017a73" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/455H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129p90gkm4wqqwvffjx5chdxqwch23ne5vlte2aqwnzu48wdvseyrsy", + "displayName": "Account 456", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cc55527c72b9ca5d82cda594b0e5ddd0a0422bbb70683deb017bad6ab6e4c60e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/456H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nesm6we7ntdcemf890tsmhm6mm6a9my7rx3aqdwvdesgkszspvka", + "displayName": "Account 457", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "42276c28a0e5d57ca9b93c9dcf8b6a0ce8b608adbe920cb0395bd75fa151aa21" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/457H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjwn0zekjj847czmma895yqrdw29fzrwv7l7pettx7gtp67cu85hm", + "displayName": "Account 458", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "830904097550e1e3c522ce72c7a506da0c2ae37ef832492f68ce5df0022a9caf" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/458H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvtjxnkphdq8vldtnqa50x9v74n3ya6d74pqd8hzaq4hlng2aajps", + "displayName": "Account 459", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "97184f219e81f031b7f783ec019b3d8f4e8de4f0f2eadc51de56d3894011e871" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/459H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yydvda98p3wcdfsuj7de5d85sc08u7jcwq9daqyeg9ha5nt8lv0fn", + "displayName": "Account 460", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec6d5fabf34ea3b888bfbde52532aedcfde694161d7e6c5868a2017fd163f43a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/460H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8s6hj6sv3ezdnhyy0pk97qqlaxgkcgkhfq45zrn2hgvwy3sv39f8", + "displayName": "Account 461", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "edad2ecea67cd517599311e6e7342099500378d87929cca5b054fb74553f4d6a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/461H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x2u7wy94dyw0y9gvtxjefvz3sa8m8gnz2wc7679p0mnpd8u4sd0xj", + "displayName": "Account 462", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5f4d807b66aa14b61f81f3a4fa339aa95efa554436b5ccb17fc2c61017373d7c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/462H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129sk5zrm3gvvd495a3gklznvfe4cvr4rg726pduza4hlgcf5vf9l2m", + "displayName": "Account 463", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d3c547d9ae57968dbb699f05d666c2e6182f4847a18be1e40e7a0cf76a0d70f5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/463H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xccz09u5rqvx83hlynlht44nmz3us0n064elstggqe7t6sztwpv92", + "displayName": "Account 464", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2667bd7ae029a1c7fda35b75cbfdf5d7350a660d273b05e2893d644db55eb4e4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/464H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12894segwruvhwll0vf6gmfz7d0kyw2sed6nruxu3wwj04l56hhpwn2", + "displayName": "Account 465", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c934e7d584c045f6cb37dc1130621b79f008619a6d562a66739bdf69e08a9e2d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/465H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ysrr46scx0tlhpv90pj09zjdnnnk43q03245jdfunetmu05z3tg5q", + "displayName": "Account 466", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6fc08c0f6f3357b2035f545bba8a95f097c0be83c5d93c8a47aa052c998be99a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/466H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpg5wz5veq0dvplklmaucpxtnp9e57rlepwm7a493z28fysr3hp6n", + "displayName": "Account 467", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3260e61682d71329466317c15b23b07cd0b302483bd88786d44e98a3892b6f3c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/467H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xa8e9kp93sca2xxrgurw0funglvulxrhcsmx62dp0q328s88pw97x", + "displayName": "Account 468", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "adc89e40337bd5c8f988f74d03b5f116a32094815eb518d55727176511427efa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/468H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129afr5wun6j0umtdaw6ffkgp8wxgxj4yk06kcem7myxcsr7ay6x06l", + "displayName": "Account 469", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8a01bb20b892ee4cb6ac5113091d5b4633c327cb3e9bfb0dc4c4645b22237453" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/469H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xss26gaazvu8g6y5r4q96904cftgzeu5ny9y59zk9f6pfy7qwk34c", + "displayName": "Account 470", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "80cfd13e212ca54561f7baa008844d700c11b5901d5163a92083ac571a28b3b5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/470H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12836j3539dt0t2tvqz5mdamj6cxug9k4lsrynqjwhfppe5alzhsg3v", + "displayName": "Account 471", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4e3121524e4bfd1147ffdbb01eaacff86f4302830ca9eea08656f86327221384" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/471H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yn0kak3wpzy8fyj9v54a8yqx8zvq73hhr5luzsq26thw62qqp496w", + "displayName": "Account 472", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "60328a6a9cb2f2e881fc3dd6651dab251825260250fa68db3ee5b1a31aa4ee90" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/472H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xuzsqllfx3r5xlntkkvhqx4ajm0rsmuv9s3k7rc7s8uzrau63ct74", + "displayName": "Account 473", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f9359c4b97c81201dfac7bc21a40febcd99747050e8d9ec31162f6acaea71a34" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/473H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y07st8utfcpppqd76clnl79qpld3ymcynq9pty7aeg236xm427llg", + "displayName": "Account 474", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e0fdd6f66b5178e95d707c0cb1b62f3ab699cb7d92e330075f6e08858cbfcc73" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/474H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x62e7aje0ta25f9r30y0qlqlxnppu2mjd3xdtzj82kxld26d3tv2y", + "displayName": "Account 475", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a020207913f7ec7899cd2afc2e1044540488555131bef048a0ea80a9957aa312" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/475H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rdkep5z6pf7mpmkxnjrnhr9ur0s8u4cujrwfepffj04t55hzvv4w", + "displayName": "Account 476", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3eb72db351dae67ce7b11095e1f28b30baa3dbef378b81006048823115dc12c1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/476H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ylrsypaeex3mda9cxs998c8nzzvdse2ke03uhr0ee23mpsfzfm25s", + "displayName": "Account 477", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "68e27473b8eb60d975bd2a064afd1a5210ca6791a68c14fb075f3888fcc8156f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/477H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y29urh79z6n7fqr4qsd2jkyxpltz3tmr52u4ksdeeg23tfe0lex60", + "displayName": "Account 478", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fa734edb895f08db56bb9794e0fcff989e06c8b4e074ebe6df047d5c2900137f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/478H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zqrz9ry7zkvvnacg8fsm3pez56vt47f6xkryam4yhm5w3adqqcmz", + "displayName": "Account 479", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d8e15889c2d8b189a99bd4e8d383d04b59c9adb19082b8677167d524b5c64ed3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/479H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xcwkrtw42qp854fmld4lgylzyvfua4769sd069acw5hvp0j892py0", + "displayName": "Account 480", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d468133979228f5b23e2ce97a673a970e774d4636822da50daebf451a206eeca" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/480H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128jgqpp63szmdd2z2g955d4tz2qm5lcnfjdpvqhqv2lwstm6awu63m", + "displayName": "Account 481", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "df23abd6ca4c61a3b668411688154267508be9214719fe4dafc317e13513112b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/481H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1293wu0hugkx7vhs58eux0a8xp3ukwe583uymnlaslf346v0uumlq9c", + "displayName": "Account 482", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0104c7dd6c5c2e94fbaba8fc692948a6950275f472a44954b8c2289da34e7722" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/482H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjln7766kwc4yrj0f7lhffnva8qtalh4yhm8lqqhuf3dfprawmydf", + "displayName": "Account 483", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "56551bb42d1915bbe2dffee4783c135e25077b7f9a25ea84876dd7d56182b343" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/483H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvylyxd87mmdszj8uc9zvx666ya4d5wz2n5yqlzdkplcjvvy52yj0", + "displayName": "Account 484", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "88c7d60a9cdb9b0797ed713283d7c1daf5b3b455e517b4ca6626cb9e33550f23" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/484H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x2zfld3r8m5c8ecm6vpg9dmdkww6kjqdshrkcd6l27y4rmu2gjwuu", + "displayName": "Account 485", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b49ee27607ae755589352af21aa1f030ec2383413e298583e901c7c2d1755475" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/485H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x094vqm0z522xhq3ntrttd54p02rgyszzan3xzceec8h0la468qqh", + "displayName": "Account 486", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7e3283b698ef6a8934dc7795fa7bb639fe4a2e9144e5c73ad3d529a12c5269a7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/486H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xf8fv85k0nl8jvy077uu5yl7cyj5zpm5pdgcw6jzg7c3vw4cgjenx", + "displayName": "Account 487", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c82c44ccb51de6b03e42fcdd0fc3c79bc6d619695b3a3608f310f2f51ca111b2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/487H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129kdz0hpv92mxsuseh3yy8esvz7a6veprp9se8d7jkglaazfswmrxn", + "displayName": "Account 488", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ddda91f0d772fe930c4e4ffabcd5a8d3e26404ef0a7a7712425c28907bb0ab36" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/488H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129evyu0sjy0y99mxcmn94gxn84wn3sdly4ppesf57p59476xwkz86l", + "displayName": "Account 489", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0beb924ac547c2bdffbe286c6fbc94e6da16cc7eb1dedc8076d4b3854e17f631" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/489H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129p23fllx5xrc6mgaxeupv0flk2yryzfvj0zqk9dyx2d66h8rfemex", + "displayName": "Account 490", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2ab684fb1923a2e7b169e8dee77935ffe1518ec2530c1988c80c684a7b319fb6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/490H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9kvgk0ssdt3h6jh4lnevydr8wp9jglfj5j75n2dc3xa8z469aqng", + "displayName": "Account 491", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "32630b366e46ce1e896d6299310ba43ecfe5adc5ceaf5a78de00d5e083a57731" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/491H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x5gs2clxz93xsxwv2z3qtqksn7zzka96m52j7rczxhth5j7xf7e34", + "displayName": "Account 492", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cfbb80cb4801a0f4d943e3472e3f020a61b8017a0a75efa1cd7a73be098deed0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/492H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296wdwyky7jg4l9g8qt8f69m6nzxfeegf7zlchnyaszjzmnnc5enwt", + "displayName": "Account 493", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "010c9d804384b1b9d1815510253a7b83c82667ea0d08ae8800d1fbd2a8bac8e2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/493H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qn7ypr0ha74ll3jde4zw45vk80p93af6qr27w0m3w38jz8yapkj9", + "displayName": "Account 494", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4fb51667a919be74dd5df6c61f5146604ee53c721914885cdaab5e00f92ce5ba" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/494H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yv3f26vrvadh3ah8fky6mtww50c9dyrpvmmtlfkjucm5lpnsuylaa", + "displayName": "Account 495", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7cc11b76e392e5ed709272bd43bb9be43a1f8fa4b3d80b3a075943fa71197440" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/495H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xt82mexh8fx76uzkq5vtwgpcgx3fhq5q9nfjgvuw4wvft2msnt2ur", + "displayName": "Account 496", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "215d75e1c489d904f0307d57d09586fb50dabad5bf8264710f5380ee1f135173" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/496H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286gh58rekkvgrjlhzzky0f5ddsnj0xr2ydk4dfxaqrgn5tlm3qcv4", + "displayName": "Account 497", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "891b247ea3258a82a9afe0fe5b932647079f42bf713d099c2d83a303557cff96" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/497H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ue7v3y9mvvpccl9584cyyh4m27ncvzlje7xye9sj0vx2cfz3xnte", + "displayName": "Account 498", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f36c9367fe85d93cf6c60c9ae0e4bba06256897313fec3a50e3b614e189be4e5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/498H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xs0v8ns86z9772wekhcud6dfztllhtn5nt7rk5w24suxf90mag4lj", + "displayName": "Account 499", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7839e0420b27578b2645fc459e13e795edda06e1f78c08ee287b0348ca2e6f61" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/499H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rsue8hm4zgqnyelxp43m585hnkcgq4s7a98svwc4rmsap2mzuv6g", + "displayName": "Account 500", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "32b6eba763c0279b1fa70c9cefdd70cddd9fab2082a9d22f183cccf2126e4c96" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/500H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284cll34yakve2cvadj37ke63s4ua2lfr0czm9w7ff9490qjdqen7l", + "displayName": "Account 501", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e01beb5dde3412215888b00a7409e5c5413b38df94fa646e07a0ba786469c8d1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/501H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wpk8ugkm8t4f9hkaettwfrweyy56n3l8ahvzwalr5svwl2txwhzz", + "displayName": "Account 502", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a6c764f01c882becebf08dfae666ca2636814e36409f0b7093b390b0d2326b52" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/502H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ljdgr05atwdfffjg249qz5mn445ruh7hldh3djsgszf5e6v7unjk", + "displayName": "Account 503", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c71a0cdde11c89eece650d320f43ff971affcce346286b00e00624c2ba41ca0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/503H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xxd92pcqjx8thgeqtvd7x775z5vyujp5dr94r8l9r7cxmkuhauwye", + "displayName": "Account 504", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d77d4c9e17857e7f4230a4f39e8cbb4ede12583025a9a7afed6f51048afb19d3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/504H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zfhacu3a8wdgz6rucvvtxg5y3k0ml74w33e4rztjalw7p30cruxm", + "displayName": "Account 505", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ac6fe691f9b9044a94b5f0796c73fcf191377c2b9d8164642c65910270d2d4da" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/505H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1299v2vlrnyyuja0evwxyd396pwm7dv40myrkqys8qvpnn3terlxwan", + "displayName": "Account 506", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9e4a5031060ee9aea80672ca91b8c22466cb504566599be826bfcdaf1d8a823b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/506H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xc5lkccpmcnpqxsne7ejf4wdscat244kyp6sljh5tkym73mwx86kn", + "displayName": "Account 507", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0ea9b18320ce9be33b796676b1fd09fb63dbea50f4782a530a250e347888c340" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/507H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4gkudsf375uhjzv9lafmv0l2kldqchdzge4cd7fke74cs5ae0zwu", + "displayName": "Account 508", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "41a927b93f9e9f57add0a6c409e9079e80b3577a676a773ae22c31c25a8681be" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/508H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywl4292a4r9arehuf5lp7nnq7tq7hpzgr092py49u66t87t7avery", + "displayName": "Account 509", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e7021fb12d40ed2576239bf3d56bcfc093da91be7221c325d3516b07d16370b6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/509H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296yfyteh26d0ukvzlc78dyr2saayrghmvqtfhqjqjgxv4y9z9985n", + "displayName": "Account 510", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "964b662e3651b89428247e877a669c788d4df484980fecbe4d2f131e2853873c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/510H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129jjxjua509mu3u7698t0h26phnqy8u5lnm0c5erp0dx8utlwy75c2", + "displayName": "Account 511", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9611807536542ead618fc5c8fd74ad796c70b949018752050c0b3afc9af80e6d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/511H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129540tdzpjjcfs682y5xh527ydzxvg86lrwtrn6pghpcp29m5ln7u7", + "displayName": "Account 512", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5446708892656e75bdbd0ea2d59cf8ab6101f1d8341104024b9146c706a51a0e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/512H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280pvu67yd6ya5gmu4lyw0qpjfd9hlhsgrcc4new4xvhdcnsnftamr", + "displayName": "Account 513", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ac62d58b0efe0ce79ab71300f428ca5cc9d7886249d3fc4263779c881cb11576" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/513H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xa86daj0crrsmtxff0ag8jhljqxhew5ujshg3k9jpn0e4j6gcdl3k", + "displayName": "Account 514", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2b5cb8cb29bec5d0c5b03ce1666abec24b9474bae426b46f7645154b93e052c9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/514H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295v8pdvvt6epm3fa8u47yjvegk7f82qd37sjvlt8k9ltsqvqz3jwu", + "displayName": "Account 515", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "48402df0dc9ffba1e4a6e0aab4e09885c2e9fe8d8235a8b5e75eebe6db7a3150" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/515H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z3tc8m2c4g966nhnwn96przna9dszudskatwucdf0jqhamswv7a6", + "displayName": "Account 516", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a9221516244b5c7352dd17ea39ec9c61b71953972964f98124c3307b8156e13a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/516H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12845t2p9juyg6w5486d36fmsp48tx9m3n0nf03lfryfmvweru4es36", + "displayName": "Account 517", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d10f862ed4b72d19b9eeea2d0286454f8fa7d7f600282176a5028098b391d187" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/517H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129xukmuqf8cz9ek47st8504ntr8sfx6xfjnshdj473z8snwgmpmer7", + "displayName": "Account 518", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d36369c2cc6502733339f01d1aa5f421d80349fdbb0f4ed237d9b10b49359a6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/518H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhx7zle2avr6ugmglf5s7dpl08t5f5q3sulgt2qgd62lx24n4trr6", + "displayName": "Account 519", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0e8e3a614988afec0412ec5d363f2abb958aaa317e95e9058d30dcf13273e230" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/519H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129sz9e3tmjkr0mcqypueyr7d5uh0t6dc8n55npvpy25x5e06jlj8n0", + "displayName": "Account 520", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e2920fde1d95497abd7a508591342baac54995baacb91b95cdc52d599e95360e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/520H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yudkscs7e8yys7qams37jytq86u25m0f9wvav8tr2g57et8zl9m36", + "displayName": "Account 521", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "24a6ae993718467e4aa61e21da7b86456826dc817bacb29a11c03b91ff023d1b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/521H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m00ef5x7tr8n3u4umywj2rwkv8a9dqe09n3t780ft23ugevsck76", + "displayName": "Account 522", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "347f91d5c97fa474d782caffa73cdda6689fafbfa26f2cbc80f75a220676114a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/522H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wzrhrnm5gg4k73gvemu7ccl4jc4h9hd7lltpr8uavx5tw5yks82q", + "displayName": "Account 523", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8c20064e938a768954be2a09ab7b8f97bd17228a3569e183897f0e7ce34d6570" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/523H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yn46w8rpmsdalw4l9k48sx30xapn4z6h464n7ze5x848fsqq2j8pf", + "displayName": "Account 524", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dccd09ac1ad49e0756441c870154f2947ab8d7c6348cf7bddf1e41dd3f6f295d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/524H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128yhqce5uxrsfjxvsmusn3q4g5ch3h4gzekysj925apxqj8atkgmkh", + "displayName": "Account 525", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d7447575f43ab7dc30ded0b3130d2cfac9b646047950e3e80e1f3ce6ed7f2523" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/525H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xm2xmp4kdajuecvls6jcl63fygj2hlef685yql6c9thff7u3auhvm", + "displayName": "Account 526", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "25e8d385b973b3729ce7083f940bc5a79d59adbc2dac21149bc1b3f773287b51" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/526H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yq7p3xvtq7cfy5f6z5yv0lf2kf9dv6fz45pw6tywa4525l39httul", + "displayName": "Account 527", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "43ecbe7db65b9c4a6e91229eb3f9685ff79ad641b7ff678ab75c83004995e815" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/527H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vqvf9zydk3dh4ls6xvdzp84ez5eg5jar0rdqz6x6n57502n5ku35", + "displayName": "Account 528", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "99786c8d5844ac73bce469dcfe592b4183edbabb294c2437eca2f16efea1da7c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/528H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yu25uze0wcep0y5g84zy0lekmn0vtq7kqj6k6d3206m5hvg8nyzgl", + "displayName": "Account 529", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c909cec1a53fbf42fd0b9dece9fa2d9b97783a14d524d2eeab18fc091b6952ee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/529H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yc40k99frx4t343e6qg4vz9na40mn5mtwucxxl5wegsltzqt0h2qh", + "displayName": "Account 530", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "35079ccdfb2f9aa5c1266a5d4e0eaa4e9debbca4bed8fb3e974e6ccbff8008bc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/530H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280tahvxzjcaur3ky9xmnqanqfrgsdtv2h46agsa7aapsrkyh5vw7x", + "displayName": "Account 531", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d1a31deb3e42817d3a4250c2f856622afb6c98ba905c728bae156530d017d58" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/531H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ye9f8uwvspyz29ekc0mv67uwkvlle9ewgx93wuk9wnjrvw6sg7j6v", + "displayName": "Account 532", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ca6f815e9045faa744a9b1cacf8bca91b6ac23405a05f9df89fb1eab52ed24b9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/532H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwnetdat8et4jclrky6y2ahz8prhk829669vv472alwcd0uazn4ej", + "displayName": "Account 533", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b8ba0be2c7c70703ff2b1c6f35578296279becdd216ab241a36876e516c493f5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/533H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289ssgrvtuvfqv3vsaevs5lfsx46h2p3qaluy77r2460843yf7mvx6", + "displayName": "Account 534", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d87b7b806bad4f49c738ea7228c556b3901598b21b7eebdd18252eede020948b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/534H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yv5s939zae0qgqvuvdkeg4kcdzkx6ja3mza6rn5xxdhusp7fvm09s", + "displayName": "Account 535", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b3f2a92181f295e007813853e5ff6547dcfb53b4e1a4fb1576da55d067bf7a64" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/535H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129stf7w8lwne4v466lzty78dgkd65n24smy9y89zhvx84aawzlhyad", + "displayName": "Account 536", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ecc5bbe4e42178c25e5ac94f03d1b333397c1b4128aff79c23c01633d349d581" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/536H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yswdlas3vzpqt32gcdn0j4lkx3wm6993xap6r0ds4mllta0j6waeq", + "displayName": "Account 537", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ce16ab3ae812bc49e926a802f5e23ad37a2281a65274fb1d413ea8ca33fbfe61" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/537H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zclv4kqjxjtz2uadqlzthw9ld4kns0zce8xfvh0seg3xyudu6l9n", + "displayName": "Account 538", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e3c4359727a3762c50ab7da23b3ca611d2116759d073765be8ab9c22bc5ffdf5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/538H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydy6cwkt6rct3p0xtce02h5kam2matjdf680e698zg4ndanfyy7p5", + "displayName": "Account 539", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d2d94752fbf0b91487c332b0dc2c45b63479b0c9382160ff61c2d8f1cbced5b1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/539H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128tmz8c5pwk2zyqda9x2xhmull3fca30t92hypj9q3dcf2697lms8j", + "displayName": "Account 540", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "44e37590561f6c430e3ec3645c6678faec12dfc75172c7827d74a4ee2ba8aa89" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/540H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128w2zunfwvx4x8psqs7vyc4a9zvpasv7urn5p9uxlykqp6p3gtvp6p", + "displayName": "Account 541", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3260fd3b67a6ce76942ccefb080b69d6e4f9eeb0ad93fcaad084e36093e7d968" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/541H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zw9ay8f8w7at04as6mggpzsm3q9clvayv7ygdd5g35q095dt5x77", + "displayName": "Account 542", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "87b9e01bd3723213503189cc00196820a55f50cb6a49dfbf9903a77dd751dd59" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/542H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yearz5tpqeu5ng3g85vewpeg9n254efluu7crmke65fyah3yfnjyt", + "displayName": "Account 543", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9549f224cb0d6dfab84cc71b722761c3c2f3888e64314c16a8de757b4485a730" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/543H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129n4jnecppusnxq4vk9mxkuxvgx9ehsvnf0c7y2a2gvjjqx0e0ej3u", + "displayName": "Account 544", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "70529c925a72f82b8f70d94d40711a074297812a58377cf3da3e2784364fc17b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/544H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129aapgdgenqjcp0wdpjm8kkagd854azgc8vx8gjg38xrey9l8xj8pw", + "displayName": "Account 545", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "60fd7ed66a8240822e3fac5f98b9f6b895e41b7318f4f784591a1cbb9d51f1a9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/545H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286qcp4hp2rnw8w83a6tfrs5jzpfsg4382tfhfh5rklza2tcgj7hul", + "displayName": "Account 546", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e24071cd85db22311aa6870fa72378b5a5b7409e8f41c4fb8177922d35632178" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/546H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295g9vfy2ph7krh0efzfvcxn38yfjah3j8zs67wql46edrupw4anx9", + "displayName": "Account 547", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7093a3db35b5255478a79cad7540e1a1eee29900f771b2c82bf3c1e47de30e3b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/547H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yye5afg0natcjq59lnqeddu4yflgqdclagh4g7z00egu77x9wyfdq", + "displayName": "Account 548", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a20e621daf551d53b44e58aded637d7842f8f2376f32d54964b922d7d55f1976" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/548H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ut46cquktvsuzh0z2ujd7uwyzqn6rfyuk5c8hfnqeucm0hfurhf4", + "displayName": "Account 549", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ef7e0c63fc3687c690e06e2223093186addc2b5fa7678f6ac1e9dc843e95ad13" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/549H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ac9ns009vdfsfe0xm6j279mka6uln5r7schrtxtu83afa8p6ql6z", + "displayName": "Account 550", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "94406e2b5cf9b4aefb34dd66dff657d582522a5e80ab9bd649a60581a890c6de" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/550H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y429s3vqw62y9lz4mt8nhfvfpjf78zqlnhnk3p5ct6ev9cqp6ptpj", + "displayName": "Account 551", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1cd9715928e3b084aa8b4c4c5264e2fa248ef7dd818f5a7d401c67068467ea28" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/551H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12948gxghg49gudsa3zw9dvl774v58jzlmjjccgpjyxx0g27p700urf", + "displayName": "Account 552", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "40abe074db982f7e0eb64eea65f9a83454e735898f7ace3c572af1d38972d74e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/552H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x05fgm0j0yccvxugj48jps9gt5gajevxe7qeqat8d9mpnp4j0dawh", + "displayName": "Account 553", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dc55f6e2014f4e247040cebfc762c436fa85167354e40b1e298355a3f902e83e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/553H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uz3xzxlykqg88srmxsh8ay9mt9d46lxhwa0npswazj9lzspl60zw", + "displayName": "Account 554", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "878b3bdff7a7a68e0abdd15da7c70ba2fbd4747e3c08f3a2dca259473d26393a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/554H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129y5png4nzfu4y4c0x0z7qlm5pxzsyrtferlzw9d5umwrykw5ytvfn", + "displayName": "Account 555", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b016e5c5693183fa6e773b7f95f0be2e53a5add4987613f05f1c43756d1c3208" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/555H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dmw3pswj9twcn2ptup3d3p6y4lz68m7ff8f49nszxx60vj3ymxkw", + "displayName": "Account 556", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2fa7174b682598c9fecc474befb64354f26a7d6bfb1f0030101093b8b40f6541" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/556H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286ddua7kqfrkg05ruzxvu3jnxcgwp0szcwh82qqcre3sn9ujxeuyl", + "displayName": "Account 557", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9cb083d10888bd21c4a44139eee4b2598cf3fd55b1b040aa2d0a86661c0aa07d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/557H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjaa4rmsmn4j0fzvsk72rs4qf5433p8mk3ky7dqpqfew4a8rl7p94", + "displayName": "Account 558", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5b98f2d8b4976fe99f2a3c896bad0b16964a6299485a6ad17fb4ed788d09c9e3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/558H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292q8klxxa4lgch43cl8yhy80h9ne7r7em6mq2sl3vtwv3lzgcs8s6", + "displayName": "Account 559", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a36393ee98a1d613dcd3a9f90e679e918069318ec2c6bb9df59e00818b2e7f26" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/559H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpmwl47lmeaz53dz3u2hh5j2s9rpufkcmllrzms3mvlylpvv0y0ny", + "displayName": "Account 560", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3089b7a289dfe02e5933a3d8a0c4efde4219c96b4dd7935604fd2f4110b95b79" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/560H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284eq7r335lfhm6t26l2l7m6da3xs6799tk3kec4crqqgvvn54qha5", + "displayName": "Account 561", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bed31c0ce88218a125f12351991f1541d185b8547f9b0c74f95da57efff6098c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/561H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128j4hfcjc7rmqqmegyd45u0qd68ud44728zgqxauxzrsfdlxc4522e", + "displayName": "Account 562", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d836f408a598a5741d38652da7b839aef5d7b0d3e7cfb78d8159c0ae327d1a14" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/562H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128cjy8xvzsvw2y8m4fqrtc2seetp7v244mt8p03ssvhv2pv93scse6", + "displayName": "Account 563", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7c527fdef2b4f11b976b5c52648c448b8effd1e01def2974ca18c71f8a6ccede" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/563H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129c0ga5ugt0aq4tfu9262dz48fnt6a68su93msv2xyyuegp4zyzeyn", + "displayName": "Account 564", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "627d33db1c77cf4e923e5680849aaf37807d92ef1edeb375f565e7f6e9d44cea" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/564H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xp5xeqcuev723ad746g6m325vg0r7yudez296cfafj6ndcp4yszny", + "displayName": "Account 565", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dfe33b21fc97bc363fcdfbcd42f5e7c7a1900ddcd6225e6aff868143edac7ea3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/565H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128z3kux4r5sjtmelstszahvtv2zvhjcm5jp8kqqj8g7v3w9t79cc58", + "displayName": "Account 566", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "16639683e6342d501510a054c0215f9fc3d4a7fe81c83284bffc3ea73d41e5e6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/566H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yasqslcrql04cp7ncnqpumapnq2chcff2l6k0s7qlz4ysfh39mgpk", + "displayName": "Account 567", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "96355f6d9b90039c2b8648b13de853b309f121179f8f427a70025dbcf5bdc08c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/567H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nmj8d24a4jujkcwpaavu3q3j6fsw99nahcc9rwc03zwyn3fs2h63", + "displayName": "Account 568", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e845c38808c5883d02c646e110331211a8259a067d1ad772e9d5068f41e6724" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/568H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128463yhsa8v2f9wrfukkexe9cnqvs68pga4avtfevch2l5d060gkvq", + "displayName": "Account 569", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3d8e859e1f3b566e3c57d1efe469281583a48e19ea936dc2842c1c2c79cf7fab" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/569H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yw572lly4qsjk4unhza8f05c76lh2fyqplhjezyukhkmtzlxttfaj", + "displayName": "Account 570", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2a1d0afe613e795c0a78077b68b922d70cdf0172ddc58d34db080f02e9076dc7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/570H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289z8p6q4j7fsyftqdsvz367ufx69qmhtjcccawh4k8rapps0upqq3", + "displayName": "Account 571", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2605ee1d71041e5576ae82e1ab5c5e7688c9cbb18f8dbc550d1546d3352c32eb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/571H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12854n9ecaey0u2rt82eer8q07aashh7w9c703far6d2ak00udy6l4s", + "displayName": "Account 572", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0e2e02a9b6ed10017df6c9e2f7cdd49e633a19d32f4c3cfc5a628b93b81db6b4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/572H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tu0eqv4v9gwjtam2wvss8fj38hzqpyarefz8vnm6ae7j42qee9s3", + "displayName": "Account 573", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4b5704d371e8693d9e4352647a8df357d140c8839bc428fb3533f95df1aec97e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/573H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9hwpewyvmu8rwd7rcnr526a3z7k4wxg4z9dyzmjewxfvcnv9rr2k", + "displayName": "Account 574", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f79f924a36c69434499399b1b37a14cdd1e1708fcbcd5d031b26b98b479da06b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/574H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zpcsjvtm309x7w86aaukecwrpvx6hgdgvat3wuh60zekauuc03uh", + "displayName": "Account 575", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2d03d04a9b89a59996cdf9a9b6e7147b9b1c3024c2d7b2b538e776c1eb7c86ed" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/575H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xafh0zd5fkjthza9trzk07qwywm8xughjzs3yrxv9nc7xj2fuz7df", + "displayName": "Account 576", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a5135daefce519ef1ef7247e5de06121ab0e4122c71a31b8240e32fe24f2f8d9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/576H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nt4ukftws52rec530yluzjmnz62mw7yuhgl0dg0vagch3vwgrpcq", + "displayName": "Account 577", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a59729855deadb124e3e8db4ad813544d143483022d100704f6426b2cec89f7f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/577H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpsurjk0eem4rvyp9unkjw68u42sf8q5s5m9tcqkfm7jma25kydx5", + "displayName": "Account 578", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ede63db65c6e61cd1a234dfc01e49a9f0a7cf1a51b860426ce96063b875f8d25" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/578H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qswp3jq7lzz29tac5pdzckhr8sutt3j9rpa4gtar8jsdyzmgdpv2", + "displayName": "Account 579", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "392c97dc510743eb4f25a7d5d0a8c8461f7f69a468aacd3fb45be85399a190f1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/579H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3x7yds5xd6xd883eqxq0q842f5699fx7nxu764dzflu7lwcqs0wp", + "displayName": "Account 580", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "07f2e95fd3da84b4f18c74edeff43bd3713862b7120811ebeab7f87b8c6f44f2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/580H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vzya45hlgkrk2r9lpxtlq4kjkyw66qgc2r0z2md6kkskl92hd0rq", + "displayName": "Account 581", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1182c666a0d9ae3ac06ece6ae7a3ffca955c3efdd0735e2352c6e626c3625aae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/581H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xka592yvmux7ad96nu3t05mdyyd55fec3lwxxmzcqy4mvhsvqzzax", + "displayName": "Account 582", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "572696e433e4a28389fb6b4b2b0d2638ef850c593ccf8e2620dac972c06cba6e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/582H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn4xad3yuvn0kfflm7h6k9guen6yugvkf5kh3q98rl72r7x2m6l0k", + "displayName": "Account 583", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e9c445789ca8b0f41e69c7d07848234725544f723118eea3b3b0478f61913d09" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/583H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129t8mdh7nfs4zw2vl90lg994sazlfaustu8mrynvp3wut8j76dkzvf", + "displayName": "Account 584", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fc9bfaf1b45e317704ef63c3ad56575e203f7bdc8277fc513e0e515013d6d2e3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/584H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3ywcfj32mdu6lpupjqvsslj9ptc94rh2lpgdgt7c3yfkjtgksxhc", + "displayName": "Account 585", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eb61511b56f67691d8f96f1e0038b97819036159b9709e0639c74ce979255fde" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/585H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yrl3jvc9uddslhfmk6dwma9mkmtml733faumk6rg9xuvpa67lde2n", + "displayName": "Account 586", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "949e867efb7620cb71c1e08eb46b0211c4b3349c811ec16309ccff34e2fec8bd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/586H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128npyr59vh4r44rwq4smu4zrd9ygyu73q8hrkd55lnsq4pp8yp3xqd", + "displayName": "Account 587", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a48d4bb332e819cf77cac07b80c1a0c555308a7dde6ea18ccc7a05af612e7b66" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/587H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129etdzh4fua0zclr7dkjjhaaqnvaspaj78radvlnuhygwnmaxlzhm6", + "displayName": "Account 588", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7549d3102e5d26a00387491ad7d70b5c189b4a608df83893b6f3cc9d2078c1dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/588H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12999pxgh0e8enmhegu4kplevqs37xwdr888gnkyy6q02vqyn96n24u", + "displayName": "Account 589", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "01986230d82950bf67cde2a285b985cc36b4bc42879a32d35363290490e9a28a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/589H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129genzeu2tegyfh6xwute24kkrwwx50lt6z9u7haqczdhn5z5ypl8x", + "displayName": "Account 590", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2b48cd80ed404e955bfc702ba74f06813e42f5f61de5695ee649630e68218965" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/590H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294hmk3rla6uyag9m58kvwjs6y2a3gguhwk8cfg3d8yl8cxkzgs0uz", + "displayName": "Account 591", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ab0eff4ab20ff46c7b33e704d7fff024f20cbb459f5737044c522bf139510902" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/591H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129eccqns5r6q47v4k77jntwm945ez56037qa4m72x6gnyn2pm7lfgk", + "displayName": "Account 592", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6ccc53aaadc14bba4cc85d8b7b86b9ec0fe1ca223336a8c118a82a06d204b538" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/592H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xm5q3t0gzq9hr4wpmn35kskdvzsk5ewuhp7y8hkfnak0nj9xl4cyf", + "displayName": "Account 593", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "453f5d42a8dfca16d9449c23c1185d80cad5796c50a7e1931d0bcc3a2c71576f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/593H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xs0pqd3ndn2vy4dw9eaacmgsa3t78umy7l6ufgwzl0da4ar9g89pa", + "displayName": "Account 594", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e890d91cf34eed7893dacefa5d60644a378f14f26e9403dcebcb5e3129e0fb40" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/594H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129npqz3ua09h6ajhmrvk0sjrqfxzjmjlws9vpn4wxd4c3jslwdq002", + "displayName": "Account 595", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ef5c76a546f933854fa5fca5fcfcfef2bdd74667589d1fe54933f6280cbb8ccd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/595H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128tvv345n32r5gszx5ytfntknta8e2ejwatf0pd9pp6rw7v8c6zulv", + "displayName": "Account 596", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b8f64fa1e28869b8c1f736f43502fd746580e9fe9f7adabfe68414378867840f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/596H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296stpfrhd6ysm02cdasd08q00jk99p29vylr7n5pfe8k939jav0sx", + "displayName": "Account 597", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eafe9fd2c8dc60cb85614757c3e1e98742b8be0a21401c4ef5dcee950b065a15" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/597H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xtendvhywflz27wmvj6qexd99y34xywfmqqtetugd5yafj9gr8wxj", + "displayName": "Account 598", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "255f526cc5d29b4c689880e1ee5da47a12b5c429093560cb4bc8e3ccc7ea070d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/598H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128f7j7dwuakrwunkpj74v3ak5sx6m7hlktxqcqeptmuh07y4v6r9cj", + "displayName": "Account 599", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8c1a988e1f386d330157d6f1c767f5dedc4c86dd9024e0a6b77d9c895b59d310" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/599H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ykfarl9trdwcg3tcrrxvq046ap87tmntu265h3zvp2p9xt0y2swvc", + "displayName": "Account 600", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "061ba400bad3c2a7ee6c1fc749d64d4e1e03547eca4b9dfa2e44e45c66bc3e09" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/600H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdt3khkyd9ps3gtmh2x0qz69mwx95kdkg8z8j3ydfl72yrzqafdch", + "displayName": "Account 601", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cefe7735717392cea9f7d7bfc90a08a3845bb2855b6adc93b6cd666c7a7f15b8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/601H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129jj2jg3wegk96yms88nyr7ps9c0623fgew07kfadtam7pcul5f8cl", + "displayName": "Account 602", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "60d55f91c34c7f6f08cdbedcfc9cd81bfbe913d894dee0386a64242796c49406" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/602H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywdfz860dfxvskdfcwwk5e2lvjjqhwfms4qv8l9nv8dq6aqz4vlt0", + "displayName": "Account 603", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ea845fc7817476b17f2a7d3c2250952801cb499cc03229c79e609a29bbc7dc5b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/603H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m0whctfdavxcklxres4z200ghvxykfprdvdhk9pnm4qg6jkp2n98", + "displayName": "Account 604", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7c1cf9f708c4b73286b9ded1ce9f1e2768aaab4270c9cf8a0ad3d10abbb363ca" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/604H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn7j9y2azu48rsph54cu07w38c7rrc8p5qc9msdpuzgp2u0snrde9", + "displayName": "Account 605", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ee31515383072a722ffcd2fb05796cd2f856a2bdc55a7b9371e0a461cbca64ac" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/605H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128f9rn3505jr83p77wlsrp9hqdt8x874nczs6f4vl297779rnq49zf", + "displayName": "Account 606", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dc9bfb8fe0345df1a7e54fcb8ba325556a6a6c4d6c9b4997adc91d15ac094064" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/606H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ela530t69pz23lk69cl6gkgkwanumsd6w9frs8l0n6yf3ec8gudt", + "displayName": "Account 607", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6762ceacba32e453477b5d5b2f9f6a85a8c91a811a54b13cc1cb1fa3315404b0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/607H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yj7dls3ssqmwklm83jsxn63hlgr4qsx0ew53v0je93m9p4746wvm9", + "displayName": "Account 608", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4fd33e1bfed5ab87777f0615d47c855fee03a9d8b15a863d589a8d4d3ddcfff8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/608H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygg7y4kmsl6u8676hwf9uarn23m9vezw8lqq899lu6jvxjcxf2f9x", + "displayName": "Account 609", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fe9367dc700f8aecd2d63acc7bfa3b63827831a4c6eda7a4877ce8f7b2878919" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/609H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128umrv2vhzxq4twpgze2eqjm3g3ul6tsg72hz82akgmpvefk3hvwu3", + "displayName": "Account 610", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e6d3a2ac9ab4512c1f08d910d3e3e58bc642174e4d7600ed896c57a09c0dd55" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/610H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3zeq09a0zd5u4mdrtklaglkme6054m2dk8l033mqelz57vc0vyry", + "displayName": "Account 611", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7a2cf8937315ffda30183c41623530c18994872a87b86d12148472ce8841550c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/611H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y680nxfjennmurn7yupprhndwx963zu6da896ksk2tm4c8hgkxgnq", + "displayName": "Account 612", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d270f1545a6f93b1315600af0370ad0fd43d17ffb2cbd480a4bcb4693b1bbb1e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/612H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xrvc8t4ca44glkr9gvedzhfj4rp4e9uzg7rpaeap5w8ctc4tlut24", + "displayName": "Account 613", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0e517be3bf12416e38491810b7bfdb3cc28f1921cedfc296e13751c5f5ce4014" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/613H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yhx88geup2dg2xvlk5qtccm8r5ae4y0tk6rwgcc9yk3v5xuj9d9d8", + "displayName": "Account 614", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2bea58ccb950857f748765702cb32baf311260c1eb0e3571ed6c556cde245a7e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/614H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywxe880n9gpryefkpjlv3m60pdnxgjrmvght6p3p7fqacte5c60gt", + "displayName": "Account 615", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0cb9ebcdf46f84ada298eedf9722e2e0f0c5e856b383d7c4d5db1644068b8253" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/615H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymx4jszl7w7fuwtv882tdu3xg9he7f6nlqnzgugllc4gvypsr4ufj", + "displayName": "Account 616", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5b420fdff355c3a251ac79df6374187eb7d51e6390b9b4392851d1fc272c01cd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/616H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xs2uu5wn27fmulx6efzy2c40fh7pp0z7q43xt6avjqp8fskc44pq5", + "displayName": "Account 617", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "51f41117b1596e7d3f0c673315302cca97d0e3d7421b97792e36970937da448f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/617H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129hvdjf3utv3spy6a9pmndrw0zj6rfmkwyl4uvw9zgu748u59fg02r", + "displayName": "Account 618", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5f00fe65bc812b52363e6ecdfab089292bc5f1919a0278985c7f593a57d94db4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/618H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zr20w0ehlpfycqyrmsxuc9xgmla6dddkcpj0zujf73uxq0ej5a5z", + "displayName": "Account 619", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "59018feda6d295faa4b6d3650f88ed69bcbd3f4cc0ab3b7d78c4dd79cf01a5d5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/619H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yp5ca08qshq5xxf8txvvntezkshn8jmz8sll22cmcmhc5fxhwuymk", + "displayName": "Account 620", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "156cd83034ea04f016b3231b0c132947d94843f4a4bc1c36a1c73d6e3dfc7e80" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/620H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129aqn4slx8az60c962xtg46426krfavdwkgh0yyfjz7mjmr7us32w2", + "displayName": "Account 621", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fa1a00404f3eda7cf4b6c31d3b2180dd9d0b5eadde154f617c6ba681f62a9304" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/621H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294ll0rlvar6gy4mk34rhlpnr56vn20a4e3lntt0ffjk0yj6rv5y89", + "displayName": "Account 622", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3d3b0456640be373142cb17b0a70a61656b288d00f2c366f8fc534f10ab5feb5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/622H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1287tj2gheqht2zsfp96wksuvl7sdjky2x74q078w7dxc6wlup88l6d", + "displayName": "Account 623", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1f3a7a35d27914257524791a3906b33be93d80501270e0249f12c4aa65a40a1c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/623H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7sgh4jmxmcqll9uw4n5sqvd3zw8pwq8922c97sru5ute2ujnsf07", + "displayName": "Account 624", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "63bf90ba7ef43907f999b66220b17c17d18ad40c2b51a8350154e8429f182304" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/624H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1296lfy09wa44k5jnmhe5c0rezs37qse334wjpk7n89274d3zuaym80", + "displayName": "Account 625", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d67d4e2d883f0ac748514f81269782c832c4ebc400fa8f165bc13b22d3820089" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/625H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2fh5l4sr6h6djx7s2v9d2lgxtkuxuaenccrmamfjhwmwud8sutsh", + "displayName": "Account 626", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a4ff70db3372438bf451f26dd27f9a4b9ee87ce55cf77aa7b20c74791515d44d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/626H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xe7m854c4w3ru2ee497ycm5cdx2lvjcq6y2syvludanlmsz6v5423", + "displayName": "Account 627", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e6d263be799ded119e977a5ad217b60d79b1f693663a5d29f8b2d6bab740c3a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/627H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xq64qzdnjss3c5laerycpvpa0rlpz23ddcnkl5uzv9f384gmm5y27", + "displayName": "Account 628", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "356ad0f913a305bcf3599ddcfa11169c271b4f3f7d96ce6697dd843dc8316545" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/628H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129t46q0tnlv0v6ngh65ygqz5789zemx60a7n26mj00gk0exf7np64m", + "displayName": "Account 629", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ea65e4b4de43e187b0c39be5b07e473fc6ac03d7e8ce4ff2f6468ea4cc4c83f0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/629H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zu7sedgcvycrqr8tlnge7cgwa2azxmmeqmztt0chvtur4kv0skmj", + "displayName": "Account 630", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "afb12b654081cc7e20483042f9def6261385141b477e319fdb5afaa4e9b04f79" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/630H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129jpjfsrcglt6juhv4mcntqn44dm8xznsax3cmz68dwfl548nsz7v7", + "displayName": "Account 631", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8ca460794f02bcfec7e2d2c2ce56e384c4c5a8aca91868959f32fb203ef6a75d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/631H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4q9v3zwv3z3peytx2z2w3vqwfhu5c46qh69mn6puh4ml79hq9te7", + "displayName": "Account 632", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dc8f43ef776924fc83dd742c206641118820169b18a98d291c7473c85e34677c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/632H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ttudlmcvgp26vau8l9eqf4tpky5ydz7wuurtvpeqhw8qjvq7u6fs", + "displayName": "Account 633", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4296cf82cacdf99a481745ba6cc87f2030aaff12a3231e71330d26e173a2d249" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/633H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydgz4f4lktd2d3eee6euxs7xasgk069ctat7auur266wsx5c7v7h6", + "displayName": "Account 634", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3a2b017b25f29d14a681e5dd3df516448bf792ed6963106452d4925f33ca91f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/634H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ykpzvp67ejn49xe45xqxqfx5d2jhrcs6v8lmwdmr3376fmjv5pg7u", + "displayName": "Account 635", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "91911a96f91747b4df1e4316a2284055c9d4bed373f270a7ec253f1e65c86c00" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/635H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yp9fk5h53yr658225062aeaupu6hn00yc5zv90r70eevtlezyu5ad", + "displayName": "Account 636", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "896f9894fc4085911f9567e6039a3ef17711c35184ea09514ef6c89a510a0a35" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/636H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128f9cdxt8k5cytlu9esu2zmxa2vnc52xfrrgywc4ljln4huzpj6a5u", + "displayName": "Account 637", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "41369bb70872ef3ddc6d042c6e0051798411022bd98b38e982841727a58300cd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/637H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kcsaknhrdj2j7s3d8c0n7n3f4jhx3af0yr4p0q6pcrv23f9v7h27", + "displayName": "Account 638", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0d8981f966e179f42220aa2a345b4d07b79d891bac38f4f02d5eef68ebae501" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/638H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yr94llufhmc742n3y03a3k5h9wpnvg77wr8e6sh29lclupgap203q", + "displayName": "Account 639", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4ff5dbde8a577f0c814626104667c08d2fcdc629b13e204bc6e9bffb9f58c134" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/639H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xk43rs65tqgt47ltmu59gnsapp86pwhyew54mtf2c4r7ep845eglt", + "displayName": "Account 640", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1360a4941c52372fdeff829159d64b0eb6b8e76866d62c3a5e8929b189b05ed8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/640H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294y5e6laguq5tyw2xav4a8fn5jng69qt2seu3kf24g2kel40axm7e", + "displayName": "Account 641", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3d6d53ceeb2b0af32e118713b247bbe5277836f3f3b03a5fb60c57cd4a715d41" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/641H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ccztqjg0tk3rlpx8l8kmchhy9hpplcg4cmzdetq3fj2tr027dfxv", + "displayName": "Account 642", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "86312b58df034a96ebed68a4e739c4d0ac1021a299c05cc1412dd4c99c5f556f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/642H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128e03ufs5j8tzs0pyns0k00depxshm5ga0k7xcymcw3p75m940rycl", + "displayName": "Account 643", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6ea5269f82ae35a5b79d644550daf7203d0d289cd22a8fd6d0dc5a4ca1168fb0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/643H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fllefnjj6hgstr8zsnp9rw0u0h35ukl82jhk39yrw2gjh995sdav", + "displayName": "Account 644", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9a9ae4e3b9a77fe9140681816d20aa477b7cf01e662bb5bb334137e69f5c79f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/644H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128eu5gf9y6gc0arfqfyp3m7jkf46zppzt6qajckcxtaqajg8z5t206", + "displayName": "Account 645", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "167dd3a2a4923cd1ccd356396020d8f4d41fc127e43187a3daa2b1456cd47b87" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/645H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yl69dpqgz0lkn9vfddwl7vgwy50a79k9cut7r6zwy9dudyzz0l5nj", + "displayName": "Account 646", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8232e663ed0d8f2da80eaeaab6cb21286dd3cf38247a1cf6295424da2e864093" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/646H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x5xlacwzj8h6uy9nvvm4xap5shs4jr5kf925c6wsf7s0ktm0j4tyf", + "displayName": "Account 647", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "519f432afb7e23eab9d0a7a8525d0aa820b0a943f8243fe41be56034dfe55207" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/647H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xxcjpsg5htk5987g9xvh90cq2jru75y4rc8c6ccw7x8tqpkrzcuhq", + "displayName": "Account 648", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "348b037d77e2c345ae73cf59bea08eed2c6edd324346f818d81fa5e111ad446f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/648H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xyxmg7xyyneqlus8e8uh4e9asta47lpd44c0le57z529yv3tkgg2v", + "displayName": "Account 649", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c4f9766043c22a01c200d9b9c36c3023811877cefc5877372b52758d8f3597e1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/649H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xna6dvw9kmg5lhfqa9efxmv48y6zhzyrgpz8mjfpjd6ejzsaruz5p", + "displayName": "Account 650", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e58f6b5759afeea757095b4bb270a768917afc162f4e32cac8b0207cf56e5753" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/650H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xz3j88yl5q84numwfhevh0cgg2wvgg4fkpqdwn8gzxggu0vap8lq7", + "displayName": "Account 651", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3078e32f9c65153e96da11a163f160bf4e63a6b3210fcfabb163d2acd717c4de" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/651H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xp0hcvx4kjvjazdg8clxfuq8srvga3h4sp84eeljfey29fpjpt32u", + "displayName": "Account 652", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "04645df86f55f0f45bc359770d7992814106e80f4f66e271c8dd4271850112aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/652H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xd7uv33jcl6xutyfn7jk29nj2z9jkzh6tgadz8n9a28wqyty02p4a", + "displayName": "Account 653", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8ec32e3ed102696fdb7a84215bd165dca0c6f2c2c8dc7513ff7fef20becca711" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/653H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x665naevlu9plmf786ww8cuaxpu0tw64s5zwtc3u0qxehym93d40d", + "displayName": "Account 654", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e353cbdb2d24e3e40a0a4818ba2f9d2871ea488849cc318d48990eee03f67e89" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/654H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x6zn8n87vu60ng54je2a00nd0y3m9e4aj9970nky478lwcstgdv0w", + "displayName": "Account 655", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f561530831ce44f157388b975b92434ae346c3cb32a3f1a52e891dc0ea785e77" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/655H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4xw7lhy4s8evwlf0euhys20htxqnzp9qesnsf3pa5eqqq8jfgdhy", + "displayName": "Account 656", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ca2b1dec8489d8dc926c36f28842611e916b4bebac26a62f89d11455f73160da" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/656H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3f2ppt0acujeefrunxdy6h0k0x32sjenqfwah4s6x2fs6hq9l9rs", + "displayName": "Account 657", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "53a5cdb77732cd8df462cfa9cc615d4ec0e9d0d76838c4cdd420e6e9d6526dca" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/657H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12833plaqmrwwzzd7gd8j2h6a6dct403x6hkq0cgw48u7thqeuym0vm", + "displayName": "Account 658", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eed565110304606b7b358cf449c633a41565d763045296cfcd85b9eae8075fea" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/658H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xt8cnklthy3qt449nawshg9hjy3237s9rz5euzewg7gnvek93vld7", + "displayName": "Account 659", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ae7041ac4b0a567e2e447a9d182845c55596cb10b0fd605c27ad792a095643a2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/659H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4md4nq9gf5lucdtmj03pvs3m770xk8hzgr5jrwmdqa0480v75pgd", + "displayName": "Account 660", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1366aec035a5597230d5813628d407480b8c3712c7e24d53d7025dd0069b8e3f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/660H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y82j2r07286xmks75ejrsyfpkqmk4t9cf4aymfaf3c87nvsh96lg8", + "displayName": "Account 661", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c76ec9d81325d52350c7b7cdb39569358e7108d6cec65f0019105f0d70aa9be2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/661H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xap9p9l889e2z5n5fmw389gs00apdncy2zgmm4x87ge5yhlq84dxa", + "displayName": "Account 662", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f6f761ae822034efc017fd7b09d313fa314f6984755f2647604f51277b688a0a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/662H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhk5fc9x289ys7el9j2zlkfmrjl350p0s39fjp9qx2n5vhvh8x7xv", + "displayName": "Account 663", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "85ff1ce31dae51e8d314bc0dfd775ec64f334c7507af9a8b203efbf100da37af" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/663H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128l8c4vwrl3jxdufw55dneyn22ea47cturw9pyzsmrlazzgek4rx22", + "displayName": "Account 664", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "df128a7c9ea1894b2626051ab606a8ee7b46c9751ff4e64d9a6e8d44261eea0a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/664H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129d85av6k0pc6ufwum52frpdj38gpgqezjpzxyc7z3p5fy7j7lek2r", + "displayName": "Account 665", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7c430a295dc79f216687a0235a14de2460046886c79ceb41ad31a0a752afb088" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/665H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128p2gdq7qgldvgwm05z8m9p8ukf2u3pzkwyc58p4mzjcm0mt6mngw8", + "displayName": "Account 666", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a6b5afddc069a65f7092aa64ff73c9914ebe8ea07bc66e27eabda2c79c929ce2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/666H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjgvw0s7fe8fkqnmrcnj6dl5xetptal8wmlu4u7tjs987gtn0p46a", + "displayName": "Account 667", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "95c7472f12005556475bd7f783512ec3c3727c0c13f41d7ddbae7c6a9da83e17" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/667H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xp5xkqf6v9xr6t9lmhxgmtfd4eymnjem9frma2z506lervj6zesex", + "displayName": "Account 668", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a1d0b87beb0b2831ad766d4e992f8caebcb528a45f4f45f5fe7d62297bae3c8d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/668H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0c0pt0yxccueu0ay7788varkzqlpwnyj9re96l73q68e70g2v6vd", + "displayName": "Account 669", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3991fb7efa621b1352ee47c140c4b75fd35ced009be1e0b0607ce4c3b7a0090b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/669H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12846z4km3ny8hr7r3dl8wnj56f4ar8jv9r6datpdfxjgkv7sa654un", + "displayName": "Account 670", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "17f841d75d719aeb2927c1b6b5a18536f2c26b5622a9ba9a81116bc1cbdfe37e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/670H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yv0qsykny2kr3v0kgnzt8lr0q9l7qf3a22sfmrwgmz6yhv7ndj0lz", + "displayName": "Account 671", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "80f1d998dcc4be3f3b66d5e97140170b3d1a7c9670f5bd0cc2dc7e2c35f31df2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/671H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uvepa3km4q99q4snud9an6ymt4nvevefr0yac2clu794mzjpsqe7", + "displayName": "Account 672", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "313a7e84b996963ce80b1cbe571ebba1be055c22c7be2653ba4db23a4461158a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/672H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1282pv543eh3lj6tteneaslhwvh56ht4t8qmp9scxc6436ccdx343h0", + "displayName": "Account 673", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3505fa181f34b084260ea73eb484ecb16d57c15fc1f8eeae4a86238c803f4ea3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/673H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9uwz5zjs0sxxren3ukwa24dk852euh2ky3pu4v8s40jushc4kpkk", + "displayName": "Account 674", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "13f3356cd18804d719c27a29d3d978d3f28b9fd7e444582f302d83bff9f5a7f0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/674H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128xl9sajvazk44g0pww58ghche6q9xfjgxnd5wzv3lv2dgwqt4xq2e", + "displayName": "Account 675", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0dc34ca8527326d906eb8a4165692844da00078c4e492adee9829a7e60455289" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/675H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yd7gluunxqlrshzavxtvx5wcyasf5ascp0tha86fmmkgn2dph7h4k", + "displayName": "Account 676", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "21be10c2fc8b6a3a0df2ca3876bd5382cce6c90f577f88907cb3f1064f79d0d9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/676H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129287r3dphhccajrp7fkm7eu36vp67am762k96qh24v359fuxqkpyw", + "displayName": "Account 677", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f2bbb769654691c230f6241ba931228b568d608bb49875cc752d86201c9de85e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/677H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1297ywujmxrmwh3xtd3e8qdagut5wzj4rxz0x7gl0sggr0mnpv2dskh", + "displayName": "Account 678", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6102271d9058d35530e30bda8fa1248781041de49e3186e4a8f427ae6f1ecde8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/678H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xk80q3pjcw4ez2hj850tgrhsjpch4y0gc2a7qk6apkj4ct9ndl975", + "displayName": "Account 679", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eae3359bfde7286e64f658979ae325cd8a9049357a5883639394e7fa83d1a915" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/679H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xkrzxy7c34qy82t7flsynazyg685unyfdm00ztt4ye625v94ksef4", + "displayName": "Account 680", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f9a34bd7276c45f714b0d6f25fffbad2c2750e4d67d7fcba409df8145292a13e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/680H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjxulzttta8l7k30sxqt565ahvfc55gxedy4rz264kzf98xtncjcc", + "displayName": "Account 681", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7999a23ccfe8cd73fd48c7ae034a6bdfb951d435dd15fcfb78736eeae7eb1867" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/681H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129d9l0nvj560farl9c60uaul9gnsmgkpnz2q9k5h474lssth2ftwrk", + "displayName": "Account 682", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8ec67154b163eea5a542cc4ef7bf1f019957566222b6a57f913f5a14e38f0fe0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/682H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294yy6ww7d4vfxlp8pvf47c3nn5fdy43sgvdu6nmra22skdq6ay2mp", + "displayName": "Account 683", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f0c481bd6475d3b2ee31c4cc9b11140ad63c9466fb9b184d72ca8b1ebaac2069" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/683H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128eqvncvdeuuz5lrlkvpghdjs5q6m056ctlgmrlvj3xpxer6s3dwwu", + "displayName": "Account 684", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "64ad77f1aa139b25cf869f5d92ff3f29f51dc56855d8667e57b5efb7b9917099" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/684H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygwexpts0j6jt2zey3647suya37svzhy6f6w536apt60y8lzv0qcu", + "displayName": "Account 685", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c610f69773fd409801e64295f6e0c83ac1bbda04e196bf99a4f16009d0af8add" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/685H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128h0ejrw3jyjahn9wpgwd8aqltzt9x990jj6nz0tlrv7fef2rvzmwj", + "displayName": "Account 686", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6fdc09cbbdba442e78d0268b4d7e05a3eeccf4d20dcbe569ac619f3282564a43" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/686H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zguvw53ruj7w0469228m4cy2k99k5rch5jpzfq4a5vedp645x85p", + "displayName": "Account 687", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7885a9c1f296b813065f050c1e797965de05403d4f8f1a967e5c98245e31de5c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/687H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ywwtzp2xffqlwsqxljn9dq8ppk4c66gwe53pxsr7pe0n256nqx4w3", + "displayName": "Account 688", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "026d6972f847604fe605171757dcdd10d492d01947e14d8930a2aafe2ce023e5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/688H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1288f25sjpg5tn6wq5svkth7cjtn8j9gq96r2ztclz9ff05n6a0szqe", + "displayName": "Account 689", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "04189fe11f55f176ecf1923feac454566f893831b86c3302968eeff1b204219b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/689H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129uk2clfmegqcn5l3s2k2zr63sfqwz4qggyf2yv9ce7w20mmt2rdyz", + "displayName": "Account 690", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b92c689141e7d552769e1dcd048aade0ab65b520f8d2ba5195a8fcef4f01df6f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/690H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pfg4sdklzcs9wdwhrtzljpcm7zn0pa5ujq05kqsf5fc6nuze4y7m", + "displayName": "Account 691", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "87529dd5bb40ed824d5fa28ca386c15396f46f402480b0c48cf7c312c4198e4e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/691H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4fmrp90rwffjapynnvdr383007ljk6xmgtz4mh98276p98hnaxcd", + "displayName": "Account 692", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fe1cdba16c460d78acf77c18372346361ff9a082fafa6fffe42332f9387a9da9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/692H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3zlt4tn4c9cgj4dar9yl5a9zdzvmy8nk7upa4fgs44r9cvgqdm9f", + "displayName": "Account 693", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a7d5370c3a05f6b9244b6301a360c0ad90b00ba103b44203c8ce44401a0d0439" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/693H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xmqsexh87v0lnja0w8zh2jtpnn4vw628l4h5qjwjqermkc4p9qa9j", + "displayName": "Account 694", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5709ea55a78f74cf95e471765ec6241baa0de406ced0f2d78035724ac85afff8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/694H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ek5k7hy8chewek8vxxl6chl02jjathxazzh20y2y6gh5gky7jzyg", + "displayName": "Account 695", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a4e3dc14249902a4afb63ff9f36ef640b033cb9e731e4a0a907a75075dc6f067" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/695H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ju7w3n6tnkz08a2yllxnvzcyh4wymyfapemc67ul73qgzrzh3sjh", + "displayName": "Account 696", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a9f3ef7c69e7b4a325a90d1ae986e9e150e521083c386b2923e24ae940f8a620" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/696H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydgg3q7wt4mn332fqrxy94szd3zd9xp8mda520hfef3xuxzxz82c4", + "displayName": "Account 697", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bf757efa8a5fc1036b3b2c3ac1beb60c1dfe2539ef01c47928b80f296400f5a9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/697H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128zdy2040hl2vfdycsu3wk5hh6px09krwm80k0fn8ghapdg2d969hg", + "displayName": "Account 698", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8fc6074f7c6534c0d56c80459fb6cb399f467f9accd00adfccde9d7087a2d01d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/698H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129aqz2z8972ln3fdfq4xvfdcqg35uw92lxd9rhl0rva6l7hwtmvdxf", + "displayName": "Account 699", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2062a420f6be240294ed800e4bf57f9bc892f60bf2378c133bc63a30a02b28d8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/699H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yzn7tctjl7ja6ynzmmwn8gj5evpwa86wy442whvyrcuv4xcfstu9y", + "displayName": "Account 700", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "93f04f558ec7bdf66d022a212fbc5fe53faa523cd7781750d790efb10244fde0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/700H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129j9sntyq3rnj3vc4rm4mw45gjzguqlcag0qvqqtu9axsj3rx5tdwr", + "displayName": "Account 701", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "06c6dc906ff356885353290dac3e3586679ab6d0303524b29d01b72fb0219a89" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/701H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xmqlc6zmqu2ervnc6ad595dyfgzjs6zt2nzkdx55qdgf2q4cx7nxw", + "displayName": "Account 702", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d1ff8166d1c116e340b35ede39272c70c6e1bb4f798eed21315119e7ddf5da22" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/702H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pw08ju9kuwf5dr8rtl84hz0y0wqfhkmsj59v55jx06cndfej8404", + "displayName": "Account 703", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a0ace7ba650b2df6d44df790a96894346fe8d2b11d5c27b1dff051d3cc533c94" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/703H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x3ygqc77gataqe9g53qy4gktzvqaatqk4tr9kdqc48tacw4l2hqvu", + "displayName": "Account 704", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "76839185942bfc0608e8ee130daec6dd1cabaa222a2e8327cb2ccb41abb5ac47" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/704H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qpzngheqgtl40ksl4qff9qexjdz6g5sv3hpnz60lrtld34yqz30s", + "displayName": "Account 705", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f7b46f5ae81002c12f83337389559e6f11a3fc4053d02668626c571f767a729d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/705H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128gqtxwej94nj7qnvnp6v55t53k2hf4rfz306da6xecxpd84rrr5jg", + "displayName": "Account 706", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b69da24454bb5f9035b52a849fb55bfd77b88d421aeac83a2a75d95496c4e009" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/706H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rd2e9ynxwd8fyttnavw5w7emvtlrlsfed6h0387vvwc7ejksatn0", + "displayName": "Account 707", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1ce79f1c37950fcb41c82c6a28044f251dbe112b291009356fb7354f1d89f6fe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/707H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ynj3p479kwshdvvhu9qkdgu2z6ukfug9evwd6wg4scmm9ckrxv67n", + "displayName": "Account 708", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dcaf34a569ca21e040c0925b795365e102999ce3b795110d8df0aa420110287f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/708H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlqdmhg3qeghd23f9g3mgey3kqrfs32v85aqaf5phr6ddpn4laxpk", + "displayName": "Account 709", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "67b9a9949318c59b177d4107f964d72025d14d9dac0cd92b58760fdd108876f9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/709H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ke06f67wsdt5fpd3lsl2pfteugwq2rlfun5d6mdvrwe8tz27vl48", + "displayName": "Account 710", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c4577e3e392c2d508ef1a7b9ab67b0f9b51fa3b744c6be7446bdd81506695674" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/710H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsr92z7utkxuds5w3extp50dvp4lpaxwnnsr7vu8mftky3c9qe4ld", + "displayName": "Account 711", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "436aaadb3d1c3d8bc7fa4a87cf58adc28dab30856a242258ad3d22bcbdeb8c52" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/711H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yx34e3ycc7fx2h4zu0cxucf60tu5hpaqd3q8q8c0khxdwfzgfmrkj", + "displayName": "Account 712", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8b041dc5274d540b269d282f1486092caa786af13f1e17b02d43932815ed846b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/712H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1288gx6uerlfjxw9rzg3gdg6fddeh39mlg559hy4jpjq737ery525gu", + "displayName": "Account 713", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5d124ec216cc682029d9ec0cc7eb6ea7a36a272a9a88cf80c95adc27a5777104" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/713H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x0eaxec9pq9v0wy4eyy0x7tu5a3gmhv2w8ev2n5g9l4wmuyn5lggj", + "displayName": "Account 714", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "016d01027115d084524434ec512436a7568da8ad5b7841f0236cf2c09f13b8ac" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/714H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ypvrzv2rh70g60kn2swajwyc8eaeleekl0m2v8fujcrrhlmjmv2ls", + "displayName": "Account 715", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d0e73814792bd0ec3b57da050217d8d0483185dbaebe4785a532f17f0b1ecf8d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/715H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2rr7nttj4r50dgkpz8nrn6wlky43n9azjn3tktmqe0uer3y9d9f9", + "displayName": "Account 716", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bad6d156606d471d5974ee8f92c134d894da904af9b9cb5bebb403365f01bf95" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/716H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x47yrf3rm2lakl6lg3kqrsdkmtk7xlfnslstjuvf2p7xsczdmql7x", + "displayName": "Account 717", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8174affa0c5a8f4e3f6bd801cdd9bfb5b4fca674837b483fb247bbd614853840" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/717H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhvenjqpt80vfnqs7gmkw0s642cq2wxk6ysgz9p8skge6haamuct0", + "displayName": "Account 718", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8ede6efb7aeb5c7af26a43e788a5d2c4101081bbca9e37c289da77060a23a2fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/718H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yg20q0saeexra7ky8py23ajsms3ssxagjfj6ejv855ykf795gh83k", + "displayName": "Account 719", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4826929c1ffb3812c1dad2bfb69fddd66f4563837ad645decc83ed993ffaa43d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/719H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgeumrzy23sp472zdjkhuectn3w0sh2zadsf24f35m5vktclmhh3a", + "displayName": "Account 720", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3f0a76eb63ca075e0c5e73d85b4f846286b9bd2202230f2c4582182d1bee9d9c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/720H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yeduefjprdmfq7x9fraqwcaz54wus0w4merdnghah4see7skvh9tn", + "displayName": "Account 721", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fe090f41ef4ebb55c327b2a4984bb19bdbf2121990816f0c086895b1f8711add" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/721H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129xp6spr98e8c6n8putcf5ajjjyu3zaap6j8ug2vxf62nsjmnjvkc6", + "displayName": "Account 722", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "219c74473536f260d3b9f512a03c1f80070e391d202cf2439b99168cfb03e680" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/722H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dkud9aqptsu5h29rscw2n57wk02hhslldrju220a3vpdrxfd64ad", + "displayName": "Account 723", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b731646373f491783f58495efc878fdc8c781d07dae2f4c8b921c3a4aa0e8c17" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/723H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129cpyhrdp6370p8llgg48chjzxfxlnn9e483yc647juezxjwxpclg4", + "displayName": "Account 724", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "007c70e521fc9695a187626c4aae38ee139411509bc67edae9a0e3eb87340527" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/724H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ylqrdpt3wmacnt6fv2lr0xhu6enwxdvjtef40zu4p5cref8n585rf", + "displayName": "Account 725", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a50685b8783d5a4aac9df2df72cfd2f3736c0719b853628129841c5e7fca9409" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/725H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128pjk6zxt3s8qll0u36wdcj6yzrcxzy5zxws5q37un4dujf44axzcr", + "displayName": "Account 726", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "925d3b53719baee9ec8b13802a3f968ed3e2c0767f388e5babbd0593a4d9c1cd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/726H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129jr3y5w25xew06e0eemrjj40argdyynaet88p2g5trcaqq7rt2nvv", + "displayName": "Account 727", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a67254afb8ad25cc69220ff2358cb77ce8e423961e1755a9ab5f7a7f0121afc3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/727H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129exyecz0fftjqhh7c0kvzm3a6s4e2d3c5mv89j0g353vkuknph53s", + "displayName": "Account 728", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f7061e5c28d8a313322443ab607356707236e6661e2119f96f3db2ce9c10886a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/728H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128m04xgc8d96crg7zqq5470us0t3rzlcxzghwx9f5cvt0gaug7nlhs", + "displayName": "Account 729", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ba7a30cd994b5ed88b9b1b55a76a36bd60d4d2a90cff8914edec29704d02c758" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/729H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qedrwkng7t4vcuuyfxxwxkq9jeffn959rklu57rdh08jx8uel6qq", + "displayName": "Account 730", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c40e205998dc0b32169f512e572d88a0467d3a577b46ba6ae5d10f2312e92195" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/730H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ck7n86a8v0wwrj9p5upmh58mv2wewuca0kx329umhaknd4j8p0ry", + "displayName": "Account 731", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "644797f3cf1b4f9308e1072e7d5c80c1769cc108eae3d2b1526eac91dc1cbea0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/731H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1287lnpm0r9x4ujdm5h62wuh90uneca88zj48gkh8q9sqmkwj3q4zt3", + "displayName": "Account 732", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "48c102e122ab777217d218b9a982ca4b390f882f522a0cf631498023645451c1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/732H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpx3w3xdau5f074kcmpsp08hefk0kya6puw5a9a4zne62dh7r74eg", + "displayName": "Account 733", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "df5c56b49103ad020faabfb781f97d9036aa334063943cd946127c5ffd035606" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/733H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xf0u6fq5652l9cjxukg4daj3257t79l3rknfl5jkntcnhlmfsr84r", + "displayName": "Account 734", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2f0f8e68a1c136e81d95e4d736fcfaa59f6bbb3deb0c29f0770ec7f32a131726" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/734H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294zura8qgr9n3fqxr6y6cg4az5vrhqmh0rmklk65x2dfjyvtemc9y", + "displayName": "Account 735", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "513cc116744d6ae78093d4a37d06d9177732b6e0d8babae23a6dc1ce8f0fceb2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/735H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yng76j2uh0v4xarazxukx07sz7ugalhcytg7t9m67xrqj64nymf3e", + "displayName": "Account 736", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9ce2d542ea8fc5f33aad4b794b1acfc466d356ba0bde9865a2e245990771df50" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/736H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1283cg6fhey6dtnqxwcmefs2ch0v9y0ukxlcty0nez0605964y94wc3", + "displayName": "Account 737", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ad3c45dc857ddb170aceff6f08d86417679745f11d42fb364aaec59f2a1727dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/737H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vsx0kt5cvczpepwafwdtkar300kz6rkdz2s42r5flur7q4lyh6kk", + "displayName": "Account 738", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0f70529e94645c1bacf0aead47f805295b39f947418d0f872f223e8e6716c3ab" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/738H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4qftzc0vsldxsznw43unyy40mxxf46njyd4lgm8g76kgpvx7q87m", + "displayName": "Account 739", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a8cc156eb02cc3fedf1cc67bb2809b9b60452dd15e2fa93ea3c25a83dec7ab22" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/739H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128l5kgw7d2yn7en4yrmatdhp0rzm098ukyddy7se0zr99m639lugvz", + "displayName": "Account 740", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "618694504177215edb2008ce9c54600d3a69a790098a6c0d71858981a69f3286" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/740H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjsl5j69t8wy68zqqu0sdjd7mzqh8nn0azxe7mneqjvu2p20gx7w7", + "displayName": "Account 741", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5be7efc490d3240d5528e61e2e0e38430e1605b1497641cc3c8b5993d1f5bef4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/741H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qg34zx3eez8lv9jr2wzvkmwxr5yzk57qp59gnetpnzrya9np5wxy", + "displayName": "Account 742", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e9d221b69217978d655b1bf6d32a75f299b66acdbff010c569e50ba1f879826" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/742H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xg7v94ufcrrenxclr3kgppa22r9xwfspzzj3nze2kman6ukvm989n", + "displayName": "Account 743", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1bbaeb74b7557b4b62ca50479c75e84bd9bcd5e5e172b54cee97970aeb272e59" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/743H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285dry4a7ssw6a7d82w8ymn9qsjystgmt2vhqr7ugqcg7069zsc74s", + "displayName": "Account 744", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c85e8edfda480c12b383180981bddf1da2a20d88f35637ccfd7935cda0ff17c9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/744H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128yulr8sr64ury2djv0vtz7fq9sxk5gpde5ku2q07f62tfsk9xlhc8", + "displayName": "Account 745", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9d7b73d07137007406db3ecce14fd20391f544bf4b3775aa6b16d2fbc319805e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/745H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1299arfjw7cpvyxmelm23ju6q2tpqygslrsxhgh9cjglmmcw80tcpfe", + "displayName": "Account 746", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fbef83db2aa348aa10191a64229ba56b13b1770789661e9932026b7d448f4312" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/746H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129h2ydydxn0tntj0ew4sx2a596h4uqvrnsgjg0pd5fl9m3yh3wrwmr", + "displayName": "Account 747", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9d99bf0fc243ef05b553c1dc8ac9e69dda1b8805f27235ee26624e6ebb89610a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/747H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yf693w3kvkv8azv2k04qjv2er9vuzpsj2w4gp330trn54wp7k224x", + "displayName": "Account 748", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bf5a184f800ed4370f9738ee832d1b8adf05ed9ab947e16d3f4d5717ef9932e4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/748H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1299jn0xe7y055xn4hv4ekgactn6x34rvqu6ppfqwwv8x9pk7w4qmd3", + "displayName": "Account 749", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ea97824a5943db11ecd7905d85ee895e4f9ca2c4da3f6b08efc4a3a1ea112abb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/749H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xgag6hccp0vkn6n0mt556mugz4je3wn83gss3lqzuqs46mvpgn3nc", + "displayName": "Account 750", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3c7035a4928d0a652e9460947557e50e39e137330168036eefef3852847821dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/750H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjmf63ucvp54cr3qq5fdk355k443ljky3085gyekpmvpxz7qun9q3", + "displayName": "Account 751", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "95329472bcca86e9827aae1ae8feb25ebd031592a34799ffaa1d4f4b40f3cd49" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/751H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129586s248c0kdugqp429ad99gahdaw85kj0r4kf2l226yw8aa92223", + "displayName": "Account 752", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8dc9db9590a208b936f35d85357887a8cff1ab362c5c9c634c1c0330dc29522b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/752H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yp0mmes9hc3dqq4tushjmwyvmzyhthu8zm4dre0elrg3zrqhyh8hh", + "displayName": "Account 753", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b780027d5e18a7e2c446cc09eda7e53eedf7b80d046b7e3ac7b4b16f3d4a425e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/753H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjf6jz38ju9vjvwugf8zur29qdka80d48ecwv3luu5qrtnacu46gr", + "displayName": "Account 754", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "869c227c77f56fd731c070308870c54d46988241944348f12de112b59b2bd429" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/754H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ye83hk0fgskk0pmc4kp0j3ht737xqd2s6t779h06rh20ea5htjfmy", + "displayName": "Account 755", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "11bc7faa779019193f5962dbf9d39d788c392f28a052a88b94be6a3ba1548511" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/755H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1295fwy63advthpjsujqchnfjse7ladty6dv2q8spsy3098zefnf2a9", + "displayName": "Account 756", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fa547b46f362dc6ee898ba734a244af81f7191bfd339983ed3a6320df30398d6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/756H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128k8pw3ryzfk86ct0fe6t34ljljlvgqyuke558398gkr9w9qdar2a8", + "displayName": "Account 757", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5619ccc8e2462dcb296274da924200f4f2f589f23f69fe0a04fb5bf2dc1ef492" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/757H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8ukq2a5s7da70mgqv9ee4462gzj02spxz4c9mmrh3p5nay3qr3mw", + "displayName": "Account 758", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "62caba4a39d56a4e92262dc35794a812787aad126213a6f3adc5851c8250a971" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/758H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ys9hw79d47np754zczexr6sx84grzc8watzh4audqa94zqn7f80cr", + "displayName": "Account 759", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d4c0994be8a204e474e1f2a1b10ccc88b487544b3b16d839b108d5eda76379c7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/759H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wdmd05fmypjdel5g4ure0gsksjkzra0893qmzaaghaedz8upp7kj", + "displayName": "Account 760", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de686df32759239f3b83adb14757c3e525d251730704ec4142881846aef90be8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/760H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12885mtluyfnsfsc4r07uda9wswnqug4k4xg93pntrmpc9p37v7zget", + "displayName": "Account 761", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4692e99a34a0f18c3840bd46ccb0b3240b74561645ed37b93d30f6fe89bab039" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/761H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128vc722ts9sfeegyrn5zpwhm40rtpgp6jhytgfvhtprr24klzws0hy", + "displayName": "Account 762", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "894f2acb1059ade52674ef01c239e68e71417b9caaab1934365343eb3053fc42" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/762H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xnpv3jp9tzcev9gst5u8ky6rmcl0p53dx5ntt8cmur83wg5wnlzpy", + "displayName": "Account 763", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5d338c2d56143135e084c98860a48e171bb6a82b7bdb401a28d32549e2645342" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/763H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsvlvs39jsphht9uzttcf6fjsj8kcperd3hztvq0tx4fa3lhwa098", + "displayName": "Account 764", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "17229d376ca03f3e031bbbedf8f29f534ff258094aa21d33cecac5639db7b7a8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/764H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xdunqr6309xlajtut7p8hu69tmvwneh425azp28jjskltul8wd4l6", + "displayName": "Account 765", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "356b6b715b3b3dcea94d532682b6000cd483d618c30e9ef5491739bbe5d22c45" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/765H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284ewyq66p6dvcfjamry3saz6uce4mlj3fd7l382gma90hkj87f86k", + "displayName": "Account 766", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "79465c7239eae14972a8fe0e7ac2a082b29c8e8c21edfecc669ac6e929d07e7e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/766H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygjuvzkw2fj3pqv90kc9dexd68hl7k4sg242mp3hcfwgv7persua5", + "displayName": "Account 767", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "349d6061d17bcd9359745d5f1e2f8eb12c26284e0f623895e7bf58a2f73776b0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/767H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y576cvrqwyn6gjj3kjny5ucn05qzqdk4quj2tyssz4a6kysj2u7yp", + "displayName": "Account 768", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "338df1319497cef2f47e6ec2c83a6bfca56fdb2592ad4802ddb5c25ada98ef38" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/768H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128guyc2s4spkksnjh8jnxsknqh7qctwmhtwk2grgayqgpnrkqfl4l8", + "displayName": "Account 769", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e9ed2b95231baafc1f7353da0bee938ca7969edc859692bf81d5bea7456a47b4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/769H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xkpngf5kcdrd5yyeekgzdyh22d3k746vwtsccyt9paz04gth0ww0h", + "displayName": "Account 770", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5bef5aaba3ace3767b0d9bab32790455d94b2978bce0883a4d43852918b823ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/770H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z3sawfpgyj4hvcpg5udenqfxp09esxtjecyqf3xnsqaydf52yqn4", + "displayName": "Account 771", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1c4037835d12174d0395676ed6a9cda842ec5f6125d3e11e2f6d0b575098f7e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/771H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128trcanj75zsdt9r9wqpxwkva4s9wfysmqzwxpnkevk2sdrpk54fdp", + "displayName": "Account 772", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "67ace672740c2800f79180ed977c4fb54bdfeeb3b2a51d2b0dea5084ea70a0c0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/772H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xx9eayq3258tj8304cjk08n74enu9jvztkndm0sm0e3heanj9wlnr", + "displayName": "Account 773", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5b9ca231c2690810b84358dedca137cb159b79ad95ee44d08cf66959694a2db8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/773H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129c8p95v08xfg8ld60rjz5ndsdmgq8xgfz9kz83kqz9plgdgmjxg8u", + "displayName": "Account 774", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3a4ca6711ec8c1c2691d4d62cd93a3e92ee29e71e495e4560250e5e11c8b4d0f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/774H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128gxz4ppfe9gye06hznutjuc9kccwpv35k8qqw0h6v0m0rephgu9e8", + "displayName": "Account 775", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ffd0e6db523d002ef72f0cbd0627c87dca7fabf9a90218707c896f0e981302fc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/775H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129wzq40yht2tk396kzzvd7cvh7d6axspy2fetz4202eymdvx2f9vh6", + "displayName": "Account 776", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "76d6f9d09c259c5e9141550af64cb7da483e439c9fa6f65fc09f5c790e5c0839" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/776H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yz2tscar45jw3um8ucf6wv8pfh7f68vu9qnrhajkz6cvupxz3sx2p", + "displayName": "Account 777", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d17084e416452faac3eed788d2c88efb0184a42e22e1356c6735d3a3a2536bc5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/777H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xe77pec0dcssarmeck62ndznvps7k88zjytzu0ug0jdmsq9nguck8", + "displayName": "Account 778", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bc97aca09dc5ad78b3eb04f91358e774d88163bd22cd33467522fbbd6abe534a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/778H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ygex7ueyj0xrpqmt8pr46fkpa7jxe53re89gz5lzj0t8aqmtfzace", + "displayName": "Account 779", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "dedca6ee098c8d9dc5efabd84d5212a4aedaed36446cd03d7cd7d650fbe69cb5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/779H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8p3xmljc94qtjcal4w9hj6yflfs96zmj8akr64twfe3h2xhfnz9x", + "displayName": "Account 780", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "32dd6ed4149cb5f9a133d3b9cf1f75cf44b9162409228300445dc5fe1cabd219" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/780H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y8hkq0v5m2gug7tft8arnj2qjqy77d3u4f34skhvwtyv56maqux8f", + "displayName": "Account 781", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "85c163fd15e09a34968e095472a3bc075b2bbe57f7e95464906dc109238a249b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/781H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128urgrz5azntj84mz6yg2r6w0sr3xuggjxnfzh8j4vhsc6cjnlry5e", + "displayName": "Account 782", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f148e89d227e73a326d60e4eab79cfaada5817983ff9e7be5278ffd88eadd26" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/782H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128nr6f08d9auk44j6nfxe0fw466ulhugpz2zeuzjz689a0fy9xya38", + "displayName": "Account 783", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "40976bf045ee7cf5c34378249b0a7d733d556aa4d5699d4cbd9ffbcfe74d4eae" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/783H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yxjmg2a7zvetgmmk3e57u0apxunq29qmwajgku4hprghwnmrqzagr", + "displayName": "Account 784", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0e30282b9e4ca518c5a3aa9f385e2e94a51b53b86c9d433f22eea6e56223717e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/784H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytzpvjcpxm3pa8fv9use6f80zem8ayhrr5tzjh3a5fqdk9fq9p0wv", + "displayName": "Account 785", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bf4f2acf6a6ff758a8d2be11d33d4a520d41be503b2b9bf8ce7618b828abdf03" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/785H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqcjvc872772au9z2xw8kfx785s08q7k0macjdrdxswa90c8ezuy4", + "displayName": "Account 786", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a80ff294089020f4766947ee4e726ff5f3e71ef1338e92e0323fdd4f58cfb0e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/786H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y06pz4dawkku96l3ev7lepka45fz9un2y5dmu8g0x6ya2gx39nasz", + "displayName": "Account 787", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d50c06748836a1f93b1c0dc4c52238a34877168118b4a57edb6f1a9fcfcf4408" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/787H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128shkn9y3f3na9jsd007ar434n5y0dh6dagmrhu33xrg4mh5fhkvke", + "displayName": "Account 788", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7630787ef0b015a7acd7bf269aae19b7a5bcb4e81f76fd1797d457a5c3577405" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/788H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ypk7wjyntm4dxskdprrvfm5knedy2h0407ryn9kfpe0s0t9grq9u3", + "displayName": "Account 789", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "38f0a5c250c35b9008be80fa2917dc893bbbb10051895ad207fe6a3147fe7bb5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/789H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xd5fdupcgltvv8xkm3q3f55e634r7yr3xtgu3yht0cjlw7q86fu38", + "displayName": "Account 790", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5238044bba823ed0b16b2852aaefd5c55d76038ada0f2c0eeee65d6c0afeee8a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/790H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1283t3furdf8n6f8hva3gys90smg8c87yanmdalwgtcq6yzjwajl0ne", + "displayName": "Account 791", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4ef39f688baa454b616b1e9c05edc0a132722cc8330d6993f6f9e8eeb2237f9e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/791H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x09fw6qevg5rg2y65z07mzynxnu935efgkxsssy3v3xmcl6sajv3w", + "displayName": "Account 792", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "657a97008541aa1c5d0b13326d3546dfcd5f4ea2d0504d06b2429c7044e354b5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/792H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129gzuuj8rn3chxc58wthg8jpt6tc28wqwm3lkx6ztjnwjlgj5a83ta", + "displayName": "Account 793", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "551ff462c6ff18f0fda0ccf5366024a0d8697dae14230bdb53c7a4efea8ee17d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/793H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ls8msch50y2j6wcjn6l8gs52wc5vqfxvwd7gfv4wv0n0z33a2t4x", + "displayName": "Account 794", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2f27e6b40b0073ff3c443083c640f853336ccb5bcc4bd13f58f02cc2f9eef036" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/794H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yf4rheglnm75u0grt8v6hjega5ph3d3pv6sld7mjltvk0xzcxtkkd", + "displayName": "Account 795", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "caaa32cc570535a78788a779a5fbcc03499c4212e1068fb5429c44b50be78dc6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/795H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ysesqt80e004rzxkcuaz5lusxr2mqguedt3lyhr8anpmgqwhxh7r4", + "displayName": "Account 796", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e23767e0d8193b02e36f7f7bbb1dfecc40c91466e357a04d8cb9b30e76e4a682" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/796H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x28tn03cucu24u3ywv23tyluh24g8t02kuqcgpcn32q7mj0ynh48y", + "displayName": "Account 797", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2a29b73ac8e6820c3157713593843201e2d4c9ad8dd7314d40bc67b2ce8e31b5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/797H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1293jku6dd8xf56dg64d3hv9fenyt2ht05syystlmv294zttz6qglyp", + "displayName": "Account 798", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d55f6b8abb44f21b32703d4dfc501d781d856c863328175e79a97ea79d30931e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/798H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129u9hg40kkaxsr5fkllt3mgh299ledspk8elktha40yrpuayzk434y", + "displayName": "Account 799", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c85d6302cbb7dc31c2e01a7e2a1b933a758bf6da6183b0db352422a34ffd5f9d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/799H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yazc4px6w894fdlupy39z00mx4pjf3kw38cs76hru033s5965s2yk", + "displayName": "Account 800", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "27157ad7162133635aadfd66238eaca879719b8cb839d571d190133a61fb4410" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/800H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129xmw3z6rzmf0nqsrv43r6vrwck2skpg6ct9eapk9hl6acwz6k0v7z", + "displayName": "Account 801", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d32d010cf64c20f0cf3fbabab4589e46012249b29ad3841dee2afaefab9b284a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/801H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0qezdz052gkzl75pvq9x3cjypdtr02ep8cjt9q4x8s963l7juksd", + "displayName": "Account 802", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "233914c939c0b0186136771b5ecef68252d579321c1c3563a15c851977c1c1ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/802H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ulv230huq04th42qgnaaytp20p0nxk77w34y9p7wwuc8wqx78fnz", + "displayName": "Account 803", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0b23587ab09a133265c6e9a50aa1b43df51ef40ab2bfc73ca5b6e3dd8d24ea64" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/803H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2jvu2lehdcfrxps7nxlvz3emrelyqmfz73gs3fg2qttqks4s98l4", + "displayName": "Account 804", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4ac33f8a1e1001a07cde973a63a85732358878d0b26deec4d8f7525fdbee370a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/804H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129l0tvd7hp8h0kh5hv0f625z9ryf0qhepnpxc2yh04tnmjsnjhq2wp", + "displayName": "Account 805", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4a327763b1c18e9e2c1976acf2b9efdff14bfcdb6bbef10b95b388db218084d7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/805H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128at6dtw852z5hhhmlus8p0ape7h65tahelk0q7ve0duxdfj7u3w44", + "displayName": "Account 806", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "660ffd75c6417fe831cc5b24649c5c264fb1dfd57fba9f844090b9e63538873b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/806H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yjka5m5t84gddcrjgmj5zhpdeqfkeg3zvwhsvfvrcq0nx93h8laqj", + "displayName": "Account 807", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d775a520d74053b91b2ab5dd7b44e48465ea827da36ae90ebc943e055c4086eb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/807H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129u7e26urx2gpu6hywmcd4vsvcaqup0y9j3ccrz3mfptu3q5syugqk", + "displayName": "Account 808", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8071531cdb26e216d3cbc9ddf1525ce0894092821d6cf5d9d79b4ed477e244eb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/808H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4y2xzpydm55t6c8wcuhzrd8lwklmvknnhnnjwja8z47n75teq275", + "displayName": "Account 809", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d33f632ab28e4fd5847c7da70759412dd797da5b6974e7a6547294d27103c725" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/809H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12978m4h7p9wpdgenknmfw4t227w3tw9x8704q3dfp700sgu39w8pg8", + "displayName": "Account 810", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e5d4017b01fa49faa8e1436860d2f73e08577468f96d4feeb9b63e0e23ff7eb1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/810H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12953fs63mrdtylh3vyw56neukj5vssa4k0vf5w3ssjmepajuf30fw8", + "displayName": "Account 811", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8c29cdc2b8f5f3daac6c2ad9e9ce37efe7fb18f0b325988146a79ed3c7d03c08" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/811H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ymzn9y4nmyjdlrz9jvmk29exu7y0fk3v0zd56rtn40xe6xaa704x7", + "displayName": "Account 812", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7ed1a4013ce67cc0d65c24916d932a772036a7b951de2c0e8287ba6afffd70c4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/812H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129nlnjpy7qnz0ez2cmuetrykdhvenjgzhvpzx4lvdsgstweu6ckte0", + "displayName": "Account 813", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e2c80b9d3419ed784b77f1bd3d26264e9807963db503fb3b66eb294574af82fc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/813H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ytvf08l8hfgltvy5j6fjdy45y52e04tk7a2pppcjjevth0dre5hpe", + "displayName": "Account 814", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a7993ff4143a544f88ff2bed8d1de46cff93e9d5f45eb5b758f08fe16b94508e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/814H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286kpf6g9j4mp26prwhjkernhfpvq2kvfgnglp27hn7g0jz9as5t3n", + "displayName": "Account 815", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b56a1b94c375a464c424b87313979411759f31e401d5228cc96e454b5c8e6226" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/815H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pd4mq8ts7phkwypspqutzas53c7qkkx0tj8dvc9q9gzwmzrh0fnd", + "displayName": "Account 816", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9a7b40eb7a57cb18946473749da362e28c8af60178d7be8fab3455fb8fc3b9ba" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/816H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0gxd2vp2yd7z3w5eye5dtp8m2fj6uglkd8exzztrdvgdq5h48vs8", + "displayName": "Account 817", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c964aef4b1da9478f30e6c9341864390f0acc104a105cae90ae024382ec38e2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/817H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y32qh8xa0xwv2v34yzh636hchaaehwm5sdg3yw7xffscuxsnkk8dh", + "displayName": "Account 818", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2fad435f897b5e6128538aafda247820a1e2f4012249459d19fb2400b6a4bcc5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/818H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289vwf80w23e9mxc8vaeeu9srfuxt6nxq7h43wkgqgjwxczpu9tfzs", + "displayName": "Account 819", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d3fd0f17af0bea89411b8b1a96df94c40b501562706d38a862557f3a0be51bda" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/819H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129kn5h9t8a5q3gttmx0wyafhxu6fh6n44hxfnwm6yzfez67j238guf", + "displayName": "Account 820", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1b48a9fe39bf43eb7df428a7122b4aa360808234c43ed707afc4833a21115c11" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/820H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ys8hz298347cfvela4sn52av92zvkxrrvzztjznz68tw2v0xtxr7d", + "displayName": "Account 821", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f2bc84ebc56605fc7fd8469bda046de66147e582fef1d5988a0d57989dec7667" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/821H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128949zh9njgfdx9dy7whdgxzegc6vpurfa8k80f8vu5tk6rsgsve06", + "displayName": "Account 822", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "70b443e98a34b5e2b92b560a7a620cf0bc4f587a042f0e28a71796fb05114336" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/822H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2lxann5kchmayh4882cd3tnxd4jldsn4xgrwudpcs24j442e0v60", + "displayName": "Account 823", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "017f9bbe1aa4dfd9ccc2e80147d6e2d1af81cc226b4bd989424226f576f6200a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/823H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xw3yn6paqk4jwsq2a9ewvwmuz9lseru3sdk3q856x6r6ulddwfsre", + "displayName": "Account 824", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3cadbcb92a3906c3e9accd2962f25fc30eb7cee52dfc1569d5e7f9e0927a8b3a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/824H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128c2e2t5gvqf34e4yhgvtzqwmaw7wwccdp85xr6nq2atwhdlhm5gkk", + "displayName": "Account 825", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a1ba01f6171eb0a520efac9e44595824bf8ea0a5a0dc678aa7f616275825d12f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/825H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1283e9mt4lptuucnwxamtvqu0ruh7hdnuknu4y32sh0hzs2jhsdtfsy", + "displayName": "Account 826", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c7e6f2393950bd4d08705c62a70f90ca30a253b39a9088d2373a1ba5b3857df" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/826H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128623dqny97mkasne32vmevfvzkdtva4ew7qaz52wavapmyy208vlq", + "displayName": "Account 827", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2ce247ca08511d761a066f06f1c3941eabd6d378f22253fa3c58c972bac7fd84" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/827H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y5kumkth4que80tk4wtyk3cjd02vceuekzjx7qn7pjqq6n8zw97dc", + "displayName": "Account 828", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b14af17e0bd2b56c1d9d0c14e68c92788cedf79ba077af4c76ebdb0150d40d40" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/828H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yensal5yz43juhcnlmrpv3xukrn94gz5cyvnyu09sum9lyxemd0sl", + "displayName": "Account 829", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7f977f8911746d0422d82d6894f504bb884d9dd1d1fad7ae7ea304baef0f11cc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/829H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128pmuxwrlda2g5ep59sfwkf4n6kj5jqfj4p7xn7ed0thwcjw88dtwr", + "displayName": "Account 830", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a46030abcc82bee846b13234497693d40a6b73517d09a90ab9a10a2711e4e84e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/830H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yu7svkq0lmkwfyav6y3n09ssjnfy9270a5gk0y6zfvsfc9v8tv6tt", + "displayName": "Account 831", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fcd2ce9329fd4de25de8c89cb7021a5c9ed752a8ead1aa0b5230a077faae244e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/831H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xl5n26z2642a6yhvmgamvvu0nqrqjc0kmlrkquc8qvmm26775vr9k", + "displayName": "Account 832", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1eb655241e0648270a92b48c5891f371eae751002ba320ebed7c4813255a6650" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/832H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xsjp6h7u5xtskhaqhsnsjv3q6327chvavclj9phk9k7x9j5qnrssj", + "displayName": "Account 833", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "21e0e621f472a972538f4ecb428dd377e280f42b22abfbbe657866c68ff902ef" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/833H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12944jm7c4tm0ql2s7sr59345z46q7d23qwu8al7tgwqfe9fe4pw60e", + "displayName": "Account 834", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ac949f2bfb72226ef562a19ff51e52d030470031fc90917533ca9a35be9839c1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/834H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xmtakme4t40ftr5vwaew96vnuva6vj6u44papgd6x7he3uaxc2dax", + "displayName": "Account 835", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5ea13147b4d642185d1b1dcbe3eb991785b2cac99fd41a19a37d9c244b57fdd0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/835H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129039r64rzzs0tefdztfrvjn8l9kscwx6mcgn90fz2kddjrggzjetu", + "displayName": "Account 836", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ad5472847137f341c6c587ccb0f21972244f5c16ab7202014a1c4ca7f4521b3c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/836H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129qkr8k8jm4px9k5qmjk8lcrl2cnjyvcjtfg0nx7mmdh6jcx300jnw", + "displayName": "Account 837", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c4861b5b2669162ab1462db485734fb6426130c0c804c9672b440358a77e2ddc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/837H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129lc498w9dev32h85a624jlnkatjjlm49xwef4tn778z7e6dkz2r6p", + "displayName": "Account 838", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e18566c664eb839739332bb45d5b7e7795e8517b30272cef52f00bbf67b7830c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/838H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128adr4ldx5m7zmtq8e0824zzagye7ff305g8u4hfzlt5c4ah9nxykw", + "displayName": "Account 839", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5b62cb4b0f78a3ed3a59f8c0c18eb0fa63b838895f8726620762d0796486f410" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/839H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128xlssm245cpg2n4t6tpm4cy65ua4s9mtdcx9twe0x9wjgu7p44qgn", + "displayName": "Account 840", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3756971d07fc300ad8407d5b867828f485dcc17ac89f26709b1e886bf179fd55" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/840H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y8ja3ddl3s8hd0xkp6yazcghns6y497ukqrmmksxpzull4gm3wh3a", + "displayName": "Account 841", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ab1695131ec31cc1eb905e1cda05e6408d85d5abe31ba80c58a80e50d66aeb12" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/841H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xqndze00g0tlqtwhugje48wmnkhjxx8m7dtehgeq3nm8m2aeycf55", + "displayName": "Account 842", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bc31222e1f2c6679bc9661a4ca43331190269d425e91f3aca1f243db97cfa626" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/842H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128509tf5gyedtfdplqvq7h6ft4ww8k9zpampdjm0yqup5dp8rca7uk", + "displayName": "Account 843", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "13296eb02e9442cd902583aae52b0bec40f12e8b66455082900fb677664611e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/843H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129k5sr2vxxmx3f0q3ljr7x40ecr7pt5lraegw756ef5udnuk9y0q8l", + "displayName": "Account 844", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e7b2f6bfc5226d352e0b13426771421677d80c9252272655b0af706a6fa1d79c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/844H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129anvaee8k794p44h9q3w7pdx4jm6ssqclypj2ec6scddtpff2km6l", + "displayName": "Account 845", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "11e46cd879c6288a20ceffda8e0a6c5037c5b08ac26bab85a9c39ad13979f69e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/845H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xllga5wzltrrx2gr0eqtl0jl7tczrtkvl6nepfaq249m05fay8vxy", + "displayName": "Account 846", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3c476421ee03a709a360cd85c6c7c925f92a647310f5f122d29e26369bc3ca19" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/846H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x7ncm6kuhvw7ts4rjju2uqahqgmh6guez3pxzd5qsy0nhu2kph7fy", + "displayName": "Account 847", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "24b5909f302fd8a93ef486ec8dfcb3ddba2d21808527fce921df587f26dd8adb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/847H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129eyhu6rp5ef7q347tcfgka290tg98h0a75ef0tgnu9s5w60ftzav5", + "displayName": "Account 848", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d02b1e834717a6287c82ed4baf662f4c6ab8ca890ee5b25975fa94db4bead942" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/848H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129fq8fmplnackyv6sytjkqk6m52gsg4lu4nvlnepu0g6dacfuyz8d7", + "displayName": "Account 849", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1d02bf4b60cb109b4800586a20e95020c851bc471fb73e338b20141981587f53" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/849H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y62ttmrv4ce6q377mwvqskklgnaf03nx7t4dtfcvyepm20uy949xy", + "displayName": "Account 850", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ff0a26496c3c4db70162317d45b95817da508167a4e790ce77770ac8572f5c4b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/850H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ysw2d6d2znqruvqhktrgch725esvj8p4nf4yvy4rme7h8qqldxvy", + "displayName": "Account 851", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "852bdfe6feeb61a6fbb8de07809c83679a1d4d2be60d4fb533b1a3b9e2d2e877" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/851H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlh9v5stan92wv56svdzzpedtxra73dhkyds2ezcf6jxssem8wrxw", + "displayName": "Account 852", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3d68a1e32b44c4ce4bcaa47528bbae08de13a28cc2e152dfbf9b7ff202a431b2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/852H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xeqatr54ctfxwe8lpl9dv4hwua6vw38nzcdrn5cfc6r5trxfp4nla", + "displayName": "Account 853", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3e7fd62198f80ac1ae9c2d7261b6df8870c23106a1d779cd965e048166389479" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/853H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1284u2npelxm8k8asrzzc7jmjg9fwqnlmz9scyecutrnm0l50glcwqt", + "displayName": "Account 854", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "766c526a261c448264c57773431e284dddbda61424b25ce032205ce0b808c894" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/854H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128tsh665x5funvfn6x3krpl7eaayw86pd3df0ljdkjq9753dctk2tt", + "displayName": "Account 855", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "513b0bec08a7dde0a4d807bafc935a541ffa91efe2c43eedf9e84db998aa380e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/855H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1290ujzhjtqrn74ml6l5urpz3tuprt83a3p6f24s5hcas724nlflwqc", + "displayName": "Account 856", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c49b23a0315c689f42c6221dd42dc903dbcdb709ba54b35b27543a69d2300152" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/856H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xggnjyhz7xjq5qrah9z2p07t3xska5af22lhhjwn7zs73anyfa4e6", + "displayName": "Account 857", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3932138876420b070bd7bbebf67a382d7141a7175c14c6f054f298310f7875ee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/857H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292649urtlef6cdw3esfkzuxnrpzedpmtt0yeexjmkq76s5sgf3286", + "displayName": "Account 858", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bda572b7089f3b72c75005268ef6cdc62147236e53bad3c9138986baf840130c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/858H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7fsyerd5gua0k97c3ws4982jqlrqm34glhn68ekmh4hj4p3pflmp", + "displayName": "Account 859", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1ce7eda592c22d5a92ed1622723e49daae2c2d1a41b5c2f21fdc361d075b8e35" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/859H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128fyc9ak59tysq5gduexem7fp2ynrclcrxhhlxje4r974894m8m380", + "displayName": "Account 860", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d0c5142cb53da512a0bbead9448bc71c60167b7023eebf54dc10334634240eeb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/860H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128klmnya474a8etn0fk5m3h5ge2c8f4e88ms8zqmhjzwd90856j0sg", + "displayName": "Account 861", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "27b519e8a3c31edf71b4379b10758d61c94732793d6d519dfa60e48b6eb7169f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/861H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xaplhhuc80u3j8sn4zw7gcnhvxhjzrtzju977l6elrac9v4ud20wh", + "displayName": "Account 862", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fbf5913a71b99d71dc0f75edffb4874db04e8fab217d40765e6268906ee39ef7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/862H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yykfcp258e965syangssenuk43v0wcs6w68sk7gfx3evtavvlrls9", + "displayName": "Account 863", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b90d04dd3be856b51f0e7409e6375da8480e68e15fcc8b6c1353c3304bf1659f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/863H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xfu0v9zckz0z5pn0mzu2xv8effrc074tfy75kprkgzultu8lrgrw2", + "displayName": "Account 864", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "74a8cf0372542e86db46b710d22a1f67b5e3b753a50daa2c38a6675f8392b3e4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/864H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ya8j4s4rgdduafaf5akkte0h4r8ncdlcwvzwauwkmt5d40f77cj0", + "displayName": "Account 865", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9c238ec99029fe7275924b9fcf19407aad288a664860531a5e4ea032f65a3ed9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/865H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1292r0fp0zvd7gsc88crue0nhw2j85x0acasqrj2gjrjm9jjnmpj39h", + "displayName": "Account 866", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e59ca2cd6e4c5c76d4aaae0e32f2782c157b1485e971c534c6bf71fe08aae86b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/866H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128stw8wcn275guewt8xfgtqnsvxv2e9rvfsqgxmlanfe7fkcdzp8sl", + "displayName": "Account 867", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "51351557a9461ee2ec7207c1237a5777bff150ce2c2e7a489f4ed75ba6761ce2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/867H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xk963h5de2k8k4rrd255ty2vs9t6qgtvz7q3uaj6zf5sewhtqzqw3", + "displayName": "Account 868", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6d52e0396989a121b23fa05c9c583590f67c2095786acba577861a91c76402ba" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/868H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yeucamtdazd6kg7f5a6hdw4c3eur6ygnw5eedcrt2hgqv4uy7n47z", + "displayName": "Account 869", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "378be1a950949457fd3caaf8ac2e0a4af88a9fccadc01f6538b4bacd1544b375" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/869H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280f78zg5u0x089v4nj9t4thpt7wars24xgy96c0fgat9l2aylrwmh", + "displayName": "Account 870", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a2d9c20b01c4a5a3bb63d2965dd61467bcf834be2bb1ad267cce3f72683d5299" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/870H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129tusyt7r4q8qur0mqpc3mt87zx4gs9m4ux8g0v57vuzya4zhdn0dy", + "displayName": "Account 871", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6f88a0794f152a946b7d7b2cc4dd086b06465a59a2c471a22b18ec9e4509b97b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/871H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1289l059fdyksjnsyuafs9gw9nf83r8zt9p4jz0yxuv9myhhyc459t0", + "displayName": "Account 872", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "65a2b0e33257f3bebafc69e28c14d5201dffd14e829394a4d4cb63c7f0fbd6f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/872H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129q70dleu3scs67h2qz7my3zl5k5a92tufy2met9hghyzteyusegm7", + "displayName": "Account 873", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "82f8db1de3ea8ba39a9154f8d6524fc6a046df617d5cc17bb5740fc2e1c052a1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/873H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128sdvgetxc3rd2zkgznwhh9v0h4uamljcfy95vle0dwhcx4nvwxvrc", + "displayName": "Account 874", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a39f410cc3218462b0c2059746a53250b6949274683782d32236941d798078e0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/874H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xaesk8u8vqmqwrg6du65vmgvsw9mzudvm8tfs7zglzwymu477p4jr", + "displayName": "Account 875", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d0e0de607c544bb03828ee8c96184f2570b08f1671dff6b11b3d20783ad79470" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/875H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12923vzc3nun6237083jd3pzw2uua0c6scnennrsh0urda8660lzsxt", + "displayName": "Account 876", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4000fd04142a074fd17758d628379d13eeb7bab3db71ff26ceadca0930d7e3be" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/876H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvk5nd8s8hczxs06phy0zzs5s5r2rkej3yf27dkv9ylkxgdtg2u3c", + "displayName": "Account 877", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b2f832bd9be83ff873592f85b13c304dc925ae423cb6d6686a4a39923aea053e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/877H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yp65nl0gayd573gtkfa8xrxedft07jqd45xxfgzj7neudr75zuzlr", + "displayName": "Account 878", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "699c6725c2f93afd6e2b954422ac67bdc3e2da75fdde0cd3d7eaa03faf21aa33" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/878H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3pvd0wxelj5cda9wyrwa3ekukeystnfh238u90krc302dpxhn3ne", + "displayName": "Account 879", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "73fbae3077ed8bbb0f255ccf3466ec75a153123370c5407f1cccc594768758e4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/879H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128x9grpgqufvc4k9udq2zhn77cun73kl6mp4sddtzsmkke7a9qd0w4", + "displayName": "Account 880", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f7b37cdedc3dd8aa19dbb2dbae32aba4b8672bc155b8d670be480c4177ee4fbb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/880H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xvzkdhp29mjm5rj0kmsta83tv5nj9ux4jk642y5wg3nqagf0epyd9", + "displayName": "Account 881", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6c33d95d58c56f8ec338bb5472b2754ada220f5804b16dc7ed849c1a1520bc07" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/881H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12862525k4s44f9w0wqkn3u652kgwld7kyylmx0h4vylnnrc3ls03dl", + "displayName": "Account 882", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f38dc0f4aceac1d21b636cef04a835d03343135d67abd579135aa7840255267b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/882H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128quuknd9h9yg32ectc8vsdzvp5ffc3antqqsqddwr4mdv2z8kxqfp", + "displayName": "Account 883", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7e9bb44acadbab693fc5072d8f788c1bb2fdd6183707c97ebe8fc366baf2c774" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/883H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7rhz7ax78k5nk8w5vfeqw28n29snefl3e43ep3yzac2vl4z4dgcc", + "displayName": "Account 884", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7d463355f9140a50006f8b1f8c7675f16321c5d809d53b0b4c638be4f6d042f6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/884H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yurdpxy269yy7nhduthghewxjgcuvk58fk3l8a9f236jka4x3wdyd", + "displayName": "Account 885", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2a8158078ff240c65163a3db0fef1fe70b68f0a377326b5852272913a1300e0c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/885H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129k45srajrc5tjmhceq59d4ldfycclfx0tne0ht5ll9df9mmy9fkh8", + "displayName": "Account 886", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a8797582b3670786947ecae079e4e7ff3f92db2d61ef5b8a9cf3847041e2d3f9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/886H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128w5xsva485edhu4390jzhthuckdpjmzk0gwjkm2ah8pt3frj4t6wn", + "displayName": "Account 887", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "34cf47b530ab373ec06adad367daa4d8ca2f05d739d01bfc401b362fcf87cf4b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/887H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yntk9vsl3dwhkfjkmqp0sdml60apwmnrmf83xpzzfmmcdph045quy", + "displayName": "Account 888", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "be7139376cade3db530fd69cdeb2bf82e221b26fdba530488e5ee097b5889149" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/888H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xphvsxexvhhaj6c7r5kdrvkl5jkn26zk432fkxrkx0dyy9jg3rscp", + "displayName": "Account 889", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "98483ad1a12eaa06e899736e4241a5a4c6d71e6c987cd74a1354e03178689ee8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/889H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1299wy4mj3ezw4a8ul2js3gp90xa8ljgkghv5l5us736g627xrs5czx", + "displayName": "Account 890", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "61f016bae1f6fd383bef835e8131bf7e055ee38b833c9bdb9bb9f36afadc5de2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/890H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xjgq0eh8s2av4fmkmr2de3ukddv57qflwjdjhvj0d50y8uxgjuye4", + "displayName": "Account 891", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a7038f166818cdaa1ae6070953ad7c66ee138619cc525f310f0988c7cac74bdc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/891H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128emlxlgzm2zm68zy9ehc8rt2380t36etq793vd49ywvqg7g9cn4xg", + "displayName": "Account 892", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "20cf190387d6fc8f6a95d7c76eb6aaf608ebc5d4ed8ca2e5db1a0170ff43382a" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/892H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ujaya6pn79nkgalwhzgjljtkn46l93ypvkp7el7zlzgkq4qdvqhw", + "displayName": "Account 893", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bdd02ed754897e179e7eee680c5ada3ee3714a4550413cab5f67f44785eb993f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/893H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x2wdj5m6c33wu77ycu0c8rdyyvvwhfxfxeseyh50tlad54h89zt0m", + "displayName": "Account 894", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9917aec920a42e08588f914daf12ce297bc65820fa78d6a51e47a59d42aa38e7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/894H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129zrr6gd40fq9wqakzv9d6yn9ydytuj4a7r99rpfwdkna7xek9js32", + "displayName": "Account 895", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8fc63100413ff1f52ca2ea0335abe7f3a149fb7d3296f7145365740e659675c0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/895H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xajjx8p3jkss8z99p5xkqdae7l357fsjgypqmp4v34aw4fznf0wga", + "displayName": "Account 896", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7466c57fd8c77902f05b961c9712eb9dd5efaa3ba19e49a0d14f3d9d63f388a2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/896H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xcr36uaachu43e647wknk5h88rqk3ccrd9e3h8hg0c7rzk5zrfur6", + "displayName": "Account 897", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cdd14a8e6eb77a35a3c0971a4fc94be19ae92309ac1e495e61f26e51051e68df" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/897H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x894jcu0tfd5lqcnkckt3rqw44qrgrrutmkxu3ec6wx7ffw793emy", + "displayName": "Account 898", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "840e58189f894b946a4d72e4b679fb63291f78e1a3cfe3466ffb36e3335f7763" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/898H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128lt8mazmppyn03nh6mwpaa0maqvff88465y98h360rcdjh0qrlap9", + "displayName": "Account 899", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4cd63849c2e515376c122690c97c3e38e340640b7cf4df505d326aca58e6d3fc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/899H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xzxhzh7qyjeza352klxhdj2qmsnf0ex7kkdj60tntgs4u7e88q7kp", + "displayName": "Account 900", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "701501a430a0a25cae7c92bccbb8a80ec9d955c26bf1fe061234c76bb8839933" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/900H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128nchxzltzlzrdzjkpua5vqc4y6my0hlfp8tm7t6yslteurz576u95", + "displayName": "Account 901", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "91ba1457b535ce545b116688d49cbb3dd9a142ea9de8998ac87a8e98c940d6e0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/901H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vt0w74s5cm8vm722dj708t6umwn4x0sq9am6vcc5khqj27damg27", + "displayName": "Account 902", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5024c9fcb03ef267afea37920758c6fa0401dadd0da76a2e9598164a614f1a2c" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/902H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128e6d5vk45gdhql43c7qy024x9pqh76pstmsd5yl99ch3ngk3gp8yd", + "displayName": "Account 903", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2d8c095453ce13872c1c2e3602c55e6bb337f4d11e08ff4df0abe0bcfedd195b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/903H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280ntmgmfe6f44evvdfxhq9gv6jycvtfgw3nps4mlgsvaurkjwcdv4", + "displayName": "Account 904", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9e354c2f8eb28da79c72a19d5b7a2c7a3307badaac0e39d1616966d3c5385917" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/904H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129ywlcxyucam2my5n6gnvvnlts305gwwvuzc8sa7u2cfsn2uu2y60v", + "displayName": "Account 905", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "79b8c0365dc592cb6ecb4ae63bf94e692489f722d880216142307ec5ae0fbbd4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/905H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xptuxcl2mdraqfngjp7jm6udcynj2q7fmpvczsc0v6xz4lvxtrtdp", + "displayName": "Account 906", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9d8ffc425453cea1a04824ee38b1825975027069a56483c7f9135dfdc0a8d039" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/906H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129yw83qt79z2s6dgut3vx5hgqdqp9w9aptegpln48tkmdt8exz6m0x", + "displayName": "Account 907", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2d12949427af7473e70d66830dd88cf2ef2a33e50e8de4b5246410e5ca0d452f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/907H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xn68h5a5en2zypmv9z6nt3kfkcp2p6kr3qv377rg68s9end95emxn", + "displayName": "Account 908", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "6a3ed532e2d974c61bb8e22f98b5b781c6fd856204283fb13d15155d06925514" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/908H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129j8xshqdp66m6admp3fpw52dwg9pr95yau0hx20tp38f6lpuxfqug", + "displayName": "Account 909", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "2344f9db54d724eb3bf97ce4056f42c8155cfa2a4b24f96253e4c1db84024834" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/909H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1294h56mxzjxhufrn6qjtkgm45ckrj6nwpd599jm2glkhkfz33c2p73", + "displayName": "Account 910", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1ff2275a01187c2b9b298d79f44bff7b3f33f2185e096613f106afe316cc25bb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/910H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0f093t8z83tv3rdl4zzehjvnwyt7pkyx0p2xv5wwlgg987puwquv", + "displayName": "Account 911", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ef2490a47b3f2553d47b7bbbee1be787c84a098411c1f942f6a9aaa87d51bf44" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/911H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128evaneq8ysdas3x3s8awm7p9s940vqd6e2y3lt3z2me0jnkl00zpe", + "displayName": "Account 912", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8f349e2b9df2be8fa709469435ea73fbd268ae1462663b19c5f28cc527d186fe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/912H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129rvkfw8ar0j763w52mgz3h8xcmnl0k58tchsm2qawslfl2uuqppcy", + "displayName": "Account 913", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "95863a7708128729a20b34298719717179810d96827fbdb4ac1b212ad8b27493" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/913H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129mjxqakxmykj9n8a5mhckljx4sxfzkk83yqrxzmljk50m5wx80mqt", + "displayName": "Account 914", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1cec02e59c43ea0de8cac576a399626dfa61e0412973d63b257b67bc8e31d4ee" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/914H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12986anmgc70ve6af5lh2zmp4x7fyt7nn7ctdjtfn39ar60mnyfsd5n", + "displayName": "Account 915", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "e69c17fe82f6dfadfcd67da56668ffcfea4788f4783d185835a0b9e3bfea24b3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/915H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xa0qfhevun2x4pyujvy73h9zv4x8yf5mzf9kqrqjyv7aj3hu8gpmt", + "displayName": "Account 916", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5e068b6ff0deaca50b80142cbbf5838bb3c6d6cb7859dcc83b4049d4295d135d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/916H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128eua5mnjm0n0am7aftxr8cnfevcguelc5faz6frgmtrgp7qlxqk4y", + "displayName": "Account 917", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4d52dc20215648dcff88d75b9ede5a3b94381d5c8bb27c4e01cb8d5786fe5793" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/917H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128qn6ekadapx5m43cy08x27cqvf425lzhjdhxyjwzk3npkdfh2ppd6", + "displayName": "Account 918", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3475a1beee7f8353e6512b64657f1985dc0e190a297d8cc48f9537cd49d31e48" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/918H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129rh5np8uc4t7nn5ekmgrw9k8x6q8zr4s5weclyqctvxx9qufnv54c", + "displayName": "Account 919", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7da36021c6f81994bb4433703cc7843fa305e990d3af351bdeb25c57e3669a72" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/919H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129pqg57hhxevqfpesjg7mx0xq6pqmfsdxqh8402ur84vx9k2h6xm04", + "displayName": "Account 920", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9ffa0298fb4699effd79a1cda7a1676f42d3fb4e3c7924c24cd58bd51ac88e9e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/920H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xd0gpr97jep98dy8jj2tja2vg4munt4mjk9s5rusycwzwwjkqxd27", + "displayName": "Account 921", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "56857561f8964343713b81ac928a1322aff7962e953c41d273b36645d23b2217" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/921H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y29jkseh9vl55eevj9cjrcu8yy96cm9mj3fgfpgu567cjme6slpya", + "displayName": "Account 922", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1223bee9a4ccb1776f0618c4e76d39780b52cfc3de222500b4fae0e6c0b78055" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/922H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yqf6nn384znwatf8y5z6qg06chwcrwkn7x7fzmml0q36cf35mlzz3", + "displayName": "Account 923", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "9a0b35966630e9cf708e85628e0462891b9d4d3214447fd83cd7c51f78c8b815" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/923H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yxn4n8fv2jp82hdln8d0rsmetqndjwz5yzxecey6xex2rfy97u7pg", + "displayName": "Account 924", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "84255d77835f8c60a96dcd15320887b68bf0a530fc33dc730ed4764f55f155b0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/924H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129d8pdhw9hutktxyvs0uu2calwxnax7fmxkx93s7asyyp2pm54szpg", + "displayName": "Account 925", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7ecf197a4abcaf8b8b9adcb04b8e5db11464d2c33c33671a7c018e3cec821143" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/925H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128rq86vja2zwnn4qrptdhsxssd3ctjxl30pt3cykvz78pp34q6xh83", + "displayName": "Account 926", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8c09e41721f7866048dae7e484011a8e26aebaef57857c72794ab59101fe4265" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/926H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y7jejex6vxqywz0nq5626zxz9v6th4en28krlf4vnal2g6zwqdun3", + "displayName": "Account 927", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cea17a4741be70cdc0fa7c848e544e561d0fe754205e926b309b3e7344b60efe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/927H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1287d3qa5kjvhyzvh6pdp4km8t0dt7aj687lqccp0h0e6zrnzdtezeg", + "displayName": "Account 928", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3ca5829beca490f511da285a4678aaf6713c1900f9a294cbb4cd5edbb115fe79" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/928H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9cghsc089lke38dthskf7h3qa5ey7k8gcc3n6ckrdtgm75t2dhu0", + "displayName": "Account 929", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "8c490e1aa16dca17e4149a25ab5379d84bbb08c38d3b7506f0f03671172efc45" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/929H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y4whur9wwxdcdj4n7zpafzvhjsen7krjs64ej5rasvjs0hmp02unt", + "displayName": "Account 930", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7fd717e76a0e2c99c625bd545f43683c7e694f5f61e1e88dd775f4b99e37e0f5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/930H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129w5u7xfhkq9mxzfhe94pulvhlcnk0r66tctpmkjzxrr7e48pt2gh0", + "displayName": "Account 931", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "81556efa244f1ade8817068a84dff20ac69cd9593c893ab4a6e335da06d56c2e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/931H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129gg69dl7wexhe9kr8vly82q7dgfnwwjgmj3897mfw05ejakfvha3w", + "displayName": "Account 932", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "71825987d29316d223ac11acbfff7f490c1434c66685cebb190ecaf06c97e4fb" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/932H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yx8k5sqv7kw2223x0utpu8pej8nreeu8c8ep97p7lnwrndp4z9nkp", + "displayName": "Account 933", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "42e6926d822b2cec42187d06d31bbd5e94a37c4572622c6537d371566df94147" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/933H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dq3j9cukz37z78z47csdfa64j7r8ky7m6euglzjsw66jpwevd4dh", + "displayName": "Account 934", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b6f49752475b480dfecbae51c6cc7ffef3910e004790303e29c2bb15197c76f4" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/934H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129vpmkn5d4sqa6805xtfxd70fqyfs7q26cytnlzjj3mgzsrutjgv47", + "displayName": "Account 935", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "5e74e826f1e82fe3ee17b3c19d3fb16b5f696afed64c8e0d8757c27a201b8274" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/935H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128pdfl4avq69xlstcxq6hmqvu9gvu4ufxukvnskqch0ctxh64d2jz0", + "displayName": "Account 936", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0658d7cf5efb6acc19f1ac36b11423f281bade0c49f7925dcdddd2636c958aa6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/936H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yu29mxucp4t70yxflwe60382qrfzxe2zxsuk2pazaalr4ql79erng", + "displayName": "Account 937", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fe3fdae3273e2c9ab2868f1e6ad490b8a3b9135c6ba4e0f1f80eacf7b53ba8dc" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/937H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xx63v23mmpk3f4nwed9yq793fr62h2hyar0gapjw3qx86a4yvn7h5", + "displayName": "Account 938", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0b80a37df79bc04aecec62507d674302529c9a73a6b513215060f3cd91f72303" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/938H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ynlstn40vs7edgwzmqqv94gdnqxpp9u9gyl2mreses2fqhhkvep49", + "displayName": "Account 939", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "7847b6af4337ed3cb297987415fe1a6993e635aa66f30c52875ae3718bcfff91" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/939H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2x44r8k6s97md0g357vq288h5ysf7k3j5de4vwn6juqly84l99rc", + "displayName": "Account 940", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3b6c19fbf4bce99c322f3742382a581ad56b4e2198068990511394f071e265d6" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/940H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yven8n42tremulsz8e4tcl2w4mzpem5rdjtvln4uaqgycpr7kcta7", + "displayName": "Account 941", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "99fa4b7c226b67b19f0db9c648c768d976b9eace89ac3758402def980bb4b2f7" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/941H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xw5g6deflnxat3h68fz2kkkskurezlxy0t2ajx4df0y4vrgusnr0p", + "displayName": "Account 942", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "577ebf0ad504e38f7b78ae25cfbea86d5cedfa1d4f5430599abf7ea27f0e42ec" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/942H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1285ee6uaedvq7p79rzsuch4sttvctty9gx4u6l52yzta3l44mft9nh", + "displayName": "Account 943", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ff6efeea70740fdb3b8845455d8cc693787679401462e0fc0c4eafbc0c61df4f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/943H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128me408k6e0v0p0tcfvrmrpwuxhuwl0fd95z0gwlx4c8qttckq3jz3", + "displayName": "Account 944", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "62e2bea2ba37b3a001dca218ab0d4ded9ceee7e37c27aedc41dfcc2407b3cbf8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/944H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ycsvcgmp24pnwjmp63luxlkcuuwjp62hev0y84g6trxexdg8xj3c9", + "displayName": "Account 945", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "05f9120c181e243cf2baf35fcef57c89632016f9e65b41b47e746f4f14591646" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/945H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129fjjda5a0my5e37kcxkhuj9rw2muwt0el0086j967xpurqrzngufp", + "displayName": "Account 946", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ea53487eccd5fa5a7481299d4b36afa2160513945e7d0cac1b5689b9e7ff265b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/946H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xku5gm8xlzhymwnv8pk5zxhjpg6un5tpvsw430fhunr99xt73suc3", + "displayName": "Account 947", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "98bcafb8d894184313abc6191fe9c37e1ca6737d5a5feb06ab9d4668904c1362" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/947H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12880duf0rzsuua6xx2kdy5s5tr32xum960ykx40gxazrw6jrlk3x67", + "displayName": "Account 948", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a999a20fe6963e43e01becb7f7682e45ab176ccc60e96f074b59ad4fc1d66cb0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/948H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhfkkmjlau3z6yd0kq973yk222qsegg53hy62ukm4j7gdweyhjq90", + "displayName": "Account 949", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "54c403bb79fb0e2621ad09f04c1e9dc855639f6cc9e6c6c558ae80f65d1ae383" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/949H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xcuxh2vasw8rw5ty9zzhr544rrtv5nwfk97zmlxmf0j7dtm9py6tv", + "displayName": "Account 950", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b5d3cdfcf0c3826a35e2cb4457e25113569ccab4a17d45cabf3926341cf89657" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/950H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yeq64yfvp0nkwac52et49yxven7ltyd9yx0vueavzjlzfnfjgcpr2", + "displayName": "Account 951", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4f57e0e2402920698511136cb66fab8d2696f3d913a1c430c5fb972c57582dc2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/951H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128p7qnd2nkh63dha7ad4vcgxahu2drc98qva039tfls8gcflxduj7j", + "displayName": "Account 952", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cd5dfdba73c56ef07c64e2987d3452d2b68a3c1b4fd893209412d022adab58db" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/952H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xlx7ertlt5f7lku0rlrlsjg7lyeagzzwf88596p5nkvn54l9ddtk2", + "displayName": "Account 953", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "184c3445ecd51457f15dd022a954a4a39428cb4e08ba794e48d20b06a2435fe9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/953H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yvp3trg9yma7wvhpfqzxdfesvskzllzdemycjc8h93hnu3mgpe8wz", + "displayName": "Account 954", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "bd21a70a519333c82eda86e3f35626ff33bb946f9cb35eaca73553e89c765144" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/954H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y2dtkwdp5frxv3atn6n4ecs0kn8sqywmyvnnqm7cp33cqd2fxsa4q", + "displayName": "Account 955", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "756fb9fd5e7b23a8a37afb81f229eba7ba56a63ccb5e865630f3ba38f5735917" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/955H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x4cvwpkepmac8umg3vs36eytwwxkwqgwz70evfa6gcxfxcjd5vsxf", + "displayName": "Account 956", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "d39105db1c9f453ef9cd3fb5115faf2c6d859ca011ec328f9fcbeb0683da6853" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/956H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xfv660308mpwmesm3jhvp0fhkc08x8ajq0p4nr5xk2m457fyuj5ae", + "displayName": "Account 957", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f9b280975567fc56f20889407ca80261c81bbc6bb2500555cdecd7a84485a03d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/957H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yu4ehg37ww455zr5yvm9mf7apshw4ng8une2hj9qnjmgtc2l9453v", + "displayName": "Account 958", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "08095edd45e29e2cd1dea7c5502fbaac52a3fa7f4dadc076e2e08651c882f0bd" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/958H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y8q7ylm4q6vsq53gn8tw0pp7lwgyy5rkwzqgx788utdp6n8t85r69", + "displayName": "Account 959", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1c6095756ab6f73738ae59db87b274370cb40318300cc7d12366bcf350ee4cd3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/959H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x2phhnvyv595xlv6plechu59d8q83wre5snmc4g9626axyg7zzp8c", + "displayName": "Account 960", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4f3e829fbea076729b823858635d406344721a007868c47a6ae90622006afaa8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/960H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xhf97h9wunu8wtm24p22yvq5rdzdpkjcm0n4fw0920frjan7ng23w", + "displayName": "Account 961", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c20371bfc78686125d5bf7d64ca8b9350889a201fd695ec3864e38d7a437f2ff" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/961H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1286nae6np8xwszfnr2f6pqrucvaqmcqeat9af49nxh566qlrzd03vu", + "displayName": "Account 962", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "91d321e7d83932ff4d60a64ac29c0eb9a5befc93ae245873673513398d7f3e9d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/962H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ydge8re9trznlrc3nxpfy9m9mny0jvad9856h33fd8crdac989h8g", + "displayName": "Account 963", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "3188ad9299c0a58de9a7e93099052d793e2f426d5b38da6eaa38f738c35144d8" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/963H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128uc60wvjdtfk466pje2zw5ej43ansv4ec3hwl0q6j9uhwvkt0tn76", + "displayName": "Account 964", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ecd194a41f4c835c8bb9c4c68bf99c227c4192253b001c5cfd2005446f925752" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/964H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128hsfc83xg7j3pjgnvyhsfrkjfjs9uhd2xvc42y23yrr7y3skj4wgk", + "displayName": "Account 965", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "271f43e70ffc0808ce25e75115bba1106fa493607cab22ca1248061ff8b24a0b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/965H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xe6xzvgzpp5axge3gjwn69f74t6hyj2huq893l8ur0lz34z973mf8", + "displayName": "Account 966", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "54ea64e8eea4f02293f443ff985d4510828070dd3597d4de44596a4e16769eba" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/966H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128r3qmtvqt8my3f8glh95wk59myv6340hk8svyv0f8ukumger9u6ze", + "displayName": "Account 967", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "cb4fbdb6b89b03bd537d72a6700a30cd6deb111fb0331c598dcfa3b8173d03d5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/967H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128kc0znp4knktewhdezy96whl6a2nryrfqw2y0x8k34yh7jjdhxqn7", + "displayName": "Account 968", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "69ae7fc27ac23d31e40cfc27a59c91bda7391fd2740f73e41eabb8f59a138fc1" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/968H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128dj9ahj430gt3vcgr337tyejss544gehkqxq7egzqcmjfv0r8vvnu", + "displayName": "Account 969", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "846f20a795e895059d3a9b79306b4baeb5cb470eeed308093a6cdb13fc86e8ba" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/969H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yvz9c5dmaxescrmfvtsnskex2wg0v7hgs2ppe74d2h2hjfm4f7naz", + "displayName": "Account 970", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "91393e5341b472cd146bb16eb4cd0bf8c316a46b08a175f6c79c842671f9ecb5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/970H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280vs8e8rw5h8syvzm4h4clx2n80qvvz508pgueg3huaq4sf7km0sa", + "displayName": "Account 971", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "88839727947b9abc00afd9d193d5b4b7b8a7e39d4a6b005634eebf9a3a09d51f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/971H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y0jtwpyk8x7x6tw4f4wx0p4edqldglv56utlggcq6h2c99z4ek0xz", + "displayName": "Account 972", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec466d3370555c78383627d03e69bb2a20d8bc4ca488459b07bd711ac00693d5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/972H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x9kfzcg2d7fz7rze3hanp2g9ppwrm05z55vqx69gqjx3p0cwqfk8r", + "displayName": "Account 973", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "1e431c44240e3c40c4b79ef27a209925c6c673aab645334a1a1a6ed7edf88a1d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/973H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ck8nt9fjf8krhfdfyqqpe7sq2j3tguh39fax98ufu30nxvdq7jnh", + "displayName": "Account 974", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "74b2a1b044b99a0c4c3b7f0c6faa722f612bb5cb67e264703fe788bf44e2f545" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/974H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x7gjetaf6pdhhuqkjqxdv5fn2te0wvkv4jy9zd2mz4dvhr6jecmqe", + "displayName": "Account 975", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "4cc12680af7e1864ec4f02e1f884224c0c38991ea924101d1d9c3d93a1e47b30" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/975H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129dxruzjgkm8ll8j0phws6y47mwmp5factlg8rcqah2y6sd3hg65zs", + "displayName": "Account 976", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "27e49e55f5bb6e4db6d713dd08f4ea6615c79c2e0a3e5d26357385a836e54ffe" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/976H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12ykd2n0fhmz6uuj6uv7ff3v5s2mn9uxfyhqeqjfq5g85v5prmzrdww", + "displayName": "Account 977", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ecdc161dc532ad58fab35ac4e87b955969bad98e0d59e0997fabb69277600293" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/977H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12yf3ktad2y5swqcy7y6qkwlr3he5p7jdvn64z392wkxly4ke9qckyv", + "displayName": "Account 978", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "fba38815dc02ecdc914cd4684bd1d646e6820a33cfd1c20b1afa1c632d0fa5f5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/978H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1282aq8md8w2jaezhx3wumqjdfr6vm0udd5wcl2ftt8uqutxn3vccjv", + "displayName": "Account 979", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f93c7217bc405379011f92ee5e5286f575ca9446edb1a7db2b4afeec5076e14b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/979H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x02s9m9gusuync87ywzjy3ueu0sl46da387tkdpwsl0h7t44m043h", + "displayName": "Account 980", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "140a177b6eac60b31489e0399596d1161e31734ee29a889b21f444d6b036fa1b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/980H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x8zvdp742l9zrsts20v6s2z2zyn0359t4z22s2k32l90xlt50capr", + "displayName": "Account 981", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "eae00acd8454c20a7d30e4e207498d0d7ea25115891080a086ee2e3757dc1914" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/981H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ek94tpvulnd402k2qy85yyshqjrswtmmqepjqutl9vm9l2aff5ph", + "displayName": "Account 982", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f2c94e63a185e4fc559e1fe321cb998627796bea494646d517735f759f082cf5" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/982H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129kyputues6f3uped6pmekdpts23alkln0r4fwmdtwdamx6kspwgcm", + "displayName": "Account 983", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c52a5cf1cad71789061edfb220b4dec16d11d5146397c214d437bc8e0f73c862" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/983H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xyh2f8kavmm694zffgck29jlr8lglsgp5t9elr660dltajpf6x3h7", + "displayName": "Account 984", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "f223d3814e65c4d2f0a817251a41aeb636af256f65d0c3182f0fa0afb46176ad" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/984H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x694cq3zke2c2j8w4ff45zqfypjtvp6zu5p9cer0ywsyytzhh9wys", + "displayName": "Account 985", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0e97481106c8023c8959d4fe4221ac883f92a8f141ddd5a4e7c65c08ef916f95" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/985H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xr7w79dde8trkqqr95zh7ymx4tth3hg2vsa7ehu8ph6u0xa7fg0xh", + "displayName": "Account 986", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "282a13caf034626ac7a1cd2a903f226b4b5dce8f931223abb1031eda9a902e2f" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/986H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128ez0z3jf3khf8amgucmfrwtlxnv7jg7azza89e9cc9c2h24r49wr3", + "displayName": "Account 987", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de6946f93fccc7be8445afaf005e6b20523531ee5d436823365687284e4fa27b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/987H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx128thhhurdjfw53h23gmq4tj0379az7sh3998n09p4nyjzetqzmhfft", + "displayName": "Account 988", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "de4109cdfd4018cb8ef7c0b1b20004a1a9056ac56b956d23e160c4812fd724b9" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/988H" + } + } + } + } + } + } + }, + "appearanceID": 4, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xudfzq9lp7fx09xtvchphc7zc2ayjd24rnkx7gs36erm5r83dld06", + "displayName": "Account 989", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "0842d8dbd4c7928b685b2cc3ba944aab88e28990d7feae24ca5e0c1d81f4e802" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/989H" + } + } + } + } + } + } + }, + "appearanceID": 5, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12x6qc2d6rfaenqpy0vz80l07u7ras66kwadjafa6wmzuqusjxml3y0", + "displayName": "Account 990", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b2cf9d97bd2b0a4abea92806c44d31741c3f15af1058a975320c11e94a6174d3" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/990H" + } + } + } + } + } + } + }, + "appearanceID": 6, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129z48qtl8a6gchqfxwcrh4n362j7zhqascgknjc6gxzx78elmm3zfu", + "displayName": "Account 991", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "b142b4d157c5c774c47415c92f8b3249655423b1e1566c4caa06abd182f34fda" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/991H" + } + } + } + } + } + } + }, + "appearanceID": 7, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129767sedv8l2aq9vvcqdz442rwu55qlka04dx4vj74gy7hjtnepwed", + "displayName": "Account 992", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "600486efc8b5c13fe25152e29c09517376380ae5039b712668f3b15b835f8a6b" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/992H" + } + } + } + } + } + } + }, + "appearanceID": 8, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx129mzewjnxnqwkl93y73y3uuwydy0luapeg6spr5k8gxct20xksh7yw", + "displayName": "Account 993", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "65b23158eb1ca08ff0c5c566f2d1be095e7e0c5ea20eb17b2c0bcef414daa04e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/993H" + } + } + } + } + } + } + }, + "appearanceID": 9, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xwejv344y69dqc0tuk66meruvkqyutruqlvcwwd30myyhpwmhy2kk", + "displayName": "Account 994", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a184b230550e3d9dee007f2569a8c2a6b6546ba4e9d237bd2b19b63d3c4d26aa" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/994H" + } + } + } + } + } + } + }, + "appearanceID": 10, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12xpf66pakxaxuktcl803g4ey58f857qqd287u4hr0hpd68n0ynje08", + "displayName": "Account 995", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "ec168b466c616a5a0ba97a82a17337a2575af13758a83328613e756d3358c3f2" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/995H" + } + } + } + } + } + } + }, + "appearanceID": 11, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y3yp7y9zdd2tcgzf0228m346uhj7rlns4j3643p4lv0qqg9px3q8g", + "displayName": "Account 996", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "01a6ccc82c56b4655e6ad9599dafac989e865e62f0228603cc0e94ef947f85df" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/996H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y9q77nwxzty8xs6s9n3xssuztf7vy556cnklwyctcm4l5a8yu9mn6", + "displayName": "Account 997", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "004062f7b3a42b6d0af0b7e60db8ad5ed63deea5c525f8f55396ad6954610e59" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/997H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y37vls7mmrart63te6z6fknz4kv9tfqn2xq2z3ztw59jur0humkky", + "displayName": "Account 998", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "add80d5809550c955611d91ed9f6cf642e38583ce8c0a0665e2dfe775129f54e" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/998H" + } + } + } + } + } + } + }, + "appearanceID": 2, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx1280kukz0ne5zfk0zmd9nh505gev37fwzzkfjknzp082hj75w7kpcd6", + "displayName": "Account 999", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "faba3a3fc503791a93f1a511e7e01a9549982891e8bfe2fbc46d120c0a25850d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/999H" + } + } + } + } + } + } + }, + "appearanceID": 3, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + } + ], + "personas": [], + "authorizedDapps": [] + } + ] +} \ No newline at end of file diff --git a/fixtures/vector/security_questions_factor_source_sample.json b/fixtures/vector/security_questions_factor_source_sample.json new file mode 100644 index 000000000..e2e681a03 --- /dev/null +++ b/fixtures/vector/security_questions_factor_source_sample.json @@ -0,0 +1,118 @@ +{ + "id": { + "kind": "securityQuestions", + "body": "aabc6041d95785ecfabe7d5ed5af259e20e4e3f5f95b16fdeca386bc75796b46" + }, + "common": { + "cryptoParameters": { + "supportedCurves": [ + "curve25519" + ], + "supportedDerivationPathSchemes": [ + "cap26" + ] + }, + "addedOn": "2024-06-03T14:24:37.597Z", + "lastUsedOn": "2024-06-03T14:24:37.597Z", + "flags": [] + }, + "sealedMnemonic": { + "securityQuestions": [ + { + "id": 0, + "version": 1, + "kind": "freeform", + "question": "What was the first exam you failed", + "expectedAnswerFormat": { + "answerStructure": ", , ", + "exampleAnswer": "MIT, year 4, Python", + "unsafeAnswers": [] + } + }, + { + "id": 1, + "version": 1, + "kind": "freeform", + "question": "In which city and which year did your parents meet?", + "expectedAnswerFormat": { + "answerStructure": ", ", + "exampleAnswer": "Berlin, 1976", + "unsafeAnswers": [] + } + }, + { + "id": 2, + "version": 1, + "kind": "freeform", + "question": "What was the first concert you attended?", + "expectedAnswerFormat": { + "answerStructure": ", , ", + "exampleAnswer": "Jean-Michel Jarre, Paris La Défense, 1990", + "unsafeAnswers": [] + } + }, + { + "id": 3, + "version": 1, + "kind": "freeform", + "question": "What was the name of the boy or the girl you first kissed?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Maria", + "unsafeAnswers": [] + } + }, + { + "id": 4, + "version": 1, + "kind": "freeform", + "question": "Where were you when you had your first kiss?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "At bus stop outside of Dallas", + "unsafeAnswers": [ + "Specifying only a country as location would be unsafe" + ] + } + }, + { + "id": 5, + "version": 1, + "kind": "freeform", + "question": "In what city and which year did you meet your spouse/significant other?", + "expectedAnswerFormat": { + "answerStructure": ", ", + "exampleAnswer": "Berlin, 1976", + "unsafeAnswers": [] + } + } + ], + "kdfScheme": { + "version1": { + "kdfKeyExchangesKeysFromQuestionsAndAnswers": null, + "kdfEncryptionKeysFromKeyExchangeKeys": null + } + }, + "encryptionScheme": { + "description": "AESGCM-256", + "version": 1 + }, + "encryptions": [ + "dd032b986e242f21fae6e15f93b9c15e187b0cafc90c1a89d90f1f1f2d90fca6c6bb381517929245b7fcea1de21901213141f3ffa8cbd278bfd4a589", + "376111f425c6ecfe64b81df590330daeb8432ad9bed4a1f341e839fc95ea5aadd8fa8e9065c7e684029b0a39902c5632baa1b86f03e5ab191d7d88b5", + "afe981e01b0bd28a334bb51b4a74a18ec9ec54cfff90ed25102287fed2758d2b6f3dda45d5692e51a4bfb356546c9e5c36b2da01fba9ed9608ba2398", + "2c6ee3a4a4013e57f74cd0711fdcda82983852b06c6348d4f60a144c2376047e579f801590b2a5d505998e9dc9fba7acea65bc679d91fd92490f25b9", + "a540daa2e7a233a3119a431539dd74b0ff765d82e54b1ee81770070db6c9fa01de1efd54ba2d09c47f8ed5361d7164bd7835114e33b4ae13b59f32e6", + "848b89fafaad094433e2e53edad04aac065355eaeb7e285ebfe77a076f2a51b0c36af4ff907b767b2948365e043b33420dae2fc83079eb5e59d1792f", + "e698d5c4c029a9bd65bef0731363924ba00f2035aaa81ae8a07a6b80993be8e5f3442a69317963e6079da226057cd8860dcf65fb4c86761d155cf382", + "8d6cd06b7e8e9cbf39188207a6bb08b5be8894169a9da714174328cde3972e6f7b0cc1fb03d0d67a75bd6d147b778cba33ee27143a90bc8c81b05280", + "cabe2ce3bb581b401a4a8262c88aca3f4846e689b4fdf687fb3183008be9ad3f92d1505db6a9b6e53972f1d77b7f5922c04cd317f7a99763c06b202d", + "d288038477ef05ee342fbe131149a0453a4be384f13feb0fc5af78a226350c8d8a19f93aa93b2909f7e08c99a62f0623a0a42e12f0fc1fe5359b8707", + "757195845e0df2191202d697e70d816a7d14fea0693637733eed7f9e692f1d94a5f57ed2ca9b7c0bb98282a567455c4a269d8da3f9dd78f3f08fc62c", + "cfdb359477a156e5c00f04c1111833bb8397fceb4a55dd7145299ce99d8a7c38da357863b5f44b440328b0ea5a886c03805f1ed4e847b274159b23e4", + "ba4d1ddcb32ee7f1ff400ef9ec925630a9d7929ed115a263a36b2a2b085c0e5175aeeddae43bfec701371cc2433ece6f826f488e0821588624b00959", + "86716d42e4f4a60a64b62db040b3a410f5791f868103117ff4a2d7d6034803261a3a509d8511cdfb78852568b1f8eb72dc76c3c34b581d2483ebd170", + "29cd144ed6e72662dafb294f8a8a075084be7fa227c3abae6fb4e336adbce560d355f08dcafe9512eac65f9896fc123d8a9545e538ba554d674a5c96" + ] + } +} \ No newline at end of file diff --git a/fixtures/vector/security_questions_factor_source_sample_other.json b/fixtures/vector/security_questions_factor_source_sample_other.json new file mode 100644 index 000000000..cb866e932 --- /dev/null +++ b/fixtures/vector/security_questions_factor_source_sample_other.json @@ -0,0 +1,124 @@ +{ + "id": { + "kind": "securityQuestions", + "body": "bb0ac72196f748bba4ddf9c6d87c4e3ea939750e3a207f312653aa25f3f9c060" + }, + "common": { + "cryptoParameters": { + "supportedCurves": [ + "curve25519" + ], + "supportedDerivationPathSchemes": [ + "cap26" + ] + }, + "addedOn": "2024-06-03T14:25:28.173Z", + "lastUsedOn": "2024-06-03T14:25:28.173Z", + "flags": [] + }, + "sealedMnemonic": { + "securityQuestions": [ + { + "id": 6, + "version": 1, + "kind": "freeform", + "question": "What is the middle name of your youngest child?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Maria", + "unsafeAnswers": [] + } + }, + { + "id": 7, + "version": 1, + "kind": "freeform", + "question": "What was the name of your first stuffed animal?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Oinky piggy pig", + "unsafeAnswers": [ + "Teddy", + "Cat", + "Dog", + "Winnie (the Poh)", + "(Peter) Rabbit" + ] + } + }, + { + "id": 8, + "version": 1, + "kind": "freeform", + "question": "What is your oldest cousin's middle name?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Maria", + "unsafeAnswers": [ + "Don't use this one if you and your cousin are very close and have plenty of mutual friends." + ] + } + }, + { + "id": 9, + "version": 1, + "kind": "freeform", + "question": "What was the last name of your third grade teacher?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Maria", + "unsafeAnswers": [] + } + }, + { + "id": 10, + "version": 1, + "kind": "freeform", + "question": "What is the name of a college you applied to but didn't attend?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Oxford", + "unsafeAnswers": [] + } + }, + { + "id": 11, + "version": 1, + "kind": "freeform", + "question": "What was the name of the first school you remember attending?", + "expectedAnswerFormat": { + "answerStructure": "", + "exampleAnswer": "Hogwartz", + "unsafeAnswers": [] + } + } + ], + "kdfScheme": { + "version1": { + "kdfKeyExchangesKeysFromQuestionsAndAnswers": null, + "kdfEncryptionKeysFromKeyExchangeKeys": null + } + }, + "encryptionScheme": { + "description": "AESGCM-256", + "version": 1 + }, + "encryptions": [ + "c8b46eb0b7c115b94a3342fd0cec4cabfc6c21ce6bd5ae57682a97fbcfe58e4527b71db215674861bfa4781b2d0816f19fafbecf6e9bf4ed73b94a4e", + "fe0fceaadb8cbf86bd856b0c7eb86cfd27e384d4a207b42b40eecebbb40e76f7630f6676fed51419ce099ab39a1db22ff9db193a141838e7f90d550e", + "3925d3648220467a879c9c0c617dcee77840346244ee939e1dde0fd3d1b77fd459192703a6934e241708aac928df4260a21db7dea8ca6097b649db04", + "dd1c438986859cb6503d8b9c2947ebffe936a989862b57eefdfb37acc7cd6e48701290e469e31120d6a80c8a7ea7f912fdb32d9144f19d919cafe5da", + "73f1a241c93205f5493bde8b4e488bfeb54be8e24f35c42588ee3a4328f88d6e1cf4760ce6d2abfd0e412037d0a5dd032f975b506d3cf1206a31deb9", + "6a9dfa565fc8ffb3a94327d3a7ff170ee0d23ce6bdf756bb6ea88ececa216dd665cd216122a4976e898fee7c0765785c8369a5b2b7033e896332f90a", + "4dc7d0f61bb26e06c825b4d7d32662ea24e267c060c8b7cbccec3420b6af4739a08836dd78a4ad998aec1f1691fe89963b08aba3955328e2f488f0f1", + "58c743fae1bb6522801e29815453b4eac4bb9dc6874a38da584b3605786b1f42fc7d980c855ef5c24188412a0c9653e8c0eea9329656e7c7bbe95d22", + "32aad719927e4e0df0b7a2e66089610e6d9cb68918eda5dceb4ef05b7e3be003e47919fc035c08355342f504b9e3c565c4d77761e302f57fbd84e7ad", + "42931cb866dd5acd831f26f341df4755247f83be06ebc7779be9e1fb83c6009a641b60c9d37b9d607f90e63139a21a9f98b4bcf529563b224da2d193", + "2da295f92098dc8330127ff2f175ebc0ee240b7138064d93938a3886b6c9a353cf74bf0c037fca7a709df248de3c21e292bbbd158fe75cc17f39587b", + "d1097ddb08f847c250ce304b4999a9ffed056d354c4f6a5a988a1d4df25cf129320551c2caf9b778ac0a4cdefb30a7587cf9b4436452710f3d7c4978", + "752a5d0f567bb494cf7db5ebb1aa269743c138e3559eec2830c2d807945c78538d861d437a0effbf56a16ca14012be5c881ba9908498ae3981b2f76d", + "fbad95841e4ded1161e6f828cd0ebf57a0ceeaf75a9f5cfa40acbd3893c44c577c93e69cf256cb4dbdd4b82d865bcd342243c25326f706b271eb6df4", + "9e570fcb29d78a40d148e2c66dc52aea054dd9d53cd6e8646eb030887d7d356ea5e74d439f5d116c04d6c1100864540222e9434b225a7004fdba0fe9" + ] + } +} diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkAntenna.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkingDriver.kt similarity index 95% rename from jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkAntenna.kt rename to jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkingDriver.kt index f40e3427a..941cd163b 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkAntenna.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/antenna/SargonNetworkingDriver.kt @@ -3,9 +3,9 @@ package com.radixdlt.sargon.antenna import com.radixdlt.sargon.CommonException -import com.radixdlt.sargon.NetworkAntenna import com.radixdlt.sargon.NetworkRequest import com.radixdlt.sargon.NetworkResponse +import com.radixdlt.sargon.NetworkingDriver import com.radixdlt.sargon.annotation.KoverIgnore import com.radixdlt.sargon.extensions.toBagOfBytes import com.radixdlt.sargon.extensions.toHttpMethod @@ -17,9 +17,9 @@ import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import okhttp3.executeAsync -class SargonNetworkAntenna( +class SargonNetworkingDriver( private val client: OkHttpClient -) : NetworkAntenna { +) : NetworkingDriver { override suspend fun executeNetworkRequest(request: NetworkRequest): NetworkResponse = runCatching { val mediaType = request.headers.extractMediaType() diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfo.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfo.kt new file mode 100644 index 000000000..d6ea9fd16 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfo.kt @@ -0,0 +1,11 @@ +package com.radixdlt.sargon.extensions + +import com.radixdlt.sargon.DeviceInfo +import com.radixdlt.sargon.HostId +import com.radixdlt.sargon.HostInfo +import com.radixdlt.sargon.newDeviceInfoFromHostInfo + +fun DeviceInfo.Companion.from( + hostId: HostId, + hostInfo: HostInfo +): DeviceInfo = newDeviceInfoFromHostInfo(hostId = hostId, hostInfo = hostInfo) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfoDescription.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfoDescription.kt new file mode 100644 index 000000000..af750db65 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/DeviceInfoDescription.kt @@ -0,0 +1,7 @@ +package com.radixdlt.sargon.extensions + +import com.radixdlt.sargon.DeviceInfoDescription +import com.radixdlt.sargon.deviceInfoDescriptionToString + +val DeviceInfoDescription.string: String + get() = deviceInfoDescriptionToString(deviceInfoDescription = this) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/FactorSource.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/FactorSource.kt index 258ac6fae..1524ceded 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/FactorSource.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/FactorSource.kt @@ -4,9 +4,9 @@ import com.radixdlt.sargon.DeviceFactorSource import com.radixdlt.sargon.FactorSource import com.radixdlt.sargon.FactorSourceId import com.radixdlt.sargon.FactorSourceKind +import com.radixdlt.sargon.HostInfo import com.radixdlt.sargon.LedgerHardwareWalletFactorSource import com.radixdlt.sargon.MnemonicWithPassphrase -import com.radixdlt.sargon.WalletClientModel import com.radixdlt.sargon.deviceFactorSourceIsMainBdfs import com.radixdlt.sargon.factorSourceSupportsBabylon import com.radixdlt.sargon.factorSourceSupportsOlympia @@ -17,31 +17,35 @@ val FactorSource.id: FactorSourceId get() = when (this) { is FactorSource.Device -> value.id.asGeneral() is FactorSource.Ledger -> value.id.asGeneral() + else -> throw NotImplementedError() } val FactorSource.kind: FactorSourceKind get() = when (this) { is FactorSource.Device -> value.kind is FactorSource.Ledger -> value.kind + else -> throw NotImplementedError() } fun DeviceFactorSource.asGeneral() = FactorSource.Device(value = this) fun LedgerHardwareWalletFactorSource.asGeneral() = FactorSource.Ledger(value = this) fun FactorSource.Device.Companion.olympia( - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) = newDeviceFactorSourceOlympia( mnemonicWithPassphrase = mnemonicWithPassphrase, - walletClientModel = WalletClientModel.ANDROID + hostInfo = hostInfo ).asGeneral() fun FactorSource.Device.Companion.babylon( isMain: Boolean, - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) = newDeviceFactorSourceBabylon( isMain = isMain, mnemonicWithPassphrase = mnemonicWithPassphrase, - walletClientModel = WalletClientModel.ANDROID + hostInfo = hostInfo ).asGeneral() val FactorSource.Device.isMain: Boolean diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HomeCardsManager.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HomeCardsManager.kt index 8b23efe75..a1c11e0fa 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HomeCardsManager.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HomeCardsManager.kt @@ -5,7 +5,7 @@ import androidx.datastore.preferences.core.Preferences import com.radixdlt.sargon.HomeCardsManager import com.radixdlt.sargon.HomeCardsObserver import com.radixdlt.sargon.NetworkId -import com.radixdlt.sargon.antenna.SargonNetworkAntenna +import com.radixdlt.sargon.antenna.SargonNetworkingDriver import com.radixdlt.sargon.os.homecards.HomeCardsStorageImpl import okhttp3.OkHttpClient @@ -15,7 +15,7 @@ fun HomeCardsManager.Companion.init( dataStore: DataStore, observer: HomeCardsObserver ) = HomeCardsManager( - networkAntenna = SargonNetworkAntenna(client = okHttpClient), + networkingDriver = SargonNetworkingDriver(client = okHttpClient), networkId = networkId, cardsStorage = HomeCardsStorageImpl(dataStore = dataStore), observer = observer diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HostOs.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HostOs.kt new file mode 100644 index 000000000..56aafe745 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/HostOs.kt @@ -0,0 +1,28 @@ +package com.radixdlt.sargon.extensions + +import com.radixdlt.sargon.HostOs +import com.radixdlt.sargon.hostOsGetName +import com.radixdlt.sargon.hostOsGetVendor +import com.radixdlt.sargon.hostOsGetVersion +import com.radixdlt.sargon.newHostOsAndroid +import com.radixdlt.sargon.newHostOsOther + +fun HostOs.Companion.android( + vendor: String, + version: String +): HostOs = newHostOsAndroid(vendor = vendor, version = version) + +fun HostOs.Companion.other( + name: String, + vendor: String, + version: String +): HostOs = newHostOsOther(name = name, vendor = vendor, version = version) + +val HostOs.name: String + get() = hostOsGetName(hostOs = this) + +val HostOs.vendor: String + get() = hostOsGetVendor(hostOs = this) + +val HostOs.version: String + get() = hostOsGetVersion(hostOs = this) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/NetworkMethod.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/NetworkMethod.kt index 1075bb1c6..9b2f02cf8 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/NetworkMethod.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/NetworkMethod.kt @@ -1,8 +1,6 @@ package com.radixdlt.sargon.extensions import com.radixdlt.sargon.NetworkMethod +import com.radixdlt.sargon.networkMethodToString -fun NetworkMethod.toHttpMethod(): String = when (this) { - NetworkMethod.POST -> "POST" - NetworkMethod.GET -> "GET" -} \ No newline at end of file +fun NetworkMethod.toHttpMethod(): String = networkMethodToString(method = this) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PersonaDataEntryEmailAddress.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PersonaDataEntryEmailAddress.kt index 1fb76696b..56c753054 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PersonaDataEntryEmailAddress.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PersonaDataEntryEmailAddress.kt @@ -1,14 +1,16 @@ package com.radixdlt.sargon.extensions -import com.radixdlt.sargon.PersonaDataEntryEmailAddress +import com.radixdlt.sargon.EmailAddress import com.radixdlt.sargon.newPersonaDataEntryEmailAddressFromJsonString import com.radixdlt.sargon.personaDataEntryEmailAddressToJsonString +typealias PersonaDataEntryEmailAddress = EmailAddress + @Throws(SargonException::class) -fun PersonaDataEntryEmailAddress.Companion.fromJson( +fun EmailAddress.Companion.fromJson( jsonString: String -): PersonaDataEntryEmailAddress = +): EmailAddress = newPersonaDataEntryEmailAddressFromJsonString(jsonString = jsonString) -fun PersonaDataEntryEmailAddress.toJson(): String = +fun EmailAddress.toJson(): String = personaDataEntryEmailAddressToJsonString(personaDataEntryEmailAddress = this) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PrivateHierarchicalDeterministicFactorSource.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PrivateHierarchicalDeterministicFactorSource.kt index 9ed1839b9..528fd10a2 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PrivateHierarchicalDeterministicFactorSource.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/PrivateHierarchicalDeterministicFactorSource.kt @@ -1,9 +1,9 @@ package com.radixdlt.sargon.extensions +import com.radixdlt.sargon.HostInfo import com.radixdlt.sargon.MnemonicWithPassphrase import com.radixdlt.sargon.NonEmptyMax32Bytes import com.radixdlt.sargon.PrivateHierarchicalDeterministicFactorSource -import com.radixdlt.sargon.WalletClientModel import com.radixdlt.sargon.newPrivateHdFactorSourceBabylon import com.radixdlt.sargon.newPrivateHdFactorSourceBabylonFromMnemonicWithPassphrase import com.radixdlt.sargon.newPrivateHdFactorSourceOlympiaFromMnemonicWithPassphrase @@ -12,27 +12,29 @@ import com.radixdlt.sargon.newPrivateHdFactorSourceOlympiaFromMnemonicWithPassph fun PrivateHierarchicalDeterministicFactorSource.Companion.init( isMainBDFS: Boolean, entropy: NonEmptyMax32Bytes, - walletClientModel: WalletClientModel + hostInfo: HostInfo ) = newPrivateHdFactorSourceBabylon( isMain = isMainBDFS, entropy = entropy, - walletClientModel = walletClientModel + hostInfo = hostInfo ) fun PrivateHierarchicalDeterministicFactorSource.Companion.olympia( - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) = newPrivateHdFactorSourceOlympiaFromMnemonicWithPassphrase( mnemonicWithPassphrase = mnemonicWithPassphrase, - walletClientModel = WalletClientModel.ANDROID + hostInfo = hostInfo ) fun PrivateHierarchicalDeterministicFactorSource.Companion.babylon( isMain: Boolean, - mnemonicWithPassphrase: MnemonicWithPassphrase + mnemonicWithPassphrase: MnemonicWithPassphrase, + hostInfo: HostInfo ) = newPrivateHdFactorSourceBabylonFromMnemonicWithPassphrase( isMain = isMain, mnemonicWithPassphrase = mnemonicWithPassphrase, - walletClientModel = WalletClientModel.ANDROID + hostInfo = hostInfo ) diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/Profile.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/Profile.kt index 52225489c..cad46e53d 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/Profile.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/Profile.kt @@ -1,6 +1,8 @@ package com.radixdlt.sargon.extensions import com.radixdlt.sargon.FactorSource +import com.radixdlt.sargon.HostId +import com.radixdlt.sargon.HostInfo import com.radixdlt.sargon.Profile import com.radixdlt.sargon.ProfileFileContents import com.radixdlt.sargon.checkIfEncryptedProfileJsonContainsLegacyP2pLinks @@ -14,10 +16,12 @@ import com.radixdlt.sargon.profileToJsonString fun Profile.Companion.init( deviceFactorSource: FactorSource.Device, - creatingDeviceName: String + hostId: HostId, + hostInfo: HostInfo ) = newProfile( deviceFactorSource = deviceFactorSource.value, - creatingDeviceName = creatingDeviceName + hostId = hostId, + hostInfo = hostInfo ) fun Profile.Companion.analyzeContentsOfFile(contents: String): ProfileFileContents = diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/RadixConnectMobile.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/RadixConnectMobile.kt index acdb80257..dbc47a90d 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/RadixConnectMobile.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/extensions/RadixConnectMobile.kt @@ -3,7 +3,7 @@ package com.radixdlt.sargon.extensions import android.content.Context import com.radixdlt.sargon.RadixConnectMobile import com.radixdlt.sargon.annotation.KoverIgnore -import com.radixdlt.sargon.antenna.SargonNetworkAntenna +import com.radixdlt.sargon.antenna.SargonNetworkingDriver import com.radixdlt.sargon.os.radixconnect.RadixConnectSessionStorage import okhttp3.OkHttpClient @@ -12,6 +12,6 @@ fun RadixConnectMobile.Companion.init( context: Context, okHttpClient: OkHttpClient ) = RadixConnectMobile( - networkAntenna = SargonNetworkAntenna(client = okHttpClient), + networkingDriver = SargonNetworkingDriver(client = okHttpClient), sessionStorage = RadixConnectSessionStorage(context = context) ) \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceFactorSourceSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceFactorSourceSample.kt new file mode 100644 index 000000000..27ab7d549 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceFactorSourceSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.DeviceFactorSource +import com.radixdlt.sargon.newDeviceFactorSourceSample +import com.radixdlt.sargon.newDeviceFactorSourceSampleOther + +@UsesSampleValues +val DeviceFactorSource.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): DeviceFactorSource = newDeviceFactorSourceSample() + + override fun other(): DeviceFactorSource = newDeviceFactorSourceSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoDescriptionSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoDescriptionSample.kt new file mode 100644 index 000000000..41006319e --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoDescriptionSample.kt @@ -0,0 +1,14 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.DeviceInfoDescription +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.newDeviceInfoDescriptionSample +import com.radixdlt.sargon.newDeviceInfoDescriptionSampleOther + +@UsesSampleValues +val DeviceInfoDescription.Companion.sample: Sample + get() = object : Sample { + override fun invoke(): DeviceInfoDescription = newDeviceInfoDescriptionSample() + + override fun other(): DeviceInfoDescription = newDeviceInfoDescriptionSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoSample.kt new file mode 100644 index 000000000..2ab81e5d8 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/DeviceInfoSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.DeviceInfo +import com.radixdlt.sargon.newDeviceInfoSample +import com.radixdlt.sargon.newDeviceInfoSampleOther + +@UsesSampleValues +val DeviceInfo.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): DeviceInfo = newDeviceInfoSample() + + override fun other(): DeviceInfo = newDeviceInfoSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostIdSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostIdSample.kt new file mode 100644 index 000000000..299ebf470 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostIdSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.HostId +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.newHostIdSample +import com.radixdlt.sargon.newHostIdSampleOther + +@UsesSampleValues +val HostId.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): HostId = newHostIdSample() + + override fun other(): HostId = newHostIdSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostInfoSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostInfoSample.kt new file mode 100644 index 000000000..33f2f3d11 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostInfoSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.HostInfo +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.newHostInfoSample +import com.radixdlt.sargon.newHostInfoSampleOther + +@UsesSampleValues +val HostInfo.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): HostInfo = newHostInfoSample() + + override fun other(): HostInfo = newHostInfoSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostOSSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostOSSample.kt new file mode 100644 index 000000000..eadcda098 --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/HostOSSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.HostOs +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.newHostOsSample +import com.radixdlt.sargon.newHostOsSampleOther + +@UsesSampleValues +val HostOs.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): HostOs = newHostOsSample() + + override fun other(): HostOs = newHostOsSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/LedgerHardwareWalletFactorSourceSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/LedgerHardwareWalletFactorSourceSample.kt new file mode 100644 index 000000000..535bead4d --- /dev/null +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/LedgerHardwareWalletFactorSourceSample.kt @@ -0,0 +1,15 @@ +package com.radixdlt.sargon.samples + +import com.radixdlt.sargon.annotation.UsesSampleValues +import com.radixdlt.sargon.LedgerHardwareWalletFactorSource +import com.radixdlt.sargon.newLedgerHardwareWalletFactorSourceSample +import com.radixdlt.sargon.newLedgerHardwareWalletFactorSourceSampleOther + +@UsesSampleValues +val LedgerHardwareWalletFactorSource.Companion.sample: Sample + get() = object : Sample { + + override fun invoke(): LedgerHardwareWalletFactorSource = newLedgerHardwareWalletFactorSourceSample() + + override fun other(): LedgerHardwareWalletFactorSource = newLedgerHardwareWalletFactorSourceSampleOther() + } \ No newline at end of file diff --git a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/PersonaDataEntryEmailAddressSample.kt b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/PersonaDataEntryEmailAddressSample.kt index 74ab48353..35af9b8d9 100644 --- a/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/PersonaDataEntryEmailAddressSample.kt +++ b/jvm/sargon-android/src/main/java/com/radixdlt/sargon/samples/PersonaDataEntryEmailAddressSample.kt @@ -1,15 +1,15 @@ package com.radixdlt.sargon.samples -import com.radixdlt.sargon.PersonaDataEntryEmailAddress +import com.radixdlt.sargon.EmailAddress import com.radixdlt.sargon.annotation.UsesSampleValues import com.radixdlt.sargon.newPersonaDataEntryEmailAddressSample import com.radixdlt.sargon.newPersonaDataEntryEmailAddressSampleOther @UsesSampleValues -val PersonaDataEntryEmailAddress.Companion.sample: Sample - get() = object : Sample { - override fun invoke(): PersonaDataEntryEmailAddress = newPersonaDataEntryEmailAddressSample() +val EmailAddress.Companion.sample: Sample + get() = object : Sample { + override fun invoke(): EmailAddress = newPersonaDataEntryEmailAddressSample() - override fun other(): PersonaDataEntryEmailAddress = newPersonaDataEntryEmailAddressSampleOther() + override fun other(): EmailAddress = newPersonaDataEntryEmailAddressSampleOther() } \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/AppPreferencesTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/AppPreferencesTest.kt index d71deef8e..52cdf26e7 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/AppPreferencesTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/AppPreferencesTest.kt @@ -24,7 +24,7 @@ class AppPreferencesTest: SampleTestable { security = Security( isCloudProfileSyncEnabled = true, isDeveloperModeEnabled = false, - structureConfigurationReferences = emptyList() + securityStructuresOfFactorSourceIds = emptyList() ), transaction = TransactionPreferences(defaultDepositGuarantee = 0.99.toDecimal192()) ), diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoDescriptionTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoDescriptionTest.kt new file mode 100644 index 000000000..4e4ffc1c1 --- /dev/null +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoDescriptionTest.kt @@ -0,0 +1,25 @@ +package com.radixdlt.sargon + +import com.radixdlt.sargon.extensions.string +import com.radixdlt.sargon.samples.Sample +import com.radixdlt.sargon.samples.sample +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class DeviceInfoDescriptionTest: SampleTestable { + override val samples: List> + get() = listOf(DeviceInfoDescription.sample) + + @Test + fun test_string() { + val sut = DeviceInfoDescription( + name = "My phone", + model = "Brand name" + ) + + assertEquals( + "My phone (Brand name)", + sut.string + ) + } +} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoTest.kt new file mode 100644 index 000000000..ea18614f6 --- /dev/null +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/DeviceInfoTest.kt @@ -0,0 +1,49 @@ +package com.radixdlt.sargon + +import com.radixdlt.sargon.extensions.from +import com.radixdlt.sargon.extensions.string +import com.radixdlt.sargon.extensions.vendor +import com.radixdlt.sargon.extensions.version +import com.radixdlt.sargon.samples.Sample +import com.radixdlt.sargon.samples.sample +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class DeviceInfoTest: SampleTestable { + override val samples: List> + get() = listOf(DeviceInfo.sample) + + @Test + fun testNewDeviceInfoFromHostInfo() { + val hostId = HostId.sample() + val hostInfo = HostInfo.sample() + + val deviceInfo = DeviceInfo.from(hostId, hostInfo) + + assertEquals( + hostId.id, + deviceInfo.id + ) + assertEquals( + hostId.generatedAt, + deviceInfo.date + ) + assertEquals( + hostInfo.hostAppVersion, + deviceInfo.hostAppVersion + ) + assertEquals( + hostInfo.description.string, + deviceInfo.description + ) + assertEquals( + hostInfo.hostOs.version, + deviceInfo.systemVersion + ) + assertEquals( + hostInfo.hostOs.vendor, + deviceInfo.hostVendor + ) + } +} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/EphemeralKeystore.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/EphemeralKeystore.kt deleted file mode 100644 index aa6a7d7dd..000000000 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/EphemeralKeystore.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.radixdlt.sargon - -import com.radixdlt.sargon.extensions.identifier - -internal object EphemeralKeystore : SecureStorage { - private val storage: MutableMap = mutableMapOf() - - override fun loadData(key: SecureStorageKey): ByteArray? = storage[key.identifier] - - override fun saveData(key: SecureStorageKey, data: ByteArray) { - storage[key.identifier] = data - } - - override fun deleteDataForKey(key: SecureStorageKey) { - storage.remove(key = key.identifier) - } - - fun isEmpty() = storage.isEmpty() - - fun contains(value: String): Boolean { - return storage.any { entry -> entry.value.decodeToString().contains(value) } - } -} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourceTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourceTest.kt index a1ae3537f..836308f03 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourceTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourceTest.kt @@ -1,5 +1,6 @@ package com.radixdlt.sargon +import android.bluetooth.BluetoothClass.Device import com.radixdlt.sargon.extensions.babylon import com.radixdlt.sargon.extensions.isMain import com.radixdlt.sargon.extensions.kind @@ -36,7 +37,8 @@ class FactorSourceTest : SampleTestable { assertTrue( FactorSource.Device.babylon( isMain = true, - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ).isMain ) } @@ -46,7 +48,8 @@ class FactorSourceTest : SampleTestable { assertFalse( FactorSource.Device.babylon( isMain = false, - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ).isMain ) } @@ -55,7 +58,8 @@ class FactorSourceTest : SampleTestable { fun testNewBabylon() { val factorSource = FactorSource.Device.babylon( isMain = false, - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ) assertTrue(factorSource.supportsBabylon) assertFalse(factorSource.supportsOlympia) @@ -64,7 +68,8 @@ class FactorSourceTest : SampleTestable { @Test fun testNewOlympia() { val factorSource = FactorSource.Device.olympia( - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ) assertTrue(factorSource.supportsOlympia) assertFalse(factorSource.supportsBabylon) diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourcesTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourcesTest.kt index 432a989dd..047a83324 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourcesTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/FactorSourcesTest.kt @@ -66,26 +66,7 @@ internal class FactorSourcesTest : IdentifiedArrayTest { val deviceInfo = DeviceInfo( id = UUID.randomUUID(), date = Timestamp.now(), - description = "Unit test" + description = "Samsung Galaxy (My Precious)", + systemVersion = "0.0.1", + hostAppVersion = "1.6.0", + hostVendor = "Samsung" ) val header = Header.init(creatingDevice = deviceInfo) diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostIdTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostIdTest.kt new file mode 100644 index 000000000..1b38e30c8 --- /dev/null +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostIdTest.kt @@ -0,0 +1,9 @@ +package com.radixdlt.sargon + +import com.radixdlt.sargon.samples.Sample +import com.radixdlt.sargon.samples.sample + +class HostIdTest: SampleTestable { + override val samples: List> + get() = listOf(HostId.sample) +} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostInfoTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostInfoTest.kt new file mode 100644 index 000000000..17e30a978 --- /dev/null +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/HostInfoTest.kt @@ -0,0 +1,9 @@ +package com.radixdlt.sargon + +import com.radixdlt.sargon.samples.Sample +import com.radixdlt.sargon.samples.sample + +class HostInfoTest: SampleTestable { + override val samples: List> + get() = listOf(HostInfo.sample) +} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/IdentityAddressTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/IdentityAddressTest.kt index 7f8a7643d..327b6c9ac 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/IdentityAddressTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/IdentityAddressTest.kt @@ -18,7 +18,7 @@ class IdentityAddressTest: SampleTestable { @Test fun test() { - val addressString = "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x" + val addressString = "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g" val identityAddress = IdentityAddress.init(validatingAddress = addressString) assertEquals(addressString, identityAddress.string) @@ -35,10 +35,10 @@ class IdentityAddressTest: SampleTestable { @Test fun testFormat() { - val addressString = "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x" + val addressString = "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g" val address = IdentityAddress.init(validatingAddress = addressString) - assertEquals("iden...w0mg6x", address.formatted()) + assertEquals("iden...en489g", address.formatted()) assertEquals( addressString, address.formatted(format = AddressFormat.FULL) diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/NetworkAntennaTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/NetworkAntennaTest.kt index 094a8d718..d73fe6669 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/NetworkAntennaTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/NetworkAntennaTest.kt @@ -1,6 +1,6 @@ package com.radixdlt.sargon -import com.radixdlt.sargon.antenna.SargonNetworkAntenna +import com.radixdlt.sargon.antenna.SargonNetworkingDriver import com.radixdlt.sargon.extensions.compareTo import com.radixdlt.sargon.extensions.toDecimal192 import com.radixdlt.sargon.extensions.toHttpMethod @@ -19,7 +19,7 @@ class NetworkAntennaTest { @Test @Tag("IntegrationTests") fun testNetwork() = runBlocking { - val client = GatewayClient(SargonNetworkAntenna(okHttpClient), NetworkId.MAINNET) + val client = GatewayClient(SargonNetworkingDriver(okHttpClient), NetworkId.MAINNET) val xrdBalance = client.xrdBalanceOfAccountOrZero(address = AccountAddress.sampleMainnet()) diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PersonaDataEntryTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PersonaDataEntryTest.kt index addc2d56e..f140d083c 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PersonaDataEntryTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PersonaDataEntryTest.kt @@ -10,11 +10,11 @@ class PersonaDataEntryTest { @Test fun testEmailJsonRoundtrip() { - val sut = PersonaDataEntryEmailAddress.sample() + val sut = EmailAddress.sample() assertEquals( sut, - PersonaDataEntryEmailAddress.fromJson(sut.toJson()) + EmailAddress.fromJson(sut.toJson()) ) } diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PrivateHierarchicalDeterministicFactorSourceTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PrivateHierarchicalDeterministicFactorSourceTest.kt index d68377a56..a33a097f0 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PrivateHierarchicalDeterministicFactorSourceTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/PrivateHierarchicalDeterministicFactorSourceTest.kt @@ -17,7 +17,8 @@ class PrivateHierarchicalDeterministicFactorSourceTest { fun testNewBabylon() { val sut = PrivateHierarchicalDeterministicFactorSource.babylon( isMain = true, - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ) Assertions.assertTrue(sut.factorSource.asGeneral().supportsBabylon) } @@ -25,7 +26,8 @@ class PrivateHierarchicalDeterministicFactorSourceTest { @Test fun testNewOlympia() { val sut = PrivateHierarchicalDeterministicFactorSource.olympia( - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ) Assertions.assertTrue(sut.factorSource.asGeneral().supportsOlympia) } @@ -36,14 +38,16 @@ class PrivateHierarchicalDeterministicFactorSourceTest { FactorSourceKind.DEVICE, PrivateHierarchicalDeterministicFactorSource.babylon( isMain = true, - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ).factorSource.kind ) assertEquals( FactorSourceKind.DEVICE, PrivateHierarchicalDeterministicFactorSource.olympia( - mnemonicWithPassphrase = MnemonicWithPassphrase.sample() + mnemonicWithPassphrase = MnemonicWithPassphrase.sample(), + hostInfo = HostInfo.sample() ).factorSource.kind ) } diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/ProfileTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/ProfileTest.kt index fcd987666..009443ab8 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/ProfileTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/ProfileTest.kt @@ -25,18 +25,21 @@ class ProfileTest : SampleTestable { @Test fun testInit() { + val hostId = HostId.sample.other() + val hostInfo = HostInfo.sample.other() val hdFactorSource = PrivateHierarchicalDeterministicFactorSource.init( isMainBDFS = true, entropy = NonEmptyMax32Bytes(bagOfBytes = randomBagOfBytes(byteCount = 32)), - walletClientModel = WalletClientModel.ANDROID + hostInfo = hostInfo ) val profile = Profile.init( deviceFactorSource = hdFactorSource.factorSource.asGeneral(), - creatingDeviceName = "Unit tests" + hostId = hostId, + hostInfo = hostInfo ) - assertEquals("Unit tests - Android", profile.header.creatingDevice.description) + assertEquals("My Pixel (Pixel 8 Pro)", profile.header.creatingDevice.description) } @Test diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/TransactionManifestTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/TransactionManifestTest.kt index 6f9d433b7..8d7a7050d 100644 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/TransactionManifestTest.kt +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/TransactionManifestTest.kt @@ -172,7 +172,7 @@ class TransactionManifestTest : SampleTestable { TransactionManifest.createMultipleFungibleTokens( addressOfOwner = AccountAddress.init( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) @@ -180,7 +180,7 @@ class TransactionManifestTest : SampleTestable { assertTrue(contains("CREATE_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY")) assertTrue( contains( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) assertEquals(10, occurrences("symbol")) @@ -194,7 +194,7 @@ class TransactionManifestTest : SampleTestable { TransactionManifest.createMultipleFungibleTokens( addressOfOwner = AccountAddress.init( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ), count = count ) @@ -203,7 +203,7 @@ class TransactionManifestTest : SampleTestable { assertTrue(contains("CREATE_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY")) assertTrue( contains( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) assertEquals(count.toInt(), occurrences("symbol")) @@ -219,7 +219,7 @@ class TransactionManifestTest : SampleTestable { TransactionManifest.createMultipleNonFungibleTokens( addressOfOwner = AccountAddress.init( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ), collectionCount = collections.toUByte(), nftsPerCollection = nftsPerCollection.toUByte() @@ -229,7 +229,7 @@ class TransactionManifestTest : SampleTestable { assertTrue(contains("CREATE_NON_FUNGIBLE_RESOURCE_WITH_INITIAL_SUPPLY")) assertTrue( contains( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) assertEquals( @@ -246,14 +246,14 @@ class TransactionManifestTest : SampleTestable { TransactionManifest.createMultipleNonFungibleTokens( addressOfOwner = AccountAddress.init( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) with(manifest.instructionsString) { assertTrue( contains( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" ) ) } diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/WalletTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/WalletTest.kt deleted file mode 100644 index 3a3233246..000000000 --- a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/WalletTest.kt +++ /dev/null @@ -1,124 +0,0 @@ -package com.radixdlt.sargon - -import com.radixdlt.sargon.extensions.init -import com.radixdlt.sargon.extensions.toBagOfBytes -import com.radixdlt.sargon.samples.sample -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import kotlin.random.Random - -class WalletTest { - - @Test - fun test() { - println("🚀 Test Wallet in Kotlin start") - - val storage = EphemeralKeystore - assertTrue(storage.isEmpty()) - - println("🔮 GENERATING NEW WALLET") - val wallet = Wallet.with(entropy = ByteArray(32) { 0xFF.toByte() }, secureStorage = storage) - - assertTrue( - storage.contains( - value = - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote" - ) - ) - println("✨ SUCCESSFULLY GENERATED NEW WALLET ✅") - - println("🔮 Creating first account on mainnet") - val initialNameOfFirstAccount = "Alice" - // Not created any account yet... - assertFalse(storage.contains(value = initialNameOfFirstAccount)) - assertTrue(wallet.profile().networks.isEmpty()) - var main0 = wallet.createAndSaveNewAccount( - networkId = NetworkId.MAINNET, - name = DisplayName.init(validating = initialNameOfFirstAccount) - ) - assertEquals(NetworkId.MAINNET, main0.networkId) - assertEquals(1, wallet.profile().networks.size) - assertEquals(1, wallet.profile().networks[0].accounts.size) - assertEquals( - initialNameOfFirstAccount, - wallet.profile().networks[0].accounts[0].displayName.value - ) - assertTrue(storage.contains(value = initialNameOfFirstAccount)) - println("✨ Successfully created first account ✅") - - println("🔮 Update account using `update_account`") - var updatedNameOfFirstAccount = "Stella" - main0.displayName = DisplayName.init(validating = updatedNameOfFirstAccount) - main0.appearanceId = AppearanceId.sample.other() - val main0Updated = wallet.updateAccount(to = main0) - assertEquals(main0, main0Updated) - assertEquals( - updatedNameOfFirstAccount, - wallet.profile().networks[0].accounts[0].displayName.value - ) - assertEquals( - AppearanceId.sample.other(), - wallet.profile().networks[0].accounts[0].appearanceId - ) - assertTrue(storage.contains(value = updatedNameOfFirstAccount)) - println("✨ Successfully updated first account using `update_account` ✅") - - println("🔮 Renaming account using changeNameOfAccount") - updatedNameOfFirstAccount = "Satoshi" - main0 = wallet.changeNameOfAccount( - address = main0.address, - to = DisplayName.init(validating = updatedNameOfFirstAccount) - ) - assertEquals( - updatedNameOfFirstAccount, - wallet.profile().networks[0].accounts[0].displayName.value - ) - assertTrue(storage.contains(value = updatedNameOfFirstAccount)) - println("✨ Successfully renamed first account using changeNameOfAccount ✅") - - println("🔮 Creating second mainnet account") - val main1 = wallet.createAndSaveNewAccount( - networkId = NetworkId.MAINNET, - name = DisplayName.init(validating = "Bob") - ) - assertNotEquals(main0.address, main1.address) - assertEquals(main0.networkId, main1.networkId) - assertEquals(1, wallet.profile().networks.size) - assertEquals(listOf(main0, main1), wallet.profile().networks[0].accounts) - - println("🔮 Creating first testnet account") - val testnetAccountName = "Hello Radix Account!" - val test0 = wallet.createAndSaveNewAccount( - networkId = NetworkId.STOKENET, - name = DisplayName.init(validating = testnetAccountName) - ) - assertEquals(2, wallet.profile().networks.size) - assertEquals(listOf(test0), wallet.profile().networks[1].accounts) - assertEquals(testnetAccountName, wallet.profile().networks[1].accounts[0].displayName.value) - assertEquals(NetworkId.STOKENET, wallet.profile().networks[1].accounts[0].networkId) - assertTrue(storage.contains(value = testnetAccountName)) - println("✨ Successfully created first testnet account ✅") - - println("✅ Test Wallet in Kotlin completed ") - } - - val Wallet.Companion.defaultPhoneName: String - get() = "Android Phone" - - fun Wallet.Companion.with( - entropy: ByteArray = ByteArray(32).apply { Random.nextBytes(this) }, - phoneName: String = Wallet.Companion.defaultPhoneName, - secureStorage: SecureStorage - ): Wallet { - return Wallet.byCreatingNewProfileAndSecretsWithEntropy( - entropy = NonEmptyMax32Bytes(bagOfBytes = entropy.toBagOfBytes()), - walletClientModel = WalletClientModel.ANDROID, - walletClientName = phoneName, - secureStorage = secureStorage - ) - } - -} \ No newline at end of file diff --git a/jvm/sargon-android/src/test/java/com/radixdlt/sargon/os/HostOsTest.kt b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/os/HostOsTest.kt new file mode 100644 index 000000000..dcb26796c --- /dev/null +++ b/jvm/sargon-android/src/test/java/com/radixdlt/sargon/os/HostOsTest.kt @@ -0,0 +1,48 @@ +package com.radixdlt.sargon.os + +import com.radixdlt.sargon.HostOs +import com.radixdlt.sargon.SampleTestable +import com.radixdlt.sargon.extensions.android +import com.radixdlt.sargon.extensions.name +import com.radixdlt.sargon.extensions.other +import com.radixdlt.sargon.extensions.vendor +import com.radixdlt.sargon.extensions.version +import com.radixdlt.sargon.samples.Sample +import com.radixdlt.sargon.samples.sample +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class HostOsTest: SampleTestable { + override val samples: List> + get() = listOf(HostOs.sample) + + @Test + fun testGetName() { + val sut = HostOs.android("Google", "14 (API 34)") + + assertEquals("Android", sut.name) + } + + @Test + fun testGetVendor() { + val sut = HostOs.android("Google", "14 (API 34)") + + assertEquals("Google", sut.vendor) + } + + @Test + fun testGetVersion() { + val sut = HostOs.android("Google", "14 (API 34)") + + assertEquals("Android 14 (API 34)", sut.version) + } + + @Test + fun testOther() { + val sut = HostOs.other("macos", "Apple", "14.5") + + assertEquals("macos", sut.name) + assertEquals("Apple", sut.vendor) + assertEquals("macos 14.5", sut.version) + } +} \ No newline at end of file diff --git a/scripts/ios/test.sh b/scripts/ios/test.sh index b4a018a5e..d2db87edb 100755 --- a/scripts/ios/test.sh +++ b/scripts/ios/test.sh @@ -5,6 +5,7 @@ set -u # By default we test with code coverage and display details (lines missed) +should_build=false export_code_cov=false testonly=false # if true, no code coverage will happen summary=false # if true, code coverage will only show summary, no details @@ -13,6 +14,10 @@ code_cov_report_file_path="" for arg in "$@" do case $arg in + --build) + should_build=true + shift # Remove --build from processing + ;; --codecov) export_code_cov=true code_cov_report_file_path="$2" @@ -44,9 +49,13 @@ echo "✨ PWD: $PWD" echo "✨ Ensure 'useLocalFramework' is set to 'true' in Package.swift" sh ./scripts/ios/ensure-is-local.sh || exit $? -echo "✨ Building Sargon..." -sh ./scripts/ios/build-sargon.sh --maconly || exit $? -echo "✨ Sargon built" +if $should_build; then + echo "✨ Building Sargon..." + sh ./scripts/ios/build-sargon.sh --maconly || exit $? + echo "✨ Sargon built" +else + echo "🙅‍♀️ Skip building, test (and coverage?) only" +fi echo "✨ Calling 'swift test'" if $testonly; then diff --git a/src/core/error/common_error.rs b/src/core/error/common_error.rs index f55d7cb1d..5af3348f1 100644 --- a/src/core/error/common_error.rs +++ b/src/core/error/common_error.rs @@ -268,7 +268,7 @@ pub enum CommonError { ProfileDoesNotContainFactorSourceWithID { bad_value: FactorSourceID } = 10073, - #[error("No active ProfileID found in SecureStorage.")] + #[error("No active ProfileID found in SecureStorageDriver.")] NoActiveProfileIDSet = 10074, #[error("No Profile snapshot found for ProfileID {bad_value}")] @@ -277,20 +277,20 @@ pub enum CommonError { #[error("Account Already Present {bad_value}")] AccountAlreadyPresent { bad_value: AccountAddress } = 10076, - #[error("Unable to acquire write lock for Profile inside Wallet")] + #[error("Unable to acquire write lock for Profile.")] UnableToAcquireWriteLockForProfile = 10077, - #[error("Failed save Mnemonic to SecureStorage with FactorSourceID: {bad_value}")] + #[error("Failed save Mnemonic to SecureStorageDriver with FactorSourceID: {bad_value}")] UnableToSaveMnemonicToSecureStorage { bad_value: FactorSourceIDFromHash } = 10078, #[error( - "Failed load Mnemonic from SecureStorage with FactorSourceID: {bad_value}" + "Failed load Mnemonic from SecureStorageDriver with FactorSourceID: {bad_value}" )] UnableToLoadMnemonicFromSecureStorage { bad_value: FactorSourceIDFromHash } = 10079, - #[error("Failed save FactorSource to SecureStorage, FactorSourceID: {bad_value}")] + #[error("Failed save FactorSource to SecureStorageDriver, FactorSourceID: {bad_value}")] UnableToSaveFactorSourceToProfile { bad_value: FactorSourceID } = 10080, #[error("Expected IdentityPath but got something else.")] @@ -299,8 +299,8 @@ pub enum CommonError { #[error("Invalid PersonaData - phone number empty")] PersonaDataInvalidPhoneNumberEmpty = 10082, - #[error("Invalid PersonaData - email address empty")] - PersonaDataInvalidEmailAddressEmpty = 10083, + #[error("Invalid email address, cannot be empty")] + EmailAddressEmpty = 10083, #[error("Invalid PersonaData - family name empty ")] PersonaDataInvalidNameFamilyNameEmpty = 10084, @@ -488,7 +488,7 @@ pub enum CommonError { ElementDoesNotExist { id: String } = 10135, #[error("Item identified by ID {id} already exist")] - ElementAlreadyExist { id: String } = 10136, + IdentifiableItemAlreadyExist { id: String } = 10136, #[error("Invalid RadixConnectPurpose, bad value: {bad_value}")] InvalidRadixConnectPurpose { bad_value: String } = 10137, @@ -559,6 +559,88 @@ pub enum CommonError { #[error("Failed saving home cards")] FailedSavingHomeCards = 10156, + + #[error( + "Failed to load Profile from secure storage, profile id: {profile_id}" + )] + UnableToLoadProfileFromSecureStorage { profile_id: ProfileID } = 10157, + + #[error("Failed to save HostId to secure storage")] + UnableToSaveHostIdToSecureStorage = 10158, + + #[error("Unable to acquire read lock for profile")] + UnableToAcquireReadLockForProfile = 10159, + + #[error("Failed to read from unsafe storage.")] + UnsafeStorageReadError = 10160, + + #[error("Failed to write to unsafe storage.")] + UnsafeStorageWriteError = 10161, + + #[error("Failed to create file path from string: '{bad_value}'")] + FailedToCreateFilePathFromString { bad_value: String } = 10162, + + #[error("Expected collection to not be empty")] + ExpectedNonEmptyCollection = 10163, + + #[error("Failed to add all accounts, found duplicated account.")] + UnableToAddAllAccountsDuplicatesFound = 10164, + + #[error("Profile last used on other device {other_device_id} (this device: {this_device_id})")] + ProfileUsedOnOtherDevice { + other_device_id: DeviceID, + this_device_id: DeviceID, + } = 10165, + + #[error("Failed To create DeviceID (UUID) from string: {bad_value}")] + InvalidDeviceID { bad_value: String } = 10166, + + #[error("Tried to replace profile with one with a different ProfileID than the current one. Use `import_profile` instead.")] + TriedToUpdateProfileWithOneWithDifferentID = 10167, + + #[error("Invalid path, bad value: '{bad_value}'")] + InvalidPath { bad_value: String } = 10168, + + #[error("Failed to save file: '{path}'")] + FailedToSaveFile { path: String } = 10169, + + #[error("Failed to load file: '{path}'")] + FailedToLoadFile { path: String } = 10170, + + #[error("Failed to delete file: '{path}'")] + FailedToDeleteFile { path: String } = 10171, + + #[error("Not permission enough to access file: '{path}'")] + NotPermissionToAccessFile { path: String } = 10172, + + #[error("Invalid Arculus Card Model")] + InvalidArculusCardModel { bad_value: String } = 10173, + + #[error("Expected ArculusCard factor source got something else")] + ExpectedArculusCardFactorSourceGotSomethingElse = 10174, + + #[error("Failed to Derive Key after max attempts")] + FailedToDeriveKeyAfterMaxAttempts = 10175, + + #[error("Failed to decrypt sealed mnemonic")] + FailedToDecryptSealedMnemonic = 10176, + + #[error("Answers to Security Questions cannot be empty")] + AnswersToSecurityQuestionsCannotBeEmpty = 10177, + + #[error("Integrity Violation, mutation of FactorSource is not allowed to mutate its ID")] + IntegrityViolationMutationOfFactorSourceIsNotAllowedToMutateItsID = 10178, + + #[error("Invalid SecurityStructureID, bad value: '{bad_value}'")] + InvalidSecurityStructureID { bad_value: String } = 10179, + + #[error( + "Invalid SecurityStructure, it references Factors not in profile (by FactorSourceID)." + )] + StructureReferencesUnknownFactorSource = 10180, + + #[error("Invalid Questions and Answers count, expected: {expected}, found: {found}")] + InvalidQuestionsAndAnswersCount { expected: u16, found: u16 } = 10181, } #[uniffi::export] @@ -568,7 +650,7 @@ pub fn error_message_from_error(error: &CommonError) -> String { impl CommonError { pub fn error_code(&self) -> u32 { - unsafe { *<*const _>::from(self).cast::() } + core::intrinsics::discriminant_value(self) } pub fn is_safe_to_show_error_message(&self) -> bool { diff --git a/src/core/types/appearance_id.rs b/src/core/types/appearance_id.rs index 5dfad9c95..904493ce2 100644 --- a/src/core/types/appearance_id.rs +++ b/src/core/types/appearance_id.rs @@ -23,66 +23,34 @@ pub struct AppearanceID { impl AppearanceID { /// The number of different appearances - pub const MAX: u8 = 11; + pub const COUNT: u8 = 12; pub fn new(value: u8) -> Result { - if value > Self::MAX { + if value >= Self::COUNT { return Err(CommonError::InvalidAppearanceID { bad_value: value }); } Ok(Self { value }) } pub fn from_number_of_accounts_on_network(n: usize) -> Self { - Self::new((n % ((Self::MAX + 1) as usize)) as u8).unwrap() + Self::new((n % (Self::COUNT as usize)) as u8).unwrap() } // Probably want this as a macro... but it is just not worth it, why I boilerplate it. fn declare(value: u8) -> Self { Self::new(value).expect("Should have declared valid value.") } - pub fn gradient0() -> Self { - Self::declare(0) - } - pub fn gradient1() -> Self { - Self::declare(1) - } - pub fn gradient2() -> Self { - Self::declare(2) - } - pub fn gradient3() -> Self { - Self::declare(3) - } - pub fn gradient4() -> Self { - Self::declare(4) - } - pub fn gradient5() -> Self { - Self::declare(5) - } - pub fn gradient6() -> Self { - Self::declare(6) - } - pub fn gradient7() -> Self { - Self::declare(7) - } - pub fn gradient8() -> Self { - Self::declare(8) - } - pub fn gradient9() -> Self { - Self::declare(9) - } - pub fn gradient10() -> Self { - Self::declare(10) - } - pub fn gradient11() -> Self { - Self::declare(11) + + pub fn all() -> Vec { + (0..Self::COUNT).map(Self::declare).collect_vec() } } impl HasSampleValues for AppearanceID { fn sample() -> Self { - Self::gradient0() + *Self::all().first().unwrap() } fn sample_other() -> Self { - Self::gradient11() + *Self::all().iter().last().unwrap() } } @@ -124,6 +92,11 @@ mod tests { assert_ne!(SUT::sample(), SUT::sample_other()); } + #[test] + fn len_is_count() { + assert_eq!(SUT::all().len(), SUT::COUNT as usize); + } + #[test] fn test_from_number_of_accounts() { assert_eq!(SUT::from_number_of_accounts_on_network(12), SUT::sample()); @@ -178,6 +151,6 @@ mod tests { .into_iter() .map(|a| a.value) .collect::>(); - assert_eq!(set.len(), (SUT::MAX as usize) + 1); + assert_eq!(set.len(), SUT::COUNT as usize); } } diff --git a/src/core/types/appearance_id_uniffi_fn.rs b/src/core/types/appearance_id_uniffi_fn.rs index 739bcfbf0..fc86a11c2 100644 --- a/src/core/types/appearance_id_uniffi_fn.rs +++ b/src/core/types/appearance_id_uniffi_fn.rs @@ -24,20 +24,7 @@ pub fn new_appearance_id_sample_other() -> AppearanceID { #[uniffi::export] pub fn appearance_ids_all() -> Vec { - vec![ - AppearanceID::gradient0(), - AppearanceID::gradient1(), - AppearanceID::gradient2(), - AppearanceID::gradient3(), - AppearanceID::gradient4(), - AppearanceID::gradient5(), - AppearanceID::gradient6(), - AppearanceID::gradient7(), - AppearanceID::gradient8(), - AppearanceID::gradient9(), - AppearanceID::gradient10(), - AppearanceID::gradient11(), - ] + AppearanceID::all() } #[cfg(test)] @@ -49,7 +36,7 @@ mod uniffi_tests { #[test] fn new() { - assert_eq!(new_appearance_id(5).unwrap(), SUT::gradient5()); + assert_eq!(new_appearance_id(5).unwrap(), SUT::new(5).unwrap()); } #[test] diff --git a/src/core/types/identified_vec_of/identifiable.rs b/src/core/types/collections/identified_vec_of/identifiable.rs similarity index 100% rename from src/core/types/identified_vec_of/identifiable.rs rename to src/core/types/collections/identified_vec_of/identifiable.rs diff --git a/src/core/types/identified_vec_of/identified_vec_of.rs b/src/core/types/collections/identified_vec_of/identified_vec_of.rs similarity index 98% rename from src/core/types/identified_vec_of/identified_vec_of.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of.rs index 5dc5e8e9d..88a04e335 100644 --- a/src/core/types/identified_vec_of/identified_vec_of.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of.rs @@ -72,7 +72,7 @@ impl #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] diff --git a/src/core/types/identified_vec_of/identified_vec_of_display_debug.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_display_debug.rs similarity index 98% rename from src/core/types/identified_vec_of/identified_vec_of_display_debug.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_display_debug.rs index b38c9d30c..320e8a1dc 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_display_debug.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_display_debug.rs @@ -63,7 +63,7 @@ where #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] diff --git a/src/core/types/identified_vec_of/identified_vec_of_iterator.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_iterator.rs similarity index 67% rename from src/core/types/identified_vec_of/identified_vec_of_iterator.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_iterator.rs index f7fed75b8..637665e95 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_iterator.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_iterator.rs @@ -38,6 +38,20 @@ impl<'a, V: Debug + PartialEq + Eq + Clone + Identifiable> IntoIterator } } +impl IntoIterator + for IdentifiedVecOf +{ + type Item = V; + type IntoIter = OwnedIdentifiedVecOfIterator; + + fn into_iter(self) -> Self::IntoIter { + OwnedIdentifiedVecOfIterator { + ordered_map: self, + index: 0, + } + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct IdentifiedVecOfIterator< 'a, @@ -63,10 +77,34 @@ impl<'a, V: Debug + PartialEq + Eq + Clone + Identifiable> Iterator } } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct OwnedIdentifiedVecOfIterator< + V: Debug + PartialEq + Eq + Clone + Identifiable, +> { + ordered_map: IdentifiedVecOf, + index: usize, +} + +impl Iterator + for OwnedIdentifiedVecOfIterator +{ + type Item = V; + + fn next(&mut self) -> Option { + if self.index < self.ordered_map.len() { + let elem = self.ordered_map.0.get_index(self.index); + self.index += 1; + elem.map(|pair| pair.1.clone()) + } else { + None + } + } +} + #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] @@ -75,7 +113,7 @@ mod tests { #[test] fn into_from_iter() { let sut = SUT::sample(); - let iter = sut.into_iter(); + let iter = sut.clone().into_iter(); let from_iter = SUT::from_iter(iter); assert_eq!(from_iter, sut) } diff --git a/src/core/types/identified_vec_of/identified_vec_of_modify.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_modify.rs similarity index 90% rename from src/core/types/identified_vec_of/identified_vec_of_modify.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_modify.rs index 637f52024..d07d9a84a 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_modify.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_modify.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +use std::borrow::Borrow; + impl IdentifiedVecOf { /// Insert an item in the map **unconditionally**, using `id()` on item as key. /// @@ -22,7 +24,7 @@ impl IdentifiedVecOf { /// exists, if exists, an error is thrown. pub fn try_insert_unique(&mut self, item: V) -> Result<()> { if self.contains_by_id(&item) { - return Err(CommonError::ElementAlreadyExist { + return Err(CommonError::IdentifiableItemAlreadyExist { id: format!("{:?}", item.id()), }); } @@ -60,6 +62,10 @@ impl IdentifiedVecOf { (true, self.len() - 1) } + pub fn extend(&mut self, iter: impl IntoIterator) { + self.0.extend(iter.into_iter().map(|i| (i.id(), i))) + } + /// Remove and return the item with the `id`. /// /// Like `Vec::remove``, the item is removed by shifting all of the elements @@ -78,11 +84,15 @@ impl IdentifiedVecOf { /// `true`. #[cfg(not(tarpaulin_include))] // false negative #[inline] - pub fn update_with(&mut self, id: &V::ID, mut mutate: F) -> bool + pub fn update_with( + &mut self, + id: impl Borrow, + mut mutate: F, + ) -> bool where F: FnMut(&mut V), { - let Some(existing) = self.0.get_mut(id) else { + let Some(existing) = self.0.get_mut(id.borrow()) else { return false; }; mutate(existing); @@ -157,7 +167,7 @@ impl IdentifiedVecOf { #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] @@ -239,7 +249,9 @@ mod tests { let mut sut = SUT::sample(); assert_eq!( sut.try_insert_unique(User::grace()), - Err(CommonError::ElementAlreadyExist { id: "6".to_owned() }) + Err(CommonError::IdentifiableItemAlreadyExist { + id: "6".to_owned() + }) ); } @@ -247,29 +259,29 @@ mod tests { fn update_with_for_existing() { let foobar = User::new(0, "Foobar"); let mut sut = SUT::sample(); - assert_eq!(sut.get_id(&0), Some(&User::alice())); - assert!(sut.update_with(&0, |u| { *u = foobar.clone() })); - assert_eq!(sut.get_id(&0), Some(&foobar)); + assert_eq!(sut.get_id(0), Some(&User::alice())); + assert!(sut.update_with(0, |u| { *u = foobar.clone() })); + assert_eq!(sut.get_id(0), Some(&foobar)); } #[test] fn update_with_not_exists() { let mut sut = SUT::sample(); - assert!(!sut.update_with(&1, |u| { *u = User::bob() })); + assert!(!sut.update_with(1, |u| { *u = User::bob() })); } #[test] fn test_try_try_update_with_succeeds() { let foobar = User::new(0, "Foobar"); let mut sut = SUT::sample(); - assert_eq!(sut.get_id(&0), Some(&User::alice())); + assert_eq!(sut.get_id(0), Some(&User::alice())); assert!(sut .try_try_update_with(&0, |u| { *u = foobar.clone(); Ok(()) }) .is_ok()); - assert_eq!(sut.get_id(&0), Some(&foobar)); + assert_eq!(sut.get_id(0), Some(&foobar)); } #[test] @@ -288,9 +300,9 @@ mod tests { fn test_try_update_with_success() { let foobar = User::new(0, "Foobar"); let mut sut = SUT::sample(); - assert_eq!(sut.get_id(&0), Some(&User::alice())); + assert_eq!(sut.get_id(0), Some(&User::alice())); assert!(sut.try_update_with(&0, |u| { *u = foobar.clone() }).is_ok()); - assert_eq!(sut.get_id(&0), Some(&foobar)); + assert_eq!(sut.get_id(0), Some(&foobar)); } #[test] diff --git a/src/core/types/identified_vec_of/identified_vec_of_query.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_query.rs similarity index 84% rename from src/core/types/identified_vec_of/identified_vec_of_query.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_query.rs index c397b1221..6654522d5 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_query.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_query.rs @@ -1,4 +1,5 @@ use radix_rust::prelude::IndexSet; +use std::borrow::Borrow; use crate::prelude::*; @@ -25,8 +26,8 @@ impl IdentifiedVecOf { } /// Return `true`` if an item with `id` exists in the collection. - pub fn contains_id(&self, id: &V::ID) -> bool { - self.0.contains_key(id) + pub fn contains_id(&self, id: impl Borrow) -> bool { + self.0.contains_key(id.borrow()) } /// Get an item by index @@ -41,8 +42,8 @@ impl IdentifiedVecOf { /// Return a reference to the item, if it is present, else `None``. /// /// Computes in **O(1)** time (average). - pub fn get_id(&self, id: &V::ID) -> Option<&V> { - self.0.get(id) + pub fn get_id(&self, id: impl Borrow) -> Option<&V> { + self.0.get(id.borrow()) } /// Return a Vec of references to the items of the collection, in their order. @@ -64,7 +65,7 @@ impl IdentifiedVecOf { #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] @@ -73,9 +74,12 @@ mod tests { #[test] fn get_id() { let sut = SUT::sample(); - assert_eq!(sut.get_id(&0), Some(&User::alice())); - assert_eq!(sut.get_id(&2), Some(&User::carol())); - assert_eq!(sut.get_id(&200), None); + assert_eq!(sut.get_id(0), Some(&User::alice())); + assert_eq!( + sut.get_id(2), /* Can also omit & */ + Some(&User::carol()) + ); + assert_eq!(sut.get_id(200), None); } #[test] @@ -103,8 +107,8 @@ mod tests { #[test] fn contains_id() { let sut = SUT::sample(); - assert!(sut.contains_id(&0)); - assert!(!sut.contains_id(&200)); + assert!(sut.contains_id(0)); + assert!(!sut.contains_id(200)); } #[test] diff --git a/src/core/types/identified_vec_of/identified_vec_of_serde.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_serde.rs similarity index 98% rename from src/core/types/identified_vec_of/identified_vec_of_serde.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_serde.rs index 47412cdf8..f4f68bacf 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_serde.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_serde.rs @@ -37,7 +37,7 @@ where #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] diff --git a/src/core/types/identified_vec_of/identified_vec_of_uniffi_converter.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_uniffi_converter.rs similarity index 99% rename from src/core/types/identified_vec_of/identified_vec_of_uniffi_converter.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_uniffi_converter.rs index a51d33c8c..9b8ceed79 100644 --- a/src/core/types/identified_vec_of/identified_vec_of_uniffi_converter.rs +++ b/src/core/types/collections/identified_vec_of/identified_vec_of_uniffi_converter.rs @@ -70,7 +70,7 @@ impl> UFTypeId #[cfg(test)] mod tests { - use super::super::User; + use super::super::super::User; use super::*; #[allow(clippy::upper_case_acronyms)] diff --git a/src/core/types/identified_vec_of/identified_vec_of_validation_import_export.rs b/src/core/types/collections/identified_vec_of/identified_vec_of_validation_import_export.rs similarity index 100% rename from src/core/types/identified_vec_of/identified_vec_of_validation_import_export.rs rename to src/core/types/collections/identified_vec_of/identified_vec_of_validation_import_export.rs diff --git a/src/core/types/identified_vec_of/mod.rs b/src/core/types/collections/identified_vec_of/mod.rs similarity index 92% rename from src/core/types/identified_vec_of/mod.rs rename to src/core/types/collections/identified_vec_of/mod.rs index fa2f877f5..8248d1960 100644 --- a/src/core/types/identified_vec_of/mod.rs +++ b/src/core/types/collections/identified_vec_of/mod.rs @@ -8,12 +8,6 @@ mod identified_vec_of_serde; mod identified_vec_of_uniffi_converter; mod identified_vec_of_validation_import_export; -#[cfg(test)] -mod user; - -#[cfg(test)] -use user::*; - pub use identifiable::*; pub use identified_vec_of::*; pub use identified_vec_of_display_debug::*; diff --git a/src/core/types/collections/mod.rs b/src/core/types/collections/mod.rs new file mode 100644 index 000000000..0d78b0505 --- /dev/null +++ b/src/core/types/collections/mod.rs @@ -0,0 +1,9 @@ +mod identified_vec_of; + +#[cfg(test)] +mod user; + +pub use identified_vec_of::*; + +#[cfg(test)] +pub(super) use user::*; diff --git a/src/core/types/identified_vec_of/user.rs b/src/core/types/collections/user.rs similarity index 79% rename from src/core/types/identified_vec_of/user.rs rename to src/core/types/collections/user.rs index f3471d36e..49921671e 100644 --- a/src/core/types/identified_vec_of/user.rs +++ b/src/core/types/collections/user.rs @@ -75,20 +75,27 @@ impl User { } } +/// Alice(0), Carol(2), Erin(4), Grace(6) +#[cfg(test)] +fn sample_vec() -> Vec { + vec![User::alice(), User::carol(), User::erin(), User::grace()] +} + +/// Bob(1), David(3), Frank(5) +#[cfg(test)] +fn sample_vec_other() -> Vec { + vec![User::bob(), User::david(), User::frank()] +} + #[cfg(test)] impl crate::HasSampleValues for IdentifiedVecOf { /// Alice(0), Carol(2), Erin(4), Grace(6) fn sample() -> Self { - Self::from_iter([ - User::alice(), - User::carol(), - User::erin(), - User::grace(), - ]) + Self::from_iter(sample_vec()) } /// Bob(1), David(3), Frank(5) fn sample_other() -> Self { - Self::from_iter([User::bob(), User::david(), User::frank()]) + Self::from_iter(sample_vec_other()) } } diff --git a/src/core/types/decimal192.rs b/src/core/types/decimal192.rs index a54bc3a37..4e51b6063 100644 --- a/src/core/types/decimal192.rs +++ b/src/core/types/decimal192.rs @@ -1230,7 +1230,7 @@ mod test_decimal { test(f32::MIN as f64, "-340282346638528860000000000000000000000"); test(123456789.87654321, "123456789.87654321"); test(4.012_345_678_901_235, "4.012345678901235"); // precision lost - test(4.012_345_678_901_234_567_890, "4.012345678901235"); // Over 18 decimals is OK (precision lost) + test(4.012_345_678_901_235, "4.012345678901235"); // Over 18 decimals is OK (precision lost) } #[test] diff --git a/src/core/types/exactly_n_bytes.rs b/src/core/types/exactly_n_bytes.rs index f04b417dc..585207534 100644 --- a/src/core/types/exactly_n_bytes.rs +++ b/src/core/types/exactly_n_bytes.rs @@ -199,9 +199,16 @@ macro_rules! decl_exactly_n_bytes { impl [] { fn declare_sample(r: &str) -> Self { - let mut s = r.repeat($byte_count / 2); - if s.len() != $byte_count * 2 { - s = format!("{}{}", $byte_count, s); + let mut s = r.repeat($byte_count / 2).to_owned(); + + let target_len = $byte_count * 2; + + if s.len() != target_len { + let bc = format!("{}", $byte_count); + let bc_len = bc.len(); + let subs = &s[0..target_len-bc_len]; + s = format!("{}{}", bc, subs); + assert_eq!(s.len(), target_len); } Self::from_str(&s).expect("Valid sample") } @@ -522,7 +529,6 @@ decl_exactly_n_bytes!( 32, "deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead", // expected sample value for tests ); -pub type SymmetricKey = Exactly32Bytes; decl_exactly_n_bytes!( /// 64 bytes, used by Ed25519Signatures, implementation wise those bytes are @@ -551,3 +557,10 @@ decl_exactly_n_bytes!( 12, "deaddeaddeaddeaddeaddead", // expected sample value for tests ); + +decl_exactly_n_bytes!( + /// 60 bytes, used as encrypted mnemonic for security questions factor + /// source. 32 bytes mnemonic when encrypted results in exactly this length. + 60, + "deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead", // expected sample value for tests +); diff --git a/src/core/types/mod.rs b/src/core/types/mod.rs index ed2ad0775..4a42c9c4f 100644 --- a/src/core/types/mod.rs +++ b/src/core/types/mod.rs @@ -2,12 +2,12 @@ mod appearance_id; mod appearance_id_uniffi_fn; mod bag_of_bytes; mod bag_of_bytes_uniffi_fn; +mod collections; mod decimal192; mod decimal192_uniffi_fn; mod entity_kind; mod epoch; mod exactly_n_bytes; -mod identified_vec_of; mod keys; mod locale_config; mod logged_result; @@ -26,12 +26,12 @@ pub use appearance_id::*; pub use appearance_id_uniffi_fn::*; pub use bag_of_bytes::*; pub use bag_of_bytes_uniffi_fn::*; +pub use collections::*; pub use decimal192::*; pub use decimal192_uniffi_fn::*; pub use entity_kind::*; pub use epoch::*; pub use exactly_n_bytes::*; -pub use identified_vec_of::*; pub use keys::*; pub use locale_config::*; pub use logged_result::*; diff --git a/src/core/types/signatures/ed25519_signature.rs b/src/core/types/signatures/ed25519_signature.rs index 1c9ee0e03..43ef104c9 100644 --- a/src/core/types/signatures/ed25519_signature.rs +++ b/src/core/types/signatures/ed25519_signature.rs @@ -68,87 +68,10 @@ impl Ed25519Signature { } impl HasSampleValues for Ed25519Signature { - /// Returns a valid Ed25519Signature, see doc test below, - /// with the value: - /// - /// `"2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b"` - /// - /// ``` - /// extern crate sargon; - /// use sargon::prelude::*; - /// - /// let mnemonic: Mnemonic = "bright club bacon dinner achieve pull grid save ramp cereal blush woman humble limb repeat video sudden possible story mask neutral prize goose mandate".parse().unwrap(); - /// - /// let path: AccountPath = "m/44H/1022H/1H/525H/1460H/0H".parse().unwrap(); - /// - /// let mwp = MnemonicWithPassphrase::with_passphrase(mnemonic, BIP39Passphrase::new("radix")); - /// - /// let seed = mwp.to_seed(); - /// let hd_private_key = seed.derive_private_key(&path); - /// - /// assert_eq!(&hd_private_key.private_key.to_hex(), "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003"); - /// - /// assert_eq!(&hd_private_key.public_key().to_hex(), "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b"); - /// - /// let message = "There is a computer disease that anybody who works with computers knows about. It's a very serious disease and it interferes completely with the work. The trouble with computers is that you 'play' with them!"; - /// - /// let hash = hash_of(message.as_bytes()); - /// - /// let signature: Ed25519Signature = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); - /// - /// assert_eq!( - /// &hd_private_key - /// .private_key - /// .public_key() - /// .into_ed25519() - /// .unwrap() - /// .is_valid_signature_for_hash(&signature, &hash), - /// &true - /// ); - /// ``` - /// fn sample() -> Self { - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().expect("Should produce a valid sample Ed25519Signature") + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().expect("Should produce a valid sample Ed25519Signature") } - /// Returns a valid Ed25519Signature, see doc test below, - /// with the value: - /// - /// `"06cd3772c5c70d44819db80192a5b2521525e2529f770bff970ec4edc7c1bd76e41fcfa8e59ff93b1675c48f4af3b1697765286d999ee8b5bb8257691e3b7b09"` - /// - /// ``` - /// extern crate sargon; - /// use sargon::prelude::*; - /// - /// let mnemonic: Mnemonic = "bright club bacon dinner achieve pull grid save ramp cereal blush woman humble limb repeat video sudden possible story mask neutral prize goose mandate".parse().unwrap(); - /// - /// let path: AccountPath = "m/44H/1022H/1H/525H/1460H/1H".parse().unwrap(); - /// - /// let mwp = MnemonicWithPassphrase::with_passphrase(mnemonic, BIP39Passphrase::new("radix")); - /// let seed = mwp.to_seed(); - /// let hd_private_key = seed.derive_private_key(&path); - /// - /// assert_eq!(&hd_private_key.private_key.to_hex(), "6b736e59d41c5ba47dc427ebee9990426441e01db4abee5c44192492c269d8e0"); - /// - /// assert_eq!(&hd_private_key.public_key().to_hex(), "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf"); - /// - /// let message = "All those moments will be lost in time, like tears in rain. Time to die..."; - /// - /// let hash = hash_of(message.as_bytes()); - /// - /// let signature: Ed25519Signature = "06cd3772c5c70d44819db80192a5b2521525e2529f770bff970ec4edc7c1bd76e41fcfa8e59ff93b1675c48f4af3b1697765286d999ee8b5bb8257691e3b7b09".parse().unwrap(); - /// - /// assert_eq!( - /// &hd_private_key - /// .private_key - /// .public_key() - /// .into_ed25519() - /// .unwrap() - /// .is_valid_signature_for_hash(&signature, &hash), - /// &true - /// ); - /// ``` - /// fn sample_other() -> Self { "06cd3772c5c70d44819db80192a5b2521525e2529f770bff970ec4edc7c1bd76e41fcfa8e59ff93b1675c48f4af3b1697765286d999ee8b5bb8257691e3b7b09".parse().expect("Should produce a valid sample Ed25519Signature") } @@ -182,7 +105,7 @@ mod tests { #[test] fn scrypto_roundtrip_start_scrypto() { - let sig: ScryptoEd25519Signature = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); + let sig: ScryptoEd25519Signature = "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().unwrap(); assert_eq!(ScryptoEd25519Signature::from(SUT::from(sig)), sig); } diff --git a/src/core/types/signatures/ed25519_signature_uniffi_fn.rs b/src/core/types/signatures/ed25519_signature_uniffi_fn.rs index 3837cb203..c03f9fca5 100644 --- a/src/core/types/signatures/ed25519_signature_uniffi_fn.rs +++ b/src/core/types/signatures/ed25519_signature_uniffi_fn.rs @@ -55,7 +55,7 @@ mod tests { fn test_to_string() { assert_eq!( ed25519_signature_to_string(&SUT::sample()), - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" ) } diff --git a/src/core/types/signatures/secp256k1_signature.rs b/src/core/types/signatures/secp256k1_signature.rs index 81f11faf3..f0d7620be 100644 --- a/src/core/types/signatures/secp256k1_signature.rs +++ b/src/core/types/signatures/secp256k1_signature.rs @@ -57,86 +57,10 @@ impl Secp256k1Signature { } impl HasSampleValues for Secp256k1Signature { - /// Returns a valid Secp256k1Signature, see doc test below, - /// with the value: - /// - /// `"018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef"` - /// - /// ``` - /// extern crate sargon; - /// use sargon::prelude::*; - /// - /// let mnemonic: Mnemonic = "habit special recipe upon giraffe manual evil badge dwarf welcome inspire shrug post arrive van".parse().unwrap(); - /// - /// let path: BIP44LikePath = "m/44H/1022H/0H/0/5H".parse().unwrap(); - /// - /// let mwp = MnemonicWithPassphrase::with_passphrase(mnemonic, BIP39Passphrase::default()); - /// let seed = mwp.to_seed(); - /// let hd_private_key = seed.derive_private_key(&path); - /// - /// assert_eq!(&hd_private_key.private_key.to_hex(), "111323d507d9d690836798e3ef2e5292cfd31092b75b9b59fa584ff593a3d7e4"); - /// - /// assert_eq!(&hd_private_key.public_key().to_hex(), "03e78cdb2e0b7ea6e55e121a58560ccf841a913d3a4a9b8349e0ef00c2102f48d8"); - /// - /// let message = "There is a computer disease that anybody who works with computers knows about. It's a very serious disease and it interferes completely with the work. The trouble with computers is that you 'play' with them!"; - /// - /// let hash = hash_of(message.as_bytes()); - /// - /// let signature: Secp256k1Signature = "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse().unwrap(); - /// - /// assert_eq!( - /// &hd_private_key - /// .private_key - /// .public_key() - /// .into_secp256k1() - /// .unwrap() - /// .is_valid_signature_for_hash(&signature, &hash), - /// &true - /// ); - /// ``` - /// fn sample() -> Self { - "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse().expect("Should construct valid sample values.") + "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12".parse().expect("Should construct valid sample values.") } - /// Returns a valid Secp256k1Signature, see doc test below, - /// with the value: - /// - /// `"01aa1c4f46f8437b7f8ec9008ae10e6f33bb8be3e81e35c63f3498070dfbd6a20b2daee6073ead3c9e72d8909bc32a02e46cede3885cf8568d4c380ac97aa7fbcd"` - /// - /// ``` - /// extern crate sargon; - /// use sargon::prelude::*; - /// - /// let mnemonic: Mnemonic = "habit special recipe upon giraffe manual evil badge dwarf welcome inspire shrug post arrive van".parse().unwrap(); - /// - /// let path: BIP44LikePath = "m/44H/1022H/0H/0/1H".parse().unwrap(); - /// - /// let mwp = MnemonicWithPassphrase::with_passphrase(mnemonic, BIP39Passphrase::default()); - /// let seed = mwp.to_seed(); - /// let hd_private_key = seed.derive_private_key(&path); - /// - /// assert_eq!(&hd_private_key.private_key.to_hex(), "84d8a5991e8f2885fe49d77da0ee6ee9f3f03ef419ac9c19a48cd32e10244ecd"); - /// - /// assert_eq!(&hd_private_key.public_key().to_hex(), "02f0d85a3b9082683f689e6115f37e1e24b7448fff14b14877e3a4e750e86fba8b"); - /// - /// let message = "All those moments will be lost in time, like tears in rain. Time to die..."; - /// - /// let hash = hash_of(message.as_bytes()); - /// - /// let signature: Secp256k1Signature = "01aa1c4f46f8437b7f8ec9008ae10e6f33bb8be3e81e35c63f3498070dfbd6a20b2daee6073ead3c9e72d8909bc32a02e46cede3885cf8568d4c380ac97aa7fbcd".parse().unwrap(); - /// - /// assert_eq!( - /// &hd_private_key - /// .private_key - /// .public_key() - /// .into_secp256k1() - /// .unwrap() - /// .is_valid_signature_for_hash(&signature, &hash), - /// &true - /// ); - /// ``` - /// fn sample_other() -> Self { "01aa1c4f46f8437b7f8ec9008ae10e6f33bb8be3e81e35c63f3498070dfbd6a20b2daee6073ead3c9e72d8909bc32a02e46cede3885cf8568d4c380ac97aa7fbcd".parse().expect("Should construct valid sample values.") } @@ -176,6 +100,6 @@ mod tests { #[test] fn to_hex() { - assert_eq!(SUT::sample().to_hex(), "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef"); + assert_eq!(SUT::sample().to_hex(), "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12"); } } diff --git a/src/core/types/signatures/secp256k1_signature_uniffi_fn.rs b/src/core/types/signatures/secp256k1_signature_uniffi_fn.rs index a9542baa0..3b328808d 100644 --- a/src/core/types/signatures/secp256k1_signature_uniffi_fn.rs +++ b/src/core/types/signatures/secp256k1_signature_uniffi_fn.rs @@ -55,7 +55,7 @@ mod tests { fn test_to_string() { assert_eq!( secp256k1_signature_to_string(&SUT::sample()), - "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef" + "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12" ) } diff --git a/src/core/types/signatures/signature.rs b/src/core/types/signatures/signature.rs index ad447e545..3158bb5ce 100644 --- a/src/core/types/signatures/signature.rs +++ b/src/core/types/signatures/signature.rs @@ -155,24 +155,24 @@ mod tests { #[test] fn ed25519_from_str() { assert_eq!( - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse::().unwrap(), SUT::sample()); + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse::().unwrap(), SUT::sample()); } #[test] fn ed25519_from_bag_of_bytes() { - let bytes: BagOfBytes = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); + let bytes: BagOfBytes = "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().unwrap(); assert_eq!(SUT::try_from(bytes).unwrap(), SUT::sample()); } #[test] fn secp256k1_from_str() { assert_eq!( - "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse::().unwrap(), SUT::sample_other()); + "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12".parse::().unwrap(), SUT::sample_other()); } #[test] fn secp256k1_from_bag_of_bytes() { - let bytes: BagOfBytes = "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse().unwrap(); + let bytes: BagOfBytes = "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12".parse().unwrap(); assert_eq!(SUT::try_from(bytes).unwrap(), SUT::sample_other()); } diff --git a/src/core/types/signatures/signature_uniffi_fn.rs b/src/core/types/signatures/signature_uniffi_fn.rs index a4cb40e75..1e0816f1d 100644 --- a/src/core/types/signatures/signature_uniffi_fn.rs +++ b/src/core/types/signatures/signature_uniffi_fn.rs @@ -51,7 +51,7 @@ mod tests { fn test_to_string() { assert_eq!( signature_to_string(&SUT::sample()), - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" ) } @@ -59,13 +59,13 @@ mod tests { fn test_to_bytes() { assert_eq!( signature_to_bytes(&SUT::sample()).to_string(), - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" ) } #[test] fn test_new_signature_from_bytes() { - let bytes: BagOfBytes = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); + let bytes: BagOfBytes = "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().unwrap(); assert_eq!(new_signature_from_bytes(bytes).unwrap(), SUT::sample()) } } diff --git a/src/core/types/signatures/signature_with_public_key.rs b/src/core/types/signatures/signature_with_public_key.rs index f2e38e95a..e4854656f 100644 --- a/src/core/types/signatures/signature_with_public_key.rs +++ b/src/core/types/signatures/signature_with_public_key.rs @@ -152,15 +152,16 @@ impl SignatureWithPublicKey { impl HasSampleValues for SignatureWithPublicKey { fn sample() -> Self { let private_key: Ed25519PrivateKey = - "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003" + "88ec4649da764965f862510dbe53d551a3fc2da49e1ef1f383d9d17006773bee" .parse() .unwrap(); let public_key = private_key.public_key(); assert_eq!( &public_key.to_hex(), - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" ); - let signature: Ed25519Signature = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); + + let signature: Ed25519Signature = "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().unwrap(); public_key .is_valid_signature_for_hash(&signature, &Self::sample_hash()); @@ -169,13 +170,13 @@ impl HasSampleValues for SignatureWithPublicKey { fn sample_other() -> Self { let private_key: Secp256k1PrivateKey = - "111323d507d9d690836798e3ef2e5292cfd31092b75b9b59fa584ff593a3d7e4" + "09c5ec59b0cc08d07e5ed4aaee8c583264ffa060563d4b531e15db13d35b2a87" .parse() .unwrap(); let public_key = private_key.public_key(); - assert_eq!(&public_key.to_hex(), "03e78cdb2e0b7ea6e55e121a58560ccf841a913d3a4a9b8349e0ef00c2102f48d8"); + assert_eq!(&public_key.to_hex(), "038c9ae8b50356cfd87b6e8c069c14cbda692578e87cd41291701947a2d1b794c4"); - let signature: Secp256k1Signature = "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse().unwrap(); + let signature: Secp256k1Signature = "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12".parse().unwrap(); public_key .is_valid_signature_for_hash(&signature, &Self::sample_hash()); @@ -186,7 +187,6 @@ impl HasSampleValues for SignatureWithPublicKey { #[cfg(test)] mod tests { use super::*; - use crate::prelude::*; #[allow(clippy::upper_case_acronyms)] type SUT = SignatureWithPublicKey; @@ -205,7 +205,7 @@ mod tests { #[test] fn signature() { let pubkey: Ed25519PublicKey = - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" .parse() .unwrap(); assert!(pubkey.is_valid_signature_for_hash( @@ -283,11 +283,11 @@ mod tests { assert_eq!( TryInto::::try_into(( ScryptoSignatureWithPublicKey::Secp256k1 { - signature: ScryptoSecp256k1Signature::from_str("018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef").unwrap() + signature: ScryptoSecp256k1Signature::from_str("0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12").unwrap() }, Hash::sample() )).unwrap().into_secp256k1().unwrap().0, - Secp256k1PublicKey::from_str("02634e157ed84916e1a79c8c0e802772d2b095ea4e5636243a0cade9896dd4b500").unwrap() + Secp256k1PublicKey::from_str("0395679954e3c312cab9905070effb4935e4b1e5b82f987396cabdb8faf9e554d0").unwrap() ); } } diff --git a/src/core/utils/factory.rs b/src/core/utils/factory.rs index b414d6b77..ffe4d5e13 100644 --- a/src/core/utils/factory.rs +++ b/src/core/utils/factory.rs @@ -1,7 +1,14 @@ use crate::prelude::*; +/// A JSON "stable" timestamp, that is to say, this has already been JSON +/// roundtripped, ensuring the same value will be decoded once encoded, this is +/// a bit hacky solution to the fact that `07:18:08.284647000Z` when encoded +/// and then decoded become `07:18:08.284000000Z` resulting in problems for +/// equality checks. pub fn now() -> Timestamp { - Timestamp::now_utc() + let t = Timestamp::now_utc(); + let json = serde_json::to_vec(&t).unwrap(); + serde_json::from_slice(json.as_slice()).unwrap() } pub fn id() -> Uuid { @@ -21,20 +28,29 @@ pub fn date(dt: &Timestamp) -> String { dt.date().to_string() } +impl HasSampleValues for Uuid { + fn sample() -> Self { + Self::from_bytes([0xff; 16]) + } + + fn sample_other() -> Self { + Self::from_bytes([0xde; 16]) + } +} +impl HasSampleValues for Timestamp { + fn sample() -> Self { + Self::parse("2023-09-11T16:05:56Z").unwrap() + } + + fn sample_other() -> Self { + Self::parse("2023-12-24T17:13:56.123Z").unwrap() + } +} + #[cfg(test)] mod tests { use crate::prelude::*; - #[test] - fn date_now() { - let d0 = now(); - let mut d1 = now(); - for _ in 0..10 { - d1 = now(); - } - assert!(d1 > d0); - } - #[test] fn id_unique() { let n = 100; diff --git a/src/gateway_api/client/gateway_client.rs b/src/gateway_api/client/gateway_client.rs index abd74acea..4f1e556cb 100644 --- a/src/gateway_api/client/gateway_client.rs +++ b/src/gateway_api/client/gateway_client.rs @@ -18,20 +18,22 @@ pub struct GatewayClient { #[uniffi::export] impl GatewayClient { - /// Constructs a new `GatewayClient` with a NetworkAntenna for a specified + /// Constructs a new `GatewayClient` with a NetworkingDriver for a specified /// `Gateway`. #[uniffi::constructor] pub fn with_gateway( - network_antenna: Arc, + networking_driver: Arc, gateway: Gateway, ) -> Self { Self { - http_client: HttpClient { network_antenna }, + http_client: HttpClient { + driver: networking_driver, + }, gateway, } } - /// Constructs a new `GatewayClient` with a NetworkAntenna for a specified + /// Constructs a new `GatewayClient` with a NetworkingDriver for a specified /// network, by looking up an Radix DLT provided Gateway on that network. /// /// # Panics @@ -39,10 +41,10 @@ impl GatewayClient { /// `network_id` - e.g. will panic if you specify `NetworkID::Simulator` (duh). #[uniffi::constructor] pub fn new( - network_antenna: Arc, + networking_driver: Arc, network_id: NetworkID, ) -> Self { - Self::with_gateway(network_antenna, Gateway::from(network_id)) + Self::with_gateway(networking_driver, Gateway::from(network_id)) } } @@ -67,11 +69,12 @@ mod tests { #[actix_rt::test] async fn test_submit_notarized_transaction_mock_duplicate() { - let mock_antenna = - MockAntenna::with_response(TransactionSubmitResponse { + let mock_networking_driver = + MockNetworkingDriver::with_response(TransactionSubmitResponse { duplicate: true, }); - let sut = SUT::new(Arc::new(mock_antenna), NetworkID::Stokenet); + let sut = + SUT::new(Arc::new(mock_networking_driver), NetworkID::Stokenet); let req = sut.submit_notarized_transaction(NotarizedTransaction::sample()); let result = timeout(MAX, req).await.unwrap(); diff --git a/src/hierarchical_deterministic/bip39/bip39_word/bip39_word.rs b/src/hierarchical_deterministic/bip39/bip39_word/bip39_word.rs index fd888e7fe..b373add61 100644 --- a/src/hierarchical_deterministic/bip39/bip39_word/bip39_word.rs +++ b/src/hierarchical_deterministic/bip39/bip39_word/bip39_word.rs @@ -33,27 +33,28 @@ impl PartialOrd for BIP39Word { } impl BIP39Word { - pub fn new(word: &'static str, language: BIP39Language) -> Result { + pub fn new(word: impl AsRef, language: BIP39Language) -> Result { + let word = word.as_ref(); let index = index_of_word_in_bip39_wordlist_of_language(word, language.into()) .ok_or(CommonError::UnknownBIP39Word)?; Ok(Self { - word: word.to_string(), + word: word.to_owned(), index, language, }) } - pub fn english(word: &'static str) -> Result { + pub fn english(word: impl AsRef) -> Result { Self::new(word, BIP39Language::English) } } fn index_of_word_in_bip39_wordlist_of_language( - word: &'static str, + word: impl AsRef, language: bip39::Language, ) -> Option { language - .find_word(word) + .find_word(word.as_ref()) .map(|i| U11::new(i).expect("Less than 2048")) } diff --git a/src/hierarchical_deterministic/bip39/mnemonic.rs b/src/hierarchical_deterministic/bip39/mnemonic.rs index d6d903f38..45ad8c518 100644 --- a/src/hierarchical_deterministic/bip39/mnemonic.rs +++ b/src/hierarchical_deterministic/bip39/mnemonic.rs @@ -93,6 +93,14 @@ impl Mnemonic { .map(Self::from_internal) } + pub fn from_32bytes_entropy(entropy: Exactly32Bytes) -> Self { + let internal: bip39::Mnemonic = bip39::Mnemonic::from_entropy( + entropy.as_ref(), + ) + .expect("Should always be able to create Mnemonic from 32 bytes"); + Self::from_internal(internal) + } + pub fn from_words(words: Vec) -> Result { if words.is_empty() { return Err(CommonError::InvalidMnemonicPhrase); @@ -114,6 +122,12 @@ impl Mnemonic { .map(Self::from_internal) } + pub fn to_entropy(&self) -> NonEmptyMax32Bytes { + let entropy = self.internal().to_entropy(); + NonEmptyMax32Bytes::try_from(entropy) + .expect("Entropy should never be empty and always max 32 bytes") + } + pub fn to_seed(&self, passphrase: &str) -> BIP39Seed { BIP39Seed::new(self.internal().to_seed(passphrase)) } @@ -139,6 +153,179 @@ impl HasSampleValues for Mnemonic { } } +#[cfg(test)] +pub(super) fn calculate_last_mnemonic_word_from_words( + words: impl IntoIterator, +) -> Vec { + let words = words + .into_iter() + .map(|x| BIP39Word::new(x.clone(), BIP39Language::English).unwrap()) + .collect_vec(); + let count = words.len(); + assert!(count == 11 || count == 23, "wrong word count"); + + let mut mnemonics = Vec::new(); + for word in bip39_language_wordlist(&BIP39Language::English).iter() { + let mut all_words = words.clone(); + all_words.push(word.clone()); + match Mnemonic::from_words(all_words) { + Ok(mnemonic) => mnemonics.push(mnemonic), + Err(_) => continue, + }; + } + assert!(!mnemonics.is_empty(), "should find at least one!"); + mnemonics +} + +#[cfg(test)] +pub(super) fn calculate_last_mnemonic_word_from_phrase( + phrase: impl AsRef, +) -> Vec { + calculate_last_mnemonic_word_from_words( + phrase.as_ref().split(' ').map(|x| x.to_owned()), + ) +} + +impl Mnemonic { + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * athlete + /// * excite + /// * jar + /// * open + /// * planet + /// * swim + /// * wrap + pub(crate) fn sample_device() -> Self { + Self::from_phrase("device phone sign source sample device sample device sample device sample device sample device sample device sample device phone sign source sample device swim") + .expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * absurd + /// * circle + /// * expire + /// * illness + /// * paddle + /// * rabbit + /// * sniff + /// * winner + pub(crate) fn sample_device_other() -> Self { + Self::from_phrase("device phone sign source sample other device sample other device sample other device sample other device sample other device sample other device other paddle").expect("Valid mnemonic") + } + + pub(crate) fn sample_device_12_words() -> Self { + Self::from_phrase("device twelve phone sign source sample device twelve sample device twelve original").expect("Valid mnemonic") + } + + pub(crate) fn sample_device_12_words_other() -> Self { + Self::from_phrase("device twelve phone sign source sample other device twelve sample other derive").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * assault + /// * cactus + /// * exile + /// * legal + /// * million + /// * result + /// * spy + /// * version + pub(crate) fn sample_ledger() -> Self { + Self::from_phrase("pledge rely stick hard snow ice sign source sample pledge rely sample pledge rely sample pledge rely sample pledge rely sample stick sample cactus").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * basic + /// * couch + /// * elbow + /// * head + /// * ozone + /// * popular + /// * shaft + /// * tunnel + pub(crate) fn sample_ledger_other() -> Self { + Self::from_phrase("pledge rely stick hard snow ice sign source sample other pledge rely sample other pledge rely sample other pledge rely stick sample other shaft").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * begin + /// * cream + /// * excite + /// * insect + /// * lizard + /// * payment + /// * state + /// * wide + pub(crate) fn sample_off_device() -> Self { + Self::from_phrase("off device sign source sample off sample off sample off sample off sample off sample off sample off sample off sample off sample lizard").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * boss + /// * coral + /// * fruit + /// * identify + /// * local + /// * pulse + /// * talent + /// * then + pub(crate) fn sample_off_device_other() -> Self { + Self::from_phrase("off device sign source sample other off sample other off sample other off sample other off sample other off device sample other off fruit").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * amateur + /// * combine + /// * fold + /// * include + /// * neutral + /// * ritual + /// * science + /// * unveil + pub(crate) fn sample_security_questions() -> Self { + Self::from_phrase("security question sign source sample security question sample security question sample security question sample security question sample security question sample security question sample unveil").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * arrow + /// * chief + /// * ensure + /// * impulse + /// * loop + /// * problem + /// * sword + /// * total + pub(crate) fn sample_security_questions_other() -> Self { + Self::from_phrase("security question sign source sample other security question sample other security question sample other security question sample other security question sample other question loop").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * bargain + /// * discover + /// * essay + /// * govern + /// * mix + /// * power + /// * silent + /// * tobacco + pub(crate) fn sample_arculus() -> Self { + Self::from_phrase("arch card helmet sign source sample arch card sample arch card sample arch card sample arch card sample arch card sample arch card mix").expect("Valid mnemonic") + } + + /// Alternative valid mnemonics, with last (checksum) words changed only are: + /// * bomb + /// * cream + /// * dragon + /// * gather + /// * lock + /// * prevent + /// * soccer + /// * update + pub(crate) fn sample_arculus_other() -> Self { + Self::from_phrase("arch card helmet sign source sample other arch card sample other arch card sample other arch card sample other arch card sample other lock").expect("Valid mnemonic") + } +} + #[cfg(test)] mod tests { @@ -158,6 +345,97 @@ mod tests { assert_ne!(SUT::sample(), SUT::sample_other()); } + #[test] + fn find_device_sample() { + let s = "device phone sign source sample device sample device sample device sample device sample device sample device sample device phone sign source sample device"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_device())); + } + + #[test] + fn find_device_sample_other() { + let s = "device phone sign source sample other device sample other device sample other device sample other device sample other device sample other device other"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_device_other())); + } + + #[test] + fn find_device_sample_12_words() { + let s = "device twelve phone sign source sample device twelve sample device twelve"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_device_12_words())); + } + + #[test] + fn find_device_sample_12_words_other() { + let s = "device twelve phone sign source sample other device twelve sample other"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics + .iter() + .contains(&SUT::sample_device_12_words_other())); + } + + #[test] + fn find_ledger_sample() { + let s = "pledge rely stick hard snow ice sign source sample pledge rely sample pledge rely sample pledge rely sample pledge rely sample stick sample"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_ledger())); + } + + #[test] + fn find_ledger_sample_other() { + let s = "pledge rely stick hard snow ice sign source sample other pledge rely sample other pledge rely sample other pledge rely stick sample other"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_ledger_other())); + } + + #[test] + fn find_off_device_sample() { + let s = "off device sign source sample off sample off sample off sample off sample off sample off sample off sample off sample off sample"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_off_device())); + } + + #[test] + fn find_off_device_sample_other() { + let s = "off device sign source sample other off sample other off sample other off sample other off sample other off device sample other off"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + for mnemonic in mnemonics.iter() { + println!("{}", mnemonic.words.iter().last().unwrap().word); + } + assert!(mnemonics.iter().contains(&SUT::sample_off_device_other())); + } + + #[test] + fn find_security_questions_sample() { + let s = "security question sign source sample security question sample security question sample security question sample security question sample security question sample security question sample"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_security_questions())); + } + + #[test] + fn find_security_questions_sample_other() { + let s = "security question sign source sample other security question sample other security question sample other security question sample other security question sample other question"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics + .iter() + .contains(&SUT::sample_security_questions_other())); + } + + #[test] + fn find_arculus() { + let s = "arch card helmet sign source sample arch card sample arch card sample arch card sample arch card sample arch card sample arch card"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_arculus())); + } + + #[test] + fn find_arculus_other() { + let s = "arch card helmet sign source sample other arch card sample other arch card sample other arch card sample other arch card sample other"; + let mnemonics = calculate_last_mnemonic_word_from_phrase(s); + assert!(mnemonics.iter().contains(&SUT::sample_arculus_other())); + } + #[test] fn debug() { let mnemonic = SUT::sample(); diff --git a/src/hierarchical_deterministic/bip39/mnemonic_uniffi_fn.rs b/src/hierarchical_deterministic/bip39/mnemonic_uniffi_fn.rs index 308f56710..8c8461d9a 100644 --- a/src/hierarchical_deterministic/bip39/mnemonic_uniffi_fn.rs +++ b/src/hierarchical_deterministic/bip39/mnemonic_uniffi_fn.rs @@ -43,6 +43,66 @@ pub fn new_mnemonic_sample_other() -> Mnemonic { Mnemonic::sample_other() } +#[uniffi::export] +pub fn new_mnemonic_sample_device() -> Mnemonic { + Mnemonic::sample_device() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_device_other() -> Mnemonic { + Mnemonic::sample_device_other() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_device_12_words() -> Mnemonic { + Mnemonic::sample_device_12_words() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_device_12_words_other() -> Mnemonic { + Mnemonic::sample_device_12_words_other() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_ledger() -> Mnemonic { + Mnemonic::sample_ledger() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_ledger_other() -> Mnemonic { + Mnemonic::sample_ledger_other() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_off_device() -> Mnemonic { + Mnemonic::sample_off_device() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_off_device_other() -> Mnemonic { + Mnemonic::sample_off_device_other() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_security_questions() -> Mnemonic { + Mnemonic::sample_security_questions() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_security_questions_other() -> Mnemonic { + Mnemonic::sample_security_questions_other() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_arculus() -> Mnemonic { + Mnemonic::sample_arculus() +} + +#[uniffi::export] +pub fn new_mnemonic_sample_arculus_other() -> Mnemonic { + Mnemonic::sample_arculus_other() +} + #[cfg(test)] mod uniffi_tests { use super::*; @@ -65,6 +125,41 @@ mod uniffi_tests { ); } + #[test] + fn hash_of_sample_specific() { + assert_eq!( + HashSet::::from_iter([ + new_mnemonic_sample_device(), + new_mnemonic_sample_device_other(), + new_mnemonic_sample_device_12_words(), + new_mnemonic_sample_device_12_words_other(), + new_mnemonic_sample_ledger(), + new_mnemonic_sample_ledger_other(), + new_mnemonic_sample_off_device(), + new_mnemonic_sample_off_device_other(), + new_mnemonic_sample_security_questions(), + new_mnemonic_sample_security_questions_other(), + new_mnemonic_sample_arculus(), + new_mnemonic_sample_arculus_other(), + // duplicates should be removed + new_mnemonic_sample_device(), + new_mnemonic_sample_device_other(), + new_mnemonic_sample_device_12_words(), + new_mnemonic_sample_device_12_words_other(), + new_mnemonic_sample_ledger(), + new_mnemonic_sample_ledger_other(), + new_mnemonic_sample_off_device(), + new_mnemonic_sample_off_device_other(), + new_mnemonic_sample_security_questions(), + new_mnemonic_sample_security_questions_other(), + new_mnemonic_sample_arculus(), + new_mnemonic_sample_arculus_other(), + ]) + .len(), + 12 + ); + } + #[test] fn test_mnemonic_phrase() { let str = "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong"; diff --git a/src/hierarchical_deterministic/derivation/hierarchical_deterministic_private_key.rs b/src/hierarchical_deterministic/derivation/hierarchical_deterministic_private_key.rs index a1d16e179..efdc2c5ff 100644 --- a/src/hierarchical_deterministic/derivation/hierarchical_deterministic_private_key.rs +++ b/src/hierarchical_deterministic/derivation/hierarchical_deterministic_private_key.rs @@ -69,7 +69,7 @@ impl HasSampleValues for HierarchicalDeterministicPrivateKey { fn sample() -> Self { Self::new( Ed25519PrivateKey::from_str( - "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003", + "88ec4649da764965f862510dbe53d551a3fc2da49e1ef1f383d9d17006773bee", ) .unwrap() .into(), @@ -82,7 +82,7 @@ impl HasSampleValues for HierarchicalDeterministicPrivateKey { fn sample_other() -> Self { Self::new( Secp256k1PrivateKey::from_str( - "111323d507d9d690836798e3ef2e5292cfd31092b75b9b59fa584ff593a3d7e4", + "09c5ec59b0cc08d07e5ed4aaee8c583264ffa060563d4b531e15db13d35b2a87", ) .unwrap() .into(), @@ -117,7 +117,7 @@ mod tests { let sut = SUT::sample(); assert_eq!( sut.public_key().to_hex(), - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" ); } diff --git a/src/hierarchical_deterministic/derivation/hierarchical_deterministic_public_key.rs b/src/hierarchical_deterministic/derivation/hierarchical_deterministic_public_key.rs index 8be6ed789..541259bad 100644 --- a/src/hierarchical_deterministic/derivation/hierarchical_deterministic_public_key.rs +++ b/src/hierarchical_deterministic/derivation/hierarchical_deterministic_public_key.rs @@ -59,12 +59,12 @@ impl HasSampleValues for HierarchicalDeterministicPublicKey { assert_eq!(path.to_string(), "m/44H/1022H/1H/525H/1460H/0H"); assert_eq!( - "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003", + "88ec4649da764965f862510dbe53d551a3fc2da49e1ef1f383d9d17006773bee", private_key.to_hex() ); let public_key = private_key.public_key(); assert_eq!( - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b", + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36", public_key.to_hex() ); @@ -72,25 +72,19 @@ impl HasSampleValues for HierarchicalDeterministicPublicKey { } fn sample_other() -> Self { - let mwp = MnemonicWithPassphrase::with_passphrase( - Mnemonic::from_phrase( - "habit special recipe upon giraffe manual evil badge dwarf welcome inspire shrug post arrive van", - ) - .unwrap(), - "".into(), - ); + let mwp = MnemonicWithPassphrase::sample_other(); let seed = mwp.to_seed(); let private_key = seed.derive_private_key( &BIP44LikePath::from_str("m/44H/1022H/0H/0/5H").unwrap(), ); assert_eq!( - "111323d507d9d690836798e3ef2e5292cfd31092b75b9b59fa584ff593a3d7e4", + "09c5ec59b0cc08d07e5ed4aaee8c583264ffa060563d4b531e15db13d35b2a87", private_key.to_hex() ); let public_key = private_key.public_key(); assert_eq!( - "03e78cdb2e0b7ea6e55e121a58560ccf841a913d3a4a9b8349e0ef00c2102f48d8", + "038c9ae8b50356cfd87b6e8c069c14cbda692578e87cd41291701947a2d1b794c4", public_key.to_hex() ); @@ -101,26 +95,40 @@ impl HasSampleValues for HierarchicalDeterministicPublicKey { #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HierarchicalDeterministicPublicKey; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } #[test] fn to_hex() { assert_eq!( - HierarchicalDeterministicPublicKey::sample().to_hex(), - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + SUT::sample().to_hex(), + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" ); } #[test] fn json() { - let model = HierarchicalDeterministicPublicKey::sample(); + let model = SUT::sample(); assert_eq_after_json_roundtrip( &model, r#" { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", diff --git a/src/hierarchical_deterministic/derivation/mnemonic_with_passphrase.rs b/src/hierarchical_deterministic/derivation/mnemonic_with_passphrase.rs index cee29e6a2..3ba331062 100644 --- a/src/hierarchical_deterministic/derivation/mnemonic_with_passphrase.rs +++ b/src/hierarchical_deterministic/derivation/mnemonic_with_passphrase.rs @@ -119,14 +119,86 @@ impl MnemonicWithPassphrase { } } +impl MnemonicWithPassphrase { + pub(crate) fn sample_device() -> Self { + Self::with_passphrase( + Mnemonic::sample_device(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_device_other() -> Self { + Self::with_passphrase( + Mnemonic::sample_device_other(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_device_12_words() -> Self { + Self::with_passphrase( + Mnemonic::sample_device_12_words(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_device_12_words_other() -> Self { + Self::with_passphrase( + Mnemonic::sample_device_12_words_other(), + BIP39Passphrase::new("Olympia rules!"), + ) + } + + pub(crate) fn sample_ledger() -> Self { + Self::with_passphrase( + Mnemonic::sample_ledger(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_ledger_other() -> Self { + Self::with_passphrase( + Mnemonic::sample_ledger_other(), + BIP39Passphrase::new("Mellon"), + ) + } + + pub(crate) fn sample_off_device() -> Self { + Self::with_passphrase( + Mnemonic::sample_off_device(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_off_device_other() -> Self { + Self::with_passphrase( + Mnemonic::sample_off_device_other(), + BIP39Passphrase::new("open sesame"), + ) + } + + pub(crate) fn sample_arculus() -> Self { + Self::with_passphrase( + Mnemonic::sample_arculus(), + BIP39Passphrase::default(), + ) + } + + pub(crate) fn sample_arculus_other() -> Self { + Self::with_passphrase( + Mnemonic::sample_arculus_other(), + BIP39Passphrase::new("Leonidas"), + ) + } +} + impl HasSampleValues for MnemonicWithPassphrase { /// A sample used to facilitate unit tests. fn sample() -> Self { - Self::with_passphrase(Mnemonic::sample(), BIP39Passphrase::sample()) + Self::sample_device() } fn sample_other() -> Self { - Self::new(Mnemonic::sample_other()) + Self::sample_ledger() } } @@ -155,26 +227,34 @@ mod tests { } #[test] - fn debug() { + fn debug_sample() { assert_eq!( format!("{:?}", SUT::sample()), - format!("{:?}", "24 words (bright...mandate) + ") + format!("{:?}", "24 words (device...swim) + ") ); + } + + #[test] + fn debug_sample_other() { assert_eq!( format!("{:?}", SUT::sample_other()), - format!("{:?}", "12 words (zoo...wrong) + ") + format!("{:?}", "24 words (pledge...cactus) + ") ); } #[test] - fn non_sensitive() { + fn non_sensitive_sample() { assert_eq!( format!("{:?}", SUT::sample().non_sensitive()), - format!("{:?}", "24 words (bright...mandate) + ") + format!("{:?}", "24 words (device...swim) + ") ); + } + + #[test] + fn non_sensitive_sample_other() { assert_eq!( format!("{:?}", SUT::sample_other().non_sensitive()), - format!("{:?}", "12 words (zoo...wrong) + ") + format!("{:?}", "24 words (pledge...cactus) + ") ); } @@ -326,8 +406,23 @@ mod tests { &model, r#" { - "mnemonic": "bright club bacon dinner achieve pull grid save ramp cereal blush woman humble limb repeat video sudden possible story mask neutral prize goose mandate", - "passphrase": "radix" + "mnemonic": "device phone sign source sample device sample device sample device sample device sample device sample device sample device phone sign source sample device swim", + "passphrase": "" + } + "#, + ); + } + + #[test] + fn json_roundtrip_sample_ledger_other() { + let model = SUT::sample_ledger_other(); + + assert_eq_after_json_roundtrip( + &model, + r#" + { + "mnemonic": "pledge rely stick hard snow ice sign source sample other pledge rely sample other pledge rely sample other pledge rely stick sample other shaft", + "passphrase": "Mellon" } "#, ); @@ -347,11 +442,11 @@ mod tests { assert_eq!(path.to_string(), "m/44H/1022H/1H/525H/1460H/0H"); assert_eq!( - "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003", + "88ec4649da764965f862510dbe53d551a3fc2da49e1ef1f383d9d17006773bee", private_key.to_hex() ); assert_eq!( - "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b", + "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36", private_key.public_key().to_hex() ); } diff --git a/src/wallet/home_cards/deferred_deep_link/deferred_deep_link_method.rs b/src/home_cards/deferred_deep_link/deferred_deep_link_method.rs similarity index 100% rename from src/wallet/home_cards/deferred_deep_link/deferred_deep_link_method.rs rename to src/home_cards/deferred_deep_link/deferred_deep_link_method.rs diff --git a/src/wallet/home_cards/deferred_deep_link/deferred_deep_link_special_dapp.rs b/src/home_cards/deferred_deep_link/deferred_deep_link_special_dapp.rs similarity index 100% rename from src/wallet/home_cards/deferred_deep_link/deferred_deep_link_special_dapp.rs rename to src/home_cards/deferred_deep_link/deferred_deep_link_special_dapp.rs diff --git a/src/wallet/home_cards/deferred_deep_link/mod.rs b/src/home_cards/deferred_deep_link/mod.rs similarity index 100% rename from src/wallet/home_cards/deferred_deep_link/mod.rs rename to src/home_cards/deferred_deep_link/mod.rs diff --git a/src/wallet/home_cards/deferred_deep_link/onboarding_deep_link_value.rs b/src/home_cards/deferred_deep_link/onboarding_deep_link_value.rs similarity index 100% rename from src/wallet/home_cards/deferred_deep_link/onboarding_deep_link_value.rs rename to src/home_cards/deferred_deep_link/onboarding_deep_link_value.rs diff --git a/src/wallet/home_cards/deferred_deep_link/parser.rs b/src/home_cards/deferred_deep_link/parser.rs similarity index 97% rename from src/wallet/home_cards/deferred_deep_link/parser.rs rename to src/home_cards/deferred_deep_link/parser.rs index 815ffcdf1..434ddf94a 100644 --- a/src/wallet/home_cards/deferred_deep_link/parser.rs +++ b/src/home_cards/deferred_deep_link/parser.rs @@ -77,7 +77,7 @@ mod tests_decode { fn make_sut() -> SUT { SUT::new(GatewayClient::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, )) } @@ -131,7 +131,7 @@ mod tests_transform { MetadataKey::Name }; let mock_antenna = - MockAntenna::with_response(StateEntityDetailsResponse { + MockNetworkingDriver::with_response(StateEntityDetailsResponse { items: vec![StateEntityDetailsResponseItem { address: Address::sample_account_stokenet(), fungible_resources: None, @@ -155,7 +155,7 @@ mod tests_transform { fn make_failing_sut() -> SUT { SUT::new(GatewayClient::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, )) } diff --git a/src/wallet/home_cards/home_card.rs b/src/home_cards/home_card.rs similarity index 100% rename from src/wallet/home_cards/home_card.rs rename to src/home_cards/home_card.rs diff --git a/src/wallet/home_cards/home_cards.rs b/src/home_cards/home_cards.rs similarity index 100% rename from src/wallet/home_cards/home_cards.rs rename to src/home_cards/home_cards.rs diff --git a/src/wallet/home_cards/manager.rs b/src/home_cards/manager.rs similarity index 96% rename from src/wallet/home_cards/manager.rs rename to src/home_cards/manager.rs index 1e389141d..cbece2cdf 100644 --- a/src/wallet/home_cards/manager.rs +++ b/src/home_cards/manager.rs @@ -34,14 +34,14 @@ impl HomeCardsManager { impl HomeCardsManager { #[uniffi::constructor] pub fn new( - network_antenna: Arc, + networking_driver: Arc, network_id: NetworkID, cards_storage: Arc, observer: Arc, ) -> Self { Self::init( Arc::new(Parser::new(GatewayClient::new( - network_antenna, + networking_driver, network_id, ))), cards_storage, @@ -303,7 +303,7 @@ mod tests { let expected_cards = HomeCards::from_iter(vec![HomeCard::Connector]); let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_stored_cards( expected_cards.clone(), @@ -321,7 +321,7 @@ mod tests { async fn test_bootstrap_failing() { let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_load_error()), observer.clone(), @@ -335,7 +335,7 @@ mod tests { async fn test_wallet_created() { let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_empty()), observer.clone(), @@ -358,7 +358,7 @@ mod tests { async fn test_wallet_created_failing() { let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_save_error()), observer.clone(), @@ -376,7 +376,7 @@ mod tests { ]); let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_stored_cards( expected_cards.clone(), @@ -487,7 +487,7 @@ mod tests { let initial_cards = HomeCards::from_iter(vec![HomeCard::Connector]); let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_stored_cards( initial_cards, @@ -507,7 +507,7 @@ mod tests { let initial_cards = HomeCards::from_iter(vec![HomeCard::Connector]); let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_stored_cards( initial_cards.clone(), @@ -533,7 +533,7 @@ mod tests { ]); let observer = Arc::new(MockHomeCardsObserver::new()); let manager = SUT::new( - Arc::new(MockAntenna::new_always_failing()), + Arc::new(MockNetworkingDriver::new_always_failing()), NetworkID::Stokenet, Arc::new(MockHomeCardsStorage::new_with_stored_cards( initial_cards.clone(), diff --git a/src/wallet/home_cards/mod.rs b/src/home_cards/mod.rs similarity index 100% rename from src/wallet/home_cards/mod.rs rename to src/home_cards/mod.rs diff --git a/src/wallet/home_cards/observer.rs b/src/home_cards/observer.rs similarity index 100% rename from src/wallet/home_cards/observer.rs rename to src/home_cards/observer.rs diff --git a/src/wallet/home_cards/storage.rs b/src/home_cards/storage.rs similarity index 100% rename from src/wallet/home_cards/storage.rs rename to src/home_cards/storage.rs diff --git a/src/http_client/mod.rs b/src/http_client/mod.rs deleted file mode 100644 index a94d0dcda..000000000 --- a/src/http_client/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod client; -mod network_antenna; - -pub use client::*; -pub use network_antenna::*; diff --git a/src/lib.rs b/src/lib.rs index 97db3c999..4e43b4ec0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,16 @@ +#![feature(async_closure)] +#![feature(let_chains)] +#![feature(core_intrinsics)] #![allow(unused_imports)] +#![allow(internal_features)] mod core; mod gateway_api; mod hierarchical_deterministic; -mod http_client; +mod home_cards; mod profile; mod radix_connect; -mod wallet; +mod system; mod wrapped_radix_engine_toolkit; pub mod prelude { @@ -14,10 +18,10 @@ pub mod prelude { pub use crate::core::*; pub use crate::gateway_api::*; pub use crate::hierarchical_deterministic::*; - pub use crate::http_client::*; + pub use crate::home_cards::*; pub use crate::profile::*; pub use crate::radix_connect::*; - pub use crate::wallet::*; + pub use crate::system::*; pub use crate::wrapped_radix_engine_toolkit::*; pub(crate) use radix_rust::prelude::{ @@ -46,7 +50,7 @@ pub mod prelude { pub(crate) use std::hash::Hash as StdHash; pub use std::ops::{Add, AddAssign, Deref, Div, Mul, Neg, Sub}; pub(crate) use std::str::FromStr; - pub(crate) use std::sync::Arc; + pub(crate) use std::sync::{Arc, RwLock}; pub(crate) use strum::FromRepr; pub(crate) use url::Url; @@ -98,6 +102,7 @@ pub mod prelude { network::NetworkDefinition as ScryptoNetworkDefinition, prelude::{ recover_secp256k1 as Scrypto_recover_secp256k1, + FromPublicKey as ScryptoFromPublicKey, ManifestAddress as ScryptoManifestAddress, ManifestBucket as ScryptoManifestBucket, ManifestCustomValue as ScryptoManifestCustomValue, @@ -124,13 +129,14 @@ pub mod prelude { resource::ResourceOrNonFungible as ScryptoResourceOrNonFungible, }; pub(crate) use radix_engine_interface::prelude::{ - AccessRule as ScryptoAccessRule, Epoch as ScryptoEpoch, + AccessRule as ScryptoAccessRule, + AccessRuleNode as ScryptoAccessRuleNode, Epoch as ScryptoEpoch, FungibleResourceRoles as ScryptoFungibleResourceRoles, MetadataInit as ScryptoMetadataInit, MetadataValue as ScryptoMetadataValue, ModuleConfig as ScryptoModuleConfig, NonFungibleResourceRoles as ScryptoNonFungibleResourceRoles, - OwnerRole as ScryptoOwnerRole, + OwnerRole as ScryptoOwnerRole, ProofRule as ScryptoProofRule, RoleAssignmentInit as ScryptoRoleAssignmentInit, ToMetadataEntry as ScryptoToMetadataEntry, UncheckedUrl as ScryptoUncheckedUrl, diff --git a/src/profile/encrypted/encryption/aes_gcm_256.rs b/src/profile/encrypted/encryption/aes_gcm_256.rs index 9e66b152a..863fbd7a3 100644 --- a/src/profile/encrypted/encryption/aes_gcm_256.rs +++ b/src/profile/encrypted/encryption/aes_gcm_256.rs @@ -14,6 +14,7 @@ use aes_gcm::{ Hash, derive_more::Display, derive_more::Debug, + uniffi::Record, )] pub struct AesGcm256 {} @@ -68,7 +69,7 @@ impl VersionedEncryption for AesGcm256 { fn encrypt( &self, plaintext: impl AsRef<[u8]>, - encryption_key: &mut Exactly32Bytes, + encryption_key: &mut EncryptionKey, ) -> Vec { let sealed_box = Self::seal( plaintext, @@ -82,7 +83,7 @@ impl VersionedEncryption for AesGcm256 { fn decrypt( &self, cipher_text: impl AsRef<[u8]>, - decryption_key: &mut Exactly32Bytes, + decryption_key: &mut EncryptionKey, ) -> Result> { let sealed_box = AesGcmSealedBox::try_from(cipher_text.as_ref())?; let result = Self::open( @@ -99,6 +100,11 @@ impl From for Key { Self::from(*value.bytes()) } } +impl From for Key { + fn from(value: EncryptionKey) -> Self { + Self::from(value.0) + } +} #[cfg(test)] mod tests { diff --git a/src/profile/encrypted/encryption/encrypted_profile_snapshot.rs b/src/profile/encrypted/encryption/encrypted_profile_snapshot.rs index 35f1fa782..0637d0b58 100644 --- a/src/profile/encrypted/encryption/encrypted_profile_snapshot.rs +++ b/src/profile/encrypted/encryption/encrypted_profile_snapshot.rs @@ -45,7 +45,8 @@ impl EncryptedProfileSnapshot { password: impl AsRef, ) -> Result> { // Derive encryption key based on password - let mut decryption_key = self.key_derivation_scheme.kdf(password); + let mut decryption_key = + EncryptionKey::from(self.key_derivation_scheme.kdf(password)); // decrypt Profile JSON bytes self.encryption_scheme @@ -65,7 +66,8 @@ impl EncryptedProfileSnapshot { let json = profile.to_json_bytes(); // derive symmetric encryption key - let mut encryption_key = key_derivation_scheme.kdf(password); + let mut encryption_key = + EncryptionKey::from(key_derivation_scheme.kdf(password)); // encrypt profile with encryption key let encrypted_payload = diff --git a/src/profile/encrypted/encryption/encryption_key.rs b/src/profile/encrypted/encryption/encryption_key.rs new file mode 100644 index 000000000..b61b9d4a3 --- /dev/null +++ b/src/profile/encrypted/encryption/encryption_key.rs @@ -0,0 +1,59 @@ +use crate::prelude::*; + +uniffi::custom_newtype!(EncryptionKey, Exactly32Bytes); + +#[derive( + Zeroize, + Clone, + Copy, + PartialEq, + Eq, + derive_more::Display, + derive_more::Debug, + derive_more::FromStr, + Serialize, + Deserialize, + Hash, +)] +#[serde(transparent)] +pub struct EncryptionKey(pub Exactly32Bytes); + +impl EncryptionKey { + pub fn generate() -> Self { + Self::from(Exactly32Bytes::generate()) + } +} + +impl From for EncryptionKey { + fn from(value: Exactly32Bytes) -> Self { + Self(value) + } +} + +impl HasSampleValues for EncryptionKey { + fn sample() -> Self { + Self::from(Exactly32Bytes::sample()) + } + fn sample_other() -> Self { + Self::from(Exactly32Bytes::sample_other()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = EncryptionKey; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/encrypted/encryption/encryption_scheme.rs b/src/profile/encrypted/encryption/encryption_scheme.rs index 15007f709..ce13d38c3 100644 --- a/src/profile/encrypted/encryption/encryption_scheme.rs +++ b/src/profile/encrypted/encryption/encryption_scheme.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Clone, PartialEq, Eq, Hash, derive_more::Debug)] +#[derive(Clone, PartialEq, Eq, Hash, derive_more::Debug, uniffi::Enum)] pub enum EncryptionScheme { /// AES GCM 256 encryption Version1(AesGcm256), @@ -62,7 +62,7 @@ impl VersionedEncryption for EncryptionScheme { fn encrypt( &self, plaintext: impl AsRef<[u8]>, - encryption_key: &mut Exactly32Bytes, + encryption_key: &mut EncryptionKey, ) -> Vec { match self { EncryptionScheme::Version1(scheme) => { @@ -77,7 +77,7 @@ impl VersionedEncryption for EncryptionScheme { fn decrypt( &self, cipher_text: impl AsRef<[u8]>, - decryption_key: &mut Exactly32Bytes, + decryption_key: &mut EncryptionKey, ) -> Result> { match self { EncryptionScheme::Version1(scheme) => { @@ -143,17 +143,17 @@ mod tests { #[test] fn encryption_roundtrip() { let sut = SUT::default(); - let mut encryption_key = Exactly32Bytes::generate(); + let mut encryption_key = EncryptionKey::generate(); let mut decryption_key = encryption_key; let msg = "Hello Radix"; let msg_bytes: Vec = msg.bytes().collect(); let encrypted = sut.encrypt(&msg_bytes, &mut encryption_key); - assert_eq!(encryption_key, Exactly32Bytes::from(&[0; 32])); // assert zeroed out + assert_eq!(encryption_key.0, Exactly32Bytes::from(&[0; 32])); // assert zeroed out let decrypted_bytes = sut.decrypt(encrypted, &mut decryption_key).unwrap(); - assert_eq!(decryption_key, Exactly32Bytes::from(&[0; 32])); // assert zeroed out + assert_eq!(decryption_key.0, Exactly32Bytes::from(&[0; 32])); // assert zeroed out let decrypted = String::from_utf8(decrypted_bytes).unwrap(); assert_eq!(msg, decrypted); @@ -165,7 +165,7 @@ mod tests { let test = |encrypted_hex: &str, key_hex: &str, expected_plaintext: &str| { - let mut decryption_key = Exactly32Bytes::from_str(key_hex).unwrap(); + let mut decryption_key = EncryptionKey::from_str(key_hex).unwrap(); let encrypted = hex_decode(encrypted_hex).unwrap(); let decrypted = sut.decrypt(encrypted, &mut decryption_key).unwrap(); @@ -183,7 +183,7 @@ mod tests { fn decrypt_invalid_sealed_box_is_err() { let sut = SUT::default(); assert_eq!( - sut.decrypt(Vec::new(), &mut Exactly32Bytes::sample()), + sut.decrypt(Vec::new(), &mut EncryptionKey::sample()), Err(CommonError::InvalidAESBytesTooShort { expected_at_least: AesGcmSealedBox::LOWER_BOUND_LEN as u64, found: 0 diff --git a/src/profile/encrypted/encryption/mod.rs b/src/profile/encrypted/encryption/mod.rs index a5ba44bf5..232ef49e8 100644 --- a/src/profile/encrypted/encryption/mod.rs +++ b/src/profile/encrypted/encryption/mod.rs @@ -1,6 +1,7 @@ mod aes_gcm_256; mod aes_gcm_sealed_box; mod encrypted_profile_snapshot; +mod encryption_key; mod encryption_scheme; mod encryption_scheme_version; mod versioned_encryption; @@ -8,6 +9,7 @@ mod versioned_encryption; pub use aes_gcm_256::*; pub use aes_gcm_sealed_box::*; pub use encrypted_profile_snapshot::*; +pub use encryption_key::*; pub use encryption_scheme::*; pub use encryption_scheme_version::*; pub use versioned_encryption::*; diff --git a/src/profile/encrypted/encryption/versioned_encryption.rs b/src/profile/encrypted/encryption/versioned_encryption.rs index e5ff7a13d..923fe06d9 100644 --- a/src/profile/encrypted/encryption/versioned_encryption.rs +++ b/src/profile/encrypted/encryption/versioned_encryption.rs @@ -3,12 +3,12 @@ pub trait VersionedEncryption: VersionOfAlgorithm { fn encrypt( &self, plaintext: impl AsRef<[u8]>, - encryption_key: &mut Exactly32Bytes, + encryption_key: &mut EncryptionKey, ) -> Vec; fn decrypt( &self, cipher_text: impl AsRef<[u8]>, - decryption_key: &mut Exactly32Bytes, + decryption_key: &mut EncryptionKey, ) -> Result>; } diff --git a/src/profile/logic/account/create_account.rs b/src/profile/logic/account/create_account.rs new file mode 100644 index 000000000..12b090ed5 --- /dev/null +++ b/src/profile/logic/account/create_account.rs @@ -0,0 +1,145 @@ +use crate::prelude::*; +use std::future::Future; + +impl Profile { + /// Creates a new non securified account **WITHOUT** adding it to Profile, using the *main* "Babylon" + /// `DeviceFactorSource` and the "next" index for this FactorSource as derivation path. + /// + /// If you want to add it to Profile, call `add_account(account)` + /// + /// Returns a tuple `(FactorSourceID, Account)` where FactorSourceID is the ID + /// of the FactorSource used to create the account. + pub async fn create_unsaved_account( + &self, + network_id: NetworkID, + name: DisplayName, + load_private_device_factor_source: F, + ) -> Result<(FactorSourceID, Account)> + where + F: FnOnce(DeviceFactorSource) -> Fut, + Fut: Future< + Output = Result, + >, + { + let (factor_source_id, accounts) = self + .create_unsaved_accounts( + network_id, + 1, + |_| name.clone(), + load_private_device_factor_source, + ) + .await?; + + let account = accounts + .into_iter() + .last() + .expect("Should have created one account"); + + Ok((factor_source_id, account)) + } + + /// Creates many new non securified accounts **WITHOUT** adding them to Profile, using the *main* "Babylon" + /// `DeviceFactorSource` and the "next" indices for this FactorSource as derivation paths. + /// + /// If you want to add the accounts to Profile, call `add_accounts(accounts)` + /// + /// Returns a tuple `(FactorSourceID, Accounts)` where FactorSourceID is the ID + /// of the FactorSource used to create the accounts. + pub async fn create_unsaved_accounts( + &self, + network_id: NetworkID, + count: u16, + get_name: impl Fn(u32) -> DisplayName, // name of account at index + load_private_device_factor_source: F, + ) -> Result<(FactorSourceID, Accounts)> + where + F: FnOnce(DeviceFactorSource) -> Fut, + Fut: Future< + Output = Result, + >, + { + let index = self + .next_derivation_index_for_entity(EntityKind::Account, network_id); + + assert!((index as i64) - (count as i64) < (u32::MAX as i64)); // unlikely edge case + + let bdfs = self.bdfs(); + let count = count as u32; + + let number_of_accounts_on_network = self + .networks + .get_id(network_id) + .map(|n| n.accounts.len()) + .unwrap_or(0); + + let indices = index..index + count; + + let factor_instances = load_private_device_factor_source(bdfs.clone()) + .await + .map(|p| { + assert_eq!(p.factor_source, bdfs); + p.derive_entity_creation_factor_instances(network_id, indices) + })?; + + let accounts = factor_instances + .into_iter() + .map(|f| { + let idx = f.index(); + let name = get_name(idx); + let appearance_id = + AppearanceID::from_number_of_accounts_on_network( + (idx as usize) + number_of_accounts_on_network, + ); + + Account::new(f, name, appearance_id) + }) + .collect::(); + + Ok((bdfs.factor_source_id(), accounts)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[actix_rt::test] + async fn test_create_unsaved_accounts() { + let sut = Profile::from_device_factor_source( + PrivateHierarchicalDeterministicFactorSource::sample() + .factor_source, + HostId::sample(), + HostInfo::sample(), + ); + + let (_, accounts) = sut + .create_unsaved_accounts( + NetworkID::Mainnet, + 3, + |i| { + DisplayName::new(if i == 0 { + "Alice" + } else if i == 1 { + "Bob" + } else { + "Carol" + }) + .unwrap() + }, + async move |_| { + Ok(PrivateHierarchicalDeterministicFactorSource::sample()) + }, + ) + .await + .unwrap(); + + pretty_assertions::assert_eq!( + accounts, + Accounts::from_iter([ + Account::sample_mainnet_alice(), + Account::sample_mainnet_bob(), + Account::sample_mainnet_carol() + ]) + ) + } +} diff --git a/src/profile/logic/account/mod.rs b/src/profile/logic/account/mod.rs index ab1a767d0..909c4f742 100644 --- a/src/profile/logic/account/mod.rs +++ b/src/profile/logic/account/mod.rs @@ -1,3 +1,9 @@ mod accounts_visibility; +mod create_account; +mod query_accounts; +mod query_security_structures; pub use accounts_visibility::*; +pub use create_account::*; +pub use query_accounts::*; +pub use query_security_structures::*; diff --git a/src/profile/logic/account/query_accounts.rs b/src/profile/logic/account/query_accounts.rs new file mode 100644 index 000000000..56640e284 --- /dev/null +++ b/src/profile/logic/account/query_accounts.rs @@ -0,0 +1,81 @@ +use crate::prelude::*; + +impl Profile { + /// Returns the non-hidden accounts on the current network, empty if no accounts + /// on the network + pub fn accounts_on_current_network(&self) -> Accounts { + self.current_network().accounts.non_hidden() + } + + /// Returns the non-hidden accounts on the current network as `AccountForDisplay` + pub fn accounts_for_display_on_current_network( + &self, + ) -> AccountsForDisplay { + self.accounts_on_current_network() + .iter() + .map(AccountForDisplay::from) + .collect::() + } + + /// Looks up the account by account address, returns Err if the account is + /// unknown, will return a hidden account if queried for. + pub fn account_by_address( + &self, + address: AccountAddress, + ) -> Result { + for network in self.networks.iter() { + if let Some(account) = network.accounts.get_id(address) { + return Ok(account.clone()); + } + } + Err(CommonError::UnknownAccount) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Profile; + + #[test] + fn test_accounts_on_current_network() { + let sut = SUT::sample(); + assert_eq!( + sut.accounts_on_current_network(), + Accounts::sample_mainnet() + ); + } + + #[test] + fn test_accounts_on_current_network_stokenet() { + let sut = SUT::sample_other(); + assert_eq!( + sut.accounts_on_current_network(), + Accounts::just(Account::sample_stokenet_nadia()) // olivia is hidden + ); + } + + #[test] + fn test_accounts_for_display_on_current_network() { + let sut = SUT::sample(); + assert_eq!( + sut.accounts_for_display_on_current_network(), + Accounts::sample_mainnet() + .iter() + .map(AccountForDisplay::from) + .collect::() + ); + } + + #[test] + fn test_account_by_address() { + let sut = SUT::sample(); + assert_eq!( + sut.account_by_address(Account::sample_mainnet().address), + Ok(Account::sample_mainnet()) + ); + } +} diff --git a/src/profile/logic/account/query_security_structures.rs b/src/profile/logic/account/query_security_structures.rs new file mode 100644 index 000000000..8de8e671a --- /dev/null +++ b/src/profile/logic/account/query_security_structures.rs @@ -0,0 +1,21 @@ +use crate::prelude::*; + +impl Profile { + /// Returns all the SecurityStructuresOfFactorSources, + /// by trying to map FactorSourceID level -> FactorSource Level + pub fn security_structures_of_factor_sources( + &self, + ) -> Result { + self.app_preferences + .security + .security_structures_of_factor_source_ids + .iter() + .map(|id| { + SecurityStructureOfFactorSources::try_from(( + &id, + &self.factor_sources, + )) + }) + .collect::>() + } +} diff --git a/src/profile/logic/gateway/current_gateway.rs b/src/profile/logic/gateway/current_gateway.rs new file mode 100644 index 000000000..c8aa36272 --- /dev/null +++ b/src/profile/logic/gateway/current_gateway.rs @@ -0,0 +1,139 @@ +use crate::prelude::*; + +impl Profile { + /// Returns the `current` gateway in AppPreferences, used by host clients to + /// know the NetworkID currently being used. + pub fn current_gateway(&self) -> Gateway { + self.app_preferences.gateways.current.clone() + } + + /// The NetworkID currently being used, dependent on `current` gateway in + /// AppPreferences + pub fn current_network_id(&self) -> NetworkID { + self.current_gateway().network.id + } + + /// The ProfileNetwork of the currently used Network dependent on the `current` + /// Gateway set in AppPreferences. This affects which Accounts users see in + /// "Home screen" in wallet apps. + pub fn current_network(&self) -> &ProfileNetwork { + self.networks + .get_id(self.current_network_id()) + .expect("Should have current network") + } +} + +/// When user changes `current` Gateway in AppPreferences host clients should +/// make it so that they can only change to non current gateway, this small type +/// represents the outcome of switching, e.g. if they just switched to a "new" +/// network, i.e. if the gateway was in `other` list in saved gateways, or if +/// we just added it. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum ChangeGatewayOutcome { + /// If we did in fact change the gateway, and if the gateway was unknown + /// or known before it was added, i.e. `is_new` will be true iff the gateway + /// was unknown before changing to it. + DidChange { + /// If the Gateway we just switched to already was in the `other` list of + /// saved gateways in AppPreferences, or if it was entirely new. + is_new: bool, + }, + + /// We tried to change to the current gateway. + NoChange, +} + +impl SavedGateways { + /// Changes the current Gateway to `to`, if it is not already the current. If `to` is + /// not a new Gateway, it will be removed from. Returns `Ok(false)` if `to` was already + /// the `current`, returns `Ok(true)` if `to` was not already `current`. + pub fn change_current(&mut self, to: Gateway) -> ChangeGatewayOutcome { + if self.current == to { + return ChangeGatewayOutcome::NoChange; + } + let old_current = &self.current; + let was_inserted = self.append_to_other(old_current.clone(), true); + if !was_inserted { + let msg = "Discrepancy! 'other' already contained 'current'"; + error!("{}", msg); + panic!("{}", msg); + } + let is_new = self.other.remove_id(&to.id()).is_none(); + self.current = to; + ChangeGatewayOutcome::DidChange { is_new } + } + + /// Appends `gateway` to the `other` list if `gateway` not equals `current`, + /// without changing the `current` Gateway. + /// If `other` already contains `gateway` then `(false, other.len())` is returned. + /// If `other` was new then `(true, index_of_new)` is returned. + /// + /// - Returns: `true` if it was added, `false` if it was already present (noop) + /// Appends `gateway` to the `other` list if `gateway` not equals `current`, + /// without changing the `current` Gateway. + /// If `other` already contains `gateway` then `(false, other.len())` is returned. + /// If `other` was new then `(true, index_of_new)` is returned. + /// + /// - Returns: `true` if it was added, `false` if it was already present (noop) + pub fn append(&mut self, gateway: Gateway) -> bool { + self.append_to_other(gateway, false) + } + + fn append_to_other( + &mut self, + gateway: Gateway, + is_switching: bool, + ) -> bool { + if !is_switching && self.current == gateway { + return false; + } + self.other.append(gateway).0 + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SavedGateways; + + #[test] + fn change_current_to_new() { + let mut sut = SUT::default(); + assert_eq!(sut.current.network.id, NetworkID::Mainnet); + assert_eq!( + sut.change_current(Gateway::nebunet()), + ChangeGatewayOutcome::DidChange { is_new: true } + ); + assert_eq!(sut.current.network.id, NetworkID::Nebunet); + assert_eq!( + sut.other.items(), + [Gateway::stokenet(), Gateway::mainnet()] + ); + } + + #[test] + fn change_current_to_existing() { + let mut sut = SUT::default(); + assert_eq!(sut.current.network.id, NetworkID::Mainnet); + assert_eq!( + sut.change_current(Gateway::stokenet()), + ChangeGatewayOutcome::DidChange { is_new: false } + ); + assert_eq!(sut.current.network.id, NetworkID::Stokenet); + } + + #[test] + #[should_panic( + expected = "Discrepancy! 'other' already contained 'current'" + )] + fn change_throw_gateways_discrepancy_other_should_not_contain_current() { + let mut impossible = SUT { + current: Gateway::mainnet(), + other: Gateways::from_iter([Gateway::mainnet()]), + }; + let _ = impossible.change_current(Gateway::stokenet()); + } +} diff --git a/src/profile/logic/gateway/mod.rs b/src/profile/logic/gateway/mod.rs new file mode 100644 index 000000000..9dd21f69c --- /dev/null +++ b/src/profile/logic/gateway/mod.rs @@ -0,0 +1,3 @@ +mod current_gateway; + +pub use current_gateway::*; diff --git a/src/profile/logic/mod.rs b/src/profile/logic/mod.rs index 1c973855b..b4b3aae04 100644 --- a/src/profile/logic/mod.rs +++ b/src/profile/logic/mod.rs @@ -1,9 +1,15 @@ mod account; +mod gateway; mod persona; +mod profile_header; mod profile_network; +mod profile_networks; mod profile_next_derivation; pub use account::*; +pub use gateway::*; pub use persona::*; +pub use profile_header::*; pub use profile_network::*; +pub use profile_networks::*; pub use profile_next_derivation::*; diff --git a/src/profile/logic/profile_header.rs b/src/profile/logic/profile_header.rs new file mode 100644 index 000000000..f019da25b --- /dev/null +++ b/src/profile/logic/profile_header.rs @@ -0,0 +1,50 @@ +use crate::prelude::*; + +impl Header { + /// Updates `last_modified`, `content_hint` and also `last_used_on_device` if + /// it was specified. + pub fn update( + &mut self, + content_hint: ContentHint, + maybe_device_info: impl Into>, + ) { + if let Some(device_info) = maybe_device_info.into() { + self.last_used_on_device = device_info; + } + self.content_hint = content_hint; + self.last_modified = now(); + } +} + +impl Profile { + /// Updates the header's fields: `last_modified`, `content_hint` and also + /// `last_used_on_device` if it was specified. + pub fn update_header( + &mut self, + maybe_device_info: impl Into>, + ) { + let content_hint = self.networks.content_hint(); + self.header.update(content_hint, maybe_device_info) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Header; + + #[test] + fn test_update_header() { + let mut sut = SUT::sample(); + let new_hint = ContentHint::sample_other(); + let new_device = DeviceInfo::sample_other(); + assert_ne!(sut.content_hint, new_hint.clone()); + assert_ne!(sut.last_used_on_device, new_device.clone()); + sut.update(ContentHint::sample_other(), DeviceInfo::sample_other()); + assert_eq!(sut.content_hint, new_hint); + assert_eq!(sut.last_used_on_device, new_device); + } +} diff --git a/src/profile/logic/profile_networks.rs b/src/profile/logic/profile_networks.rs new file mode 100644 index 000000000..37f4a2473 --- /dev/null +++ b/src/profile/logic/profile_networks.rs @@ -0,0 +1,35 @@ +use crate::prelude::*; + +impl Profile { + /// If the user has **any** accounts on any network at all, including hidden + /// accounts. This can be used by host devices to prompt user to create their + /// first account or not, e.g. if user starts app after fresh install, the + /// SargonOS will create an "empty" Profile and BDFS and save it, before user + /// has had the chance to create their first account. If the user force quits + /// the app and then restart it, the app can still prompt user to create their + /// first account - as if no force-restart happened. + pub fn has_any_account_on_any_network(&self) -> bool { + self.networks.iter().any(|n| !n.accounts.is_empty()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Profile; + + #[test] + fn test_empty_profile_has_any_account_on_any_network_is_false() { + let sut = + SUT::new(Mnemonic::sample(), HostId::sample(), HostInfo::sample()); + assert!(!sut.has_any_account_on_any_network()); + } + + #[test] + fn test_sample_profile_has_any_account_on_any_network() { + assert!(SUT::sample().has_any_account_on_any_network()); + assert!(SUT::sample_other().has_any_account_on_any_network()); + } +} diff --git a/src/profile/logic/profile_next_derivation.rs b/src/profile/logic/profile_next_derivation.rs index 2c183aaf0..36434f3cc 100644 --- a/src/profile/logic/profile_next_derivation.rs +++ b/src/profile/logic/profile_next_derivation.rs @@ -11,9 +11,9 @@ impl Profile { { let id = id.into(); self.factor_sources - .get_id(&id) + .get_id(id) .ok_or(CommonError::ProfileDoesNotContainFactorSourceWithID { - bad_value: id.clone(), + bad_value: id, }) .and_then(|f| { f.clone().try_into().map_err(|_| { @@ -32,14 +32,16 @@ impl Profile { self.factor_source_by_id(*id) } - pub fn bdfs(&self) -> DeviceFactorSource { - let device_factor_source = self - .factor_sources + pub fn device_factor_sources(&self) -> Vec { + self.factor_sources .iter() .filter_map(|f| f.as_device().cloned()) - .collect_vec(); + .collect_vec() + } - let explicit_main = device_factor_source + pub fn bdfs(&self) -> DeviceFactorSource { + let device_factor_sources = self.device_factor_sources(); + let explicit_main = device_factor_sources .clone() .into_iter() .filter(|x| x.is_main_bdfs()) @@ -47,7 +49,7 @@ impl Profile { .first() .cloned(); - let implicit_main = device_factor_source + let implicit_main = device_factor_sources .into_iter() .filter(|x| x.common.supports_babylon()) .collect_vec() @@ -74,7 +76,7 @@ impl Profile { }; let index = self .networks - .get_id(&network_id) + .get_id(network_id) .map(|n| { n.accounts .items() @@ -221,7 +223,10 @@ mod tests { fn device_factor_source_by_id_success_device() { let profile = Profile::sample(); let dfs = DeviceFactorSource::sample_babylon(); - assert_eq!(profile.device_factor_source_by_id(&dfs.id), Ok(dfs)); + pretty_assertions::assert_eq!( + profile.device_factor_source_by_id(&dfs.id), + Ok(dfs) + ); } #[test] diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source.rs new file mode 100644 index 000000000..8f9dad3f0 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source.rs @@ -0,0 +1,192 @@ +use crate::prelude::*; +use crate::prelude::*; + +/// An Arculus card, a hierarchal deterministic wallet capable of CAP26 derivation +/// which users interact with by placing it near their host device, which +/// communicates with the card over NFC. +#[derive( + Serialize, + Deserialize, + Clone, + PartialEq, + Eq, + Hash, + Debug, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[display("{hint} : {id}")] +pub struct ArculusCardFactorSource { + /// Unique and stable identifier of this factor source, stemming from the + /// hash of a special child key of the HD root of the mnemonic, + /// that is secured by the Arculus Card. + pub id: FactorSourceIDFromHash, + + /// Common properties shared between FactorSources of different kinds, + /// describing its state, when added, and supported cryptographic parameters. + pub common: FactorSourceCommon, + + /// Properties describing a ArculusCardFactorSource to help user disambiguate + /// between it and another one. + pub hint: ArculusCardHint, +} + +impl From for FactorSource { + fn from(value: ArculusCardFactorSource) -> Self { + FactorSource::ArculusCard { value } + } +} + +fn new_arculus_with_mwp( + mwp: MnemonicWithPassphrase, + hint: ArculusCardHint, +) -> ArculusCardFactorSource { + let id = FactorSourceIDFromHash::new_for_arculus(&mwp); + let mut source = ArculusCardFactorSource::new(id, hint); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source +} + +impl ArculusCardFactorSource { + /// Instantiates a new `ArculusCardFactorSource` + pub fn new(id: FactorSourceIDFromHash, hint: ArculusCardHint) -> Self { + Self { + id, + common: FactorSourceCommon::new_bdfs(false), + hint, + } + } +} + +impl HasSampleValues for ArculusCardFactorSource { + fn sample() -> Self { + new_arculus_with_mwp( + MnemonicWithPassphrase::sample_arculus(), + ArculusCardHint::sample(), + ) + } + + fn sample_other() -> Self { + new_arculus_with_mwp( + MnemonicWithPassphrase::sample_arculus_other(), + ArculusCardHint::sample_other(), + ) + } +} + +impl TryFrom for ArculusCardFactorSource { + type Error = CommonError; + + fn try_from(value: FactorSource) -> Result { + match value { + FactorSource::ArculusCard { value } => Ok(value), + _ => Err( + Self::Error::ExpectedArculusCardFactorSourceGotSomethingElse, + ), + } + } +} +impl IsFactorSource for ArculusCardFactorSource { + fn kind() -> FactorSourceKind { + FactorSourceKind::ArculusCard + } +} +impl BaseIsFactorSource for ArculusCardFactorSource { + fn common_properties(&self) -> FactorSourceCommon { + self.common.clone() + } + + fn factor_source_kind(&self) -> FactorSourceKind { + self.id.kind + } + + fn factor_source_id(&self) -> FactorSourceID { + self.clone().id.into() + } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = ArculusCardFactorSource; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn json_roundtrip() { + let model = SUT::sample(); + assert_eq_after_json_roundtrip( + &model, + r#" + { + "id": { + "kind": "arculusCard", + "body": "12f36554769cd96614776e6dbd5629825b8e87366eec5e515de32bb1ea153820" + }, + "common": { + "addedOn": "2023-09-11T16:05:56.000Z", + "cryptoParameters": { + "supportedCurves": ["curve25519"], + "supportedDerivationPathSchemes": ["cap26"] + }, + "flags": [], + "lastUsedOn": "2023-09-11T16:05:56.000Z" + }, + "hint": { + "name": "Silver", + "model": "arculusColdStorageWallet" + } + } + "#, + ); + } + + #[test] + fn from_factor_source() { + let sut = SUT::sample(); + let factor_source: FactorSource = sut.clone().into(); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); + } + + #[test] + fn kind() { + assert_eq!(SUT::kind(), FactorSourceKind::ArculusCard); + } + + #[test] + fn from_factor_source_invalid_got_device() { + let wrong = DeviceFactorSource::sample(); + let factor_source: FactorSource = wrong.clone().into(); + assert_eq!( + SUT::try_from(factor_source), + Err(CommonError::ExpectedArculusCardFactorSourceGotSomethingElse) + ); + } + + #[test] + fn factor_source_id() { + assert_eq!(SUT::sample().factor_source_id(), SUT::sample().id.into()); + } + + #[test] + fn factor_source_kind() { + assert_eq!(SUT::sample().factor_source_kind(), SUT::sample().id.kind); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source_uniffi_fn.rs new file mode 100644 index 000000000..10df1d55d --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_factor_source_uniffi_fn.rs @@ -0,0 +1,56 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_arculus_card_factor_source_sample() -> ArculusCardFactorSource { + ArculusCardFactorSource::sample() +} + +#[uniffi::export] +pub fn new_arculus_card_factor_source_sample_other() -> ArculusCardFactorSource +{ + ArculusCardFactorSource::sample_other() +} + +#[uniffi::export] +fn new_arculus_card_factor_source_from_mnemonic_with_passphrase( + mwp: MnemonicWithPassphrase, + hint: ArculusCardHint, +) -> ArculusCardFactorSource { + let id = FactorSourceIDFromHash::new_for_arculus(&mwp); + ArculusCardFactorSource::new(id, hint) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = ArculusCardFactorSource; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_arculus_card_factor_source_sample(), + new_arculus_card_factor_source_sample_other(), + // duplicates should get removed + new_arculus_card_factor_source_sample(), + new_arculus_card_factor_source_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_new_arculus_card_factor_source_from_mnemonic_with_passphrase() { + assert_eq!( + new_arculus_card_factor_source_from_mnemonic_with_passphrase( + MnemonicWithPassphrase::sample_arculus(), + ArculusCardHint::sample() + ) + .factor_source_id(), + SUT::sample().factor_source_id() + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_hint.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_hint.rs new file mode 100644 index 000000000..c97af3205 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_hint.rs @@ -0,0 +1,72 @@ +use crate::prelude::*; + +#[derive( + Serialize, + Deserialize, + Clone, + Debug, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[display("{name} {model}")] +pub struct ArculusCardHint { + /// E.g. "Black" or "Silver" + pub name: String, + + pub model: ArculusCardModel, +} + +impl ArculusCardHint { + pub fn new(name: &str, model: ArculusCardModel) -> Self { + Self { + name: name.to_string(), + model, + } + } +} + +impl HasSampleValues for ArculusCardHint { + fn sample() -> Self { + Self::new("Silver", ArculusCardModel::default()) + } + + fn sample_other() -> Self { + Self::new("Black", ArculusCardModel::default()) + } +} + +#[cfg(test)] +mod tests { + use crate::prelude::*; + + #[test] + fn equality() { + assert_eq!(ArculusCardHint::sample(), ArculusCardHint::sample()); + assert_eq!( + ArculusCardHint::sample_other(), + ArculusCardHint::sample_other() + ); + } + + #[test] + fn inequality() { + assert_ne!(ArculusCardHint::sample(), ArculusCardHint::sample_other()); + } + + #[test] + fn json_roundtrip() { + let model = ArculusCardHint::sample(); + assert_eq_after_json_roundtrip( + &model, + r#" + { + "name": "Silver", + "model": "arculusColdStorageWallet" + } + "#, + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model.rs new file mode 100644 index 000000000..e01f3835b --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model.rs @@ -0,0 +1,88 @@ +use crate::prelude::*; + +/// The model of a Arculus Card. +#[derive( + Serialize, + Deserialize, + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + uniffi::Enum, +)] +#[serde(rename_all = "camelCase")] +pub enum ArculusCardModel { + /// Arculus card model: "Arculus® Cold Storage Wallet", + /// for more info [see][link]. + /// + /// [link]: https://www.getarculus.com/products/arculus-cold-storage-wallet.html + ArculusColdStorageWallet, +} + +impl Default for ArculusCardModel { + fn default() -> Self { + Self::ArculusColdStorageWallet + } +} + +impl FromStr for ArculusCardModel { + type Err = CommonError; + fn from_str(s: &str) -> Result { + Self::new_from_json_string(s).map_err(|_| { + CommonError::InvalidArculusCardModel { + bad_value: s.to_owned(), + } + }) + } +} + +impl JsonStringSerializing for ArculusCardModel {} // to raw String +impl JsonStringDeserializing for ArculusCardModel {} // from raw String + +impl std::fmt::Display for ArculusCardModel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.to_json_string()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = ArculusCardModel; + + #[test] + fn string_roundtrip() { + use ArculusCardModel::*; + let eq = |f: SUT, s| { + assert_eq!(f.to_string(), s); + assert_eq!(SUT::from_str(s).unwrap(), f); + }; + + eq(ArculusColdStorageWallet, "arculusColdStorageWallet"); + } + + #[test] + fn from_str_err() { + let s = "invalid!"; + assert_eq!( + SUT::from_str(s), + Err(CommonError::InvalidArculusCardModel { + bad_value: s.to_owned(), + }) + ); + } + + #[test] + fn json_roundtrip() { + assert_json_value_eq_after_roundtrip( + &SUT::ArculusColdStorageWallet, + json!("arculusColdStorageWallet"), + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model_uniffi_fn.rs new file mode 100644 index 000000000..caa1634d4 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/arculus_card_model_uniffi_fn.rs @@ -0,0 +1,6 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn arculus_card_model_to_string(model: ArculusCardModel) -> String { + model.to_string() +} diff --git a/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/mod.rs b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/mod.rs new file mode 100644 index 000000000..0bed49658 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/arculus_card_factor_source/mod.rs @@ -0,0 +1,11 @@ +mod arculus_card_factor_source; +mod arculus_card_factor_source_uniffi_fn; +mod arculus_card_hint; +mod arculus_card_model; +mod arculus_card_model_uniffi_fn; + +pub use arculus_card_factor_source::*; +pub use arculus_card_factor_source_uniffi_fn::*; +pub use arculus_card_hint::*; +pub use arculus_card_model::*; +pub use arculus_card_model_uniffi_fn::*; diff --git a/src/profile/mfa/mfa_factor_sources/mod.rs b/src/profile/mfa/mfa_factor_sources/mod.rs new file mode 100644 index 000000000..3d624cfc4 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/mod.rs @@ -0,0 +1,9 @@ +mod arculus_card_factor_source; +mod off_device_mnemonic_factor_source; +mod security_questions_factor_source; +mod trusted_contact_factor_source; + +pub use arculus_card_factor_source::*; +pub use off_device_mnemonic_factor_source::*; +pub use security_questions_factor_source::*; +pub use trusted_contact_factor_source::*; diff --git a/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/mod.rs b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/mod.rs new file mode 100644 index 000000000..6d22bdeee --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/mod.rs @@ -0,0 +1,7 @@ +mod off_device_factor_source_hint; +mod off_device_mnemonic_factor_source; +mod off_device_mnemonic_factor_source_uniffi_fn; + +pub use off_device_factor_source_hint::*; +pub use off_device_mnemonic_factor_source::*; +pub use off_device_mnemonic_factor_source_uniffi_fn::*; diff --git a/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_factor_source_hint.rs b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_factor_source_hint.rs new file mode 100644 index 000000000..7afffd864 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_factor_source_hint.rs @@ -0,0 +1,54 @@ +use crate::prelude::*; + +/// Properties describing a DeviceFactorSource to help user disambiguate between +/// it and another one. +#[derive( + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +pub struct OffDeviceMnemonicHint { + pub display_name: DisplayName, +} + +impl OffDeviceMnemonicHint { + pub fn new(display_name: DisplayName) -> Self { + Self { display_name } + } +} + +impl HasSampleValues for OffDeviceMnemonicHint { + fn sample() -> Self { + Self::new(DisplayName::new("Story about a horse").unwrap()) + } + + fn sample_other() -> Self { + Self::new(DisplayName::new("Thrilled with a shark").unwrap()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = OffDeviceMnemonicHint; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source.rs b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source.rs new file mode 100644 index 000000000..8998eb572 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source.rs @@ -0,0 +1,155 @@ +use crate::prelude::*; + +/// A factor source representing a Mnemonic the user has to input every time +/// the use the factor source, since it is not saved on the device, it is said +/// to be "off device". +#[derive( + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[display("{hint} {id}")] +pub struct OffDeviceMnemonicFactorSource { + /// Unique and stable identifier of this factor source, stemming from the + /// hash of a special child key of the HD root of the mnemonic. + pub id: FactorSourceIDFromHash, + + /// Common properties shared between FactorSources of different kinds, + /// describing its state, when added, and supported cryptographic parameters. + pub common: FactorSourceCommon, + + /// Properties describing a OffDeviceMnemonicFactorSource to help user + /// disambiguate between it and another one. + pub hint: OffDeviceMnemonicHint, +} + +impl From for FactorSource { + fn from(value: OffDeviceMnemonicFactorSource) -> Self { + FactorSource::OffDeviceMnemonic { value } + } +} + +fn new_off_device_with_mwp( + mwp: MnemonicWithPassphrase, + hint: OffDeviceMnemonicHint, +) -> OffDeviceMnemonicFactorSource { + let id = FactorSourceIDFromHash::new_for_off_device(&mwp); + let mut source = OffDeviceMnemonicFactorSource::new(id, hint); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source +} + +impl OffDeviceMnemonicFactorSource { + /// Instantiates a new `OffDeviceMnemonicFactorSource` + pub fn new( + id: FactorSourceIDFromHash, + hint: OffDeviceMnemonicHint, + ) -> Self { + Self { + id, + common: FactorSourceCommon::new_bdfs(false), + hint, + } + } +} + +impl HasSampleValues for OffDeviceMnemonicFactorSource { + fn sample() -> Self { + new_off_device_with_mwp( + MnemonicWithPassphrase::sample_off_device(), + OffDeviceMnemonicHint::sample(), + ) + } + + fn sample_other() -> Self { + new_off_device_with_mwp( + MnemonicWithPassphrase::sample_off_device_other(), + OffDeviceMnemonicHint::sample_other(), + ) + } +} + +impl TryFrom for OffDeviceMnemonicFactorSource { + type Error = CommonError; + + fn try_from(value: FactorSource) -> Result { + value.clone().into_off_device_mnemonic().map_err(|_| { + CommonError::InvalidFactorSourceKind { + bad_value: value.factor_source_kind().to_string(), + } + }) + } +} +impl IsFactorSource for OffDeviceMnemonicFactorSource { + fn kind() -> FactorSourceKind { + FactorSourceKind::OffDeviceMnemonic + } +} +impl BaseIsFactorSource for OffDeviceMnemonicFactorSource { + fn common_properties(&self) -> FactorSourceCommon { + self.common.clone() + } + + fn factor_source_kind(&self) -> FactorSourceKind { + self.id.kind + } + + fn factor_source_id(&self) -> FactorSourceID { + self.clone().id.into() + } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = OffDeviceMnemonicFactorSource; + + #[test] + fn kind() { + assert_eq!(SUT::kind(), FactorSourceKind::OffDeviceMnemonic); + } + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn from_factor_source() { + let sut = SUT::sample(); + let factor_source: FactorSource = sut.clone().into(); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); + } + + #[test] + fn from_factor_source_invalid_got_device() { + let wrong = DeviceFactorSource::sample(); + let factor_source: FactorSource = wrong.clone().into(); + assert_eq!( + SUT::try_from(factor_source), + Err(CommonError::InvalidFactorSourceKind { + bad_value: "device".to_owned() + }) + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source_uniffi_fn.rs new file mode 100644 index 000000000..b8e01fcc7 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/off_device_mnemonic_factor_source/off_device_mnemonic_factor_source_uniffi_fn.rs @@ -0,0 +1,58 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_off_device_mnemonic_factor_source_sample( +) -> OffDeviceMnemonicFactorSource { + OffDeviceMnemonicFactorSource::sample() +} + +#[uniffi::export] +pub fn new_off_device_mnemonic_factor_source_sample_other( +) -> OffDeviceMnemonicFactorSource { + OffDeviceMnemonicFactorSource::sample_other() +} + +#[uniffi::export] +fn new_off_device_mnemonic_factor_source_from_mnemonic_with_passphrase( + mwp: MnemonicWithPassphrase, + hint: OffDeviceMnemonicHint, +) -> OffDeviceMnemonicFactorSource { + let id = FactorSourceIDFromHash::new_for_off_device(&mwp); + OffDeviceMnemonicFactorSource::new(id, hint) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = OffDeviceMnemonicFactorSource; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_off_device_mnemonic_factor_source_sample(), + new_off_device_mnemonic_factor_source_sample_other(), + // duplicates should get removed + new_off_device_mnemonic_factor_source_sample(), + new_off_device_mnemonic_factor_source_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_new_off_device_mnemonic_factor_source_from_mnemonic_with_passphrase( + ) { + assert_eq!( + new_off_device_mnemonic_factor_source_from_mnemonic_with_passphrase( + MnemonicWithPassphrase::sample_off_device(), + OffDeviceMnemonicHint::sample() + ) + .factor_source_id(), + SUT::sample().factor_source_id() + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/mod.rs new file mode 100644 index 000000000..4d9311682 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/mod.rs @@ -0,0 +1,5 @@ +mod security_question_and_answer; +mod security_questions_and_answers; + +pub use security_question_and_answer::*; +pub use security_questions_and_answers::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_question_and_answer.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_question_and_answer.rs new file mode 100644 index 000000000..2affc6ad3 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_question_and_answer.rs @@ -0,0 +1,50 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A pair of security question and answer +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct Security_NOT_PRODUCTION_READY_QuestionAndAnswer { + pub question: Security_NOT_PRODUCTION_READY_Question, + pub answer: String, +} + +impl Security_NOT_PRODUCTION_READY_QuestionAndAnswer { + pub fn new( + question: Security_NOT_PRODUCTION_READY_Question, + answer: impl AsRef, + ) -> Self { + Self { + question, + answer: answer.as_ref().to_owned(), + } + } +} + +impl HasSampleValues for Security_NOT_PRODUCTION_READY_QuestionAndAnswer { + fn sample() -> Self { + Self::new( + Security_NOT_PRODUCTION_READY_Question::first_concert(), + "Jean-Michel Jarre, Paris La Défense, 1990", + ) + } + + fn sample_other() -> Self { + Self::new( + Security_NOT_PRODUCTION_READY_Question::stuffed_animal(), + "Oinky piggy pig", + ) + } +} + +impl Identifiable for Security_NOT_PRODUCTION_READY_QuestionAndAnswer { + type ID = ::ID; + + fn id(&self) -> Self::ID { + self.question.id() + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_questions_and_answers.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_questions_and_answers.rs new file mode 100644 index 000000000..62d38fbf4 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/answer/security_questions_and_answers.rs @@ -0,0 +1,64 @@ +use crate::prelude::*; + +decl_identified_vec_of!( + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An ordered set of [`SecurityQuestionAndAnswer`]s user has selected to use + /// in their `SecurityQuestionsFactorSource` - a factor they typically + /// use for the `ConfirmationRole`. + /// ❗️ NOT PRODUCTION READY YET ❗️ + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + Security_NOT_PRODUCTION_READY_QuestionAndAnswer +); + +impl HasSampleValues for Security_NOT_PRODUCTION_READY_QuestionsAndAnswers { + fn sample() -> Self { + type Q = Security_NOT_PRODUCTION_READY_Question; + type QA = Security_NOT_PRODUCTION_READY_QuestionAndAnswer; + Self::from_iter([ + QA::new(Q::failed_exam(), "MIT, year 4, Python"), + QA::new(Q::parents_met(), "London, 1973"), + QA::new( + Q::first_concert(), + "Jean-Michel Jarre, Paris La Défense, 1990", + ), + QA::new(Q::first_kiss_whom(), "John Doe"), + QA::new( + Q::first_kiss_location(), + "Behind the shed in the oak tree forrest.", + ), + QA::new(Q::spouse_met(), "Tokyo, 1989"), + ]) + } + + fn sample_other() -> Self { + type Q = Security_NOT_PRODUCTION_READY_Question; + type QA = Security_NOT_PRODUCTION_READY_QuestionAndAnswer; + Self::from_iter([ + QA::new(Q::child_middle_name(), "Joe"), + QA::new(Q::stuffed_animal(), "Bobby"), + QA::new(Q::oldest_cousin(), "Roxanne"), + QA::new(Q::teacher_grade3(), "Ali"), + QA::new(Q::applied_uni_no_attend(), "Oxford"), + QA::new(Q::first_school(), "Hogwartz"), + ]) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Security_NOT_PRODUCTION_READY_QuestionsAndAnswers; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/is_security_questions_kdf_scheme.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/is_security_questions_kdf_scheme.rs new file mode 100644 index 000000000..202b5d9e6 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/is_security_questions_kdf_scheme.rs @@ -0,0 +1,8 @@ +use crate::prelude::*; + +pub trait IsSecurityQuestionsKDFScheme { + fn derive_encryption_keys_from_questions_and_answers( + &self, + questions_and_answers: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result>; +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/mod.rs new file mode 100644 index 000000000..b0043a58e --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/mod.rs @@ -0,0 +1,7 @@ +mod is_security_questions_kdf_scheme; +mod security_questions_keys_from_questions_and_answer_scheme; +mod sub_kdf; + +pub use is_security_questions_kdf_scheme::*; +pub use security_questions_keys_from_questions_and_answer_scheme::*; +pub use sub_kdf::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/security_questions_keys_from_questions_and_answer_scheme.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/security_questions_keys_from_questions_and_answer_scheme.rs new file mode 100644 index 000000000..ac70d6b81 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/security_questions_keys_from_questions_and_answer_scheme.rs @@ -0,0 +1,87 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// The KDF algorithm used to derive the decryption key from a combination of answers to security questions. +/// +/// N.B. Not to be confused with the much simpler password based Key Derivation used +/// to encrypt Profile part of manual file export. +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Enum, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub enum SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme { + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// First iteration of KDF for SecurityQuestions + /// ❗️ NOT PRODUCTION READY YET ❗️ + Version1(SecurityQuestions_NOT_PRODUCTION_READY_KDFSchemeVersion1), +} + +impl Default for SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme { + fn default() -> Self { + Self::Version1( + SecurityQuestions_NOT_PRODUCTION_READY_KDFSchemeVersion1::default(), + ) + } +} + +impl IsSecurityQuestionsKDFScheme + for SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme +{ + fn derive_encryption_keys_from_questions_and_answers( + &self, + questions_and_answers: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result> { + match self { + Self::Version1(kdf) => kdf + .derive_encryption_keys_from_questions_and_answers( + questions_and_answers, + ), + } + } +} + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// Version1 of SecurityQuestions KDF, derives encryption keys from security +/// questions and answers, using two "sub-KDFs". +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestions_NOT_PRODUCTION_READY_KDFSchemeVersion1 { + pub kdf_key_exchanges_keys_from_questions_and_answers: SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8, + pub kdf_encryption_keys_from_key_exchange_keys: SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold, +} + +impl Default for SecurityQuestions_NOT_PRODUCTION_READY_KDFSchemeVersion1 { + fn default() -> Self { + Self { + kdf_key_exchanges_keys_from_questions_and_answers: SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8, + kdf_encryption_keys_from_key_exchange_keys: SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold + } + } +} + +impl IsSecurityQuestionsKDFScheme + for SecurityQuestions_NOT_PRODUCTION_READY_KDFSchemeVersion1 +{ + fn derive_encryption_keys_from_questions_and_answers( + &self, + questions_and_answers: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result> { + let kdf_kek = &self.kdf_key_exchanges_keys_from_questions_and_answers; + let kdf_enc = &self.kdf_encryption_keys_from_key_exchange_keys; + + let kek = questions_and_answers + .iter() + .map(|qa| { + kdf_kek.derive_key_exchange_key_from_question_and_answer(&qa) + }) + .collect::>()?; + + Ok(kdf_enc.derive_encryption_keys_from(kek)) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/keys_by_diffie_hellman_fold.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/keys_by_diffie_hellman_fold.rs new file mode 100644 index 000000000..dfefede44 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/keys_by_diffie_hellman_fold.rs @@ -0,0 +1,92 @@ +use crate::prelude::*; +use crypto::keys::x25519::PublicKey as X25519PublicKey; +use crypto::keys::x25519::SecretKey as X25519PrivateKey; + +impl From for Exactly32Bytes { + fn from(value: X25519PublicKey) -> Exactly32Bytes { + Exactly32Bytes::from(&value.to_bytes()) + } +} +impl From for EncryptionKey { + fn from(value: X25519PublicKey) -> EncryptionKey { + EncryptionKey::from(Exactly32Bytes::from(value)) + } +} + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A key derivation function which produces Encryption Keys from a set of +/// key exchange keys, by performing Diffie-Hellman key exchange on each +/// Key Exchange Key in a Set, by "folding" from left to right. +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold; + +impl Default + for SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold +{ + fn default() -> Self { + Self + } +} + +impl SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold { + fn key_exchange_between_more_than_two_keys( + &self, + between: Vec<&X25519PrivateKey>, + ) -> X25519PublicKey { + let mut private_keys = between.clone(); + assert!(private_keys.len() > 2); + let tail = private_keys.split_off(1); + let head = private_keys.into_iter().last().unwrap(); + + tail.into_iter().fold(head.public_key(), |acc_pub, x_priv| { + let shared_secret = x_priv.diffie_hellman(&acc_pub); + X25519PublicKey::from_bytes(shared_secret.to_bytes()) + }) + } + + fn key_exchange_between_all_combinations( + &self, + of: Vec, + minus: usize, + ) -> Vec { + let private_keys = of; + + let private_key_combinations = + private_keys.iter().combinations(private_keys.len() - minus); + + private_key_combinations + .map(|xs| self.key_exchange_between_more_than_two_keys(xs)) + .collect_vec() + } + + fn encryption_keys_from_key_exchange_between_all_combinations( + &self, + of: Vec, + minus: usize, + ) -> Vec { + let private_keys = of; + let keys = + self.key_exchange_between_all_combinations(private_keys, minus); + keys.into_iter().map(EncryptionKey::from).collect_vec() + } +} + +impl SecurityQuestions_NOT_PRODUCTION_READY_EncryptionKeysByDiffieHellmanFold { + pub fn derive_encryption_keys_from( + &self, + key_exchange_keys: Vec, + ) -> Vec { + let minus = 2; + assert!((key_exchange_keys.len() - minus) > 1); + + self.encryption_keys_from_key_exchange_between_all_combinations( + key_exchange_keys, + minus, + ) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/mod.rs new file mode 100644 index 000000000..f3ec3f60a --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/encryption_keys_from_key_exchange_keys/mod.rs @@ -0,0 +1,3 @@ +mod keys_by_diffie_hellman_fold; + +pub use keys_by_diffie_hellman_fold::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/keys_from_questions_and_answers_lower_trim_utf8.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/keys_from_questions_and_answers_lower_trim_utf8.rs new file mode 100644 index 000000000..cbac2934b --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/keys_from_questions_and_answers_lower_trim_utf8.rs @@ -0,0 +1,122 @@ +use crate::prelude::*; + +use aes_gcm::{ + aead::{generic_array::sequence::Concat, Aead, AeadCore, KeyInit, OsRng}, + Aes256Gcm, Key, Nonce, +}; +use crypto::keys::x25519::PublicKey as X25519PublicKey; +use crypto::keys::x25519::SecretKey as X25519PrivateKey; +use hkdf::Hkdf; +use k256::sha2::Sha256; + +impl From for X25519PrivateKey { + fn from(value: Exactly32Bytes) -> Self { + Self::from_bytes(*value.bytes()) + } +} + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A Key Derivation Scheme which lowercases, trims and ut8f encodes answers. +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8; + +impl Default + for SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8 +{ + fn default() -> Self { + Self + } +} + +pub(crate) const SECURITY_QUESTIONS_TRIMMED_CHARS: &[char] = &[ + ' ', // whitespace + '\t', // whitespace + '\n', // whitespace + '.', // Rationale: Might be natural for some to end answers with a dot, but at a later point in time might be omitted. + '!', // Rationale: Same as dot + '?', // Rationale: Same as dot (also strange for an answer to a question to contain a question mark) + '\'', // Rationale: Feels like an unnecessary risk for differences, sometimes some might omit apostrophe (U+0027) + '\"', // Rationale: Same as apostrophe (this is "Quotation Mark" (U+0022)) + '‘', // Rationale: Same as apostrophe (this is "Left Single Quotation Mark" (U+2018)) + '’', // Rationale: Same as apostrophe (this is "Right Single Quotation Mark" (U+2019)) + ''', // Rationale: Same as apostrophe (this is "Full Width Apostrophe" (U+FF07)) +]; + +impl SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8 { + pub(crate) fn trim_answer(&self, answer: impl AsRef) -> String { + let mut answer = answer.as_ref().to_lowercase(); + answer.retain(|c| !SECURITY_QUESTIONS_TRIMMED_CHARS.contains(&c)); + answer + } + + fn bytes_from_answer(&self, answer: impl AsRef) -> Result> { + let answer = answer.as_ref(); + if answer.is_empty() { + return Err(CommonError::AnswersToSecurityQuestionsCannotBeEmpty); + } + + let trimmed = self.trim_answer(answer); + + Ok(trimmed.as_bytes().to_owned()) + } + + fn bytes_from_question(&self, question: impl AsRef) -> Vec { + question.as_ref().as_bytes().to_owned() + } +} + +impl SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8 { + + /// ```ignore + /// let mut attempt 0; + /// let FORBIDDEN = whitespace.union(delimiters); + /// let ikm = answer.remove(FORBIDDEN).lowercase(); + /// let info = question.utf8(); + /// let hkdf = Hkdf::new(salt, ikm); + /// let okm = hkdf.expand(info); + /// ``` + pub fn derive_key_exchange_key_from_question_and_answer( + &self, + question_and_answer: &Security_NOT_PRODUCTION_READY_QuestionAndAnswer, + ) -> Result { + // Input Key Material: the answer, the most secret. + let ikm = self.bytes_from_answer(&question_and_answer.answer)?; + + // We use `question` as info so that two same answers give different + // output for two different questions, silly example might be: + // Q1: "Name of best childhood teddy" - A1: "Björn" + // Q2: "Name of first boy/girl you kissed?" A2: "Björn" + // Here A1 == A2, but we don't want their keys to be the same, so using + // question as `info` => different keys. + let info = self.bytes_from_question(&question_and_answer.question); + + let hkdf = Hkdf::::new(None, &ikm); + let mut okm = [0u8; 32]; + hkdf.expand(&info, &mut okm).unwrap(); + Ok(X25519PrivateKey::from(Exactly32Bytes::from(&okm))) + } + + +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8; + + #[test] + fn apa() { + let sut = SUT::default(); + let non_trimmed = "FoO\nB.a\tR ' ! FiZz ? ‘ B ’ u'ZZ"; + let trimmed = sut.trim_answer(non_trimmed); + assert_eq!(trimmed, "foobarfizzbuzz".to_owned()) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/mod.rs new file mode 100644 index 000000000..b1a79cde2 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/mod.rs @@ -0,0 +1,3 @@ +mod keys_from_questions_and_answers_lower_trim_utf8; + +pub use keys_from_questions_and_answers_lower_trim_utf8::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_and_answer_as_bytes.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_and_answer_as_bytes.rs new file mode 100644 index 000000000..ef36a6bbf --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_and_answer_as_bytes.rs @@ -0,0 +1,24 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A pair of security question and answer +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestion_NOT_PRODUCTION_READY_AndAnswerAsBytes { + pub question: Security_NOT_PRODUCTION_READY_Question, + pub answer: SecurityQuestion_NOT_PRODUCTION_READY_AnswerAsBytes, +} + +impl SecurityQuestion_NOT_PRODUCTION_READY_AndAnswerAsBytes { + pub fn answer_to_question( + freeform: impl AsRef, + question: Security_NOT_PRODUCTION_READY_Question, + ) -> Result { + let answer = SecurityQuestion_NOT_PRODUCTION_READY_AnswerAsBytes::validate_conversion_to_bytes_of(freeform.as_ref())?; + Ok(Self { question, answer }) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_answer_as_bytes.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_answer_as_bytes.rs new file mode 100644 index 000000000..1b12a3eb4 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/key_exchange_keys_from_questions_and_answer/security_question_answer_as_bytes.rs @@ -0,0 +1,32 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// An answer **as bytes** to some security question, being the output of some +/// set of functions mapping answer -> bytes. +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestion_NOT_PRODUCTION_READY_AnswerAsBytes { + pub bytes: BagOfBytes, +} + +impl SecurityQuestion_NOT_PRODUCTION_READY_AnswerAsBytes { + fn bytes_from_trimmed_answer(freeform_answer: TrimmedAnswer) -> BagOfBytes { + BagOfBytes::from(freeform_answer.trimmed_answer.into_bytes()) + } + + pub fn validate_conversion_to_bytes_of( + answer: impl AsRef, + ) -> Result { + let answer = answer.as_ref().to_owned(); + if answer.is_empty() { + return Err(CommonError::AnswersToSecurityQuestionsCannotBeEmpty); + } + let trimmed = TrimmedAnswer::new(answer)?; + let bytes = Self::bytes_from_trimmed_answer(trimmed); + Ok(Self { bytes }) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/mod.rs new file mode 100644 index 000000000..6c9cd2988 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/kdf/sub_kdf/mod.rs @@ -0,0 +1,5 @@ +mod encryption_keys_from_key_exchange_keys; +mod key_exchange_keys_from_questions_and_answer; + +pub use encryption_keys_from_key_exchange_keys::*; +pub use key_exchange_keys_from_questions_and_answer::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/mod.rs new file mode 100644 index 000000000..5a44aa33a --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/mod.rs @@ -0,0 +1,13 @@ +mod answer; +mod kdf; +mod question; +mod security_questions_factor_source; +mod security_questions_factor_source_uniffi_fn; +mod security_questions_sealed_mnemonic; + +pub use answer::*; +pub use kdf::*; +pub use question::*; +pub use security_questions_factor_source::*; +pub use security_questions_factor_source_uniffi_fn::*; +pub use security_questions_sealed_mnemonic::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/mod.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/mod.rs new file mode 100644 index 000000000..68344eb84 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/mod.rs @@ -0,0 +1,9 @@ +mod security_question; +mod security_question_kind; +mod security_questions; +mod security_questions_uniffi_fn; + +pub use security_question::*; +pub use security_question_kind::*; +pub use security_questions::*; +pub use security_questions_uniffi_fn::*; diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question.rs new file mode 100644 index 000000000..91da244d0 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question.rs @@ -0,0 +1,563 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A specification of expected format for an answer to a security question. +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat { + /// E.g. `", "` + pub answer_structure: String, + + /// An example of a possible answer that matches `answer_structure`. + /// E.g. `"Berlin, 1976"` + pub example_answer: String, + + /// If user is about to select the question: + /// `"What was the name of your first stuffed animal?"` + /// + /// Then we can discourage the user from selecting that question + /// if the answer is in `["Teddy", "Peter Rabbit", "Winnie (the Poh)"]` + pub unsafe_answers: Vec, +} + +impl SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat { + pub fn with_details( + structure: impl AsRef, + example: impl AsRef, + unsafe_answers: impl IntoIterator, + ) -> Self { + Self { + answer_structure: structure.as_ref().to_owned(), + example_answer: example.as_ref().to_owned(), + unsafe_answers: unsafe_answers + .into_iter() + .map(|x| x.to_owned()) + .collect_vec(), + } + } + + pub fn new(structure: impl AsRef, example: impl AsRef) -> Self { + Self::with_details(structure, example, []) + } + + pub fn name() -> Self { + Self::new("", "Maria") + } + + pub fn location() -> Self { + Self::with_details( + "", + "At bus stop outside of Dallas", + ["Specifying only a country as location would be unsafe"], + ) + } + + pub fn preset_city_and_year() -> Self { + Self::new(", ", "Berlin, 1976") + } +} + +impl HasSampleValues + for SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat +{ + fn sample() -> Self { + Self::preset_city_and_year() + } + fn sample_other() -> Self { + Self::name() + } +} + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A security question +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct Security_NOT_PRODUCTION_READY_Question { + pub id: u16, // FIXME: newtype + pub version: u8, // FIXME: newtype + pub kind: SecurityQuestionKind, + pub question: String, + pub expected_answer_format: + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat, +} + +impl AsRef for Security_NOT_PRODUCTION_READY_Question { + fn as_ref(&self) -> &str { + &self.question + } +} + +impl Identifiable for Security_NOT_PRODUCTION_READY_Question { + type ID = u16; // FIXME: newtype + + /// Return `Element`'s globally unique and stable ID, used to uniquely identify + /// the `Element` in the `IdentifiedVecOf` collection of elements. + fn id(&self) -> Self::ID { + self.id + } +} + +impl Security_NOT_PRODUCTION_READY_Question { + pub fn with_details( + id: u16, + version: u8, + kind: SecurityQuestionKind, + question: impl AsRef, + expected_answer_format: SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat, + ) -> Self { + Self { + id, + version, + kind, + question: question.as_ref().to_owned(), + expected_answer_format, + } + } + + fn freeform_with_id( + id: u16, + question: impl AsRef, + expected_answer_format: SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat, + ) -> Self { + Self::with_details( + id, + 1, + SecurityQuestionKind::Freeform, + question, + expected_answer_format, + ) + } +} + +impl Security_NOT_PRODUCTION_READY_Question { + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn failed_exam() -> Self { + Self::freeform_with_id( + 0, + "What was the first exam you failed", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::new( + ", , ", + "MIT, year 4, Python", + ), + ) + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q00() -> Self { + Self::failed_exam() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn parents_met() -> Self { + Self::freeform_with_id( + 1, + "In which city and which year did your parents meet?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::preset_city_and_year() + ) + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q01() -> Self { + Self::parents_met() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn first_concert() -> Self { + Self::freeform_with_id( + 2, + "What was the first concert you attended?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::new( + ", , ", + "Jean-Michel Jarre, Paris La Défense, 1990", + ), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q02() -> Self { + Self::first_concert() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn first_kiss_whom() -> Self { + Self::freeform_with_id( + 3, + "What was the name of the boy or the girl you first kissed?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q03() -> Self { + Self::first_kiss_whom() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn first_kiss_location() -> Self { + Self::freeform_with_id( + 4, + "Where were you when you had your first kiss?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::location(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q04() -> Self { + Self::first_kiss_location() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn spouse_met() -> Self { + Self::freeform_with_id( + 5, + "In what city and which year did you meet your spouse/significant other?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::preset_city_and_year(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q05() -> Self { + Self::spouse_met() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn child_middle_name() -> Self { + Self::freeform_with_id( + 6, + "What is the middle name of your youngest child?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q06() -> Self { + Self::child_middle_name() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by NordVPN][link]. + /// + /// [link]: https://nordvpn.com/blog/security-questions/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn stuffed_animal() -> Self { + Self::freeform_with_id( + 7, + "What was the name of your first stuffed animal?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::with_details( + "", + "Oinky piggy pig", + ["Teddy", "Cat", "Dog", "Winnie (the Poh)", "(Peter) Rabbit"], + ), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q07() -> Self { + Self::stuffed_animal() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by ExpressVPN][link]. + /// + /// [link]: https://www.expressvpn.com/blog/how-to-choose-a-security-question/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn oldest_cousin() -> Self { + Self::freeform_with_id( + 8, + "What is your oldest cousin's middle name?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::with_details("", "Maria", ["Don't use this one if you and your cousin are very close and have plenty of mutual friends."])) + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q08() -> Self { + Self::oldest_cousin() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by ExpressVPN][link]. + /// + /// [link]: https://www.expressvpn.com/blog/how-to-choose-a-security-question/ + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn teacher_grade3() -> Self { + Self::freeform_with_id( + 9, + "What was the last name of your third grade teacher?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q09() -> Self { + Self::teacher_grade3() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by OWASP][link]. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn applied_uni_no_attend() -> Self { + Self::freeform_with_id( + 10, + "What is the name of a college you applied to but didn't attend?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::new( + "", + "Oxford", + ), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q10() -> Self { + Self::applied_uni_no_attend() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by OWASP][link]. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn first_school() -> Self { + Self::freeform_with_id( + 11, + "What was the name of the first school you remember attending?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::new( + "", + "Hogwartz", + ), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q11() -> Self { + Self::first_school() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by OWASP][link]. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn math_teacher_highschool() -> Self { + Self::freeform_with_id( + 12, + "What was your maths teacher's surname in 7th grade?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q12() -> Self { + Self::math_teacher_highschool() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question by OWASP][link]. + /// + /// [link]: https://cheatsheetseries.owasp.org/cheatsheets/Choosing_and_Using_Security_Questions_Cheat_Sheet.html + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn drivings_instructor() -> Self { + Self::freeform_with_id( + 13, + "What was your driving instructor's first name?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q13() -> Self { + Self::drivings_instructor() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question in spreadsheet][sheet], linked to [from]. + /// + /// [from]: https://goodsecurityquestions.com/examples/ + /// [sheet]: https://docs.google.com/spreadsheets/d/1Mzg60sJYLzUzCJhe-_brprx-KRolvLclcykf4H4hF-c/edit#gid=0 + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn street_friend_highschool() -> Self { + Self::freeform_with_id( + 14, + "What was the street name where your best friend in high school lived?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::with_details("", "Baker Street", ["Bad if had several different best friends during high school."]), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q14() -> Self { + Self::street_friend_highschool() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question in spreadsheet][sheet], linked to [from]. + /// + /// [from]: https://goodsecurityquestions.com/examples/ + /// [sheet]: https://docs.google.com/spreadsheets/d/1Mzg60sJYLzUzCJhe-_brprx-KRolvLclcykf4H4hF-c/edit#gid=0 + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn friend_kindergarten() -> Self { + Self::freeform_with_id( + 15, + "What was the first name of your best friend at kindergarten?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::name(), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q15() -> Self { + Self::friend_kindergarten() + } + + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An NON-entropy-analyzed security question + /// + /// [Suggested question in spreadsheet][sheet], linked to [from]. + /// + /// [from]: https://goodsecurityquestions.com/examples/ + /// [sheet]: https://docs.google.com/spreadsheets/d/1Mzg60sJYLzUzCJhe-_brprx-KRolvLclcykf4H4hF-c/edit#gid=0 + /// + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn street_age8() -> Self { + Self::freeform_with_id( + 16, + "What was the name of the street where you were living when you were 8 years old?", + SecurityQuestion_NOT_PRODUCTION_READY_ExpectedAnswerFormat::with_details("", "Abbey Road", ["Bad if you lived in many places during that year."]), + ) + } + /// ❗️ NOT PRODUCTION READY YET ❗️ + pub fn q16() -> Self { + Self::street_age8() + } +} + +impl Security_NOT_PRODUCTION_READY_Question { + pub fn all() -> IndexSet { + IndexSet::::from_iter([ + Self::q00(), + Self::q01(), + Self::q02(), + Self::q03(), + Self::q04(), + Self::q05(), + Self::q06(), + Self::q07(), + Self::q08(), + Self::q09(), + Self::q10(), + Self::q11(), + Self::q12(), + Self::q13(), + Self::q14(), + Self::q15(), + Self::q16(), + ]) + } +} + +impl HasSampleValues for Security_NOT_PRODUCTION_READY_Question { + /// A sample used to facilitate unit tests. + fn sample() -> Self { + Self::stuffed_animal() + } + + /// A sample used to facilitate unit tests. + fn sample_other() -> Self { + Self::first_kiss_location() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Security_NOT_PRODUCTION_READY_Question; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_id() { + let test = |t: (usize, SUT)| { + let id = t.0 as u16; + let sut = t.1; + assert_eq!(sut.id(), id); + }; + let all = SUT::all(); + all.into_iter().enumerate().for_each(test); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question_kind.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question_kind.rs new file mode 100644 index 000000000..1f85a454a --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_question_kind.rs @@ -0,0 +1,9 @@ +use crate::prelude::*; + +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Enum, +)] +#[serde(rename_all = "camelCase")] +pub enum SecurityQuestionKind { + Freeform, +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions.rs new file mode 100644 index 000000000..c22ab619b --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions.rs @@ -0,0 +1,36 @@ +use crate::prelude::*; + +decl_identified_vec_of!( + /// ❗️ NOT PRODUCTION READY YET ❗️ + /// An ordered set of [`SecurityQuestion`]s user has selected to use + /// in their `SecurityQuestionsFactorSource` - a factor they typically + /// use for the `ConfirmationRole`. + /// ❗️ NOT PRODUCTION READY YET ❗️ + Security_NOT_PRODUCTION_READY_Questions, + Security_NOT_PRODUCTION_READY_Question +); + +impl HasSampleValues for Security_NOT_PRODUCTION_READY_Questions { + fn sample() -> Self { + type Q = Security_NOT_PRODUCTION_READY_Question; + Self::from_iter([ + Q::q00(), + Q::q01(), + Q::q02(), + Q::q03(), + Q::q04(), + Q::q05(), + ]) + } + fn sample_other() -> Self { + type Q = Security_NOT_PRODUCTION_READY_Question; + Self::from_iter([ + Q::q06(), + Q::q07(), + Q::q08(), + Q::q09(), + Q::q10(), + Q::q11(), + ]) + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions_uniffi_fn.rs new file mode 100644 index 000000000..de7f91481 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/question/security_questions_uniffi_fn.rs @@ -0,0 +1,18 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn security_questions_all() -> Security_NOT_PRODUCTION_READY_Questions { + Security_NOT_PRODUCTION_READY_Questions::from_iter( + Security_NOT_PRODUCTION_READY_Question::all(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_all() { + assert_eq!(security_questions_all().len(), 17); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source.rs new file mode 100644 index 000000000..b2751098f --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source.rs @@ -0,0 +1,483 @@ +use crate::prelude::*; + +use aes_gcm::{ + aead::{generic_array::sequence::Concat, Aead, AeadCore, KeyInit, OsRng}, + Aes256Gcm, Key, Nonce, +}; +use hkdf::Hkdf; +use k256::sha2::Sha256; + +use crypto::keys::x25519::PublicKey as X25519PublicKey; +use crypto::keys::x25519::SecretKey as X25519PrivateKey; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A mnemonic "sealed" by "security questions" (personal questions). +/// +/// The user select P personal questions from a set of Q predefined questions, +/// then answers them. The user will be able to "open" (decrypt) the "sealed" +/// (encrypted) mnemonic by providing at least P-1 correct answers to the P, +/// questions, that is to say, she is allowed to input one incorrect answer. +/// This is important since it makes this factor source kind more convenient +/// to use, especially if a significant time has passed between user answering +/// the questions for the first and the second time. +/// +/// In order to make it possible for user to input one incorrect answer, we need +/// to encrypt the mnemonic with many keys, keys being formed from many combinations +/// of question-answer-based input. To do this we use a function `qna2bin` +/// (question and answer to binary), to deterministically form Curve25519 key pairs, +/// P many (one per question/answer pair), and then we combine these keys using +/// ECDH (key exchange) to form composite (symmetric) encryption keys using P-1 +/// many Ed25519 keys per composite encryption key. +/// +/// E.g. User selects 6 questions out of 20: +/// Q1: "What was the make and models of your first car?" +/// Q2: "In which town and which year did your parents meet?" +/// Q3: "What was the name of your first stuffed animal?" +/// Q4: "What was the name of the boy or the girl you first kissed?" +/// Q5: "What was the first exam you failed?" +/// Q6: "What is the middle name of your youngest child?" +/// +/// She answers them, forming +/// `let qa: Vec<(Questions, Answer)> = [(q_0, a_0), (q_1, a_1), .., (q_5, a_5)]` +/// question, answer pairs. +/// +/// The answers will be "normalized", trying to make it easier for user to provide +/// the same used answer later in time, we can do this by for example removing +/// whitespace, delimiters and apostrophes, and lowercase all chars. +/// +/// We form 6 binary inputs, call them `bins` using function `qna2bin` taking a +/// question/answer pair as input and outputting 32 bytes. +/// `let bins: Vec = qa.iter().map(qna2bin).collect()` +/// +/// We form 6 X25519PrivateKey meant for Diffie-Hellman key exchange from `bin` +/// `let ec_keys: Vec = bins.iter().map(bin2key).collect()` +/// +/// We form ["6 choose 4" ("P choose P-1")][choose] = 15 many combinations +/// (e.g. using [`combinations method from itertools`](itertools)) +/// +/// ```ignore +/// let k = 4; +/// assert_eq!(ec_keys.len(), 6); +/// let key_combinations = Vec> = ec_keys.combinations(k); +/// assert_eq!(key_combinations.len(), 15); +/// assert_eq!(key_combinations.iter().all(|v| v.len() == k); +/// ``` +/// +/// We map the 15 `Vec` into `X25519PublicKeys` using `multi_party_ecdh`: +/// +/// ```ignore +/// let ecdh_keys: Vec = key_combinations.iter().map(multi_party_ecdh).collect(); +/// assert_eq!(sec_keys.len(), 15); +/// ``` +/// +/// Where `multi_party_ecdh` is a function taking `Vec` as input and +/// returning a `Key` by doing key exchange between all keys, like so: +/// +/// ```ignore +/// fn key_exchange_between_more_than_two_keys( +/// &self, +/// between: Vec<&X25519PrivateKey>, +/// ) -> X25519PublicKey { +/// let mut private_keys = between.clone(); +/// assert!(private_keys.len() > 2); +/// let tail = private_keys.split_off(1); +/// let head = private_keys.into_iter().last().unwrap(); +/// +/// tail.into_iter().fold(head.public_key(), |acc_pub, x_priv| { +/// let shared_secret = x_priv.diffie_hellman(&acc_pub); +/// X25519PublicKey::from_bytes(shared_secret.to_bytes()) +/// }) +/// } +/// ``` +/// +/// We form 15 Symmetric Encryption keys from the 15 `X25519PublicKey` by simply +/// mapping the data of the public keys into AesGCM keys: +/// +/// ```ignore +/// let sec_keys: Vec> = ecdh_keys.iter().map(ec2sec).collect() +/// assert_eq!(sec_keys.len(), 15); +/// ``` +/// +/// We encrypt the mnemonic 15 times, using each symmetric key in `sec_keys`: +/// +/// ```ignore +/// let encryptions: Vec = sec_keys.iter().map(|x| x.enc) +/// assert_eq!(encryptions.len(), 15); +/// ``` +/// +/// Decryption is then the reverse process, trying to decrypt any of the 15 +/// encrypted mnemonics with any of the 15 symmetric (de)encryption keys we +/// re-calculate from the answers user gives at this later point in time. +/// +/// Author / Inventor: Alexander Cyon (alex.cyon@gmail.com) in the year 2022. +/// +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// +/// [choose]: https://en.wikipedia.org/wiki/Combination +/// [itertools]: https://docs.rs/itertools/latest/itertools/trait.Itertools.html#method.combinations +/// +#[derive( + Serialize, + Deserialize, + Clone, + PartialEq, + Eq, + Hash, + Debug, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[display("{id}")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + /// Unique and stable identifier of this factor source, stemming from the + /// hash of a special child key of the HD root of the mnemonic. + pub id: FactorSourceIDFromHash, + + /// Common properties shared between FactorSources of different kinds, + /// describing its state, when added, and supported cryptographic parameters. + pub common: FactorSourceCommon, + + /// The sealed mnemonic containing multiple different encryptions of a + /// mnemonic encrypted by different encryptions keys, being various combinations + /// of questions and answers derived keys, allowing for only 4 out of 6 answers + /// to be correct. + pub sealed_mnemonic: SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic, +} + +impl SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + pub fn with_details( + id: FactorSourceIDFromHash, + common: FactorSourceCommon, + sealed_mnemonic: SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic, + ) -> Self { + Self { + id, + common, + sealed_mnemonic, + } + } + + pub fn new_by_encrypting_with_schemes( + mnemonic: Mnemonic, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + kdf_scheme: SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme, + encryption_scheme: EncryptionScheme, + ) -> Result { + let questions_and_answers = with; + let id = FactorSourceIDFromHash::new_for_security_questions( + &MnemonicWithPassphrase::new(mnemonic.clone()), + ); + let sealed_mnemonic = SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic::new_by_encrypting(mnemonic, questions_and_answers, kdf_scheme, encryption_scheme)?; + let common = FactorSourceCommon::new_babylon(); + + Ok(Self { + id, + sealed_mnemonic, + common, + }) + } + + pub fn new_by_encrypting( + mnemonic: Mnemonic, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result { + let questions_and_answers = with; + Self::new_by_encrypting_with_schemes( + mnemonic, + questions_and_answers, + SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme::default(), + EncryptionScheme::default(), + ) + } + + pub fn decrypt( + &self, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result { + let questions_and_answers = with; + self.sealed_mnemonic.decrypt(questions_and_answers) + } +} + +impl HasSampleValues for SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + fn sample() -> Self { + let json = include_str!(concat!( + env!("FIXTURES_VECTOR"), + "security_questions_factor_source_sample.json" + )); + let sut = serde_json::from_str::(json).unwrap(); + let decrypted = + sut.decrypt( + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(), + ) + .unwrap(); + assert_eq!(decrypted, Mnemonic::sample_security_questions()); + sut + } + + fn sample_other() -> Self { + let json = include_str!(concat!( + env!("FIXTURES_VECTOR"), + "security_questions_factor_source_sample_other.json" + )); + let sut = serde_json::from_str::(json).unwrap(); + let decrypted = sut + .decrypt( + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample_other( + ), + ) + .unwrap(); + assert_eq!(decrypted, Mnemonic::sample_security_questions_other()); + sut + } +} + +impl From + for FactorSource +{ + fn from( + value: SecurityQuestions_NOT_PRODUCTION_READY_FactorSource, + ) -> Self { + FactorSource::SecurityQuestions { value } + } +} + +impl TryFrom + for SecurityQuestions_NOT_PRODUCTION_READY_FactorSource +{ + type Error = CommonError; + + fn try_from(value: FactorSource) -> Result { + value.clone().into_security_questions().map_err(|_| { + CommonError::InvalidFactorSourceKind { + bad_value: value.factor_source_kind().to_string(), + } + }) + } +} +impl IsFactorSource for SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + fn kind() -> FactorSourceKind { + FactorSourceKind::SecurityQuestions + } +} +impl BaseIsFactorSource + for SecurityQuestions_NOT_PRODUCTION_READY_FactorSource +{ + fn common_properties(&self) -> FactorSourceCommon { + self.common.clone() + } + + fn factor_source_kind(&self) -> FactorSourceKind { + self.id.kind + } + + fn factor_source_id(&self) -> FactorSourceID { + self.clone().id.into() + } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } +} + +#[cfg(test)] +mod tests { + use std::borrow::BorrowMut; + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityQuestions_NOT_PRODUCTION_READY_FactorSource; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn from_factor_source() { + let sut = SUT::sample(); + let factor_source: FactorSource = sut.clone().into(); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); + } + + #[test] + fn from_factor_source_invalid_got_device() { + let wrong = DeviceFactorSource::sample(); + let factor_source: FactorSource = wrong.clone().into(); + assert_eq!( + SUT::try_from(factor_source), + Err(CommonError::InvalidFactorSourceKind { + bad_value: "device".to_owned() + }) + ); + } + + #[test] + fn roundtrip_sample_all_answers_correct() { + let m = Mnemonic::sample_security_questions(); + let qas = Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + impl Security_NOT_PRODUCTION_READY_QuestionAndAnswer { + fn insert_bad_chars_to_answer(&mut self) { + let bad: String = + String::from_iter(SECURITY_QUESTIONS_TRIMMED_CHARS); + self.answer = format!("{}{}{}", bad, self.answer, bad); + } + } + + #[test] + fn roundtrip_sample_one_incorrect_answer_is_ok() { + let m = Mnemonic::sample_security_questions(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change to one wrong answer when decrypting + qas.update_with(0, |qa| qa.answer = "wrong".to_owned()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_two_incorrect_answer_is_ok() { + let m = Mnemonic::sample_security_questions(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change to two wrong answers when decrypting + qas.update_with(0, |qa| qa.answer = "wrong".to_owned()); + qas.update_with(3, |qa| qa.answer = "also wrong".to_owned()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_case_does_not_matter() { + let m = Mnemonic::sample_security_questions(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change all answers to uppercase before decrypting is ok + qas.update_with(0, |qa| qa.answer = qa.answer.to_uppercase()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_bad_chars_are_trimmed() { + let m = Mnemonic::sample_security_questions(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Inserting bad chars into answer before decrypting. + qas.update_with(0, |qa| qa.insert_bad_chars_to_answer()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_other_all_answers_correct() { + let m = Mnemonic::sample_security_questions_other(); + let qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample_other(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_other_case_does_not_matter() { + let m = Mnemonic::sample_security_questions_other(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample_other(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change all answers to uppercase before decrypting is ok + qas.update_with(0, |qa| qa.answer = qa.answer.to_uppercase()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn roundtrip_sample_other_one_incorrect_answer_is_ok() { + let m = Mnemonic::sample_security_questions_other(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample_other(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change to two wrong answers when decrypting + qas.update_with(0, |qa| qa.answer = "wrong".to_owned()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn kind() { + assert_eq!(SUT::kind(), FactorSourceKind::SecurityQuestions); + } + + #[test] + fn roundtrip_sample_other_two_incorrect_answer_is_ok() { + let m = Mnemonic::sample_security_questions_other(); + let mut qas = + Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample_other(); + let sut = SUT::new_by_encrypting(m.clone(), qas.clone()).unwrap(); + + // Change to two wrong answers when decrypting + qas.update_with(0, |qa| qa.answer = "wrong".to_owned()); + qas.update_with(3, |qa| qa.answer = "also wrong".to_owned()); + let decrypted = sut.decrypt(qas).unwrap(); + assert_eq!(m, decrypted); + } + + #[test] + fn test_too_few_questions() { + let m = Mnemonic::sample(); + type Q = Security_NOT_PRODUCTION_READY_Question; + let q0 = Q::drivings_instructor(); + let a0 = "a"; + + let q1 = Q::child_middle_name(); + let a1 = "d"; + + let q2 = Q::math_teacher_highschool(); + let a2 = "b"; + + let q3 = Q::first_school(); + let a3 = "c"; + + type QAS = Security_NOT_PRODUCTION_READY_QuestionsAndAnswers; + type QA = Security_NOT_PRODUCTION_READY_QuestionAndAnswer; + let qas = QAS::from_iter([ + QA::new(q0, a0), + QA::new(q1, a1), + QA::new(q2, a2), + QA::new(q3, a3), + ]); + let res = SUT::new_by_encrypting(m.clone(), qas.clone()); + + assert_eq!( + res, + Err(CommonError::InvalidQuestionsAndAnswersCount { + expected: 6, + found: 4 + }) + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source_uniffi_fn.rs new file mode 100644 index 000000000..1798df45f --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_factor_source_uniffi_fn.rs @@ -0,0 +1,76 @@ +use std::sync::Once; + +use crate::prelude::*; + +#[uniffi::export] +pub fn new_security_questions_factor_source_sample( +) -> SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + SecurityQuestions_NOT_PRODUCTION_READY_FactorSource::sample() +} + +#[uniffi::export] +pub fn new_security_questions_factor_source_sample_other( +) -> SecurityQuestions_NOT_PRODUCTION_READY_FactorSource { + SecurityQuestions_NOT_PRODUCTION_READY_FactorSource::sample_other() +} + +#[uniffi::export] +pub fn new_security_questions_factor_source_by_encrypting_mnemonic( + mnemonic: Mnemonic, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, +) -> Result { + SecurityQuestions_NOT_PRODUCTION_READY_FactorSource::new_by_encrypting( + mnemonic, with, + ) +} + +#[uniffi::export] +pub fn trim_security_questions_answer(answer: String) -> String { + let kdf = SecurityQuestions_NOT_PRODUCTION_READY_KeyExchangeKeysFromQandAsLowerTrimUtf8; + kdf.trim_answer(answer) +} + +#[uniffi::export] +pub fn security_questions_factor_source_decrypt( + factor_source: &SecurityQuestions_NOT_PRODUCTION_READY_FactorSource, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, +) -> Result { + factor_source.decrypt(with) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityQuestions_NOT_PRODUCTION_READY_FactorSource; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_security_questions_factor_source_sample(), + new_security_questions_factor_source_sample_other(), + // duplicates should get removed + new_security_questions_factor_source_sample(), + new_security_questions_factor_source_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn roundtrip() { + let mnemonic = Mnemonic::sample_security_questions(); + let qas = Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::sample(); + let sut = new_security_questions_factor_source_by_encrypting_mnemonic( + mnemonic.clone(), + qas.clone(), + ) + .unwrap(); + let decrypted = + security_questions_factor_source_decrypt(&sut, qas).unwrap(); + assert_eq!(decrypted, mnemonic); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_sealed_mnemonic.rs b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_sealed_mnemonic.rs new file mode 100644 index 000000000..58a3ad9d2 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/security_questions_factor_source/security_questions_sealed_mnemonic.rs @@ -0,0 +1,132 @@ +use crate::prelude::*; + +/// ❗️ NOT PRODUCTION READY YET ❗️ +/// A mnemonic encrypted by answers to security questions +/// ❗️ NOT PRODUCTION READY YET ❗️ +#[derive( + Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Debug, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[allow(non_camel_case_types)] +pub struct SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic { + pub security_questions: Security_NOT_PRODUCTION_READY_Questions, + + /// A versioned Key Derivation Function (KDF) algorithm used to produce a set + /// of Encryption keys from a set of security questions and answers + pub kdf_scheme: SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme, + + /// The scheme used to encrypt the Security Questions factor source + /// mnemonic using one combination of answers to questions, one of many. + pub encryption_scheme: EncryptionScheme, + + /// The N many encryptions of the mnemonic, where N corresponds to the number of derived keys + /// from the `keyDerivationScheme` + pub encryptions: Vec, // FIXME: Set? +} + +impl SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic { + pub const QUESTION_COUNT: usize = 6; + pub fn new_by_encrypting( + mnemonic: Mnemonic, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + kdf_scheme: SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme, + encryption_scheme: EncryptionScheme, + ) -> Result { + let questions_and_answers = with; + if questions_and_answers.len() != Self::QUESTION_COUNT { + return Err(CommonError::InvalidQuestionsAndAnswersCount { + expected: Self::QUESTION_COUNT as u16, + found: questions_and_answers.len() as u16, + }); + } + let security_questions = questions_and_answers + .iter() + .map(|qa| qa.question.clone()) + .collect::(); + + let mnemonic_entropy = Exactly32Bytes::try_from(mnemonic.to_entropy().as_ref()).expect("SecurityQuestionsFactorSource mnemonics SHOULD ALWAYS be 32 bytes of entropy."); + + let encryption_keys = kdf_scheme.derive_encryption_keys_from_questions_and_answers(questions_and_answers).expect("TODO validate that answer is non-empty BEFORE passing it here."); + + let encryptions = encryption_keys + .into_iter() + .map(|k| { + encryption_scheme.encrypt(mnemonic_entropy, &mut k.clone()) + }) + .map(|vec| { + Exactly60Bytes::try_from(vec) + .expect("Should have been 60 bytes") + }) + .collect_vec(); + + Ok(Self { + security_questions, + encryptions, + kdf_scheme, + encryption_scheme, + }) + } + + pub fn decrypt( + &self, + with: Security_NOT_PRODUCTION_READY_QuestionsAndAnswers, + ) -> Result { + let answers_to_question = with; + + let decryption_keys = self + .kdf_scheme + .derive_encryption_keys_from_questions_and_answers( + answers_to_question, + )?; + + for decryption_key in decryption_keys { + for encrypted_mnemonic in self.encryptions.iter() { + match self + .encryption_scheme + .decrypt( + encrypted_mnemonic.bytes(), + &mut decryption_key.clone(), + ) + .and_then(Exactly32Bytes::try_from) + { + Ok(decrypted) => { + return Ok(Mnemonic::from_32bytes_entropy(decrypted)) + } + _ => continue, + } + } + } + + // Failure + Err(CommonError::FailedToDecryptSealedMnemonic) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityQuestionsSealed_NOT_PRODUCTION_READY_Mnemonic; + + #[test] + fn throws_if_incorrect_count() { + let too_few = Security_NOT_PRODUCTION_READY_QuestionsAndAnswers::just( + Security_NOT_PRODUCTION_READY_QuestionAndAnswer::sample(), + ); + let res = SUT::new_by_encrypting( + Mnemonic::sample(), + too_few, + SecurityQuestions_NOT_PRODUCTION_READY_KDFScheme::default(), + EncryptionScheme::default(), + ); + assert_eq!( + res, + Err(CommonError::InvalidQuestionsAndAnswersCount { + expected: 6, + found: 1 + }) + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/mod.rs b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/mod.rs new file mode 100644 index 000000000..9875641f2 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/mod.rs @@ -0,0 +1,9 @@ +mod trusted_contact_factor_source; +mod trusted_contact_factor_source_contact; +mod trusted_contact_factor_source_contact_uniffi_fn; +mod trusted_contact_factor_source_uniffi_fn; + +pub use trusted_contact_factor_source::*; +pub use trusted_contact_factor_source_contact::*; +pub use trusted_contact_factor_source_contact_uniffi_fn::*; +pub use trusted_contact_factor_source_uniffi_fn::*; diff --git a/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source.rs b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source.rs new file mode 100644 index 000000000..5019beaf4 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source.rs @@ -0,0 +1,212 @@ +use crate::prelude::*; + +/// A factor source representing a person, company, organization or otherwise +/// entity that the user trusts to help her with recovery, if ever needed. +#[derive( + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[display("{contact} {id}")] +pub struct TrustedContactFactorSource { + /// Unique and stable identifier of this factor source. + pub id: FactorSourceIDFromAddress, + + /// Common properties shared between FactorSources of different kinds, + /// describing its state, when added, and supported cryptographic parameters. + pub common: FactorSourceCommon, + + /// The contact information about the contact that is 'trusted'. + pub contact: TrustedContactFactorSourceContact, +} + +impl TrustedContactFactorSource { + pub fn with_details( + id: FactorSourceIDFromAddress, + common: FactorSourceCommon, + contact: TrustedContactFactorSourceContact, + ) -> Self { + Self { + id, + common, + contact, + } + } + + pub fn new( + address: AccountAddress, + contact: TrustedContactFactorSourceContact, + ) -> Self { + let id = FactorSourceIDFromAddress::new_for_trusted_contact(address); + Self::with_details(id, FactorSourceCommon::new_babylon(), contact) + } +} + +impl TryFrom for TrustedContactFactorSource { + type Error = CommonError; + + fn try_from(value: FactorSource) -> Result { + value.clone().into_trusted_contact().map_err(|_| { + CommonError::InvalidFactorSourceKind { + bad_value: value.factor_source_kind().to_string(), + } + }) + } +} + +impl From for FactorSource { + fn from(value: TrustedContactFactorSource) -> Self { + FactorSource::TrustedContact { value } + } +} + +impl IsFactorSource for TrustedContactFactorSource { + fn kind() -> FactorSourceKind { + FactorSourceKind::TrustedContact + } +} +impl BaseIsFactorSource for TrustedContactFactorSource { + fn common_properties(&self) -> FactorSourceCommon { + self.common.clone() + } + + fn factor_source_kind(&self) -> FactorSourceKind { + self.id.kind + } + + fn factor_source_id(&self) -> FactorSourceID { + self.clone().id.into() + } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } +} +impl TrustedContactFactorSource { + fn new_sample(name: &str, email: &str, address: AccountAddress) -> Self { + let mut source = Self::new( + address, + TrustedContactFactorSourceContact::new( + EmailAddress::new(email).unwrap(), + DisplayName::new(name).unwrap(), + ), + ); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source + } + + pub fn sample_frank() -> Self { + Self::new_sample( + "Frank Sample", + "frank.sample@gmail.com", + AccountAddress::sample_frank(), + ) + } + pub fn sample_grace() -> Self { + Self::new_sample( + "Grace Sample", + "grace.sample@gmail.com", + AccountAddress::sample_grace(), + ) + } + pub fn sample_judy() -> Self { + Self::new_sample( + "Judy Sample", + "judy.sample@gmail.com", + AccountAddress::sample_judy(), + ) + } + pub fn sample_oscar() -> Self { + Self::new_sample( + "Oscar Sample", + "oscar.sample@gmail.com", + AccountAddress::sample_oscar(), + ) + } + pub fn sample_trudy() -> Self { + Self::new_sample( + "Trudy Sample", + "trudy.sample@gmail.com", + AccountAddress::sample_trudy(), + ) + } + pub fn sample_radix() -> Self { + Self::new_sample( + "Radix InstaBridge", + "hello@instabridge.com", + AccountAddress::sample_radix(), + ) + } +} +impl HasSampleValues for TrustedContactFactorSource { + fn sample() -> Self { + let mut source = Self::new( + AccountAddress::sample_mainnet(), + TrustedContactFactorSourceContact::sample(), + ); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source + } + + fn sample_other() -> Self { + let mut source = Self::new( + AccountAddress::sample_mainnet_other(), + TrustedContactFactorSourceContact::sample_other(), + ); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = TrustedContactFactorSource; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn kind() { + assert_eq!(SUT::kind(), FactorSourceKind::TrustedContact); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn from_factor_source() { + let sut = SUT::sample(); + let factor_source: FactorSource = sut.clone().into(); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); + } + + #[test] + fn from_factor_source_invalid_got_device() { + let wrong = DeviceFactorSource::sample(); + let factor_source: FactorSource = wrong.clone().into(); + assert_eq!( + SUT::try_from(factor_source), + Err(CommonError::InvalidFactorSourceKind { + bad_value: "device".to_owned() + }) + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact.rs b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact.rs new file mode 100644 index 000000000..3d4ecddcd --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact.rs @@ -0,0 +1,62 @@ +use crate::prelude::*; + +/// Hints about the trusted contact. +#[derive( + Serialize, + Deserialize, + Debug, + Clone, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +#[display("{name} {email_address}")] +pub struct TrustedContactFactorSourceContact { + /// The email address of the contact that the user trusts + pub email_address: EmailAddress, + /// The name of the contact that the user trusts + pub name: DisplayName, +} + +impl TrustedContactFactorSourceContact { + pub fn new( + email_address: impl Into, + name: impl Into, + ) -> Self { + Self { + email_address: email_address.into(), + name: name.into(), + } + } +} + +impl HasSampleValues for TrustedContactFactorSourceContact { + fn sample() -> Self { + Self::new(EmailAddress::sample(), DisplayName::sample()) + } + fn sample_other() -> Self { + Self::new(EmailAddress::sample_other(), DisplayName::sample_other()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = TrustedContactFactorSourceContact; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact_uniffi_fn.rs new file mode 100644 index 000000000..fd7ac40ae --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_contact_uniffi_fn.rs @@ -0,0 +1,38 @@ +use std::sync::Once; + +use crate::prelude::*; + +#[uniffi::export] +pub fn new_trusted_contact_factor_source_contact_sample( +) -> TrustedContactFactorSourceContact { + TrustedContactFactorSourceContact::sample() +} + +#[uniffi::export] +pub fn new_trusted_contact_factor_source_contact_sample_other( +) -> TrustedContactFactorSourceContact { + TrustedContactFactorSourceContact::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = TrustedContactFactorSourceContact; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_trusted_contact_factor_source_contact_sample(), + new_trusted_contact_factor_source_contact_sample_other(), + // duplicates should get removed + new_trusted_contact_factor_source_contact_sample(), + new_trusted_contact_factor_source_contact_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_uniffi_fn.rs b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_uniffi_fn.rs new file mode 100644 index 000000000..f90792f89 --- /dev/null +++ b/src/profile/mfa/mfa_factor_sources/trusted_contact_factor_source/trusted_contact_factor_source_uniffi_fn.rs @@ -0,0 +1,56 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_trusted_contact_factor_source_sample() -> TrustedContactFactorSource +{ + TrustedContactFactorSource::sample() +} + +#[uniffi::export] +pub fn new_trusted_contact_factor_source_sample_other( +) -> TrustedContactFactorSource { + TrustedContactFactorSource::sample_other() +} + +#[uniffi::export] +fn new_trusted_contact_factor_source_from_address_and_contact( + account_address: AccountAddress, + contact: TrustedContactFactorSourceContact, +) -> TrustedContactFactorSource { + TrustedContactFactorSource::new(account_address, contact) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = TrustedContactFactorSource; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_trusted_contact_factor_source_sample(), + new_trusted_contact_factor_source_sample_other(), + // duplicates should get removed + new_trusted_contact_factor_source_sample(), + new_trusted_contact_factor_source_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_new() { + assert_eq!( + new_trusted_contact_factor_source_from_address_and_contact( + AccountAddress::sample_mainnet(), + TrustedContactFactorSourceContact::sample() + ) + .factor_source_id(), + SUT::sample().factor_source_id() + ) + } +} diff --git a/src/profile/mfa/mod.rs b/src/profile/mfa/mod.rs new file mode 100644 index 000000000..59afd062f --- /dev/null +++ b/src/profile/mfa/mod.rs @@ -0,0 +1,7 @@ +mod mfa_factor_sources; +mod secured_entity_control; +mod security_structures; + +pub use mfa_factor_sources::*; +pub use secured_entity_control::*; +pub use security_structures::*; diff --git a/src/profile/mfa/secured_entity_control/mod.rs b/src/profile/mfa/secured_entity_control/mod.rs new file mode 100644 index 000000000..22ca7dd1f --- /dev/null +++ b/src/profile/mfa/secured_entity_control/mod.rs @@ -0,0 +1,3 @@ +mod secured_entity_control; + +pub use secured_entity_control::*; diff --git a/src/profile/mfa/secured_entity_control/secured_entity_control.rs b/src/profile/mfa/secured_entity_control/secured_entity_control.rs new file mode 100644 index 000000000..3f1f43b20 --- /dev/null +++ b/src/profile/mfa/secured_entity_control/secured_entity_control.rs @@ -0,0 +1,23 @@ +use crate::prelude::*; + +/// Advanced security control of an entity which has been "securified", +/// meaning an MFA security structure (`SecurityStructureOfFactorSources`) +/// which user has created has been applied to it. +#[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +pub struct SecuredEntityControl { + /// The address of the access controller which controls this entity. + /// + /// Looking up the public key (hashes) set in the key-value store at + /// this address reveils the true factors (public keys) used to protect + /// this entity. It will be the same as the ones in `security_structure` + /// if we have not changed them locally, which we should not do unless + /// we are sure the Ledger corresponds to the values in `security_structure`. + pub access_controller_address: AccessControllerAddress, + + /// The believed-to-be-current security structure of FactorInstances which + /// secures this entity. + pub security_structure: SecurityStructureOfFactorInstances, +} diff --git a/src/profile/mfa/security_structures/decl_security_structure_of.rs b/src/profile/mfa/security_structures/decl_security_structure_of.rs new file mode 100644 index 000000000..40252dffc --- /dev/null +++ b/src/profile/mfa/security_structures/decl_security_structure_of.rs @@ -0,0 +1,234 @@ +use crate::prelude::*; + +macro_rules! decl_role_with_factors_additional_impl { + ( + $role: ident, + FactorInstance + ) => { + paste! { + impl From<[< $role RoleWithFactorInstance s >]> for ScryptoAccessRule { + fn from(value: [< $role RoleWithFactorInstance s >]) -> Self { + ScryptoAccessRule::Protected(ScryptoAccessRuleNode::AnyOf(vec![ + ScryptoAccessRuleNode::ProofRule(ScryptoProofRule::CountOf( + value.threshold, + value + .threshold_factors + .into_iter() + .map(|instance| instance.badge) + .map(ScryptoResourceOrNonFungible::from) + .collect(), + )), + ScryptoAccessRuleNode::ProofRule(ScryptoProofRule::AnyOf( + value + .override_factors + .into_iter() + .map(|instance| instance.badge) + .map(ScryptoResourceOrNonFungible::from) + .collect(), + )), + ])) + } + } + } + }; + ( + $role: ident, + $factor: ident + ) => {} +} + +pub(crate) use decl_role_with_factors_additional_impl; + +macro_rules! decl_role_with_factors { + ( + $( + #[doc = $expr: expr] + )* + $role: ident, + $factor: ident + ) => { + paste! { + $( + #[doc = $expr] + )* + #[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, + )] + #[serde(rename_all = "camelCase")] + pub struct [< $role RoleWith $factor s >] { + + /// Factors which are used in combination with other instances, amounting to at + /// least `threshold` many instances to perform some function with this role. + /// + /// # Implementation + /// Must allow duplicates, thus using `Vec` since at FactorSourceKind level + /// we might wanna use duplicates, allowing us to build a "template" + /// structure where a role might contain two `FactorSourceKind::TrustedContact`, + /// meaning an instance of this template at FactorSource level + /// (`SecurityStructureOfFactorSources`) will contain two different + /// `TrustedContactFactorSource`s. + pub threshold_factors: Vec<$factor>, + + /// How many threshold factors that must be used to perform some function with this role. + pub threshold: u8, + + /// Overriding / Super admin / "sudo" / God / factors, **ANY** + /// single of these factor which can perform the function of this role, + /// disregarding of `threshold`. + pub override_factors: Vec<$factor>, + } + + impl [< $role RoleWith $factor s >] { + pub fn new( + threshold_factors: impl IntoIterator, + threshold: u8, + override_factors: impl IntoIterator + ) -> Self { + let _self = Self { + threshold_factors: threshold_factors.into_iter().collect(), + threshold, + override_factors: override_factors.into_iter().collect(), + }; + assert!(_self.threshold_factors.len() >= _self.threshold as usize); + _self + } + + pub fn all_factors(&self) -> HashSet<&$factor> { + let mut factors = HashSet::from_iter(self.threshold_factors.iter()); + factors.extend(self.override_factors.iter()); + factors + } + } + + decl_role_with_factors_additional_impl!($role, $factor); + } + }; +} + +pub(crate) use decl_role_with_factors; + +macro_rules! decl_matrix_of_factors { + ( + $( + #[doc = $expr: expr] + )* + $factor: ident + ) => { + paste! { + + decl_role_with_factors!( + /// PrimaryRole is used for Signing Transactions. + Primary, + $factor + ); + + decl_role_with_factors!( + /// RecoveryRole is used to recover lost access to an entity. + Recovery, + $factor + ); + + decl_role_with_factors!( + /// ConfirmationRole is used to confirm recovery. + Confirmation, + $factor + ); + + $( + #[doc = $expr] + )* + #[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, + )] + #[serde(rename_all = "camelCase")] + pub struct [< MatrixOf $factor s >] { + /// Used for Signing transactions + pub primary_role: [< PrimaryRoleWith $factor s >], + + /// Used to initiate recovery - resetting the used Security Shield + /// of an entity. + pub recovery_role: [< RecoveryRoleWith $factor s >], + + /// To confirm recovery. + pub confirmation_role: [< ConfirmationRoleWith $factor s >], + } + + impl [< MatrixOf $factor s >] { + pub fn new( + primary_role: [< PrimaryRoleWith $factor s >], + recovery_role: [< RecoveryRoleWith $factor s >], + confirmation_role: [< ConfirmationRoleWith $factor s >], + ) -> Self { + Self { + primary_role, + recovery_role, + confirmation_role, + } + } + + pub fn all_factors(&self) -> HashSet<&$factor> { + let mut factors = HashSet::new(); + factors.extend(self.primary_role.all_factors()); + factors.extend(self.recovery_role.all_factors()); + factors.extend(self.confirmation_role.all_factors()); + factors + } + } + } + }; +} + +pub(crate) use decl_matrix_of_factors; + +macro_rules! decl_security_structure_of { + ( + $( + #[doc = $expr: expr] + )* + $factor: ident, + ) => { + + decl_matrix_of_factors!($factor); + + paste! { + + $( + #[doc = $expr] + )* + #[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, + )] + #[serde(rename_all = "camelCase")] + pub struct [< SecurityStructureOf $factor s >] { + /// Metadata of this Security Structure, such as globally unique and + /// stable identifier, creation date and user chosen label (name). + pub metadata: SecurityStructureMetadata, + + /// The amount of time until Confirmation Role is automatically + /// exercised, inputted by user in Days in UI, but translate it into + /// epochs ("block time"). + pub number_of_epochs_until_auto_confirmation: u64, + + /// The structure of factors to use for certain roles, Primary, Recovery + /// and Confirmation role. + pub matrix_of_factors: [< MatrixOf $factor s >], + } + + impl [< SecurityStructureOf $factor s >] { + pub fn new(metadata: SecurityStructureMetadata, number_of_epochs_until_auto_confirmation: u64, matrix_of_factors: [< MatrixOf $factor s >]) -> Self { + Self { + metadata, + number_of_epochs_until_auto_confirmation, + matrix_of_factors + } + } + + pub fn all_factors(&self) -> HashSet<&$factor> { + self.matrix_of_factors.all_factors() + } + } + } + }; +} + +pub(crate) use decl_security_structure_of; diff --git a/src/profile/mfa/security_structures/matrix_of_factor_sources_uniffi_fn.rs b/src/profile/mfa/security_structures/matrix_of_factor_sources_uniffi_fn.rs new file mode 100644 index 000000000..d372f86fa --- /dev/null +++ b/src/profile/mfa/security_structures/matrix_of_factor_sources_uniffi_fn.rs @@ -0,0 +1,36 @@ +use std::sync::Once; + +use crate::prelude::*; + +#[uniffi::export] +pub fn new_matrix_of_factor_sources_sample() -> MatrixOfFactorSources { + MatrixOfFactorSources::sample() +} + +#[uniffi::export] +pub fn new_matrix_of_factor_sources_sample_other() -> MatrixOfFactorSources { + MatrixOfFactorSources::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = MatrixOfFactorSources; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_matrix_of_factor_sources_sample(), + new_matrix_of_factor_sources_sample_other(), + // duplicates should get removed + new_matrix_of_factor_sources_sample(), + new_matrix_of_factor_sources_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/mfa/security_structures/mod.rs b/src/profile/mfa/security_structures/mod.rs new file mode 100644 index 000000000..bcb7605e5 --- /dev/null +++ b/src/profile/mfa/security_structures/mod.rs @@ -0,0 +1,25 @@ +mod decl_security_structure_of; +mod matrix_of_factor_sources_uniffi_fn; +mod security_structure_id; +mod security_structure_metadata; +mod security_structure_metadata_uniffi_fn; +mod security_structure_of_factor_instances; +mod security_structure_of_factor_source_ids; +mod security_structure_of_factor_sources; +mod security_structure_of_factor_sources_uniffi_fn; +mod security_structures_of_factor_source_ids; +mod security_structures_of_factor_source_ids_uniffi_fn; +mod security_structures_of_factor_sources; + +pub use decl_security_structure_of::*; +pub use matrix_of_factor_sources_uniffi_fn::*; +pub use security_structure_id::*; +pub use security_structure_metadata::*; +pub use security_structure_metadata_uniffi_fn::*; +pub use security_structure_of_factor_instances::*; +pub use security_structure_of_factor_source_ids::*; +pub use security_structure_of_factor_sources::*; +pub use security_structure_of_factor_sources_uniffi_fn::*; +pub use security_structures_of_factor_source_ids::*; +pub use security_structures_of_factor_source_ids_uniffi_fn::*; +pub use security_structures_of_factor_sources::*; diff --git a/src/profile/mfa/security_structures/security_structure_id.rs b/src/profile/mfa/security_structures/security_structure_id.rs new file mode 100644 index 000000000..d4e4c2f96 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_id.rs @@ -0,0 +1,75 @@ +use crate::prelude::*; + +/// A stable and globally unique identifier of a `SecurityStructureOfFactorSources` the +/// user has created. Also used in `SecurityStructureOfFactorSourceIDs` and in +/// `SecurityStructureOfFactorInstances`. +#[derive( + Serialize, + Deserialize, + Debug, + Copy, + derive_more::Display, + Clone, + PartialEq, + Eq, + Hash, +)] +#[serde(transparent)] +pub struct SecurityStructureID(pub(crate) Uuid); +uniffi::custom_newtype!(SecurityStructureID, Uuid); + +impl From for SecurityStructureID { + fn from(value: Uuid) -> Self { + Self(value) + } +} + +impl FromStr for SecurityStructureID { + type Err = CommonError; + fn from_str(s: &str) -> Result { + Uuid::from_str(s).map(SecurityStructureID).map_err(|_| { + CommonError::InvalidSecurityStructureID { + bad_value: s.to_owned(), + } + }) + } +} + +impl HasSampleValues for SecurityStructureID { + fn sample() -> Self { + SecurityStructureID(Uuid::sample()) + } + + fn sample_other() -> Self { + SecurityStructureID(Uuid::sample_other()) + } +} + +#[cfg(test)] +mod tests { + use crate::prelude::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureID; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn from_str_invalid() { + assert_eq!( + "bad".parse::(), + Err(CommonError::InvalidSecurityStructureID { + bad_value: "bad".to_owned() + }) + ); + } +} diff --git a/src/profile/mfa/security_structures/security_structure_metadata.rs b/src/profile/mfa/security_structures/security_structure_metadata.rs new file mode 100644 index 000000000..17a4fd2d0 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_metadata.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; + +#[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +pub struct SecurityStructureMetadata { + pub id: SecurityStructureID, + pub display_name: DisplayName, + pub created_on: Timestamp, + pub last_updated_on: Timestamp, +} + +impl Identifiable for SecurityStructureMetadata { + type ID = SecurityStructureID; + + fn id(&self) -> Self::ID { + self.id + } +} + +impl SecurityStructureMetadata { + pub fn with_details( + id: SecurityStructureID, + display_name: DisplayName, + created_on: Timestamp, + last_updated_on: Timestamp, + ) -> Self { + Self { + id, + display_name, + created_on, + last_updated_on, + } + } + + pub fn new(display_name: DisplayName) -> Self { + Self::with_details( + SecurityStructureID::from(Uuid::new_v4()), + display_name, + now(), + now(), + ) + } +} +impl HasSampleValues for SecurityStructureMetadata { + fn sample() -> Self { + Self::with_details( + SecurityStructureID::sample(), + DisplayName::sample(), + Timestamp::sample(), + Timestamp::sample(), + ) + } + fn sample_other() -> Self { + Self::with_details( + SecurityStructureID::sample_other(), + DisplayName::sample_other(), + Timestamp::sample_other(), + Timestamp::sample_other(), + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureMetadata; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/mfa/security_structures/security_structure_metadata_uniffi_fn.rs b/src/profile/mfa/security_structures/security_structure_metadata_uniffi_fn.rs new file mode 100644 index 000000000..ce8db4eca --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_metadata_uniffi_fn.rs @@ -0,0 +1,53 @@ +use std::sync::Once; + +use crate::prelude::*; + +#[uniffi::export] +pub fn new_security_structure_metadata_sample() -> SecurityStructureMetadata { + SecurityStructureMetadata::sample() +} + +#[uniffi::export] +pub fn new_security_structure_metadata_sample_other( +) -> SecurityStructureMetadata { + SecurityStructureMetadata::sample_other() +} + +#[uniffi::export] +pub fn new_security_structure_metadata_named( + name: &DisplayName, +) -> SecurityStructureMetadata { + SecurityStructureMetadata::new(name.clone()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureMetadata; + + #[test] + fn test_new() { + let name = &DisplayName::sample(); + assert_ne!( + new_security_structure_metadata_named(name), + new_security_structure_metadata_named(name) + ) + } + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_security_structure_metadata_sample(), + new_security_structure_metadata_sample_other(), + // duplicates should get removed + new_security_structure_metadata_sample(), + new_security_structure_metadata_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/mfa/security_structures/security_structure_of_factor_instances.rs b/src/profile/mfa/security_structures/security_structure_of_factor_instances.rs new file mode 100644 index 000000000..543956d87 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_of_factor_instances.rs @@ -0,0 +1,42 @@ +use crate::prelude::*; + +decl_matrix_of_factors!( + /// A matrix of FactorInstances + FactorInstance +); + +#[derive( + Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, uniffi::Record, +)] +#[serde(rename_all = "camelCase")] +pub struct SecurityStructureOfFactorInstances { + /// The ID of the `SecurityStructureOfFactorSourceIDs` in + /// `profile.app_preferences.security.security_structures_of_factor_source_ids` + /// which was used to derive the factor instances in this structure. Or rather: + /// The id of `SecurityStructureOfFactorSources`. + pub security_structure_id: SecurityStructureID, + + /// The structure of factors to use for certain roles, Primary, Recovery + /// and Confirmation role. + pub matrix_of_factors: MatrixOfFactorInstances, +} + +impl SecurityStructureOfFactorInstances { + pub fn new( + security_structure_id: SecurityStructureID, + matrix_of_factors: MatrixOfFactorInstances, + ) -> Self { + Self { + security_structure_id, + matrix_of_factors, + } + } +} + +impl Identifiable for SecurityStructureOfFactorInstances { + type ID = ::ID; + + fn id(&self) -> Self::ID { + self.security_structure_id + } +} diff --git a/src/profile/mfa/security_structures/security_structure_of_factor_source_ids.rs b/src/profile/mfa/security_structures/security_structure_of_factor_source_ids.rs new file mode 100644 index 000000000..dbbe83c12 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_of_factor_source_ids.rs @@ -0,0 +1,135 @@ +use crate::prelude::*; + +decl_security_structure_of!( + /// A security structure at FactorSourceID level, this is + /// what is serialized and store into Profile, we convert + /// into this structure from `SecurityStructureOfFactorSources`. + FactorSourceID, +); + +impl Identifiable for SecurityStructureOfFactorSourceIDs { + type ID = ::ID; + + fn id(&self) -> Self::ID { + self.metadata.id() + } +} + +impl From for PrimaryRoleWithFactorSourceIDs { + fn from(value: PrimaryRoleWithFactorSources) -> Self { + Self::new( + value.threshold_factors.iter().map(|x| x.factor_source_id()), + value.threshold, + value.override_factors.iter().map(|x| x.factor_source_id()), + ) + } +} + +impl From for RecoveryRoleWithFactorSourceIDs { + fn from(value: RecoveryRoleWithFactorSources) -> Self { + Self::new( + value.threshold_factors.iter().map(|x| x.factor_source_id()), + value.threshold, + value.override_factors.iter().map(|x| x.factor_source_id()), + ) + } +} + +impl From + for ConfirmationRoleWithFactorSourceIDs +{ + fn from(value: ConfirmationRoleWithFactorSources) -> Self { + Self::new( + value.threshold_factors.iter().map(|x| x.factor_source_id()), + value.threshold, + value.override_factors.iter().map(|x| x.factor_source_id()), + ) + } +} + +impl From for MatrixOfFactorSourceIDs { + fn from(value: MatrixOfFactorSources) -> Self { + Self::new( + value.primary_role.into(), + value.recovery_role.into(), + value.confirmation_role.into(), + ) + } +} +impl From + for SecurityStructureOfFactorSourceIDs +{ + fn from(value: SecurityStructureOfFactorSources) -> Self { + Self::new( + value.metadata, + value.number_of_epochs_until_auto_confirmation, + value.matrix_of_factors.into(), + ) + } +} + +impl HasSampleValues for SecurityStructureOfFactorSourceIDs { + fn sample() -> Self { + SecurityStructureOfFactorSources::sample().into() + } + fn sample_other() -> Self { + SecurityStructureOfFactorSources::sample_other().into() + } +} + +#[cfg(test)] +mod test_schematic_of_security_shield { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureOfFactorSourceIDs; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} + +// #[cfg(test)] +// mod test_schematics_primary_role { +// use super::*; + +// #[allow(clippy::upper_case_acronyms)] +// type SUT = RoleOfTierReference; + +// #[test] +// fn equality() { +// assert_eq!(SUT::sample(), SUT::sample()); +// assert_eq!(SUT::sample_other(), SUT::sample_other()); +// } + +// #[test] +// fn inequality() { +// assert_ne!(SUT::sample(), SUT::sample_other()); +// } +// } + +// #[cfg(test)] +// mod test_security_structure_reference { +// use super::*; + +// #[allow(clippy::upper_case_acronyms)] +// type SUT = SecurityStructureReference; + +// #[test] +// fn equality() { +// assert_eq!(SUT::sample(), SUT::sample()); +// assert_eq!(SUT::sample_other(), SUT::sample_other()); +// } + +// #[test] +// fn inequality() { +// assert_ne!(SUT::sample(), SUT::sample_other()); +// } +// } diff --git a/src/profile/mfa/security_structures/security_structure_of_factor_sources.rs b/src/profile/mfa/security_structures/security_structure_of_factor_sources.rs new file mode 100644 index 000000000..01db66011 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_of_factor_sources.rs @@ -0,0 +1,332 @@ +use crate::prelude::*; + +decl_security_structure_of!( + /// Security structure at `FactorSource` level. + /// This is what user view, creates and manages. + /// + /// Before it gets saved into Profile gets converted into + /// `SecurityStructureOfFactorSourceIDs` + FactorSource, +); + +pub const MINUTES_PER_DAY: u64 = 24 * 60; +pub const MINUTES_PER_EPOCH: u64 = 5; +pub const EPOCHS_PER_DAY: u64 = MINUTES_PER_DAY / MINUTES_PER_EPOCH; + +pub fn days_to_epochs(days: u16) -> u64 { + let days = days as u64; + days * EPOCHS_PER_DAY +} + +impl SecurityStructureOfFactorSources { + pub fn new_with_days( + metadata: SecurityStructureMetadata, + number_of_days_until_auto_confirmation: u16, + matrix_of_factors: MatrixOfFactorSources, + ) -> Self { + Self::new( + metadata, + days_to_epochs(number_of_days_until_auto_confirmation), + matrix_of_factors, + ) + } +} + +impl Identifiable for SecurityStructureOfFactorSources { + type ID = ::ID; + + fn id(&self) -> Self::ID { + self.metadata.id() + } +} + +fn factors_from( + ids: &[FactorSourceID], + from: &FactorSources, +) -> Result { + ids.iter() + .map(|id| { + from.get_id(*id) + .ok_or(CommonError::ProfileDoesNotContainFactorSourceWithID { + bad_value: *id, + }) + .map(|x| x.clone()) + }) + .collect::>() +} + +impl TryFrom<(&PrimaryRoleWithFactorSourceIDs, &FactorSources)> + for PrimaryRoleWithFactorSources +{ + type Error = CommonError; + fn try_from( + value: (&PrimaryRoleWithFactorSourceIDs, &FactorSources), + ) -> Result { + let (id_level, factor_sources) = value; + + let threshold_factors = + factors_from(&id_level.threshold_factors, factor_sources)?; + + let override_factors = + factors_from(&id_level.override_factors, factor_sources)?; + Ok(Self::new( + threshold_factors, + id_level.threshold, + override_factors, + )) + } +} +impl TryFrom<(&RecoveryRoleWithFactorSourceIDs, &FactorSources)> + for RecoveryRoleWithFactorSources +{ + type Error = CommonError; + fn try_from( + value: (&RecoveryRoleWithFactorSourceIDs, &FactorSources), + ) -> Result { + let (id_level, factor_sources) = value; + + let threshold_factors = + factors_from(&id_level.threshold_factors, factor_sources)?; + + let override_factors = + factors_from(&id_level.override_factors, factor_sources)?; + Ok(Self::new( + threshold_factors, + id_level.threshold, + override_factors, + )) + } +} +impl TryFrom<(&ConfirmationRoleWithFactorSourceIDs, &FactorSources)> + for ConfirmationRoleWithFactorSources +{ + type Error = CommonError; + fn try_from( + value: (&ConfirmationRoleWithFactorSourceIDs, &FactorSources), + ) -> Result { + let (id_level, factor_sources) = value; + + let threshold_factors = + factors_from(&id_level.threshold_factors, factor_sources)?; + + let override_factors = + factors_from(&id_level.override_factors, factor_sources)?; + Ok(Self::new( + threshold_factors, + id_level.threshold, + override_factors, + )) + } +} + +impl TryFrom<(&MatrixOfFactorSourceIDs, &FactorSources)> + for MatrixOfFactorSources +{ + type Error = CommonError; + fn try_from( + value: (&MatrixOfFactorSourceIDs, &FactorSources), + ) -> Result { + let (id_level, factor_sources) = value; + let primary_role = PrimaryRoleWithFactorSources::try_from(( + &id_level.primary_role, + factor_sources, + ))?; + + let recovery_role = RecoveryRoleWithFactorSources::try_from(( + &id_level.recovery_role, + factor_sources, + ))?; + + let confirmation_role = ConfirmationRoleWithFactorSources::try_from(( + &id_level.confirmation_role, + factor_sources, + ))?; + + Ok(Self::new(primary_role, recovery_role, confirmation_role)) + } +} + +impl TryFrom<(&SecurityStructureOfFactorSourceIDs, &FactorSources)> + for SecurityStructureOfFactorSources +{ + type Error = CommonError; + fn try_from( + value: (&SecurityStructureOfFactorSourceIDs, &FactorSources), + ) -> Result { + let (id_level, factor_sources) = value; + let matrix = MatrixOfFactorSources::try_from(( + &id_level.matrix_of_factors, + factor_sources, + ))?; + Ok(Self::new( + id_level.metadata.clone(), + id_level.number_of_epochs_until_auto_confirmation, + matrix, + )) + } +} + +impl HasSampleValues for PrimaryRoleWithFactorSources { + fn sample() -> Self { + Self::new( + [ + FactorSource::sample_device_babylon(), + FactorSource::sample_arculus(), + FactorSource::sample_off_device(), + ], + 2, + [FactorSource::sample_ledger()], + ) + } + fn sample_other() -> Self { + Self::new( + [ + FactorSource::sample_device_babylon_other(), + FactorSource::sample_arculus_other(), + FactorSource::sample_off_device_other(), + ], + 2, + [FactorSource::sample_ledger_other()], + ) + } +} + +impl HasSampleValues for RecoveryRoleWithFactorSources { + fn sample() -> Self { + Self::new( + [ + FactorSource::sample_trusted_contact_frank(), + FactorSource::sample_trusted_contact_grace(), + FactorSource::sample_trusted_contact_judy(), + ], + 2, + [FactorSource::sample_ledger()], + ) + } + fn sample_other() -> Self { + Self::new( + [ + FactorSource::sample_trusted_contact_trudy(), + FactorSource::sample_trusted_contact_oscar(), + FactorSource::sample_trusted_contact_radix(), + ], + 2, + [FactorSource::sample_ledger_other()], + ) + } +} + +impl HasSampleValues for ConfirmationRoleWithFactorSources { + fn sample() -> Self { + Self::new( + [], + 0, + [ + FactorSource::sample_security_questions(), + FactorSource::sample_ledger(), + ], + ) + } + fn sample_other() -> Self { + Self::new( + [], + 0, + [ + FactorSource::sample_security_questions_other(), + FactorSource::sample_ledger_other(), + ], + ) + } +} + +impl HasSampleValues for MatrixOfFactorSources { + fn sample() -> Self { + Self::new( + PrimaryRoleWithFactorSources::sample(), + RecoveryRoleWithFactorSources::sample(), + ConfirmationRoleWithFactorSources::sample(), + ) + } + fn sample_other() -> Self { + Self::new( + PrimaryRoleWithFactorSources::sample_other(), + RecoveryRoleWithFactorSources::sample_other(), + ConfirmationRoleWithFactorSources::sample_other(), + ) + } +} + +#[cfg(test)] +mod matrix_tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = MatrixOfFactorSources; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} + +impl HasSampleValues for SecurityStructureOfFactorSources { + fn sample() -> Self { + Self::new_with_days( + SecurityStructureMetadata::sample(), + 14, + MatrixOfFactorSources::sample(), + ) + } + fn sample_other() -> Self { + Self::new_with_days( + SecurityStructureMetadata::sample_other(), + 28, + MatrixOfFactorSources::sample_other(), + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureOfFactorSources; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_epochs_per_day() { + assert_eq!(EPOCHS_PER_DAY, 288); + } + + #[test] + fn test_days_to_epochs() { + assert_eq!(days_to_epochs(0), 0); + assert_eq!(days_to_epochs(10), 2880); + } + + #[test] + fn test_into_id_level_and_back() { + let factor_sources = FactorSources::sample_values_all(); + let sut = SUT::sample(); + let id_level = SecurityStructureOfFactorSourceIDs::from(sut.clone()); + let detailed = SUT::try_from((&id_level, &factor_sources)).unwrap(); + assert_eq!(detailed, sut); + } +} diff --git a/src/profile/mfa/security_structures/security_structure_of_factor_sources_uniffi_fn.rs b/src/profile/mfa/security_structures/security_structure_of_factor_sources_uniffi_fn.rs new file mode 100644 index 000000000..9d5f367f4 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structure_of_factor_sources_uniffi_fn.rs @@ -0,0 +1,62 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_security_structure_of_factor_sources_sample( +) -> SecurityStructureOfFactorSources { + SecurityStructureOfFactorSources::sample() +} + +#[uniffi::export] +pub fn new_security_structure_of_factor_sources_sample_other( +) -> SecurityStructureOfFactorSources { + SecurityStructureOfFactorSources::sample_other() +} + +#[uniffi::export] +pub fn new_security_structure_of_factor_sources_auto_in_days( + metadata: SecurityStructureMetadata, + number_of_days_until_auto_confirmation: u16, + matrix_of_factors: MatrixOfFactorSources, +) -> SecurityStructureOfFactorSources { + SecurityStructureOfFactorSources::new_with_days( + metadata, + number_of_days_until_auto_confirmation, + matrix_of_factors, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureOfFactorSources; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_security_structure_of_factor_sources_sample(), + new_security_structure_of_factor_sources_sample_other(), + // duplicates should get removed + new_security_structure_of_factor_sources_sample(), + new_security_structure_of_factor_sources_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_new_security_structure_of_factor_sources_auto_in_days() { + assert_eq!( + new_security_structure_of_factor_sources_auto_in_days( + SecurityStructureMetadata::sample(), + 1, + MatrixOfFactorSources::sample() + ) + .number_of_epochs_until_auto_confirmation, + 288 + ); + } +} diff --git a/src/profile/mfa/security_structures/security_structures_of_factor_source_ids.rs b/src/profile/mfa/security_structures/security_structures_of_factor_source_ids.rs new file mode 100644 index 000000000..0796f9bb0 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structures_of_factor_source_ids.rs @@ -0,0 +1,19 @@ +use crate::prelude::*; + +decl_identified_vec_of!( + /// A collection of [`SecurityStructureOfFactorSourceIDs`] + SecurityStructuresOfFactorSourceIDs, + SecurityStructureOfFactorSourceIDs +); + +impl HasSampleValues for SecurityStructuresOfFactorSourceIDs { + fn sample() -> Self { + Self::from_iter([ + SecurityStructureOfFactorSourceIDs::sample(), + SecurityStructureOfFactorSourceIDs::sample_other(), + ]) + } + fn sample_other() -> Self { + Self::from_iter([SecurityStructureOfFactorSourceIDs::sample_other()]) + } +} diff --git a/src/profile/mfa/security_structures/security_structures_of_factor_source_ids_uniffi_fn.rs b/src/profile/mfa/security_structures/security_structures_of_factor_source_ids_uniffi_fn.rs new file mode 100644 index 000000000..f6f61fdb0 --- /dev/null +++ b/src/profile/mfa/security_structures/security_structures_of_factor_source_ids_uniffi_fn.rs @@ -0,0 +1,36 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_security_structure_of_factor_source_ids_sample( +) -> SecurityStructureOfFactorSourceIDs { + SecurityStructureOfFactorSourceIDs::sample() +} + +#[uniffi::export] +pub fn new_security_structure_of_factor_source_ids_sample_other( +) -> SecurityStructureOfFactorSourceIDs { + SecurityStructureOfFactorSourceIDs::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SecurityStructureOfFactorSourceIDs; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_security_structure_of_factor_source_ids_sample(), + new_security_structure_of_factor_source_ids_sample_other(), + // duplicates should get removed + new_security_structure_of_factor_source_ids_sample(), + new_security_structure_of_factor_source_ids_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/mfa/security_structures/security_structures_of_factor_sources.rs b/src/profile/mfa/security_structures/security_structures_of_factor_sources.rs new file mode 100644 index 000000000..d64ef90fc --- /dev/null +++ b/src/profile/mfa/security_structures/security_structures_of_factor_sources.rs @@ -0,0 +1,19 @@ +use crate::prelude::*; + +decl_identified_vec_of!( + /// A collection of [`SecurityStructureOfFactorSources`] + SecurityStructuresOfFactorSources, + SecurityStructureOfFactorSources +); + +impl HasSampleValues for SecurityStructuresOfFactorSources { + fn sample() -> Self { + Self::from_iter([ + SecurityStructureOfFactorSources::sample(), + SecurityStructureOfFactorSources::sample_other(), + ]) + } + fn sample_other() -> Self { + Self::from_iter([SecurityStructureOfFactorSources::sample_other()]) + } +} diff --git a/src/profile/mod.rs b/src/profile/mod.rs index e025d8d69..eea91d699 100644 --- a/src/profile/mod.rs +++ b/src/profile/mod.rs @@ -1,11 +1,13 @@ mod encrypted; mod logic; +mod mfa; mod profilesnapshot_version; mod supporting_types; mod v100; pub use encrypted::*; pub use logic::*; +pub use mfa::*; pub use profilesnapshot_version::*; pub use supporting_types::*; pub use v100::*; diff --git a/src/profile/supporting_types/account_for_display.rs b/src/profile/supporting_types/account_for_display.rs index e2be18f40..562443308 100644 --- a/src/profile/supporting_types/account_for_display.rs +++ b/src/profile/supporting_types/account_for_display.rs @@ -13,10 +13,12 @@ use crate::prelude::*; derive_more::Display, uniffi::Record, )] -#[display("{label} | {address}")] +#[display("{display_name} | {address}")] pub struct AccountForDisplay { pub address: AccountAddress, - pub label: DisplayName, + + #[serde(rename = "label")] + pub display_name: DisplayName, #[serde(rename = "appearanceID")] pub appearance_id: AppearanceID, @@ -25,12 +27,12 @@ pub struct AccountForDisplay { impl AccountForDisplay { pub fn new( address: impl Into, - label: impl Into, + display_name: impl Into, appearance_id: impl Into, ) -> Self { Self { address: address.into(), - label: label.into(), + display_name: display_name.into(), appearance_id: appearance_id.into(), } } @@ -54,6 +56,12 @@ impl HasSampleValues for AccountForDisplay { } } +impl From for AccountForDisplay { + fn from(value: Account) -> Self { + Self::new(value.address, value.display_name, value.appearance_id) + } +} + impl Identifiable for AccountForDisplay { type ID = AccountAddress; @@ -90,4 +98,17 @@ mod tests { fn test_is_network_aware() { assert_eq!(SUT::sample().network_id(), NetworkID::Mainnet); } + + #[test] + fn from_account() { + let lhs = SUT::from(Account::sample()); + assert_eq!( + lhs, + SUT::new( + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + DisplayName::new("Alice").unwrap(), + AppearanceID::new(0).unwrap(), + ) + ) + } } diff --git a/src/profile/supporting_types/account_for_display_uniffi_fn.rs b/src/profile/supporting_types/account_for_display_uniffi_fn.rs index 6bcc2964c..af6dde0c9 100644 --- a/src/profile/supporting_types/account_for_display_uniffi_fn.rs +++ b/src/profile/supporting_types/account_for_display_uniffi_fn.rs @@ -10,6 +10,13 @@ pub fn new_account_for_display_sample_other() -> AccountForDisplay { AccountForDisplay::sample_other() } +#[uniffi::export] +pub fn new_account_for_display_from_account( + account: Account, +) -> AccountForDisplay { + AccountForDisplay::from(account) +} + #[cfg(test)] mod tests { use super::*; @@ -31,4 +38,13 @@ mod tests { 2 ); } + + #[test] + fn test_new_account_for_display_from_account() { + let sut = Account::sample(); + assert_eq!( + new_account_for_display_from_account(sut.clone()), + AccountForDisplay::from(sut) + ); + } } diff --git a/src/profile/supporting_types/account_or_persona.rs b/src/profile/supporting_types/account_or_persona.rs index e69537128..9e81143cd 100644 --- a/src/profile/supporting_types/account_or_persona.rs +++ b/src/profile/supporting_types/account_or_persona.rs @@ -137,10 +137,10 @@ mod tests { #[test] fn test_display() { - assert_eq!(format!("{}", SUT::sample()), "Alice | account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8"); + assert_eq!(format!("{}", SUT::sample()), "Alice | account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87"); assert_eq!( format!("{}", SUT::sample_other()), - "Batman | identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62" + "Batman | identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw" ); } } diff --git a/src/profile/supporting_types/decl_identified_vec_of_with_samples.rs b/src/profile/supporting_types/decl_identified_vec_of_with_samples.rs index 1bbae0a0e..1fd2f97fd 100644 --- a/src/profile/supporting_types/decl_identified_vec_of_with_samples.rs +++ b/src/profile/supporting_types/decl_identified_vec_of_with_samples.rs @@ -12,6 +12,7 @@ macro_rules! decl_identified_vec_of { $( #[doc = $expr] )* + #[allow(non_camel_case_types)] pub type $collection_type = IdentifiedVecOf<$element_type>; #[uniffi::export] diff --git a/src/profile/supporting_types/email_address.rs b/src/profile/supporting_types/email_address.rs new file mode 100644 index 000000000..b93177976 --- /dev/null +++ b/src/profile/supporting_types/email_address.rs @@ -0,0 +1,113 @@ +use crate::prelude::*; + +/// An email address. +/// +/// Current implementation does not validate the email address other than it +/// cannot be empty (in the future we might add some simple validation). +#[derive( + Serialize, + Deserialize, + Clone, + PartialEq, + Hash, + Eq, + derive_more::Display, + derive_more::Debug, + uniffi::Record, +)] +#[display("{email}")] +#[debug("{email}")] +#[serde(transparent)] +pub struct EmailAddress { + pub email: String, +} + +impl Identifiable for EmailAddress { + type ID = String; + + fn id(&self) -> Self::ID { + self.email.clone() + } +} + +impl FromStr for EmailAddress { + type Err = CommonError; + + fn from_str(s: &str) -> Result { + Self::new(s) + } +} + +impl EmailAddress { + pub fn new(email: impl AsRef) -> Result { + let email = email.as_ref().to_owned(); + if email.is_empty() { + return Err(CommonError::EmailAddressEmpty); + } + Ok(Self { email }) + } +} + +impl HasSampleValues for EmailAddress { + fn sample() -> Self { + Self::new("alan@turing.hero").expect("Valid sample.") + } + + fn sample_other() -> Self { + Self::new("satoshi@nakamoto.btc").expect("Valid sample.") + } +} + +#[cfg(test)] +mod tests { + use crate::prelude::*; + + #[test] + fn equality() { + assert_eq!(EmailAddress::sample(), EmailAddress::sample()); + assert_eq!(EmailAddress::sample_other(), EmailAddress::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(EmailAddress::sample(), EmailAddress::sample_other()); + } + + #[test] + fn invalid_empty() { + assert_eq!(EmailAddress::new(""), Err(CommonError::EmailAddressEmpty)); + } + + #[test] + fn json_roundtrip_sample() { + let model = EmailAddress::sample(); + assert_json_value_eq_after_roundtrip(&model, json!("alan@turing.hero")); + } + + #[test] + fn id_is_email() { + assert_eq!(EmailAddress::sample().id(), EmailAddress::sample().email); + } + + #[test] + fn new_from_string() { + assert_eq!( + EmailAddress::new("alan@turing.hero").unwrap(), + EmailAddress::sample() + ); + } + + #[test] + fn new_from_str() { + assert_eq!( + EmailAddress::new("alan@turing.hero").unwrap(), + EmailAddress::sample() + ); + } + + #[test] + fn new_with_fromstr() { + let email: EmailAddress = "alan@turing.hero".parse().unwrap(); + assert_eq!(email, EmailAddress::sample()); + } +} diff --git a/src/profile/supporting_types/email_address_uniffi_fn.rs b/src/profile/supporting_types/email_address_uniffi_fn.rs new file mode 100644 index 000000000..5821e9c35 --- /dev/null +++ b/src/profile/supporting_types/email_address_uniffi_fn.rs @@ -0,0 +1,36 @@ +use std::sync::Once; + +use crate::prelude::*; + +#[uniffi::export] +pub fn new_email_address_sample() -> EmailAddress { + EmailAddress::sample() +} + +#[uniffi::export] +pub fn new_email_address_sample_other() -> EmailAddress { + EmailAddress::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = EmailAddress; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_email_address_sample(), + new_email_address_sample_other(), + // duplicates should get removed + new_email_address_sample(), + new_email_address_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/supporting_types/host_id.rs b/src/profile/supporting_types/host_id.rs new file mode 100644 index 000000000..99ccd16da --- /dev/null +++ b/src/profile/supporting_types/host_id.rs @@ -0,0 +1,86 @@ +use crate::prelude::*; + +#[derive( + Serialize, + Deserialize, + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[display("ID {} at {}", id, generated_at)] +pub struct HostId { + /// A best effort stable and unique identifier of this + /// host's device. + pub id: DeviceID, + + /// The date this id of the device was generated, might + /// be equal to when the app was first ever launched on the + /// device. + pub generated_at: Timestamp, +} + +impl HostId { + pub fn generate_new() -> Self { + Self { + id: DeviceID::generate_new(), + generated_at: now(), + } + } +} + +impl HasSampleValues for HostId { + fn sample() -> Self { + Self { + id: DeviceID::sample(), + generated_at: Timestamp::sample(), + } + } + + fn sample_other() -> Self { + Self { + id: DeviceID::sample_other(), + generated_at: Timestamp::sample_other(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostId; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_uniqueness() { + let host_infos: Vec = + (0..100).map(|_| SUT::generate_new()).collect(); + + assert_eq!(HashSet::from_iter(host_infos.iter().cloned()).len(), 100); + } + + #[test] + fn test_to_string() { + let info = SUT::sample(); + assert_eq!( + "ID ffffffff-ffff-ffff-ffff-ffffffffffff at 2023-09-11T16:05:56.000Z", + info.to_string() + ) + } +} diff --git a/src/profile/supporting_types/host_id_uniffi_fn.rs b/src/profile/supporting_types/host_id_uniffi_fn.rs new file mode 100644 index 000000000..baa8144df --- /dev/null +++ b/src/profile/supporting_types/host_id_uniffi_fn.rs @@ -0,0 +1,34 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_host_id_sample() -> HostId { + HostId::sample() +} + +#[uniffi::export] +pub fn new_host_id_sample_other() -> HostId { + HostId::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostId; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_host_id_sample(), + new_host_id_sample_other(), + // duplicates should get removed + new_host_id_sample(), + new_host_id_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/supporting_types/host_info.rs b/src/profile/supporting_types/host_info.rs new file mode 100644 index 000000000..bc89e921c --- /dev/null +++ b/src/profile/supporting_types/host_info.rs @@ -0,0 +1,84 @@ +use crate::prelude::*; + +#[derive( + Clone, Debug, PartialEq, Eq, Hash, derive_more::Display, uniffi::Record, +)] +#[display("Host '{} {}' running on {}, firmware: {}", description.name, description.model, host_os, host_app_version)] +pub struct HostInfo { + /// A short description of the device. The host should + /// read the device model and a given name from the device + /// if they are able to. + pub description: DeviceInfoDescription, + + /// The **current** os and version of the device's operating system, e.g. "iOS 17.4.1". + pub host_os: HostOS, + + /// The **current** version of the host app, for example the Radix iOS Wallet version - e.g. "1.6.1" + pub host_app_version: String, +} + +impl HostInfo { + pub fn new( + description: DeviceInfoDescription, + host_os: HostOS, + host_app_version: impl AsRef, + ) -> Self { + Self { + description, + host_os, + host_app_version: host_app_version.as_ref().to_owned(), + } + } +} + +impl HasSampleValues for HostInfo { + fn sample() -> Self { + Self { + description: DeviceInfoDescription { + name: "My precious".to_owned(), + model: "iPhone SE 2nd gen".to_owned(), + }, + host_os: HostOS::sample(), + host_app_version: "1.6.4".to_string(), + } + } + + fn sample_other() -> Self { + Self { + description: DeviceInfoDescription { + name: "My Pixel".to_owned(), + model: "Pixel 8 Pro".to_owned(), + }, + host_os: HostOS::sample_other(), + host_app_version: "1.6.4".to_string(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostInfo; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_to_string() { + let info = HostInfo::sample(); + assert_eq!( + "Host 'My precious iPhone SE 2nd gen' running on iOS 17.4.1, firmware: 1.6.4", + info.to_string() + ) + } +} diff --git a/src/profile/supporting_types/host_info_uniffi_fn.rs b/src/profile/supporting_types/host_info_uniffi_fn.rs new file mode 100644 index 000000000..cf8bccb7d --- /dev/null +++ b/src/profile/supporting_types/host_info_uniffi_fn.rs @@ -0,0 +1,34 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_host_info_sample() -> HostInfo { + HostInfo::sample() +} + +#[uniffi::export] +pub fn new_host_info_sample_other() -> HostInfo { + HostInfo::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostInfo; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_host_info_sample(), + new_host_info_sample_other(), + // duplicates should get removed + new_host_info_sample(), + new_host_info_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/supporting_types/host_os.rs b/src/profile/supporting_types/host_os.rs new file mode 100644 index 000000000..6cc9ec75b --- /dev/null +++ b/src/profile/supporting_types/host_os.rs @@ -0,0 +1,137 @@ +use crate::HasSampleValues; +use std::fmt::{Display, Formatter, Pointer}; + +/// Describes the type of the Host machine and its version. Currently, as it stands at runtime +/// the possible values will be IOS or Android. Other is in place to facilitate unit tests +/// and to make sargon host agnostic. +#[derive(Debug, Clone, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum HostOS { + IOS { + version: String, + }, + Android { + vendor: String, + version: String, + }, + Other { + name: String, + vendor: String, + version: String, + }, +} + +impl HostOS { + /// Creates an iOS kind with version + pub fn ios(version: impl AsRef) -> Self { + Self::IOS { + version: version.as_ref().to_string(), + } + } + + /// Creates an Android kind with version + pub fn android(vendor: impl AsRef, version: impl AsRef) -> Self { + Self::Android { + vendor: vendor.as_ref().to_string(), + version: version.as_ref().to_string(), + } + } + + /// Creates an Other kind with a custom name and version + pub fn other( + name: impl AsRef, + vendor: impl AsRef, + version: impl AsRef, + ) -> Self { + Self::Other { + name: name.as_ref().to_string(), + vendor: vendor.as_ref().to_string(), + version: version.as_ref().to_string(), + } + } + + /// Returns the name of the host's os + pub fn name(&self) -> String { + match self { + HostOS::IOS { .. } => "iOS".to_owned(), + HostOS::Android { .. } => "Android".to_owned(), + HostOS::Other { + name, + vendor: _vendor, + version: _, + } => name.clone(), + } + } + + /// Returns the version name of the host's os. + pub fn version(&self) -> String { + let version = match self { + HostOS::IOS { version } => version, + HostOS::Android { vendor: _, version } => version, + HostOS::Other { + name: _, + vendor: _, + version, + } => version, + }; + + format!("{} {}", self.name(), version) + } + + /// Returns the vendor of this host's os. + pub fn vendor(&self) -> String { + match self { + HostOS::IOS { .. } => "Apple".to_owned(), + HostOS::Android { vendor, version: _ } => vendor.to_owned(), + HostOS::Other { + name: _name, + vendor, + version: _, + } => vendor.to_owned(), + } + } +} + +impl Display for HostOS { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.version()) + } +} + +impl HasSampleValues for HostOS { + fn sample() -> Self { + HostOS::ios("17.4.1") + } + + fn sample_other() -> Self { + HostOS::android("Google", "14 (API 34)") + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostOS; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_display() { + assert_eq!(SUT::sample().to_string(), "iOS 17.4.1"); + assert_eq!(SUT::sample_other().to_string(), "Android 14 (API 34)"); + assert_eq!( + SUT::other("Custom", "Unknown", "1.0.0").to_string(), + "Custom 1.0.0" + ); + } +} diff --git a/src/profile/supporting_types/host_os_uniffi_fn.rs b/src/profile/supporting_types/host_os_uniffi_fn.rs new file mode 100644 index 000000000..fcf474d9c --- /dev/null +++ b/src/profile/supporting_types/host_os_uniffi_fn.rs @@ -0,0 +1,111 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_host_os_ios(version: String) -> HostOS { + HostOS::ios(version) +} + +#[uniffi::export] +pub fn new_host_os_android(vendor: String, version: String) -> HostOS { + HostOS::android(vendor, version) +} + +#[uniffi::export] +pub fn new_host_os_other( + name: String, + vendor: String, + version: String, +) -> HostOS { + HostOS::other(name, vendor, version) +} + +#[uniffi::export] +pub fn host_os_get_name(host_os: &HostOS) -> String { + host_os.name() +} + +#[uniffi::export] +pub fn host_os_get_vendor(host_os: &HostOS) -> String { + host_os.vendor() +} + +#[uniffi::export] +pub fn host_os_get_version(host_os: &HostOS) -> String { + host_os.version() +} + +#[uniffi::export] +pub fn new_host_os_sample() -> HostOS { + HostOS::sample() +} + +#[uniffi::export] +pub fn new_host_os_sample_other() -> HostOS { + HostOS::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = HostOS; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_host_os_sample(), + new_host_os_sample_other(), + // duplicates should get removed + new_host_os_sample(), + new_host_os_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_new_ios() { + assert_eq!(new_host_os_ios("17.4.1".to_owned()), HostOS::ios("17.4.1")); + } + + #[test] + fn test_new_android() { + assert_eq!( + new_host_os_android("Google".to_owned(), "14 (API 34)".to_owned()), + HostOS::android("Google", "14 (API 34)") + ); + } + + #[test] + fn test_new_other() { + assert_eq!( + new_host_os_other( + "macos".to_owned(), + "Apple".to_owned(), + "14.5".to_owned() + ), + HostOS::other("macos", "Apple", "14.5") + ); + } + + #[test] + fn test_get_name() { + let sut = SUT::sample(); + assert_eq!(host_os_get_name(&sut), sut.name()); + } + + #[test] + fn test_get_vendor() { + let sut = SUT::sample(); + assert_eq!(host_os_get_vendor(&sut), sut.vendor()); + } + + #[test] + fn test_get_version() { + let sut = SUT::sample(); + assert_eq!(host_os_get_version(&sut), sut.version()); + } +} diff --git a/src/profile/supporting_types/is_network_aware.rs b/src/profile/supporting_types/is_network_aware.rs new file mode 100644 index 000000000..7e1a9d9b6 --- /dev/null +++ b/src/profile/supporting_types/is_network_aware.rs @@ -0,0 +1,19 @@ +use crate::prelude::*; + +pub trait IsNetworkAware { + fn network_id(&self) -> NetworkID; + + /// Validates that `other` is on the same network as self. + fn is_on_same_network_as(&self, other: &impl IsNetworkAware) -> Result<()> { + let this = self.network_id(); + let other = other.network_id(); + if this != other { + Err(CommonError::NetworkDiscrepancy { + expected: this, + actual: other, + }) + } else { + Ok(()) + } + } +} diff --git a/src/profile/supporting_types/mod.rs b/src/profile/supporting_types/mod.rs index 523308db8..1442942c0 100644 --- a/src/profile/supporting_types/mod.rs +++ b/src/profile/supporting_types/mod.rs @@ -10,6 +10,16 @@ mod authorized_persona_detailed; mod authorized_persona_detailed_uniffi_fn; mod decl_identified_vec_of_with_samples; mod detailed_authorized_personas; +mod email_address; +mod email_address_uniffi_fn; +mod host_id; +mod host_id_uniffi_fn; +mod host_info; +mod host_info_uniffi_fn; +mod host_os; +mod host_os_uniffi_fn; +mod is_network_aware; +mod on_same_network_validating; pub use account_for_display::*; pub use account_for_display_uniffi_fn::*; @@ -23,3 +33,12 @@ pub use authorized_persona_detailed::*; pub use authorized_persona_detailed_uniffi_fn::*; pub use decl_identified_vec_of_with_samples::*; pub use detailed_authorized_personas::*; +pub use email_address::*; +pub use email_address_uniffi_fn::*; +pub use host_id::*; +pub use host_id_uniffi_fn::*; +pub use host_info::*; +pub use host_info_uniffi_fn::*; +pub use host_os::*; +pub use is_network_aware::*; +pub use on_same_network_validating::*; diff --git a/src/profile/supporting_types/on_same_network_validating.rs b/src/profile/supporting_types/on_same_network_validating.rs new file mode 100644 index 000000000..036b3fc81 --- /dev/null +++ b/src/profile/supporting_types/on_same_network_validating.rs @@ -0,0 +1,35 @@ +use crate::prelude::*; + +pub trait OnSameNetworkValidating: + Clone + IntoIterator +{ + type Element: IsNetworkAware; + + fn is_empty(&self) -> bool; + + fn assert_elements_not_empty_and_on_same_network( + &self, + ) -> Result { + self.assert_elements_on_same_network() + .and_then(|x| x.ok_or(CommonError::ExpectedNonEmptyCollection)) + } + + fn assert_elements_on_same_network(&self) -> Result> { + if self.is_empty() { + return Ok(None); + } + let network_id = self.clone().into_iter().next().unwrap().network_id(); + self.clone().into_iter().try_for_each(|e| { + if e.network_id() == network_id { + Ok(()) + } else { + Err(CommonError::NetworkDiscrepancy { + expected: network_id, + actual: e.network_id(), + }) + } + })?; + + Ok(Some(network_id)) + } +} diff --git a/src/profile/v100/address/account_address.rs b/src/profile/v100/address/account_address.rs index 1230fe13b..98eaba742 100644 --- a/src/profile/v100/address/account_address.rs +++ b/src/profile/v100/address/account_address.rs @@ -37,7 +37,7 @@ impl AccountAddress { /// Returns `false` for all addresses created with `Ed25519PublicKey`s, i.e. /// for all accounts created by the Babylon Radix Wallets. /// Returns `true` for all addresses created with `Secp256k1PublicKey`s, i.e. - /// imported from the Olympia Wallet. + /// imported from the legacy Olympia desktop application. pub fn is_legacy_address(&self) -> bool { self.entity_type() == ScryptoEntityType::GlobalVirtualSecp256k1Account } @@ -88,7 +88,7 @@ impl AccountAddress { /// A sample used to facilitate unit tests. pub fn sample_stokenet() -> Self { let address = AccountAddress::try_from_bech32( - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", ) .unwrap(); assert_eq!(address.network_id(), NetworkID::Stokenet); @@ -98,12 +98,44 @@ impl AccountAddress { /// A sample used to facilitate unit tests. pub fn sample_stokenet_other() -> Self { let address = AccountAddress::try_from_bech32( - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp", ) .unwrap(); assert_eq!(address.network_id(), NetworkID::Stokenet); address } + + pub fn sample_grace() -> Self { + Self::from_str("account_rdx128c4f8dnuvd73d2r3fl95ryfuavw5zjf8zr57hjw0qjagz7s7grace").unwrap() + } + + pub fn sample_frank() -> Self { + Self::from_str("account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank").unwrap() + } + + pub fn sample_judy() -> Self { + // Or alternatively: `"account_rdx12xc095hk3g8klf8gvz5q6qy9pl9e7v5m5eju0xctzvesnyhnfdjudy"` + // Or alternatively: `"account_rdx12x82w84l6n55m78h8eldedeca52tp8tpuu3342g5lw4f9v85znjudy"` + Self::from_str("account_rdx12y0389ew2xn7w02d059hhye6t0mjzqxqyavsetyg2j3p3xqyepjudy").unwrap() + } + + pub fn sample_oscar() -> Self { + Self::from_str("account_rdx129uc6rf5vmkj2gau7fgxlsqdg8008nca8yd57sxx4v67dyw7u0scar").unwrap() + } + + pub fn sample_trudy() -> Self { + Self::from_str("account_rdx1284z0gpg9vnhevn7sytdncszc7ukcrycntg7zjktqvggmwe6ctrudy").unwrap() + } + pub fn sample_radix() -> Self { + // Or alternatively: `"account_rdx12yql52whel8xjttrw84tau270asj92ssu9pgqzgrftd4m8ptm8zrdx"` + // Or alternatively: `"account_rdx129sctf9rusf0ceq6ap2ca8r030f2mf8z0a2fx90jg5yxtladqrprdx"` + // Or alternatively: `"account_rdx1287mp2d20wfmc8tyluryehz3j53jn0f9jmkdxp9808vrjxetu9prdx"` + // Or alternatively: `"account_rdx1282v25pw9y59ny74rv7aht6q0qgqs4g85q20zmustkyu6mxphp5rdx"` + // Or alternatively: `"account_rdx128avae2px32e8t7vcax0axvt0afa5lrw4rwjlksev48wamgs472rdx"` + // Or alternatively: `"account_rdx128g9urn56vyu2axptn9r4rctggn9f0phlu3mzd6mz6lsdkxkd7hrdx"` + // Or alternatively: `"account_rdx129mvy35wx370ey2sxqces5ddq5sqj4q7xxhwl3ejpvu8gd8ta3erdx"` + Self::from_str("account_rdx12y7uww27s250g9d3d72ey9wdp5z78zpmq5la0r0wgw4fkf6y8eerdx").unwrap() + } } #[cfg(test)] diff --git a/src/profile/v100/address/account_address_uniffi_fn.rs b/src/profile/v100/address/account_address_uniffi_fn.rs index c131dddde..1042bb170 100644 --- a/src/profile/v100/address/account_address_uniffi_fn.rs +++ b/src/profile/v100/address/account_address_uniffi_fn.rs @@ -31,7 +31,7 @@ pub fn new_account_address_sample_stokenet_other() -> AccountAddress { /// Returns `false` for all addresses created with `Ed25519PublicKey`s, i.e. /// for all accounts created by the Babylon Radix Wallets. /// Returns `true` for all addresses created with `Secp256k1PublicKey`s, i.e. -/// imported from the Olympia Wallet. +/// imported from the legacy Olympia desktop application. #[uniffi::export] pub fn account_address_is_legacy(address: &AccountAddress) -> bool { address.is_legacy_address() diff --git a/src/profile/v100/address/identity_address.rs b/src/profile/v100/address/identity_address.rs index 4e8bbb4a5..abfc8d11b 100644 --- a/src/profile/v100/address/identity_address.rs +++ b/src/profile/v100/address/identity_address.rs @@ -49,28 +49,28 @@ impl IdentityAddress { impl IdentityAddress { pub fn sample_mainnet() -> Self { - let address: IdentityAddress = "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x" + let address: IdentityAddress = "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g" .parse() .expect("Should have a valid sample value"); assert_eq!(address.network_id(), NetworkID::Mainnet); address } pub fn sample_mainnet_other() -> Self { - let address: IdentityAddress = "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62" + let address: IdentityAddress = "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw" .parse() .expect("Should have a valid sample value"); assert_eq!(address.network_id(), NetworkID::Mainnet); address } pub fn sample_stokenet() -> Self { - let address: IdentityAddress = "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc" + let address: IdentityAddress = "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8" .parse() .expect("Should have a valid sample value"); assert_eq!(address.network_id(), NetworkID::Stokenet); address } pub fn sample_stokenet_other() -> Self { - let address: IdentityAddress = "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08" + let address: IdentityAddress = "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq" .parse() .expect("Should have a valid sample value"); assert_eq!(address.network_id(), NetworkID::Stokenet); diff --git a/src/profile/v100/address/identity_address_uniffi_fn.rs b/src/profile/v100/address/identity_address_uniffi_fn.rs index 3e6e39218..263e6b288 100644 --- a/src/profile/v100/address/identity_address_uniffi_fn.rs +++ b/src/profile/v100/address/identity_address_uniffi_fn.rs @@ -37,7 +37,7 @@ mod uniffi_tests { #[test] fn new_from_bech32_get_network_id_and_address() { - let b32 = "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x"; + let b32 = "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g"; let address = new_identity_address(b32.to_owned()).unwrap(); assert_eq!(identity_address_network_id(&address), NetworkID::Mainnet); assert_eq!(identity_address_bech32_address(&address), b32); diff --git a/src/profile/v100/address/non_fungible_global_id.rs b/src/profile/v100/address/non_fungible_global_id.rs index 356a62bec..3979366e4 100644 --- a/src/profile/v100/address/non_fungible_global_id.rs +++ b/src/profile/v100/address/non_fungible_global_id.rs @@ -39,7 +39,7 @@ impl NonFungibleGlobalId { ) -> Self { let resource_address = resource_address.into(); if resource_address.is_fungible() { - info!("Notice: Fungible resource address used with NonFungible Global ID.") + debug!("Notice: Fungible resource address used with NonFungible Global ID.") } Self { resource_address, diff --git a/src/profile/v100/address/wrap_ret_address.rs b/src/profile/v100/address/wrap_ret_address.rs index 7638f1596..59d17a623 100644 --- a/src/profile/v100/address/wrap_ret_address.rs +++ b/src/profile/v100/address/wrap_ret_address.rs @@ -7,23 +7,6 @@ pub trait AddressViaRet: Sized { ) -> Result; } -pub trait IsNetworkAware { - fn network_id(&self) -> NetworkID; - - fn is_on_same_network_as(&self, other: &impl IsNetworkAware) -> Result<()> { - let this = self.network_id(); - let other = other.network_id(); - if this != other { - Err(CommonError::NetworkDiscrepancy { - expected: this, - actual: other, - }) - } else { - Ok(()) - } - } -} - pub trait IsAddress: IsNetworkAware + Serialize diff --git a/src/profile/v100/app_preferences/app_preferences.rs b/src/profile/v100/app_preferences/app_preferences.rs index f983017ee..70317577c 100644 --- a/src/profile/v100/app_preferences/app_preferences.rs +++ b/src/profile/v100/app_preferences/app_preferences.rs @@ -157,16 +157,8 @@ mod tests { "isCurrencyAmountVisible": true }, "gateways": { - "current": "https://rcnet-v3.radixdlt.com/", + "current": "https://mainnet.radixdlt.com/", "saved": [ - { - "network": { - "name": "zabanet", - "id": 14, - "displayDescription": "RCnet-V3 (Test Network)" - }, - "url": "https://rcnet-v3.radixdlt.com/" - }, { "network": { "name": "mainnet", @@ -187,7 +179,7 @@ mod tests { }, "security": { "isCloudProfileSyncEnabled": true, - "structureConfigurationReferences": [], + "securityStructuresOfFactorSourceIDs": [], "isDeveloperModeEnabled": true }, "transaction": { diff --git a/src/profile/v100/app_preferences/gateways/saved_gateways.rs b/src/profile/v100/app_preferences/gateways/saved_gateways.rs index d76e54efe..f2b5642bb 100644 --- a/src/profile/v100/app_preferences/gateways/saved_gateways.rs +++ b/src/profile/v100/app_preferences/gateways/saved_gateways.rs @@ -119,53 +119,21 @@ impl SavedGateways { } } -impl SavedGateways { - /// Changes the current Gateway to `to`, if it is not already the current. If `to` is - /// not a new Gateway, it will be removed from. Returns `Ok(false)` if `to` was already - /// the `current`, returns `Ok(true)` if `to` was not already `current`. - pub fn change_current(&mut self, to: Gateway) -> Result { - if self.current == to { - return Ok(false); - } - let old_current = &self.current; - let was_inserted = self.append(old_current.clone()); - if !was_inserted { - return Err( - CommonError::GatewaysDiscrepancyOtherShouldNotContainCurrent, - ); - } - self.other.remove_id(&to.id()); - self.current = to; - Ok(true) - } - - /// Appends `gateway` to the `other` list, without changing the `current` Gateway. - /// If `other` already contains `gateway` then `(false, other.len())` is returned. - /// If `other` was new then `(true, index_of_new)` is returned. - /// - /// - Returns: `true` if it was added, `false` if it was already present (noop) - pub fn append(&mut self, gateway: Gateway) -> bool { - self.other.append(gateway).0 - } -} - impl Default for SavedGateways { fn default() -> Self { - Self::new_with_other(Gateway::mainnet(), vec![Gateway::stokenet()]) + Self::new_with_other(Gateway::mainnet(), [Gateway::stokenet()]) .expect("Stokenet and Mainnet should have different NetworkIDs.") } } impl HasSampleValues for SavedGateways { fn sample() -> Self { - let mut gateways = Self::new(Gateway::rcnet()); - gateways.append(Gateway::mainnet()); - gateways.append(Gateway::stokenet()); - gateways + SavedGateways::default() } fn sample_other() -> Self { - SavedGateways::default() + Self::new_with_other(Gateway::stokenet(), [Gateway::mainnet()]) + .expect("Stokenet and Mainnet should have different NetworkIDs.") } } @@ -181,7 +149,7 @@ impl HasSampleValues for Gateways { #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; #[allow(clippy::upper_case_acronyms)] type SUT = SavedGateways; @@ -197,39 +165,27 @@ mod tests { assert_ne!(SUT::sample(), SUT::sample_other()); } - #[test] - fn change_current_to_existing() { - let mut sut = SUT::default(); - assert_eq!(sut.current.network.id, NetworkID::Mainnet); - assert_eq!(sut.change_current(Gateway::stokenet()), Ok(true)); - assert_eq!(sut.current.network.id, NetworkID::Stokenet); - } - #[test] fn append() { let mut sut = SUT::sample(); assert!(!sut.append(Gateway::mainnet())); + assert!(!sut.append(Gateway::stokenet())); assert_eq!(sut, SUT::sample()); assert!(sut.append(Gateway::kisharnet())); - assert_ne!(sut, SUT::sample()); - } - - #[test] - fn new_throw_gateways_discrepancy_other_should_not_contain_current() { assert_eq!( - SUT::new_with_other(Gateway::mainnet(), vec![Gateway::mainnet()]), - Err(CommonError::GatewaysDiscrepancyOtherShouldNotContainCurrent) + sut, + SUT::new_with_other( + Gateway::mainnet(), + [Gateway::stokenet(), Gateway::kisharnet()] + ) + .unwrap() ); } #[test] - fn change_throw_gateways_discrepancy_other_should_not_contain_current() { - let mut impossible = SUT { - current: Gateway::mainnet(), - other: Gateways::from_iter([Gateway::mainnet()]), - }; + fn new_throw_gateways_discrepancy_other_should_not_contain_current() { assert_eq!( - impossible.change_current(Gateway::stokenet()), + SUT::new_with_other(Gateway::mainnet(), vec![Gateway::mainnet()]), Err(CommonError::GatewaysDiscrepancyOtherShouldNotContainCurrent) ); } @@ -238,7 +194,10 @@ mod tests { fn change_current_to_current() { let mut sut = SUT::default(); assert_eq!(sut.current.network.id, NetworkID::Mainnet); - assert_eq!(sut.change_current(Gateway::mainnet()), Ok(false)); + assert_eq!( + sut.change_current(Gateway::mainnet()), + ChangeGatewayOutcome::NoChange + ); assert_eq!(sut.current.network.id, NetworkID::Mainnet); } @@ -253,18 +212,6 @@ mod tests { assert!(!sut.is_empty()); } - #[test] - fn change_current_to_new() { - let mut sut = SUT::default(); - assert_eq!(sut.current.network.id, NetworkID::Mainnet); - assert_eq!(sut.change_current(Gateway::nebunet()), Ok(true)); - assert_eq!(sut.current.network.id, NetworkID::Nebunet); - assert_eq!( - sut.other.items(), - [Gateway::stokenet(), Gateway::mainnet()] - ); - } - #[test] fn json_roundtrip() { let sut = SUT::sample(); @@ -273,17 +220,8 @@ mod tests { &sut, r#" { - "current": "https://rcnet-v3.radixdlt.com/", + "current": "https://mainnet.radixdlt.com/", "saved": [ - { - "network": - { - "name": "zabanet", - "id": 14, - "displayDescription": "RCnet-V3 (Test Network)" - }, - "url": "https://rcnet-v3.radixdlt.com/" - }, { "network": { @@ -355,7 +293,12 @@ mod tests { "#; let sut = serde_json::from_str::(json).unwrap(); - assert_eq!(sut, SUT::sample()); + + let mut expected = SUT::new(Gateway::rcnet()); + expected.append(Gateway::mainnet()); + expected.append(Gateway::stokenet()); + + assert_eq!(sut, expected); } #[test] diff --git a/src/profile/v100/app_preferences/gateways/saved_gateways_uniffi_fn.rs b/src/profile/v100/app_preferences/gateways/saved_gateways_uniffi_fn.rs index 0263d0744..d57116e20 100644 --- a/src/profile/v100/app_preferences/gateways/saved_gateways_uniffi_fn.rs +++ b/src/profile/v100/app_preferences/gateways/saved_gateways_uniffi_fn.rs @@ -38,7 +38,7 @@ pub fn new_saved_gateways_changing_current( gateways: &SavedGateways, ) -> Result { let mut gateways = gateways.clone(); - gateways.change_current(to)?; + let _ = gateways.change_current(to); Ok(gateways) } diff --git a/src/profile/v100/app_preferences/security.rs b/src/profile/v100/app_preferences/security.rs index ca3293430..f26d864d2 100644 --- a/src/profile/v100/app_preferences/security.rs +++ b/src/profile/v100/app_preferences/security.rs @@ -1,17 +1,5 @@ use crate::prelude::*; -// FIXME: MFA this is in fact not used, so ok to be a `bool` for now. The AppPreferences Security type has -// a field `structure_configuration_references` but no client can populate it yet, so the list will always -// be empty, thus save to used a serializable trivial type such as `bool` as a sample for now. -pub type SecurityStructureConfigurationReference = bool; -impl Identifiable for SecurityStructureConfigurationReference { - type ID = Self; - - fn id(&self) -> Self::ID { - *self - } -} - /// Controls e.g. if Profile Snapshot gets synced to iCloud or not, and whether /// developer mode is enabled or not. In future (MFA) we will also save a list of /// MFA security structure configurations. @@ -35,8 +23,11 @@ impl Identifiable for SecurityStructureConfigurationReference { pub struct Security { pub is_cloud_profile_sync_enabled: bool, pub is_developer_mode_enabled: bool, - pub structure_configuration_references: - IdentifiedVecOf, + + #[serde(rename = "securityStructuresOfFactorSourceIDs")] + #[serde(default)] + pub security_structures_of_factor_source_ids: + SecurityStructuresOfFactorSourceIDs, } impl Security { @@ -44,14 +35,12 @@ impl Security { pub fn new( is_cloud_profile_sync_enabled: bool, is_developer_mode_enabled: bool, - structure_configuration_references: IdentifiedVecOf< - SecurityStructureConfigurationReference, - >, + security_structures_of_factor_source_ids: SecurityStructuresOfFactorSourceIDs, ) -> Self { Self { is_cloud_profile_sync_enabled, is_developer_mode_enabled, - structure_configuration_references, + security_structures_of_factor_source_ids, } } } @@ -59,66 +48,303 @@ impl Security { impl Default for Security { /// By default we cloud profile sync is enabled and developer mode is disabled, with an empty `structure_configuration_references` list. fn default() -> Self { - Self::new(true, false, IdentifiedVecOf::new()) + Self::new(true, false, SecurityStructuresOfFactorSourceIDs::new()) } } impl HasSampleValues for Security { /// A sample used to facilitate unit tests. fn sample() -> Self { - Self::new(true, true, IdentifiedVecOf::new()) + Self::new(true, true, SecurityStructuresOfFactorSourceIDs::new()) } /// A sample used to facilitate unit tests. fn sample_other() -> Self { - Self::new(false, false, IdentifiedVecOf::new()) + Self::new(false, false, SecurityStructuresOfFactorSourceIDs::new()) } } #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Security; #[test] fn equality() { - assert_eq!(Security::sample(), Security::sample()); - assert_eq!(Security::sample_other(), Security::sample_other()); + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); } #[test] fn inequality() { - assert_ne!(Security::sample(), Security::sample_other()); + assert_ne!(SUT::sample(), SUT::sample_other()); } #[test] fn default_developer_mode_is_enabled() { - assert!(Security::default().is_cloud_profile_sync_enabled); + assert!(SUT::default().is_cloud_profile_sync_enabled); } #[test] fn default_is_developer_mode_disabled() { - assert!(!Security::default().is_developer_mode_enabled); + assert!(!SUT::default().is_developer_mode_enabled); } #[test] - fn default_structure_configuration_references_is_empty() { - assert!(Security::default() - .structure_configuration_references + fn default_security_structures_of_factor_source_ids_is_empty() { + assert!(SUT::default() + .security_structures_of_factor_source_ids .is_empty()); } #[test] fn json_roundtrip() { - let sut = Security::sample(); + let sut = SUT::sample(); assert_eq_after_json_roundtrip( &sut, r#" { "isCloudProfileSyncEnabled": true, - "structureConfigurationReferences": [], + "securityStructuresOfFactorSourceIDs": [], "isDeveloperModeEnabled": true } "#, ) } + + #[test] + fn json_roundtrip_with_security_structures() { + let mut sut = SUT::sample(); + + sut.security_structures_of_factor_source_ids = + SecurityStructuresOfFactorSourceIDs::sample(); + assert_eq_after_json_roundtrip( + &sut, + r#" + { + "isCloudProfileSyncEnabled": true, + "isDeveloperModeEnabled": true, + "securityStructuresOfFactorSourceIDs": [ + { + "metadata": { + "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", + "displayName": "Spending Account", + "createdOn": "2023-09-11T16:05:56.000Z", + "lastUpdatedOn": "2023-09-11T16:05:56.000Z" + }, + "numberOfEpochsUntilAutoConfirmation": 4032, + "matrixOfFactors": { + "primaryRole": { + "thresholdFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "arculusCard", + "body": "12f36554769cd96614776e6dbd5629825b8e87366eec5e515de32bb1ea153820" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "offDeviceMnemonic", + "body": "820122c9573768ab572b0c9fa492a45b7b451a2740291b3da908ad423d10e410" + } + } + ], + "threshold": 2, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" + } + } + ] + }, + "recoveryRole": { + "thresholdFactors": [ + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank" + } + }, + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx128c4f8dnuvd73d2r3fl95ryfuavw5zjf8zr57hjw0qjagz7s7grace" + } + }, + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx12y0389ew2xn7w02d059hhye6t0mjzqxqyavsetyg2j3p3xqyepjudy" + } + } + ], + "threshold": 2, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" + } + } + ] + }, + "confirmationRole": { + "thresholdFactors": [], + "threshold": 0, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "securityQuestions", + "body": "aabc6041d95785ecfabe7d5ed5af259e20e4e3f5f95b16fdeca386bc75796b46" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" + } + } + ] + } + } + }, + { + "metadata": { + "id": "dededede-dede-dede-dede-dededededede", + "displayName": "Savings Account", + "createdOn": "2023-12-24T17:13:56.123Z", + "lastUpdatedOn": "2023-12-24T17:13:56.123Z" + }, + "numberOfEpochsUntilAutoConfirmation": 8064, + "matrixOfFactors": { + "primaryRole": { + "thresholdFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "5255999c65076ce9ced5a1881f1a621bba1ce3f1f68a61df462d96822a5190cd" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "arculusCard", + "body": "3ac064d4b40f78effe7037a12f3287efc67aa87af7c6a083738eae05e28dadaf" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "offDeviceMnemonic", + "body": "5c308b9c3e41912d4af4c5ff088e84877aac5de01c95f32dedd280d55a6d8262" + } + } + ], + "threshold": 2, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "52ef052a0642a94279b296d6b3b17dedc035a7ae37b76c1d60f11f2725100077" + } + } + ] + }, + "recoveryRole": { + "thresholdFactors": [ + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx1284z0gpg9vnhevn7sytdncszc7ukcrycntg7zjktqvggmwe6ctrudy" + } + }, + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx129uc6rf5vmkj2gau7fgxlsqdg8008nca8yd57sxx4v67dyw7u0scar" + } + }, + { + "discriminator": "fromAddress", + "fromAddress": { + "kind": "trustedContact", + "body": "account_rdx12y7uww27s250g9d3d72ey9wdp5z78zpmq5la0r0wgw4fkf6y8eerdx" + } + } + ], + "threshold": 2, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "52ef052a0642a94279b296d6b3b17dedc035a7ae37b76c1d60f11f2725100077" + } + } + ] + }, + "confirmationRole": { + "thresholdFactors": [], + "threshold": 0, + "overrideFactors": [ + { + "discriminator": "fromHash", + "fromHash": { + "kind": "securityQuestions", + "body": "bb0ac72196f748bba4ddf9c6d87c4e3ea939750e3a207f312653aa25f3f9c060" + } + }, + { + "discriminator": "fromHash", + "fromHash": { + "kind": "ledgerHQHardwareWallet", + "body": "52ef052a0642a94279b296d6b3b17dedc035a7ae37b76c1d60f11f2725100077" + } + } + ] + } + } + } + ] + } + "#, + ) + } + + #[test] + fn json_deserialize_without_security_structures() { + let json = r#" + { + "isCloudProfileSyncEnabled": true, + "isDeveloperModeEnabled": true + } + "#; + + let sut: SUT = serde_json::from_str(json).unwrap(); + assert!(sut.security_structures_of_factor_source_ids.is_empty()) + } } diff --git a/src/profile/v100/entity/abstract_entity_type.rs b/src/profile/v100/entity/abstract_entity_type.rs index 83ae99601..0594d5721 100644 --- a/src/profile/v100/entity/abstract_entity_type.rs +++ b/src/profile/v100/entity/abstract_entity_type.rs @@ -18,7 +18,7 @@ use crate::prelude::*; )] #[repr(u32)] // it is u32 since used in Derivation Paths (CAP26) where each component is a u32. pub enum AbstractEntityType { - /// The entity type used by Accounts created by the Radix Wallet. + /// The entity type used by Accounts. Account, /// The entity type used by Personas. Identity, diff --git a/src/profile/v100/entity/account/account.rs b/src/profile/v100/entity/account/account.rs index f45889d3d..6bc413533 100644 --- a/src/profile/v100/entity/account/account.rs +++ b/src/profile/v100/entity/account/account.rs @@ -176,11 +176,8 @@ impl Account { name: &str, is_hidden: bool, ) -> Self { - let mwp = MnemonicWithPassphrase::sample(); - let bdfs = - DeviceFactorSource::babylon(true, &mwp, WalletClientModel::Iphone); let private_hd_factor_source = - PrivateHierarchicalDeterministicFactorSource::new(mwp, bdfs); + PrivateHierarchicalDeterministicFactorSource::sample(); let account_creating_factor_instance = private_hd_factor_source .derive_entity_creation_factor_instance(network_id, index); @@ -382,7 +379,7 @@ mod tests { let account = SUT::sample(); assert_eq!( format!("{account}"), - "Alice | account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8" + "Alice | account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87" ); } @@ -460,7 +457,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -474,7 +471,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } @@ -493,7 +490,7 @@ mod tests { "depositorsAllowList": [] } }, - "address": "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8" + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87" } "#, ); @@ -514,7 +511,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf" + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" }, "derivationPath": { "scheme": "cap26", @@ -528,7 +525,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } @@ -547,7 +544,7 @@ mod tests { "depositorsAllowList": [] } }, - "address": "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" } "#, ); @@ -568,7 +565,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "18c7409458a82281711b668f833b0485e8fb58a3ceb8a728882bf6b83d3f06a9" + "compressedData": "535e0b74beffc99d96acd36ae73444c0e35ebb5707f077f9bf1120b1bb8894c0" }, "derivationPath": { "scheme": "cap26", @@ -582,7 +579,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } @@ -601,7 +598,7 @@ mod tests { "depositorsAllowList": [] } }, - "address": "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" + "address": "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m" } "#, ); @@ -622,7 +619,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "26b3fd7f65f01ff8e418a56722fde9cc6fc18dc983e0474e6eb6c1cf3bd44f23" + "compressedData": "436c67c678713be6a4306bf2a64d62d29c9bccb92a776175e5cb6e95e87be55d" }, "derivationPath": { "scheme": "cap26", @@ -636,7 +633,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } @@ -655,7 +652,7 @@ mod tests { "depositorsAllowList": [] } }, - "address": "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "address": "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" } "#, ); diff --git a/src/profile/v100/entity/persona/persona.rs b/src/profile/v100/entity/persona/persona.rs index 3b1d7d3e7..6f05b0c98 100644 --- a/src/profile/v100/entity/persona/persona.rs +++ b/src/profile/v100/entity/persona/persona.rs @@ -117,8 +117,7 @@ impl Persona { E: IntoIterator, { let mwp = MnemonicWithPassphrase::sample(); - let bdfs = - DeviceFactorSource::babylon(true, &mwp, WalletClientModel::Iphone); + let bdfs = DeviceFactorSource::babylon(true, &mwp, &HostInfo::sample()); let private_hd_factor_source = PrivateHierarchicalDeterministicFactorSource::new(mwp, bdfs); @@ -459,7 +458,7 @@ mod tests { #[test] fn new_with_identity_and_name() { let identity_address: IdentityAddress = - "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62" + "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw" .parse() .unwrap(); let persona = SUT::sample_mainnet_other(); @@ -471,7 +470,7 @@ mod tests { let account = SUT::sample_mainnet_other(); assert_eq!( format!("{account}"), - "Batman | identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62" + "Batman | identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw" ); } @@ -479,7 +478,7 @@ mod tests { fn identifiable() { let persona = SUT::sample_mainnet_other(); let identity_address: IdentityAddress = - "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62" + "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw" .parse() .unwrap(); assert_eq!(persona.id(), identity_address); @@ -493,7 +492,7 @@ mod tests { r#" { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "Satoshi", "securityState": { "discriminator": "unsecured", @@ -503,7 +502,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -513,7 +512,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", @@ -570,7 +569,7 @@ mod tests { r#" { "networkID": 1, - "address": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "address": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "displayName": "Batman", "securityState": { "discriminator": "unsecured", @@ -580,7 +579,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -590,7 +589,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "1fe80badc0520334ee339e4010491d417ca3aed0c9621698b10655529f0ee506" + "compressedData": "675aa54df762f24df8f6b38122e75058a18fe55a3dbb030b4c0bb504bacc7e81" }, "derivationPath": { "scheme": "cap26", @@ -639,7 +638,7 @@ mod tests { r#" { "networkID": 2, - "address": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "address": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "displayName": "Skywalker", "securityState": { "discriminator": "unsecured", @@ -649,7 +648,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -659,7 +658,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "3c4d6f1267485854313c1ed81aea193b8f750cd081e3aa4dea29b93c34ca2261" + "compressedData": "d3dd2992834813ba76d6619021560b759e81f7391a5cdbb8478feb3bfa8cb9e4" }, "derivationPath": { "scheme": "cap26", @@ -708,7 +707,7 @@ mod tests { r#" { "networkID": 2, - "address": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "address": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "displayName": "Granger", "securityState": { "discriminator": "unsecured", @@ -718,7 +717,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -728,7 +727,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "b6885032393165d56cce19850c2a3dbb80733d21c78c7314223e9c3a75f64c8d" + "compressedData": "c287e135eac194e4d6b6c65a2545988686b941509043bab026ef9717fd6b4f4e" }, "derivationPath": { "scheme": "cap26", @@ -775,7 +774,7 @@ mod tests { r#" { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "No Flags", "securityState": { "discriminator": "unsecured", @@ -785,7 +784,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -795,7 +794,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", diff --git a/src/profile/v100/entity/persona/persona_data/entry_kinds/persona_data_entry_email_address.rs b/src/profile/v100/entity/persona/persona_data/entry_kinds/persona_data_entry_email_address.rs index 19cbd9345..09290b807 100644 --- a/src/profile/v100/entity/persona/persona_data/entry_kinds/persona_data_entry_email_address.rs +++ b/src/profile/v100/entity/persona/persona_data/entry_kinds/persona_data_entry_email_address.rs @@ -1,130 +1,3 @@ use crate::prelude::*; -/// A persons email address they have chosen to associated with a Persona, e.g. -/// `satoshi@btc.org`. -/// -/// Current implementation does not validate the email address other than it -/// cannot be empty (in the future we might add some simple validation). -#[derive( - Serialize, - Deserialize, - Clone, - PartialEq, - Hash, - Eq, - derive_more::Display, - derive_more::Debug, - uniffi::Record, -)] -#[display("{email}")] -#[debug("{email}")] -#[serde(transparent)] -pub struct PersonaDataEntryEmailAddress { - pub email: String, -} - -impl Identifiable for PersonaDataEntryEmailAddress { - type ID = String; - - fn id(&self) -> Self::ID { - self.email.clone() - } -} - -impl FromStr for PersonaDataEntryEmailAddress { - type Err = CommonError; - - fn from_str(s: &str) -> Result { - Self::new(s) - } -} - -impl PersonaDataEntryEmailAddress { - pub fn new(email: impl AsRef) -> Result { - let email = email.as_ref().to_owned(); - if email.is_empty() { - return Err(CommonError::PersonaDataInvalidEmailAddressEmpty); - } - Ok(Self { email }) - } -} - -impl HasSampleValues for PersonaDataEntryEmailAddress { - fn sample() -> Self { - Self::new("alan@turing.hero").expect("Valid sample.") - } - - fn sample_other() -> Self { - Self::new("satoshi@nakamoto.btc").expect("Valid sample.") - } -} - -#[cfg(test)] -mod tests { - use crate::prelude::*; - - #[test] - fn equality() { - assert_eq!( - PersonaDataEntryEmailAddress::sample(), - PersonaDataEntryEmailAddress::sample() - ); - assert_eq!( - PersonaDataEntryEmailAddress::sample_other(), - PersonaDataEntryEmailAddress::sample_other() - ); - } - - #[test] - fn inequality() { - assert_ne!( - PersonaDataEntryEmailAddress::sample(), - PersonaDataEntryEmailAddress::sample_other() - ); - } - - #[test] - fn invalid_empty() { - assert_eq!( - PersonaDataEntryEmailAddress::new(""), - Err(CommonError::PersonaDataInvalidEmailAddressEmpty) - ); - } - - #[test] - fn json_roundtrip_sample() { - let model = PersonaDataEntryEmailAddress::sample(); - assert_json_value_eq_after_roundtrip(&model, json!("alan@turing.hero")); - } - - #[test] - fn id_is_email() { - assert_eq!( - PersonaDataEntryEmailAddress::sample().id(), - PersonaDataEntryEmailAddress::sample().email - ); - } - - #[test] - fn new_from_string() { - assert_eq!( - PersonaDataEntryEmailAddress::new("alan@turing.hero").unwrap(), - PersonaDataEntryEmailAddress::sample() - ); - } - - #[test] - fn new_from_str() { - assert_eq!( - PersonaDataEntryEmailAddress::new("alan@turing.hero").unwrap(), - PersonaDataEntryEmailAddress::sample() - ); - } - - #[test] - fn new_with_fromstr() { - let email: PersonaDataEntryEmailAddress = - "alan@turing.hero".parse().unwrap(); - assert_eq!(email, PersonaDataEntryEmailAddress::sample()); - } -} +pub type PersonaDataEntryEmailAddress = EmailAddress; diff --git a/src/profile/v100/entity/persona/persona_data/persona_data_identified_collection_types.rs b/src/profile/v100/entity/persona/persona_data/persona_data_identified_collection_types.rs index ab02ece40..401c49a33 100644 --- a/src/profile/v100/entity/persona/persona_data/persona_data_identified_collection_types.rs +++ b/src/profile/v100/entity/persona/persona_data/persona_data_identified_collection_types.rs @@ -62,10 +62,10 @@ macro_rules! declare_collection_of_identified_entry { } } - impl<'a> IntoIterator for &'a $struct_name { + impl IntoIterator for $struct_name { type Item = $id_ent_type; type IntoIter = - IdentifiedVecOfIterator<'a, $id_ent_type>; + OwnedIdentifiedVecOfIterator<$id_ent_type>; fn into_iter(self) -> Self::IntoIter { self.collection.into_iter() diff --git a/src/profile/v100/entity_security_state/entity_security_state.rs b/src/profile/v100/entity_security_state/entity_security_state.rs index c6c727671..6c18426f6 100644 --- a/src/profile/v100/entity_security_state/entity_security_state.rs +++ b/src/profile/v100/entity_security_state/entity_security_state.rs @@ -110,7 +110,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -124,7 +124,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } diff --git a/src/profile/v100/entity_security_state/unsecured_entity_control.rs b/src/profile/v100/entity_security_state/unsecured_entity_control.rs index b27d2ae0b..aa1125a6f 100644 --- a/src/profile/v100/entity_security_state/unsecured_entity_control.rs +++ b/src/profile/v100/entity_security_state/unsecured_entity_control.rs @@ -128,7 +128,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -142,7 +142,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } diff --git a/src/profile/v100/factors/factor_instance/badge_virtual_source.rs b/src/profile/v100/factors/factor_instance/badge_virtual_source.rs index 2de76332c..22c099f9e 100644 --- a/src/profile/v100/factors/factor_instance/badge_virtual_source.rs +++ b/src/profile/v100/factors/factor_instance/badge_virtual_source.rs @@ -117,7 +117,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", diff --git a/src/profile/v100/factors/factor_instance/factor_instance.rs b/src/profile/v100/factors/factor_instance/factor_instance.rs index 43a8bc4ef..a7af5ecae 100644 --- a/src/profile/v100/factors/factor_instance/factor_instance.rs +++ b/src/profile/v100/factors/factor_instance/factor_instance.rs @@ -88,7 +88,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -102,7 +102,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } diff --git a/src/profile/v100/factors/factor_instance/factor_instance_badge.rs b/src/profile/v100/factors/factor_instance/factor_instance_badge.rs index d5a139129..f8579a507 100644 --- a/src/profile/v100/factors/factor_instance/factor_instance_badge.rs +++ b/src/profile/v100/factors/factor_instance/factor_instance_badge.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -/// Either a "physical" badge (NFT) or some source for recreation of a producer +/// Either a "physical" badge (resource) or some source for recreation of a producer /// of a virtual badge (signature), e.g. a HD derivation path, from which a private key /// is derived which produces virtual badges (signatures). #[derive( @@ -20,22 +20,45 @@ pub enum FactorInstanceBadge { #[serde(rename = "virtualSource")] value: FactorInstanceBadgeVirtualSource, }, + Physical { + value: ResourceAddress, + }, } impl HasSampleValues for FactorInstanceBadge { /// A sample used to facilitate unit tests. fn sample() -> Self { - FactorInstanceBadge::Virtual { + Self::sample_virtual() + } + + /// A sample used to facilitate unit tests. + fn sample_other() -> Self { + Self::sample_physical() + } +} + +impl FactorInstanceBadge { + /// A sample used to facilitate unit tests. + fn sample_virtual() -> Self { + Self::Virtual { value: FactorInstanceBadgeVirtualSource::sample(), } } + #[allow(unused)] /// A sample used to facilitate unit tests. - fn sample_other() -> Self { - FactorInstanceBadge::Virtual { + fn sample_virtual_other() -> Self { + Self::Virtual { value: FactorInstanceBadgeVirtualSource::sample_other(), } } + + /// A sample used to facilitate unit tests. + fn sample_physical() -> Self { + Self::Physical { + value: ResourceAddress::sample(), + } + } } impl From for FactorInstanceBadge { @@ -52,6 +75,36 @@ impl From for FactorInstanceBadge { } } +impl From for FactorInstanceBadge { + fn from(value: ResourceAddress) -> Self { + Self::Physical { value } + } +} + +impl From for ScryptoResourceOrNonFungible { + fn from(value: FactorInstanceBadge) -> Self { + match value { + FactorInstanceBadge::Virtual { + value: + FactorInstanceBadgeVirtualSource::HierarchicalDeterministic { + value, + }, + } => ScryptoResourceOrNonFungible::NonFungible( + ScryptoNonFungibleGlobalId::from_public_key( + &ScryptoPublicKey::from(value.public_key), + ), + ), + FactorInstanceBadge::Physical { value } => { + ScryptoResourceOrNonFungible::Resource( + ScryptoResourceAddress::new_or_panic( + value.secret_magic.node_id().0, + ), + ) + } + } + } +} + impl<'de> Deserialize<'de> for FactorInstanceBadge { #[cfg(not(tarpaulin_include))] // false negative fn deserialize>( @@ -76,11 +129,16 @@ impl Serialize for FactorInstanceBadge { let mut state = serializer.serialize_struct("FactorInstanceBadge", 2)?; match self { - FactorInstanceBadge::Virtual { value } => { + Self::Virtual { value } => { let discriminant = "virtualSource"; state.serialize_field("discriminator", discriminant)?; state.serialize_field(discriminant, value)?; } + Self::Physical { value } => { + let discriminant = "physical"; + state.serialize_field("discriminator", discriminant)?; + state.serialize_field(discriminant, value)?; + } } state.end() } @@ -121,7 +179,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -163,4 +221,32 @@ mod tests { } ) } + + #[test] + fn a_correct_resource_or_non_fungible_is_derived_from_a_physical_factor_instance_badge( + ) { + let sut = FactorInstanceBadge::sample_physical(); + let resource_or_non_fungible = ScryptoResourceOrNonFungible::from(sut); + assert_eq!( + resource_or_non_fungible, + ScryptoResourceOrNonFungible::Resource(XRD) + ); + } + + #[test] + fn a_correct_resource_or_non_fungible_is_derived_from_a_virtual_factor_instance_badge( + ) { + let sut = FactorInstanceBadge::sample_virtual(); + let resource_or_non_fungible = ScryptoResourceOrNonFungible::from(sut); + assert_eq!( + resource_or_non_fungible, + ScryptoResourceOrNonFungible::NonFungible( + ScryptoNonFungibleGlobalId::from_public_key( + &ScryptoPublicKey::from( + HierarchicalDeterministicPublicKey::sample().public_key + ) + ) + ) + ); + } } diff --git a/src/profile/v100/factors/factor_instance/private_hierarchical_deterministic_factor_instance.rs b/src/profile/v100/factors/factor_instance/private_hierarchical_deterministic_factor_instance.rs index 3a497937e..262a4d507 100644 --- a/src/profile/v100/factors/factor_instance/private_hierarchical_deterministic_factor_instance.rs +++ b/src/profile/v100/factors/factor_instance/private_hierarchical_deterministic_factor_instance.rs @@ -92,7 +92,7 @@ mod tests { ); assert_eq!( sut.private_key.private_key.to_hex(), - "cf52dbc7bb2663223e99fb31799281b813b939440a372d0aa92eb5f5b8516003" + "88ec4649da764965f862510dbe53d551a3fc2da49e1ef1f383d9d17006773bee" ); } diff --git a/src/profile/v100/factors/factor_source.rs b/src/profile/v100/factors/factor_source.rs index d9c184014..48a76ac5d 100644 --- a/src/profile/v100/factors/factor_source.rs +++ b/src/profile/v100/factors/factor_source.rs @@ -25,13 +25,68 @@ pub enum FactorSource { #[display("LedgerHWFS({value})")] value: LedgerHardwareWalletFactorSource, }, + + OffDeviceMnemonic { + #[serde(rename = "offDeviceMnemonic")] + #[display("OffDevice({value})")] + value: OffDeviceMnemonicFactorSource, + }, + + ArculusCard { + #[serde(rename = "arculusCard")] + #[display("ArculusCard({value})")] + value: ArculusCardFactorSource, + }, + + SecurityQuestions { + #[serde(rename = "securityQuestions")] + #[display("SecurityQuestions({value})")] + value: SecurityQuestions_NOT_PRODUCTION_READY_FactorSource, + }, + + TrustedContact { + #[serde(rename = "trustedContact")] + #[display("TrustedContact({value})")] + value: TrustedContactFactorSource, + }, } impl BaseIsFactorSource for FactorSource { + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + match self { + FactorSource::Device { value } => { + value.set_common_properties(updated) + } + FactorSource::Ledger { value } => { + value.set_common_properties(updated) + } + FactorSource::SecurityQuestions { value } => { + value.set_common_properties(updated) + } + FactorSource::ArculusCard { value } => { + value.set_common_properties(updated) + } + FactorSource::OffDeviceMnemonic { value } => { + value.set_common_properties(updated) + } + FactorSource::TrustedContact { value } => { + value.set_common_properties(updated) + } + } + } + fn common_properties(&self) -> FactorSourceCommon { match self { FactorSource::Device { value } => value.common_properties(), FactorSource::Ledger { value } => value.common_properties(), + FactorSource::SecurityQuestions { value } => { + value.common_properties() + } + FactorSource::ArculusCard { value } => value.common_properties(), + FactorSource::OffDeviceMnemonic { value } => { + value.common_properties() + } + FactorSource::TrustedContact { value } => value.common_properties(), } } @@ -39,6 +94,16 @@ impl BaseIsFactorSource for FactorSource { match self { FactorSource::Device { value } => value.factor_source_kind(), FactorSource::Ledger { value } => value.factor_source_kind(), + FactorSource::SecurityQuestions { value } => { + value.factor_source_kind() + } + FactorSource::ArculusCard { value } => value.factor_source_kind(), + FactorSource::OffDeviceMnemonic { value } => { + value.factor_source_kind() + } + FactorSource::TrustedContact { value } => { + value.factor_source_kind() + } } } @@ -46,6 +111,14 @@ impl BaseIsFactorSource for FactorSource { match self { FactorSource::Device { value } => value.factor_source_id(), FactorSource::Ledger { value } => value.factor_source_id(), + FactorSource::SecurityQuestions { value } => { + value.factor_source_id() + } + FactorSource::ArculusCard { value } => value.factor_source_id(), + FactorSource::OffDeviceMnemonic { value } => { + value.factor_source_id() + } + FactorSource::TrustedContact { value } => value.factor_source_id(), } } } @@ -70,6 +143,16 @@ impl From for FactorSource { } } +impl FactorSource { + pub fn is_main_bdfs(&self) -> bool { + if let Some(dfs) = self.as_device() { + dfs.is_main_bdfs() + } else { + false + } + } +} + impl<'de> Deserialize<'de> for FactorSource { #[cfg(not(tarpaulin_include))] // false negative fn deserialize>( @@ -95,15 +178,35 @@ impl Serialize for FactorSource { let mut state = serializer.serialize_struct("FactorSource", 2)?; let discriminator_key = "discriminator"; match self { - FactorSource::Device { value: device } => { + FactorSource::Device { value } => { let discriminant = "device"; state.serialize_field(discriminator_key, discriminant)?; - state.serialize_field(discriminant, device)?; + state.serialize_field(discriminant, value)?; } - FactorSource::Ledger { value: ledger } => { + FactorSource::Ledger { value } => { let discriminant = "ledgerHQHardwareWallet"; state.serialize_field(discriminator_key, discriminant)?; - state.serialize_field(discriminant, ledger)?; + state.serialize_field(discriminant, value)?; + } + FactorSource::ArculusCard { value } => { + let discriminant = "arculusCard"; + state.serialize_field(discriminator_key, discriminant)?; + state.serialize_field(discriminant, value)?; + } + FactorSource::OffDeviceMnemonic { value } => { + let discriminant = "offDeviceMnemonic"; + state.serialize_field(discriminator_key, discriminant)?; + state.serialize_field(discriminant, value)?; + } + FactorSource::SecurityQuestions { value } => { + let discriminant = "securityQuestions"; + state.serialize_field(discriminator_key, discriminant)?; + state.serialize_field(discriminant, value)?; + } + FactorSource::TrustedContact { value } => { + let discriminant = "trustedContact"; + state.serialize_field(discriminator_key, discriminant)?; + state.serialize_field(discriminant, value)?; } } state.end() @@ -119,28 +222,95 @@ impl HasSampleValues for FactorSource { Self::sample_ledger() } } - +impl FactorSources { + pub fn sample_values_all() -> Self { + Self::from_iter(FactorSource::sample_values_all()) + } +} impl FactorSource { + pub fn sample_values_all() -> Vec { + vec![ + Self::sample_device_babylon(), + Self::sample_device_babylon_other(), + Self::sample_device_olympia(), + Self::sample_ledger(), + Self::sample_ledger_other(), + Self::sample_arculus(), + Self::sample_arculus_other(), + Self::sample_off_device(), + Self::sample_off_device_other(), + Self::sample_trusted_contact_frank(), + Self::sample_trusted_contact_grace(), + Self::sample_trusted_contact_judy(), + Self::sample_trusted_contact_oscar(), + Self::sample_trusted_contact_trudy(), + Self::sample_trusted_contact_radix(), + Self::sample_security_questions(), + Self::sample_security_questions_other(), + ] + } pub fn sample_device() -> Self { Self::sample_device_babylon() } pub fn sample_device_babylon() -> Self { - Self::Device { - value: DeviceFactorSource::sample_babylon(), - } + Self::from(DeviceFactorSource::sample_babylon()) } + pub fn sample_device_babylon_other() -> Self { + Self::from(DeviceFactorSource::sample_babylon_other()) + } pub fn sample_device_olympia() -> Self { - Self::Device { - value: DeviceFactorSource::sample_olympia(), - } + Self::from(DeviceFactorSource::sample_olympia()) } pub fn sample_ledger() -> Self { - Self::Ledger { - value: LedgerHardwareWalletFactorSource::sample(), - } + Self::from(LedgerHardwareWalletFactorSource::sample()) + } + pub fn sample_ledger_other() -> Self { + Self::from(LedgerHardwareWalletFactorSource::sample_other()) + } + + pub fn sample_arculus() -> Self { + Self::from(ArculusCardFactorSource::sample()) + } + pub fn sample_arculus_other() -> Self { + Self::from(ArculusCardFactorSource::sample_other()) + } + + pub fn sample_off_device() -> Self { + Self::from(OffDeviceMnemonicFactorSource::sample()) + } + pub fn sample_off_device_other() -> Self { + Self::from(OffDeviceMnemonicFactorSource::sample_other()) + } + + pub fn sample_trusted_contact_frank() -> Self { + Self::from(TrustedContactFactorSource::sample_frank()) + } + pub fn sample_trusted_contact_grace() -> Self { + Self::from(TrustedContactFactorSource::sample_grace()) + } + pub fn sample_trusted_contact_judy() -> Self { + Self::from(TrustedContactFactorSource::sample_judy()) + } + pub fn sample_trusted_contact_oscar() -> Self { + Self::from(TrustedContactFactorSource::sample_oscar()) + } + pub fn sample_trusted_contact_trudy() -> Self { + Self::from(TrustedContactFactorSource::sample_trudy()) + } + pub fn sample_trusted_contact_radix() -> Self { + Self::from(TrustedContactFactorSource::sample_radix()) + } + + pub fn sample_security_questions() -> Self { + Self::from(SecurityQuestions_NOT_PRODUCTION_READY_FactorSource::sample()) + } + pub fn sample_security_questions_other() -> Self { + Self::from( + SecurityQuestions_NOT_PRODUCTION_READY_FactorSource::sample_other(), + ) } } @@ -199,6 +369,19 @@ mod tests { ); } + #[test] + fn get_set_common() { + let test = |sut: SUT| { + let mut sut = sut; + let mut common = sut.common_properties(); + let new_date = Timestamp::now_utc(); + common.last_used_on = new_date; + sut.set_common_properties(common); + assert_eq!(sut.common_properties().last_used_on, new_date); + }; + FactorSource::sample_values_all().into_iter().for_each(test); + } + #[test] fn factor_source_kind_ledger() { assert_eq!( @@ -207,6 +390,38 @@ mod tests { ); } + #[test] + fn factor_source_kind_security_questions() { + assert_eq!( + SUT::sample_security_questions().factor_source_kind(), + FactorSourceKind::SecurityQuestions + ); + } + + #[test] + fn factor_source_kind_arculus_card() { + assert_eq!( + SUT::sample_arculus().factor_source_kind(), + FactorSourceKind::ArculusCard + ); + } + + #[test] + fn factor_source_kind_off_device_mnemonic() { + assert_eq!( + SUT::sample_off_device().factor_source_kind(), + FactorSourceKind::OffDeviceMnemonic + ); + } + + #[test] + fn factor_source_kind_trusted_contact() { + assert_eq!( + SUT::sample_trusted_contact_frank().factor_source_kind(), + FactorSourceKind::TrustedContact + ); + } + #[test] fn into_from_device() { let factor_source: SUT = DeviceFactorSource::sample().into(); @@ -241,7 +456,7 @@ mod tests { "device": { "id": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "common": { "flags": ["main"], @@ -253,8 +468,49 @@ mod tests { "lastUsedOn": "2023-09-11T16:05:56.000Z" }, "hint": { - "name": "Unknown Name", - "model": "iPhone", + "name": "My precious", + "model": "iPhone SE 2nd gen", + "mnemonicWordCount": 24, + "systemVersion": "iOS 17.4.1", + "hostAppVersion": "1.6.4", + "hostVendor": "Apple" + } + } + } + "#, + ) + } + + #[test] + fn json_roundtrip_device_without_host_info() { + let mut device = DeviceFactorSource::sample_babylon(); + device.hint.system_version = None; + device.hint.host_app_version = None; + device.hint.host_vendor = None; + let model = FactorSource::from(device); + + assert_eq_after_json_roundtrip( + &model, + r#" + { + "discriminator": "device", + "device": { + "id": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + }, + "common": { + "flags": ["main"], + "addedOn": "2023-09-11T16:05:56.000Z", + "cryptoParameters": { + "supportedCurves": ["curve25519"], + "supportedDerivationPathSchemes": ["cap26"] + }, + "lastUsedOn": "2023-09-11T16:05:56.000Z" + }, + "hint": { + "name": "My precious", + "model": "iPhone SE 2nd gen", "mnemonicWordCount": 24 } } @@ -274,7 +530,7 @@ mod tests { "ledgerHQHardwareWallet": { "id": { "kind": "ledgerHQHardwareWallet", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" }, "common": { "addedOn": "2023-09-11T16:05:56.000Z", @@ -282,7 +538,7 @@ mod tests { "supportedCurves": ["curve25519"], "supportedDerivationPathSchemes": ["cap26"] }, - "flags": ["main"], + "flags": [], "lastUsedOn": "2023-09-11T16:05:56.000Z" }, "hint": { diff --git a/src/profile/v100/factors/factor_source_common.rs b/src/profile/v100/factors/factor_source_common.rs index c68be852e..080e1dd8f 100644 --- a/src/profile/v100/factors/factor_source_common.rs +++ b/src/profile/v100/factors/factor_source_common.rs @@ -19,11 +19,11 @@ impl Identifiable for FactorSourceFlag { pub struct FactorSourceCommon { /// Cryptographic parameters a certain FactorSource supports, e.g. Elliptic Curves. /// - /// Has interior mutability since Radix Wallet App version 1.3.0, it is - /// possible to add crypto parameters to a FactorSource, e.g. when a user - /// with a DeviceFactorSource with babylon crypto parameters, lets call it `B`, - /// with mnemonic `M` adds `M` again but as an "Olympia" factor source, then - /// the olympia crypto parameters are added to `B`. + /// Since Radix Wallet App version 1.3.0, it is possible to add crypto + /// parameters to a FactorSource, e.g. when a user with a DeviceFactorSource + /// with babylon crypto parameters, lets call it `B`, with mnemonic `M` adds + /// `M` again but as an "Olympia" factor source, then the olympia crypto + /// parameters are added to `B`. pub crypto_parameters: FactorSourceCryptoParameters, /// When this factor source for originally added by the user. @@ -73,6 +73,10 @@ impl FactorSourceCommon { Self::new(FactorSourceCryptoParameters::olympia(), Vec::new()) } + pub fn new_babylon() -> Self { + Self::new(FactorSourceCryptoParameters::babylon(), Vec::new()) + } + pub fn new_bdfs(is_main: bool) -> Self { Self::new( FactorSourceCryptoParameters::babylon(), @@ -179,26 +183,6 @@ mod tests { assert!(FactorSourceCommon::new_main_bdfs().is_main_bdfs()); } - #[test] - fn new_uses_now_as_date() { - let date0 = now(); - let model = FactorSourceCommon::new( - FactorSourceCryptoParameters::default(), - [], - ); - let mut date1 = now(); - for _ in 0..10 { - // rust is too fast... lol. - date1 = now(); - } - let do_test = |d: Timestamp| { - assert!(d > date0); - assert!(d < date1); - }; - do_test(model.added_on); - do_test(model.last_used_on); - } - #[test] fn json_roundtrip() { let date = Timestamp::parse("2023-09-11T16:05:56.000Z").unwrap(); diff --git a/src/profile/v100/factors/factor_source_common_uniffi_fn.rs b/src/profile/v100/factors/factor_source_common_uniffi_fn.rs new file mode 100644 index 000000000..0d951740d --- /dev/null +++ b/src/profile/v100/factors/factor_source_common_uniffi_fn.rs @@ -0,0 +1,61 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_factor_source_common_sample() -> FactorSourceCommon { + FactorSourceCommon::sample() +} + +#[uniffi::export] +pub fn new_factor_source_common_sample_other() -> FactorSourceCommon { + FactorSourceCommon::sample_other() +} + +#[uniffi::export] +pub fn new_factor_source_common_olympia() -> FactorSourceCommon { + FactorSourceCommon::new_olympia() +} + +#[uniffi::export] +pub fn new_factor_source_common_babylon() -> FactorSourceCommon { + FactorSourceCommon::new_babylon() +} + +#[uniffi::export] +pub fn new_factor_source_common_bdfs(is_main: bool) -> FactorSourceCommon { + FactorSourceCommon::new_bdfs(is_main) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = FactorSourceCommon; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_factor_source_common_sample(), + new_factor_source_common_sample_other(), + // duplicates should get removed + new_factor_source_common_sample(), + new_factor_source_common_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn inequality_of_presets() { + assert_ne!( + new_factor_source_common_babylon(), + new_factor_source_common_olympia() + ); + assert_ne!( + new_factor_source_common_bdfs(false), + new_factor_source_common_olympia() + ); + } +} diff --git a/src/profile/v100/factors/factor_source_id.rs b/src/profile/v100/factors/factor_source_id.rs index 97cbbb110..f9e65693d 100644 --- a/src/profile/v100/factors/factor_source_id.rs +++ b/src/profile/v100/factors/factor_source_id.rs @@ -9,6 +9,7 @@ use crate::prelude::*; Deserialize, EnumAsInner, Clone, + Copy, Debug, PartialEq, Eq, @@ -127,7 +128,7 @@ mod tests { { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator" : "fromHash" } @@ -146,7 +147,7 @@ mod tests { { "fromAddress": { "kind": "trustedContact", - "body": "account_rdx128y6j78mt0aqv6372evz28hrxp8mn06ccddkr7xppc88hyvynvjdwr" + "body": "account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank" }, "discriminator" : "fromAddress" } @@ -171,7 +172,7 @@ mod tests { #[test] fn address_into_as_roundtrip() { let from_address = FactorSourceIDFromAddress::sample(); - let id: FactorSourceID = from_address.clone().into(); // test `into()` + let id: FactorSourceID = from_address.into(); // test `into()` assert_eq!(id.as_address().unwrap(), &from_address); } diff --git a/src/profile/v100/factors/factor_source_id_from_address.rs b/src/profile/v100/factors/factor_source_id_from_address.rs index 7ee7ebf1c..6ca248ef8 100644 --- a/src/profile/v100/factors/factor_source_id_from_address.rs +++ b/src/profile/v100/factors/factor_source_id_from_address.rs @@ -5,6 +5,7 @@ use crate::prelude::*; Serialize, Deserialize, Clone, + Copy, PartialEq, Eq, Hash, @@ -29,24 +30,49 @@ impl FactorSourceIDFromAddress { } } +impl FactorSourceIDFromAddress { + pub fn new_for_trusted_contact(address: AccountAddress) -> Self { + Self::new(FactorSourceKind::TrustedContact, address) + } +} + impl FactorSourceIDFromAddress { pub fn to_canonical_string(&self) -> String { format!("{}:{}", self.kind.discriminant(), self.body) } } +impl FactorSourceIDFromAddress { + /// A sample used to facilitate unit tests. + pub fn sample_trusted_contact_friend_frank() -> Self { + Self::new_for_trusted_contact(AccountAddress::sample_frank()) + } + + /// A sample used to facilitate unit tests. + pub fn sample_trusted_contact_friend_judy() -> Self { + Self::new_for_trusted_contact(AccountAddress::sample_judy()) + } + + /// A sample used to facilitate unit tests. + pub fn sample_trusted_contact_friend_oscar() -> Self { + Self::new_for_trusted_contact(AccountAddress::sample_oscar()) + } + + /// A sample used to facilitate unit tests. + pub fn sample_trusted_entity_radix() -> Self { + Self::new_for_trusted_contact(AccountAddress::sample_radix()) + } +} + impl HasSampleValues for FactorSourceIDFromAddress { /// A sample used to facilitate unit tests. fn sample() -> Self { - Self::new(FactorSourceKind::TrustedContact, AccountAddress::sample()) + Self::sample_trusted_contact_friend_frank() } /// A sample used to facilitate unit tests. fn sample_other() -> Self { - Self::new( - FactorSourceKind::TrustedContact, - AccountAddress::sample_other(), - ) + Self::sample_trusted_contact_friend_oscar() } } @@ -78,7 +104,7 @@ mod tests { fn display() { assert_eq!( format!("{}", FactorSourceIDFromAddress::sample()), - "trustedContact:account_rdx128y6j78mt0aqv6372evz28hrxp8mn06ccddkr7xppc88hyvynvjdwr" + "trustedContact:account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank" ); } @@ -86,7 +112,7 @@ mod tests { fn debug() { assert_eq!( format!("{:?}", FactorSourceIDFromAddress::sample()), - "trustedContact:account_rdx128y6j78mt0aqv6372evz28hrxp8mn06ccddkr7xppc88hyvynvjdwr" + "trustedContact:account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank" ); } @@ -99,7 +125,7 @@ mod tests { r#" { "kind": "trustedContact", - "body": "account_rdx128y6j78mt0aqv6372evz28hrxp8mn06ccddkr7xppc88hyvynvjdwr" + "body": "account_rdx1298d59ae3k94htjzpy2z6mx4436h98e5u4qpnwhek8lukv7lkfrank" } "#, ); diff --git a/src/profile/v100/factors/factor_source_id_from_hash.rs b/src/profile/v100/factors/factor_source_id_from_hash.rs index fec9393f7..ff5dc83d6 100644 --- a/src/profile/v100/factors/factor_source_id_from_hash.rs +++ b/src/profile/v100/factors/factor_source_id_from_hash.rs @@ -53,6 +53,42 @@ impl FactorSourceIDFromHash { mnemonic_with_passphrase, ) } + + pub fn new_for_ledger( + mnemonic_with_passphrase: &MnemonicWithPassphrase, + ) -> Self { + Self::from_mnemonic_with_passphrase( + FactorSourceKind::LedgerHQHardwareWallet, + mnemonic_with_passphrase, + ) + } + + pub fn new_for_security_questions( + mnemonic_with_passphrase: &MnemonicWithPassphrase, + ) -> Self { + Self::from_mnemonic_with_passphrase( + FactorSourceKind::SecurityQuestions, + mnemonic_with_passphrase, + ) + } + + pub fn new_for_arculus( + mnemonic_with_passphrase: &MnemonicWithPassphrase, + ) -> Self { + Self::from_mnemonic_with_passphrase( + FactorSourceKind::ArculusCard, + mnemonic_with_passphrase, + ) + } + + pub fn new_for_off_device( + mnemonic_with_passphrase: &MnemonicWithPassphrase, + ) -> Self { + Self::from_mnemonic_with_passphrase( + FactorSourceKind::OffDeviceMnemonic, + mnemonic_with_passphrase, + ) + } } impl FactorSourceIDFromHash { @@ -76,76 +112,59 @@ impl HasSampleValues for FactorSourceIDFromHash { impl FactorSourceIDFromHash { /// A sample used to facilitate unit tests. pub fn sample_device() -> Self { - Self::new_for_device(&MnemonicWithPassphrase::sample()) + DeviceFactorSource::sample().id } /// A sample used to facilitate unit tests. pub fn sample_ledger() -> Self { - Self::from_mnemonic_with_passphrase( - FactorSourceKind::LedgerHQHardwareWallet, - &MnemonicWithPassphrase::sample(), - ) - } - - /// A sample used to facilitate unit tests. - pub fn sample_ledger_other() -> Self { - Self::from_mnemonic_with_passphrase( - FactorSourceKind::LedgerHQHardwareWallet, - &MnemonicWithPassphrase::sample_other(), - ) + LedgerHardwareWalletFactorSource::sample().id } } #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = FactorSourceIDFromHash; #[test] fn equality() { - assert_eq!( - FactorSourceIDFromHash::sample(), - FactorSourceIDFromHash::sample() - ); - assert_eq!( - FactorSourceIDFromHash::sample_other(), - FactorSourceIDFromHash::sample_other() - ); + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); } #[test] fn inequality() { - assert_ne!( - FactorSourceIDFromHash::sample(), - FactorSourceIDFromHash::sample_other() - ); + assert_ne!(SUT::sample(), SUT::sample_other()); } #[test] fn display() { assert_eq!( - format!("{}", FactorSourceIDFromHash::sample()), - "device:3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + format!("{}", SUT::sample()), + "device:f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" ); } #[test] fn debug() { assert_eq!( - format!("{:?}", FactorSourceIDFromHash::sample()), - "device:3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + format!("{:?}", SUT::sample()), + "device:f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" ); } #[test] fn json_roundtrip_sample() { - let model = FactorSourceIDFromHash::sample(); + let model = SUT::sample(); assert_eq_after_json_roundtrip( &model, r#" { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } "#, ); @@ -154,13 +173,13 @@ mod tests { #[test] fn json_from_sample_mnemonic() { let mwp = MnemonicWithPassphrase::sample(); - let model = FactorSourceIDFromHash::new_for_device(&mwp); + let model = SUT::new_for_device(&mwp); assert_eq_after_json_roundtrip( &model, r#" { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } "#, ); @@ -192,7 +211,7 @@ mod tests { Mnemonic::from_phrase(&vector.phrase).unwrap(), BIP39Passphrase::new(vector.pass), ); - let id = FactorSourceIDFromHash::new_for_device(&mwp); + let id = SUT::new_for_device(&mwp); assert_eq!(id.to_string(), vector.expected_id); } diff --git a/src/profile/v100/factors/factor_source_kind.rs b/src/profile/v100/factors/factor_source_kind.rs index fbbfba0e7..79fa3920e 100644 --- a/src/profile/v100/factors/factor_source_kind.rs +++ b/src/profile/v100/factors/factor_source_kind.rs @@ -69,6 +69,20 @@ pub enum FactorSourceKind { /// * Hierarchical deterministic (**Encrypted** mnemonic) #[serde(rename = "securityQuestions")] SecurityQuestions, + + /// An Arculus card, in credit card size, communicating with host using NFC. + /// + /// For more info see [link] + /// + /// Attributes: + /// * Mine + /// * Off device + /// * Hierarchical deterministic (**Encrypted** mnemonic)\ + /// * Hardware (communicates with host using NFC) + /// + /// [link]: https://www.getarculus.com/ + #[serde(rename = "arculusCard")] + ArculusCard, } impl FactorSourceKind { diff --git a/src/profile/v100/factors/factor_source_uniffi_fn.rs b/src/profile/v100/factors/factor_source_uniffi_fn.rs index 671daac00..0a1739b8a 100644 --- a/src/profile/v100/factors/factor_source_uniffi_fn.rs +++ b/src/profile/v100/factors/factor_source_uniffi_fn.rs @@ -34,7 +34,7 @@ mod tests { #[test] fn to_string() { - assert_eq!(factor_source_to_string(&SUT::sample()), "Unknown Name iPhone device:3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240") + assert_eq!(factor_source_to_string(&SUT::sample()), "My precious iPhone SE 2nd gen device:f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a") } #[test] diff --git a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source.rs b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source.rs index 31d20930a..cbdba9568 100644 --- a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source.rs +++ b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source.rs @@ -1,9 +1,11 @@ use crate::prelude::*; -/// A factor source representing the device that the Radix Wallet is running on -/// typically an iPhone or Android device. This is the initial factor source of -/// all new Accounts and Personas an users authenticate signing by authorizing -/// the client (Wallet App) to access a mnemonic stored in secure storage on +/// A factor source representing the host device which SargonOS runs on, typically +/// an iPhone or Android device. +/// +/// This is the initial factor source of +/// all new Accounts and Personas. Users authenticate signing by authorizing +/// the host to access a mnemonic stored in secure storage on /// the device. #[derive( Serialize, @@ -25,9 +27,6 @@ pub struct DeviceFactorSource { /// Common properties shared between FactorSources of different kinds, /// describing its state, when added, and supported cryptographic parameters. - /// - /// Has interior mutability since we must be able to update the - /// last used date. pub common: FactorSourceCommon, /// Properties describing a DeviceFactorSource to help user disambiguate between it and another one. @@ -60,6 +59,10 @@ impl BaseIsFactorSource for DeviceFactorSource { fn factor_source_id(&self) -> FactorSourceID { self.clone().id.into() } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } } impl DeviceFactorSource { @@ -75,40 +78,32 @@ impl DeviceFactorSource { pub fn babylon( is_main: bool, mnemonic_with_passphrase: &MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Self { let id = FactorSourceIDFromHash::from_mnemonic_with_passphrase( FactorSourceKind::Device, mnemonic_with_passphrase, ); - - Self::new( - id, - FactorSourceCommon::new_bdfs(is_main), - DeviceFactorSourceHint::unknown_model_of_client( - mnemonic_with_passphrase.mnemonic.word_count, - wallet_client_model, - ), - ) + let hint = DeviceFactorSourceHint::with_info( + host_info, + mnemonic_with_passphrase.mnemonic.word_count, + ); + Self::new(id, FactorSourceCommon::new_bdfs(is_main), hint) } pub fn olympia( mnemonic_with_passphrase: &MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Self { let id = FactorSourceIDFromHash::from_mnemonic_with_passphrase( FactorSourceKind::Device, mnemonic_with_passphrase, ); - - Self::new( - id, - FactorSourceCommon::new_olympia(), - DeviceFactorSourceHint::unknown_model_of_client( - mnemonic_with_passphrase.mnemonic.word_count, - wallet_client_model, - ), - ) + let hint = DeviceFactorSourceHint::with_info( + host_info, + mnemonic_with_passphrase.mnemonic.word_count, + ); + Self::new(id, FactorSourceCommon::new_olympia(), hint) } /// Checks if its Main Babylon Device Factor Source (BDFS). @@ -132,57 +127,119 @@ impl HasSampleValues for DeviceFactorSource { impl DeviceFactorSource { /// A sample used to facilitate unit tests. pub fn sample_babylon() -> Self { - Self::new( - FactorSourceIDFromHash::sample(), - FactorSourceCommon::sample_main_babylon(), - DeviceFactorSourceHint::sample(), - ) + let mut source = Self::babylon( + true, + &MnemonicWithPassphrase::sample_device(), + &HostInfo::sample(), + ); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source + } + + /// A sample used to facilitate unit tests. + pub fn sample_babylon_other() -> Self { + let mut source = Self::babylon( + false, + &MnemonicWithPassphrase::sample_device_other(), + &HostInfo::sample_other(), + ); + source.common.last_used_on = Timestamp::sample_other(); + source.common.added_on = Timestamp::sample_other(); + source } /// A sample used to facilitate unit tests. pub fn sample_olympia() -> Self { - Self::new( - FactorSourceIDFromHash::sample_other(), - FactorSourceCommon::sample_olympia(), - DeviceFactorSourceHint::sample(), - ) + let mut source = Self::olympia( + &MnemonicWithPassphrase::sample_device_12_words(), + &HostInfo::sample_other(), + ); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source + } + + /// A sample used to facilitate unit tests. + pub fn sample_olympia_other() -> Self { + let mut source = Self::olympia( + &MnemonicWithPassphrase::sample_device_12_words_other(), + &HostInfo::sample(), + ); + source.common.last_used_on = Timestamp::sample_other(); + source.common.added_on = Timestamp::sample_other(); + source } } #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = DeviceFactorSource; #[test] fn equality() { - assert_eq!(DeviceFactorSource::sample(), DeviceFactorSource::sample()); - assert_eq!( - DeviceFactorSource::sample_other(), - DeviceFactorSource::sample_other() - ); + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); } #[test] fn inequality() { - assert_ne!( - DeviceFactorSource::sample(), - DeviceFactorSource::sample_other() - ); + assert_ne!(SUT::sample(), SUT::sample_other()); } #[test] fn main_babylon() { - assert!(DeviceFactorSource::babylon( + assert!(SUT::babylon( true, &MnemonicWithPassphrase::sample(), - WalletClientModel::sample() + &HostInfo::sample() ) .is_main_bdfs()); } #[test] fn json() { - let model = DeviceFactorSource::sample(); + let model = SUT::sample(); + assert_eq_after_json_roundtrip( + &model, + r#" + { + "common": { + "addedOn": "2023-09-11T16:05:56.000Z", + "cryptoParameters": { + "supportedCurves": ["curve25519"], + "supportedDerivationPathSchemes": ["cap26"] + }, + "flags": ["main"], + "lastUsedOn": "2023-09-11T16:05:56.000Z" + }, + "hint": { + "mnemonicWordCount": 24, + "model": "iPhone SE 2nd gen", + "name": "My precious", + "systemVersion": "iOS 17.4.1", + "hostAppVersion": "1.6.4", + "hostVendor": "Apple" + }, + "id": { + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a", + "kind": "device" + } + } + "#, + ); + } + + #[test] + fn json_without_host_details() { + let mut model = SUT::sample(); + model.hint.system_version = None; + model.hint.host_app_version = None; + model.hint.host_vendor = None; + assert_eq_after_json_roundtrip( &model, r#" @@ -198,11 +255,11 @@ mod tests { }, "hint": { "mnemonicWordCount": 24, - "model": "iPhone", - "name": "Unknown Name" + "model": "iPhone SE 2nd gen", + "name": "My precious" }, "id": { - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a", "kind": "device" } } @@ -212,21 +269,21 @@ mod tests { #[test] fn factor_source_id() { - let sut = DeviceFactorSource::sample(); + let sut = SUT::sample(); let factor_source_id: FactorSourceID = sut.clone().id.into(); assert_eq!(factor_source_id, sut.factor_source_id()); } #[test] fn from_factor_source() { - let sut = DeviceFactorSource::sample(); + let sut = SUT::sample(); let factor_source: FactorSource = sut.clone().into(); - assert_eq!(DeviceFactorSource::try_from(factor_source), Ok(sut)); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); } #[test] fn static_kind() { - assert_eq!(DeviceFactorSource::kind(), FactorSourceKind::Device); + assert_eq!(SUT::kind(), FactorSourceKind::Device); } #[test] @@ -234,7 +291,7 @@ mod tests { let ledger = LedgerHardwareWalletFactorSource::sample(); let factor_source: FactorSource = ledger.clone().into(); assert_eq!( - DeviceFactorSource::try_from(factor_source), + SUT::try_from(factor_source), Err(CommonError::ExpectedDeviceFactorSourceGotSomethingElse) ); } @@ -242,9 +299,7 @@ mod tests { #[test] fn sample_olympia_has_crypto_parameters_olympia() { assert_eq!( - DeviceFactorSource::sample_olympia() - .common - .crypto_parameters, + SUT::sample_olympia().common.crypto_parameters, FactorSourceCryptoParameters::olympia() ); } @@ -252,7 +307,7 @@ mod tests { #[test] fn hint() { assert_eq!( - DeviceFactorSource::sample().hint.mnemonic_word_count, + SUT::sample().hint.mnemonic_word_count, BIP39WordCount::TwentyFour ); } diff --git a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_hint.rs b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_hint.rs index 3241e6dfb..73e860225 100644 --- a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_hint.rs +++ b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_hint.rs @@ -25,50 +25,88 @@ pub struct DeviceFactorSourceHint { /// The number of words in the mnemonic of a DeviceFactorSource, according to the BIP39 /// standard, a multiple of 3, from 12 to 24 words. pub mnemonic_word_count: BIP39WordCount, + + /// The **last known** version of the device's operating system, e.g. "iOS 17.4.1". + /// + /// It is possible that the host device has been updated to a new + /// version than recorded here, but Sargon or host clients might + /// just not have updated this value here. + /// + /// MUST be optional since this was added on 2024-05-03 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub system_version: Option, + + /// The **last known** version of the host app, for example the Radix iOS Wallet version - e.g. "1.6.1" + /// + /// It is possible that the host device has been updated to a new + /// version than recorded here, but Sargon or host clients might + /// just not have updated this value here. + /// + /// MUST be optional since this was added on 2024-05-03 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub host_app_version: Option, + + /// The vendor of the device host, e.g. "Apple" or "Samsung". + /// + /// MUST be optional since this was added on 2024-05-03 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub host_vendor: Option, } impl DeviceFactorSourceHint { - /// Instantiates a new DeviceFactorSourceHint from the specified name, model and word count. + /// Instantiates a new DeviceFactorSourceHint from the specified name, model, + /// system version, app version and mnemonic word count. pub fn new( - name: String, - model: String, + name: impl AsRef, + model: impl AsRef, + system_version: impl Into>, + host_app_version: impl Into>, + host_vendor: impl Into>, word_count: BIP39WordCount, ) -> Self { Self { - name, - model, + name: name.as_ref().to_owned(), + model: model.as_ref().to_owned(), + system_version: system_version.into(), + host_app_version: host_app_version.into(), + host_vendor: host_vendor.into(), mnemonic_word_count: word_count, } } - pub fn unknown_model_of_client( - word_count: BIP39WordCount, - wallet_client_model: WalletClientModel, - ) -> Self { + pub fn with_info(host_info: &HostInfo, word_count: BIP39WordCount) -> Self { + let description = host_info.description.clone(); Self::new( - "Unknown Name".to_string(), - wallet_client_model.to_string(), + description.name, + description.model, + host_info.host_os.version(), + host_info.host_app_version.clone(), + host_info.host_os.vendor(), word_count, ) } - - pub fn iphone_unknown_model_with_word_count( - word_count: BIP39WordCount, - ) -> Self { - Self::unknown_model_of_client(word_count, WalletClientModel::Iphone) - } } impl HasSampleValues for DeviceFactorSourceHint { /// A sample used to facilitate unit tests. fn sample() -> Self { - Self::sample_iphone_unknown() + Self::new( + "Unknown Name", + "iPhone", + None, + None, + None, + BIP39WordCount::TwentyFour, + ) } fn sample_other() -> Self { Self::new( - "Android".to_string(), - "Samsung Galaxy S23 Ultra".to_string(), + "Android", + "Samsung Galaxy S23 Ultra", + None, + None, + None, BIP39WordCount::Twelve, ) } @@ -77,59 +115,47 @@ impl HasSampleValues for DeviceFactorSourceHint { impl DeviceFactorSourceHint { /// A sample used to facilitate unit tests. pub fn sample_iphone_unknown() -> Self { - Self::iphone_unknown_model_with_word_count(BIP39WordCount::TwentyFour) + Self::new( + "Unknown Name", + "iPhone", + None, + None, + None, + BIP39WordCount::TwentyFour, + ) } } #[cfg(test)] mod tests { - use crate::prelude::*; - #[test] - fn equality() { - assert_eq!( - DeviceFactorSourceHint::sample(), - DeviceFactorSourceHint::sample() - ); - assert_eq!( - DeviceFactorSourceHint::sample_other(), - DeviceFactorSourceHint::sample_other() - ); - } - #[test] - fn inequality() { - assert_ne!( - DeviceFactorSourceHint::sample(), - DeviceFactorSourceHint::sample_other() - ); - } + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = DeviceFactorSourceHint; #[test] - fn set_model() { - let mut sut = DeviceFactorSourceHint::sample(); - assert_eq!(sut.model, "iPhone".to_string()); - sut.model = "Android".to_string(); - assert_eq!(sut.model, "Android".to_string()); + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); } #[test] - fn set_name() { - let mut sut = DeviceFactorSourceHint::sample(); - sut.name = "Foo".to_string(); - assert_eq!(sut.name, "Foo".to_string()); + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); } #[test] fn get_word_count() { assert_eq!( - DeviceFactorSourceHint::sample().mnemonic_word_count, + SUT::sample().mnemonic_word_count, BIP39WordCount::TwentyFour ); } #[test] fn json() { - let model = DeviceFactorSourceHint::sample_iphone_unknown(); + let model = SUT::sample_iphone_unknown(); assert_eq_after_json_roundtrip( &model, r#" @@ -141,4 +167,29 @@ mod tests { "#, ) } + + #[test] + fn json_app_version_and_system_version_set() { + let sut = SUT::new( + "My precious", + "iPhone 15 Pro", + "17.4.1".to_owned(), + "1.6.0".to_owned(), + "Apple".to_owned(), + BIP39WordCount::TwentyFour, + ); + assert_eq_after_json_roundtrip( + &sut, + r#" + { + "name": "My precious", + "model": "iPhone 15 Pro", + "systemVersion": "17.4.1", + "hostAppVersion": "1.6.0", + "hostVendor": "Apple", + "mnemonicWordCount": 24 + } + "#, + ) + } } diff --git a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_uniffi_fn.rs b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_uniffi_fn.rs index 3a851715f..b80e04841 100644 --- a/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_uniffi_fn.rs +++ b/src/profile/v100/factors/factor_sources/device_factor_source/device_factor_source_uniffi_fn.rs @@ -14,21 +14,17 @@ pub fn new_device_factor_source_sample_other() -> DeviceFactorSource { pub fn new_device_factor_source_babylon( is_main: bool, mnemonic_with_passphrase: &MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> DeviceFactorSource { - DeviceFactorSource::babylon( - is_main, - mnemonic_with_passphrase, - wallet_client_model, - ) + DeviceFactorSource::babylon(is_main, mnemonic_with_passphrase, host_info) } #[uniffi::export] pub fn new_device_factor_source_olympia( mnemonic_with_passphrase: &MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> DeviceFactorSource { - DeviceFactorSource::olympia(mnemonic_with_passphrase, wallet_client_model) + DeviceFactorSource::olympia(mnemonic_with_passphrase, host_info) } #[uniffi::export] @@ -49,7 +45,7 @@ mod tests { fn test_new_olympia() { let olympia = new_device_factor_source_olympia( &MnemonicWithPassphrase::sample(), - WalletClientModel::Iphone, + &HostInfo::sample(), ); assert!(factor_source_supports_olympia(&olympia.clone().into())); @@ -61,7 +57,7 @@ mod tests { let babylon = new_device_factor_source_babylon( true, &MnemonicWithPassphrase::sample(), - WalletClientModel::Iphone, + &HostInfo::sample(), ); assert!(factor_source_supports_babylon(&babylon.clone().into())); @@ -73,7 +69,7 @@ mod tests { let babylon = new_device_factor_source_babylon( false, &MnemonicWithPassphrase::sample(), - WalletClientModel::Iphone, + &HostInfo::sample(), ); assert!(!device_factor_source_is_main_bdfs(&babylon)); @@ -84,7 +80,7 @@ mod tests { let babylon = new_device_factor_source_babylon( true, &MnemonicWithPassphrase::sample(), - WalletClientModel::Iphone, + &HostInfo::sample(), ); assert!(device_factor_source_is_main_bdfs(&babylon)); diff --git a/src/profile/v100/factors/factor_sources/device_factor_source/mod.rs b/src/profile/v100/factors/factor_sources/device_factor_source/mod.rs index 20c43c2f3..333d49dd7 100644 --- a/src/profile/v100/factors/factor_sources/device_factor_source/mod.rs +++ b/src/profile/v100/factors/factor_sources/device_factor_source/mod.rs @@ -1,9 +1,7 @@ mod device_factor_source; mod device_factor_source_hint; mod device_factor_source_uniffi_fn; -mod wallet_client_model; pub use device_factor_source::*; pub use device_factor_source_hint::*; pub use device_factor_source_uniffi_fn::*; -pub use wallet_client_model::*; diff --git a/src/profile/v100/factors/factor_sources/device_factor_source/wallet_client_model.rs b/src/profile/v100/factors/factor_sources/device_factor_source/wallet_client_model.rs deleted file mode 100644 index 9e5d8273e..000000000 --- a/src/profile/v100/factors/factor_sources/device_factor_source/wallet_client_model.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::prelude::*; - -#[derive( - Debug, Clone, PartialEq, Eq, Hash, derive_more::Display, uniffi::Enum, -)] -pub enum WalletClientModel { - #[display("iPhone")] - Iphone, - Android, - Unknown, -} - -impl HasSampleValues for WalletClientModel { - fn sample() -> Self { - WalletClientModel::Iphone - } - - fn sample_other() -> Self { - WalletClientModel::Android - } -} - -#[cfg(test)] -mod tests { - use crate::prelude::*; - #[test] - fn equality() { - assert_eq!(WalletClientModel::sample(), WalletClientModel::sample()); - assert_eq!( - WalletClientModel::sample_other(), - WalletClientModel::sample_other() - ); - } - - #[test] - fn inequality() { - assert_ne!( - WalletClientModel::sample(), - WalletClientModel::sample_other() - ); - } - - #[test] - fn name() { - assert_eq!(format!("{}", WalletClientModel::Iphone), "iPhone"); - assert_eq!(format!("{}", WalletClientModel::Android), "Android"); - assert_eq!(format!("{}", WalletClientModel::Unknown), "Unknown"); - } -} diff --git a/src/profile/v100/factors/factor_sources/factor_sources.rs b/src/profile/v100/factors/factor_sources/factor_sources.rs index 75eed3844..82c72e2c7 100644 --- a/src/profile/v100/factors/factor_sources/factor_sources.rs +++ b/src/profile/v100/factors/factor_sources/factor_sources.rs @@ -112,7 +112,7 @@ mod tests { "device": { "id": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "common": { "flags": ["main"], @@ -124,9 +124,12 @@ mod tests { "lastUsedOn": "2023-09-11T16:05:56.000Z" }, "hint": { - "name": "Unknown Name", - "model": "iPhone", - "mnemonicWordCount": 24 + "name": "My precious", + "model": "iPhone SE 2nd gen", + "mnemonicWordCount": 24, + "systemVersion": "iOS 17.4.1", + "hostAppVersion": "1.6.4", + "hostVendor": "Apple" } } }, @@ -135,7 +138,7 @@ mod tests { "ledgerHQHardwareWallet": { "id": { "kind": "ledgerHQHardwareWallet", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" }, "common": { "addedOn": "2023-09-11T16:05:56.000Z", @@ -143,7 +146,7 @@ mod tests { "supportedCurves": ["curve25519"], "supportedDerivationPathSchemes": ["cap26"] }, - "flags": ["main"], + "flags": [], "lastUsedOn": "2023-09-11T16:05:56.000Z" }, "hint": { diff --git a/src/profile/v100/factors/factor_sources/factor_sources_uniffi_fn.rs b/src/profile/v100/factors/factor_sources/factor_sources_uniffi_fn.rs new file mode 100644 index 000000000..08080c5e4 --- /dev/null +++ b/src/profile/v100/factors/factor_sources/factor_sources_uniffi_fn.rs @@ -0,0 +1,16 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn factor_sources_all_sample_values() -> Vec { + FactorSource::sample_values_all() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hash_of_samples() { + assert!(factor_sources_all_sample_values().len() > 10); + } +} diff --git a/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source.rs b/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source.rs index ed97da30b..a17e5b43e 100644 --- a/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source.rs +++ b/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source.rs @@ -21,15 +21,24 @@ pub struct LedgerHardwareWalletFactorSource { /// Common properties shared between FactorSources of different kinds, /// describing its state, when added, and supported cryptographic parameters. - /// - /// Has interior mutability since we must be able to update the - /// last used date. pub common: FactorSourceCommon, /// Properties describing a LedgerHardwareWalletFactorSource to help user disambiguate between it and another one. pub hint: LedgerHardwareWalletHint, } +fn new_ledger_with_mwp( + mwp: MnemonicWithPassphrase, + hint: LedgerHardwareWalletHint, + common: FactorSourceCommon, +) -> LedgerHardwareWalletFactorSource { + let id = FactorSourceIDFromHash::new_for_ledger(&mwp); + let mut source = LedgerHardwareWalletFactorSource::new(id, common, hint); + source.common.last_used_on = Timestamp::sample(); + source.common.added_on = Timestamp::sample(); + source +} + impl LedgerHardwareWalletFactorSource { /// Instantiates a new `LedgerHardwareWalletFactorSource` pub fn new( @@ -43,18 +52,18 @@ impl LedgerHardwareWalletFactorSource { impl HasSampleValues for LedgerHardwareWalletFactorSource { fn sample() -> Self { - Self::new( - FactorSourceIDFromHash::sample_ledger(), - FactorSourceCommon::sample(), + new_ledger_with_mwp( + MnemonicWithPassphrase::sample_ledger(), LedgerHardwareWalletHint::sample(), + FactorSourceCommon::new_bdfs(false), ) } fn sample_other() -> Self { - Self::new( - FactorSourceIDFromHash::sample_ledger_other(), - FactorSourceCommon::sample_other(), + new_ledger_with_mwp( + MnemonicWithPassphrase::sample_ledger_other(), LedgerHardwareWalletHint::sample_other(), + FactorSourceCommon::new_olympia(), ) } } @@ -65,9 +74,7 @@ impl TryFrom for LedgerHardwareWalletFactorSource { fn try_from(value: FactorSource) -> Result { match value { FactorSource::Ledger { value: factor } => Ok(factor), - FactorSource::Device { value: _ } => { - Err(Self::Error::ExpectedLedgerHardwareWalletFactorSourceGotSomethingElse) - } + _ => Err(Self::Error::ExpectedLedgerHardwareWalletFactorSourceGotSomethingElse) } } } @@ -88,42 +95,45 @@ impl BaseIsFactorSource for LedgerHardwareWalletFactorSource { fn factor_source_id(&self) -> FactorSourceID { self.clone().id.into() } + + fn set_common_properties(&mut self, updated: FactorSourceCommon) { + self.common = updated + } } #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = LedgerHardwareWalletFactorSource; #[test] fn equality() { - assert_eq!( - LedgerHardwareWalletFactorSource::sample(), - LedgerHardwareWalletFactorSource::sample() - ); - assert_eq!( - LedgerHardwareWalletFactorSource::sample_other(), - LedgerHardwareWalletFactorSource::sample_other() - ); + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); } #[test] fn inequality() { - assert_ne!( - LedgerHardwareWalletFactorSource::sample(), - LedgerHardwareWalletFactorSource::sample_other() - ); + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn kind() { + assert_eq!(SUT::kind(), FactorSourceKind::LedgerHQHardwareWallet); } #[test] fn json_roundtrip() { - let model = LedgerHardwareWalletFactorSource::sample(); + let model = SUT::sample(); assert_eq_after_json_roundtrip( &model, r#" { "id": { "kind": "ledgerHQHardwareWallet", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" }, "common": { "addedOn": "2023-09-11T16:05:56.000Z", @@ -131,7 +141,7 @@ mod tests { "supportedCurves": ["curve25519"], "supportedDerivationPathSchemes": ["cap26"] }, - "flags": ["main"], + "flags": [], "lastUsedOn": "2023-09-11T16:05:56.000Z" }, "hint": { @@ -145,12 +155,9 @@ mod tests { #[test] fn from_factor_source() { - let sut = LedgerHardwareWalletFactorSource::sample(); + let sut = SUT::sample(); let factor_source: FactorSource = sut.clone().into(); - assert_eq!( - LedgerHardwareWalletFactorSource::try_from(factor_source), - Ok(sut) - ); + assert_eq!(SUT::try_from(factor_source), Ok(sut)); } #[test] @@ -158,24 +165,18 @@ mod tests { let wrong = DeviceFactorSource::sample(); let factor_source: FactorSource = wrong.clone().into(); assert_eq!( - LedgerHardwareWalletFactorSource::try_from(factor_source), + SUT::try_from(factor_source), Err(CommonError::ExpectedLedgerHardwareWalletFactorSourceGotSomethingElse) ); } #[test] fn factor_source_id() { - assert_eq!( - LedgerHardwareWalletFactorSource::sample().factor_source_id(), - LedgerHardwareWalletFactorSource::sample().id.into() - ); + assert_eq!(SUT::sample().factor_source_id(), SUT::sample().id.into()); } #[test] fn factor_source_kind() { - assert_eq!( - LedgerHardwareWalletFactorSource::sample().factor_source_kind(), - LedgerHardwareWalletFactorSource::sample().id.kind - ); + assert_eq!(SUT::sample().factor_source_kind(), SUT::sample().id.kind); } } diff --git a/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source_uniffi_fn.rs b/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source_uniffi_fn.rs index f5d12c9a6..6aa6758f7 100644 --- a/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source_uniffi_fn.rs +++ b/src/profile/v100/factors/factor_sources/ledger_hardware_wallet_factor_source/ledger_hardware_wallet_factor_source_uniffi_fn.rs @@ -12,6 +12,16 @@ pub fn new_ledger_hardware_wallet_factor_source_sample_other( LedgerHardwareWalletFactorSource::sample_other() } +#[uniffi::export] +fn new_ledger_hardware_wallet_from_mnemonic_with_passphrase( + mwp: MnemonicWithPassphrase, + hint: LedgerHardwareWalletHint, + common: FactorSourceCommon, +) -> LedgerHardwareWalletFactorSource { + let id = FactorSourceIDFromHash::new_for_ledger(&mwp); + LedgerHardwareWalletFactorSource::new(id, common, hint) +} + #[cfg(test)] mod tests { use super::*; @@ -33,4 +43,17 @@ mod tests { 2 ); } + + #[test] + fn test_new_ledger_hardware_wallet_from_mnemonic_with_passphrase() { + assert_eq!( + new_ledger_hardware_wallet_from_mnemonic_with_passphrase( + MnemonicWithPassphrase::sample_ledger(), + LedgerHardwareWalletHint::sample(), + FactorSourceCommon::sample() + ) + .factor_source_id(), + SUT::sample().factor_source_id() + ); + } } diff --git a/src/profile/v100/factors/factor_sources/mod.rs b/src/profile/v100/factors/factor_sources/mod.rs index f622c6044..b4902fe88 100644 --- a/src/profile/v100/factors/factor_sources/mod.rs +++ b/src/profile/v100/factors/factor_sources/mod.rs @@ -1,11 +1,13 @@ mod device_factor_source; mod factor_sources; +mod factor_sources_uniffi_fn; mod ledger_hardware_wallet_factor_source; mod private_hierarchical_deterministic_factor_source; mod private_hierarchical_deterministic_factor_source_uniffi_fn; pub use device_factor_source::*; pub use factor_sources::*; +pub use factor_sources_uniffi_fn::*; pub use ledger_hardware_wallet_factor_source::*; pub use private_hierarchical_deterministic_factor_source::*; pub use private_hierarchical_deterministic_factor_source_uniffi_fn::*; diff --git a/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source.rs b/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source.rs index 457a08a82..8161260f7 100644 --- a/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source.rs +++ b/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source.rs @@ -28,24 +28,22 @@ impl PrivateHierarchicalDeterministicFactorSource { pub fn new_olympia_with_mnemonic_with_passphrase( mnemonic_with_passphrase: MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Self { - let device_factor_source = DeviceFactorSource::olympia( - &mnemonic_with_passphrase, - wallet_client_model, - ); + let device_factor_source = + DeviceFactorSource::olympia(&mnemonic_with_passphrase, host_info); Self::new(mnemonic_with_passphrase, device_factor_source) } pub fn new_babylon_with_mnemonic_with_passphrase( is_main: bool, mnemonic_with_passphrase: MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Self { let bdfs = DeviceFactorSource::babylon( is_main, &mnemonic_with_passphrase, - wallet_client_model, + host_info, ); Self::new(mnemonic_with_passphrase, bdfs) } @@ -54,7 +52,7 @@ impl PrivateHierarchicalDeterministicFactorSource { is_main: bool, entropy: BIP39Entropy, passphrase: BIP39Passphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Self { let mnemonic = Mnemonic::from_entropy(entropy); let mnemonic_with_passphrase = @@ -62,20 +60,17 @@ impl PrivateHierarchicalDeterministicFactorSource { Self::new_babylon_with_mnemonic_with_passphrase( is_main, mnemonic_with_passphrase, - wallet_client_model, + host_info, ) } - pub fn generate_new_babylon( - is_main: bool, - wallet_client_model: WalletClientModel, - ) -> Self { + pub fn generate_new_babylon(is_main: bool, host_info: &HostInfo) -> Self { let mnemonic = Mnemonic::generate_new(); let mnemonic_with_passphrase = MnemonicWithPassphrase::new(mnemonic); Self::new_babylon_with_mnemonic_with_passphrase( is_main, mnemonic_with_passphrase, - wallet_client_model, + host_info, ) } } @@ -89,24 +84,54 @@ impl PrivateHierarchicalDeterministicFactorSource { where T: IsEntityPath + Clone, { - let path = T::new(network_id, CAP26KeyKind::TransactionSigning, index); + self.derive_entity_creation_factor_instances(network_id, [index]) + .into_iter() + .last() + .expect("Should have created one factor instance") + } + + pub fn derive_entity_creation_factor_instances( + &self, + network_id: NetworkID, + indices: impl IntoIterator, + ) -> Vec> + where + T: IsEntityPath + Clone, + { + let paths = indices + .into_iter() + .map(|i| T::new(network_id, CAP26KeyKind::TransactionSigning, i)); + let mut seed = self.mnemonic_with_passphrase.to_seed(); - let hd_private_key = seed.derive_private_key(&path); - let hd_factor_instance = HierarchicalDeterministicFactorInstance::new( - self.factor_source.id, - hd_private_key.public_key(), - ); + let instances = paths + .map(|p| { + let hd_private_key = seed.derive_private_key(&p); + let hd_factor_instance = + HierarchicalDeterministicFactorInstance::new( + self.factor_source.id, + hd_private_key.public_key(), + ); + // TODO: zeroize `hd_private_key` when `HierarchicalDeterministicPrivateKey` implement Zeroize... + HDFactorInstanceTransactionSigning::new(hd_factor_instance) + .unwrap() + }) + .collect_vec(); + seed.zeroize(); - // TODO: zeroize `hd_private_key` when `HierarchicalDeterministicPrivateKey` implement Zeroize... - HDFactorInstanceTransactionSigning::new(hd_factor_instance).unwrap() + instances } } impl HasSampleValues for PrivateHierarchicalDeterministicFactorSource { fn sample() -> Self { + let mwp = MnemonicWithPassphrase::sample(); Self::new( - MnemonicWithPassphrase::sample(), - DeviceFactorSource::sample_babylon(), + mwp.clone(), + DeviceFactorSource::new( + FactorSourceIDFromHash::new_for_device(&mwp), + FactorSourceCommon::sample_main_babylon(), + DeviceFactorSourceHint::sample_other(), + ), ) } @@ -144,9 +169,7 @@ mod tests { fn hash() { let n = 100; let set = (0..n) - .map(|_| { - SUT::generate_new_babylon(true, WalletClientModel::Unknown) - }) + .map(|_| SUT::generate_new_babylon(true, &HostInfo::sample())) .collect::>(); assert_eq!(set.len(), n); } diff --git a/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source_uniffi_fn.rs b/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source_uniffi_fn.rs index 913dc33e6..94bd1edfb 100644 --- a/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source_uniffi_fn.rs +++ b/src/profile/v100/factors/factor_sources/private_hierarchical_deterministic_factor_source_uniffi_fn.rs @@ -4,14 +4,14 @@ use crate::prelude::*; pub fn new_private_hd_factor_source_babylon( is_main: bool, entropy: NonEmptyMax32Bytes, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> Result { BIP39Entropy::try_from(entropy).map(|entropy| { PrivateHierarchicalDeterministicFactorSource::new_babylon_with_entropy( is_main, entropy, BIP39Passphrase::default(), - wallet_client_model, + host_info, ) }) } @@ -20,17 +20,17 @@ pub fn new_private_hd_factor_source_babylon( pub fn new_private_hd_factor_source_babylon_from_mnemonic_with_passphrase( is_main: bool, mnemonic_with_passphrase: MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> PrivateHierarchicalDeterministicFactorSource { - PrivateHierarchicalDeterministicFactorSource::new_babylon_with_mnemonic_with_passphrase(is_main, mnemonic_with_passphrase, wallet_client_model) + PrivateHierarchicalDeterministicFactorSource::new_babylon_with_mnemonic_with_passphrase(is_main, mnemonic_with_passphrase, host_info) } #[uniffi::export] pub fn new_private_hd_factor_source_olympia_from_mnemonic_with_passphrase( mnemonic_with_passphrase: MnemonicWithPassphrase, - wallet_client_model: WalletClientModel, + host_info: &HostInfo, ) -> PrivateHierarchicalDeterministicFactorSource { - PrivateHierarchicalDeterministicFactorSource::new_olympia_with_mnemonic_with_passphrase(mnemonic_with_passphrase, wallet_client_model) + PrivateHierarchicalDeterministicFactorSource::new_olympia_with_mnemonic_with_passphrase(mnemonic_with_passphrase, host_info) } #[uniffi::export] @@ -72,7 +72,7 @@ mod tests { let private: SUT = new_private_hd_factor_source_babylon( true, Entropy32Bytes::new([0xff; 32]).into(), - WalletClientModel::Unknown, + &HostInfo::sample(), ) .unwrap(); assert_eq!(private.mnemonic_with_passphrase.passphrase.0, ""); @@ -85,7 +85,7 @@ mod tests { new_private_hd_factor_source_babylon_from_mnemonic_with_passphrase( true, MnemonicWithPassphrase::sample(), - WalletClientModel::Android, + &HostInfo::sample(), ); assert!(&sut.factor_source.supports_babylon()); assert!(!&sut.factor_source.supports_olympia()); @@ -98,7 +98,7 @@ mod tests { new_private_hd_factor_source_babylon_from_mnemonic_with_passphrase( true, MnemonicWithPassphrase::sample(), - WalletClientModel::Android, + &HostInfo::sample(), ); assert!(sut.factor_source.is_main_bdfs()); } @@ -109,7 +109,7 @@ mod tests { let sut = new_private_hd_factor_source_olympia_from_mnemonic_with_passphrase( MnemonicWithPassphrase::sample(), - WalletClientModel::Android, + &HostInfo::sample(), ); assert!(&sut.factor_source.supports_olympia()); assert!(!&sut.factor_source.supports_babylon()); diff --git a/src/profile/v100/factors/hierarchical_deterministic_factor_instance.rs b/src/profile/v100/factors/hierarchical_deterministic_factor_instance.rs index ead8cad1a..07f05f139 100644 --- a/src/profile/v100/factors/hierarchical_deterministic_factor_instance.rs +++ b/src/profile/v100/factors/hierarchical_deterministic_factor_instance.rs @@ -61,7 +61,7 @@ impl HierarchicalDeterministicFactorInstance { let badge = virtual_source.as_hierarchical_deterministic(); Self::try_from( - factor_instance.factor_source_id.clone(), + factor_instance.factor_source_id, badge.public_key, badge.derivation_path.clone(), ) @@ -195,7 +195,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -209,7 +209,7 @@ mod tests { "factorSourceID": { "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "discriminator": "fromHash" } diff --git a/src/profile/v100/factors/is_factor_source.rs b/src/profile/v100/factors/is_factor_source.rs index b35d57b30..ae4ea484f 100644 --- a/src/profile/v100/factors/is_factor_source.rs +++ b/src/profile/v100/factors/is_factor_source.rs @@ -1,12 +1,14 @@ use crate::prelude::*; pub trait BaseIsFactorSource: - Into + TryFrom + Into + TryFrom + Clone { fn factor_source_kind(&self) -> FactorSourceKind; fn factor_source_id(&self) -> FactorSourceID; fn common_properties(&self) -> FactorSourceCommon; + fn set_common_properties(&mut self, updated: FactorSourceCommon); + fn supports_babylon(&self) -> bool { self.common_properties().supports_babylon() } diff --git a/src/profile/v100/factors/mod.rs b/src/profile/v100/factors/mod.rs index 4a754428e..536e7f2a0 100644 --- a/src/profile/v100/factors/mod.rs +++ b/src/profile/v100/factors/mod.rs @@ -1,6 +1,7 @@ mod factor_instance; mod factor_source; mod factor_source_common; +mod factor_source_common_uniffi_fn; mod factor_source_crypto_parameters; mod factor_source_crypto_parameters_uniffi_fn; mod factor_source_flag; @@ -22,6 +23,7 @@ mod is_factor_source; pub use factor_instance::*; pub use factor_source::*; pub use factor_source_common::*; +pub use factor_source_common_uniffi_fn::*; pub use factor_source_crypto_parameters::*; pub use factor_source_crypto_parameters_uniffi_fn::*; pub use factor_source_flag::*; diff --git a/src/profile/v100/header/content_hint.rs b/src/profile/v100/header/content_hint.rs index 885b93fc8..ce541c672 100644 --- a/src/profile/v100/header/content_hint.rs +++ b/src/profile/v100/header/content_hint.rs @@ -72,27 +72,45 @@ impl ContentHint { } } +impl HasSampleValues for ContentHint { + fn sample() -> Self { + Self::with_counters(3, 1, 1) + } + fn sample_other() -> Self { + Self::with_counters(1, 0, 0) + } +} + #[cfg(test)] mod tests { - use crate::prelude::*; + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = ContentHint; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } #[test] fn new_counters_all_start_at_zero() { - let sut = ContentHint::new(); + let sut = SUT::new(); assert_eq!(sut.number_of_accounts_on_all_networks_in_total, 0); assert_eq!(sut.number_of_personas_on_all_networks_in_total, 0); assert_eq!(sut.number_of_networks, 0); } - #[test] - fn eq() { - assert_eq!(ContentHint::new(), ContentHint::new()); - } - #[test] fn display() { - let sut = ContentHint::default(); + let sut = SUT::default(); assert_eq!( format!("{}", sut), "#networks: 0, #accounts: 0, #personas: 0" @@ -105,7 +123,7 @@ mod tests { let x = i + 1; let y = i + 2; let z = i + 3; - let sut = ContentHint::with_counters(x, y, z); + let sut = SUT::with_counters(x, y, z); assert_eq!( sut.number_of_accounts_on_all_networks_in_total as usize, x @@ -120,7 +138,7 @@ mod tests { #[test] fn json_roundtrip() { - let model = ContentHint::with_counters(3, 2, 1); + let model = SUT::with_counters(3, 2, 1); assert_eq_after_json_roundtrip( &model, r#" @@ -146,7 +164,7 @@ mod tests { #[test] fn invalid_json() { - assert_json_fails::( + assert_json_fails::( r#" { "numberOfAccountsOnAllNetworksInTotal": "oh a string", @@ -156,7 +174,7 @@ mod tests { "#, ); - assert_json_fails::( + assert_json_fails::( r#" { "missing_key": "numberOfAccountsOnAllNetworksInTotal", @@ -166,7 +184,7 @@ mod tests { "#, ); - assert_json_fails::( + assert_json_fails::( r#" { "numberOfAccountsOnAllNetworksInTotal": 1337, @@ -176,7 +194,7 @@ mod tests { "#, ); - assert_json_fails::( + assert_json_fails::( r#" { "numberOfAccountsOnAllNetworksInTotal": 1337, @@ -187,7 +205,7 @@ mod tests { ); // We are NOT doing snake case - assert_json_fails::( + assert_json_fails::( r#" { "number_of_accounts_on_all_networks_in_total": 1337, diff --git a/src/profile/v100/header/device_id.rs b/src/profile/v100/header/device_id.rs new file mode 100644 index 000000000..0b1bd09d3 --- /dev/null +++ b/src/profile/v100/header/device_id.rs @@ -0,0 +1,84 @@ +use crate::prelude::*; + +/// A stable and globally unique identifier of a device, +/// e.g. an Android phone. +#[derive( + Serialize, + Deserialize, + Debug, + Copy, + derive_more::Display, + Clone, + PartialEq, + Eq, + Hash, +)] +#[serde(transparent)] +pub struct DeviceID(pub(crate) Uuid); +uniffi::custom_newtype!(DeviceID, Uuid); + +impl DeviceID { + pub fn generate_new() -> Self { + Self(id()) + } +} + +impl FromStr for DeviceID { + type Err = CommonError; + fn from_str(s: &str) -> Result { + Uuid::from_str(s).map(DeviceID).map_err(|_| { + CommonError::InvalidDeviceID { + bad_value: s.to_owned(), + } + }) + } +} + +impl HasSampleValues for DeviceID { + fn sample() -> Self { + DeviceID(Uuid::sample()) + } + + fn sample_other() -> Self { + DeviceID(Uuid::sample_other()) + } +} + +#[cfg(test)] +mod tests { + use crate::prelude::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = DeviceID; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn from_str_invalid() { + assert_eq!( + "bad".parse::(), + Err(CommonError::InvalidDeviceID { + bad_value: "bad".to_owned() + }) + ); + } + + #[test] + fn from_upper_case_is_ok() { + assert!(SUT::from_str("66F07CA2-A9D9-49E5-8152-77ACA3D1DD74").is_ok()) + } + + #[test] + fn generate_new_is_unique() { + assert_ne!(SUT::generate_new(), SUT::generate_new()); + } +} diff --git a/src/profile/v100/header/device_info.rs b/src/profile/v100/header/device_info.rs index 016aead8a..52292135e 100644 --- a/src/profile/v100/header/device_info.rs +++ b/src/profile/v100/header/device_info.rs @@ -22,7 +22,7 @@ pub struct DeviceInfo { /// query iOS for a unique identifier of the device, thus /// the iOS team has made their own impl of a best effort /// stable identifier. - pub id: Uuid, + pub id: DeviceID, /// The date this description of the device was made, might /// be equal to when the app was first ever launched on the @@ -32,65 +32,115 @@ pub struct DeviceInfo { /// A short description of the device, we devices should /// read the device model and a given name from the device /// if they are able to. + pub description: String, // FIXME: Start using `DeviceInfoDescription` ! + + /// The **last known** version of the device's operating system, e.g. "iOS 17.4.1". + /// + /// It is possible that the host device has been updated to a new + /// version than recorded here, but Sargon or host clients might + /// just not have updated this value here. + /// + /// MUST be optional since this was added on 2024-05-03 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub system_version: Option, + + /// The **last known** version of the host app, for example the Radix iOS Wallet version - e.g. "1.6.1" /// - /// E.g. "My Red Phone (iPhone SE 2nd Gen)" - pub description: String, + /// It is possible that the host device has been updated to a new + /// version than recorded here, but Sargon or host clients might + /// just not have updated this value here. + /// + /// MUST be optional since this was added on 2024-05-03 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub host_app_version: Option, + + /// The vendor of the host client, e.g. "Apple" for iPhone clients, + /// or "Samsung" for Android clients. + /// + /// MUST be optional since this was added on 2024-05-16 and + /// was not present in earlier version of wallet (pre 1.6.0). + pub host_vendor: Option, } impl DeviceInfo { /// Instantiates a new `DeviceInfo` with `id`, `date` and `description`. pub fn new( - id: Uuid, + id: DeviceID, date: Timestamp, - description: impl AsRef, + description: DeviceInfoDescription, + system_version: impl AsRef, + host_app_version: impl AsRef, + host_vendor: impl AsRef, ) -> Self { Self { id, date, - description: description.as_ref().to_owned(), + description: description.to_string(), + system_version: Some(system_version.as_ref().to_owned()), + host_app_version: Some(host_app_version.as_ref().to_owned()), + host_vendor: Some(host_vendor.as_ref().to_owned()), } } - /// Instantiates a new `DeviceInfo` with `description`, and generates a new `id` - /// and will use the current `date` for creation date. - pub fn with_description(description: impl AsRef) -> Self { - Self::new(id(), now(), description) - } - - /// Instantiates a new `DeviceInfo` with "iPhone" as description, and - /// generates a new `id` and will use the current `date` for creation date. - pub fn new_iphone() -> Self { - Self::with_description("iPhone") - } - - /// Instantiates a new `DeviceInfo` with "Unknown device" as description, and - /// generates a new `id` and will use the current `date` for creation date. - pub fn new_unknown_device() -> Self { - Self::with_description("Unknown device") + /// Instantiates a new `DeviceInfo` with information retrieved from host + /// like `host_id` and `host_info` + pub fn new_from_info(host_id: &HostId, host_info: &HostInfo) -> Self { + Self::new( + host_id.id, + host_id.generated_at, + host_info.description.clone(), + host_info.host_os.version(), + host_info.host_app_version.clone(), + host_info.host_os.vendor().clone(), + ) } } -impl Default for DeviceInfo { - fn default() -> Self { - Self::new_unknown_device() +#[cfg(test)] +impl DeviceInfo { + fn new_unknown() -> Self { + Self::new( + DeviceID::generate_new(), + now(), + DeviceInfoDescription::new("Unknown", "Unknown"), + "Unknown", + "Unknown", + "Unknown", + ) } } impl HasSampleValues for DeviceInfo { fn sample() -> Self { - Self::new( - Uuid::from_str("66F07CA2-A9D9-49E5-8152-77ACA3D1DD74").unwrap(), - Timestamp::parse("2023-09-11T16:05:56Z").unwrap(), - "iPhone", - ) + Self { + id: DeviceID::from_str("66F07CA2-A9D9-49E5-8152-77ACA3D1DD74") + .unwrap(), + date: Timestamp::sample(), + description: DeviceInfoDescription { + name: "iPhone".to_owned(), + model: "iPhone".to_owned(), + } + .to_string(), + system_version: None, + host_app_version: None, + host_vendor: None, + } } fn sample_other() -> Self { - Self::new( - Uuid::from_str("f07ca662-d9a9-9e45-1582-aca773d174dd").unwrap(), - Timestamp::parse("2023-12-24T17:13:56.123Z").unwrap(), - "Android", - ) + Self { + id: DeviceID::from_str("f07ca662-d9a9-9e45-1582-aca773d174dd") + .unwrap(), + date: Timestamp::sample_other(), + description: DeviceInfoDescription { + name: "Android".to_owned(), + model: "Android".to_owned(), + } + .to_string(), + system_version: None, + host_app_version: None, + host_vendor: None, + } } } @@ -112,49 +162,55 @@ mod tests { assert_ne!(SUT::sample(), SUT::sample_other()); } - #[test] - fn new_iphone() { - assert_eq!(SUT::new_iphone().description, "iPhone"); - } - - #[test] - fn with_description() { - assert_eq!(SUT::with_description("Nokia").description, "Nokia"); - } - - #[test] - fn new_has_description_unknown_device() { - assert_eq!(SUT::new_unknown_device().description, "Unknown device"); - } - #[test] fn display() { let id_str = "12345678-bbbb-cccc-dddd-abcd12345678"; - let id = Uuid::from_str(id_str).unwrap(); + let id = DeviceID::from_str(id_str).unwrap(); let sut = SUT::new( id, Timestamp::parse("2023-09-11T16:05:56Z").unwrap(), - "Foo", + DeviceInfoDescription::new("Foo", "Unknown"), + "Unknown", + "Unknown", + "Unknown", ); - assert_eq!( + pretty_assertions::assert_eq!( format!("{sut}"), - format!("Foo | created: 2023-09-11 | #{}", id_str) + format!("Foo (Unknown) | created: 2023-09-11 | #{}", id_str) ) } #[test] fn id_is_unique() { - let n = 1000; + let n = 20; let ids = (0..n) - .map(|_| SUT::new_iphone()) + .map(|_| SUT::new_unknown()) .map(|d| d.id) - .collect::>(); + .collect::>(); assert_eq!(ids.len(), n); } #[test] fn date_is_now() { - assert!(SUT::new_iphone().date.year() >= 2023); + assert!(SUT::new_unknown().date.year() >= 2023); + } + + #[test] + fn test_new_from_info() { + let host_id = HostId::sample(); + let host_info = HostInfo::sample(); + + assert_eq!( + DeviceInfo::new_from_info(&host_id, &host_info), + DeviceInfo::new( + host_id.id, + host_id.generated_at, + host_info.description, + host_info.host_os.version(), + host_info.host_app_version, + host_info.host_os.vendor() + ) + ) } #[test] @@ -163,7 +219,7 @@ mod tests { { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#; let model = serde_json::from_str::(str).unwrap(); @@ -172,6 +228,11 @@ mod tests { assert!(json.contains("56.000Z")); } + #[test] + fn json_nanoseconds_precision() { + assert_json_roundtrip(&SUT::new_unknown()); + } + #[test] fn json_roundtrip() { let model = SUT::sample(); @@ -183,7 +244,7 @@ mod tests { { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#, ); @@ -194,12 +255,39 @@ mod tests { { "id": "00000000-0000-0000-0000-000000000000", "date": "1970-01-01T12:34:56Z", - "description": "Nokia" + "description": "Nokia 3310 (lur)" } "#, ); } + #[test] + fn json_roundtrip_with_system_and_app_version() { + let sut = SUT::new( + DeviceID::from_str("66F07CA2-A9D9-49E5-8152-77ACA3D1DD74").unwrap(), + Timestamp::parse("2023-09-11T16:05:56Z").unwrap(), + DeviceInfoDescription::new("My nice iPhone", "iPhone 15 Pro"), + "17.4.1", + "1.6.0", + "Apple", + ); + assert_eq_after_json_roundtrip( + &sut, + // The JSON string literal below contains `.000` ISO8601 + // milliseconds which is not set on the sample + r#" + { + "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", + "date": "2023-09-11T16:05:56.000Z", + "description": "My nice iPhone (iPhone 15 Pro)", + "system_version": "17.4.1", + "host_app_version": "1.6.0", + "host_vendor": "Apple" + } + "#, + ) + } + #[test] fn invalid_json() { assert_json_fails::( @@ -207,7 +295,7 @@ mod tests { { "id": "invalid-uuid", "date": "1970-01-01T12:34:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#, ); @@ -217,7 +305,7 @@ mod tests { { "id": "00000000-0000-0000-0000-000000000000", "date": "invalid-date", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#, ); @@ -227,7 +315,7 @@ mod tests { { "missing_key": "id", "date": "1970-01-01T12:34:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#, ); @@ -237,7 +325,7 @@ mod tests { { "id": "00000000-0000-0000-0000-000000000000", "missing_key": "date", - "description": "iPhone" + "description": "iPhone (iPhone)" } "#, ); diff --git a/src/profile/v100/header/device_info_description.rs b/src/profile/v100/header/device_info_description.rs new file mode 100644 index 000000000..f938cc9a5 --- /dev/null +++ b/src/profile/v100/header/device_info_description.rs @@ -0,0 +1,152 @@ +use crate::prelude::*; + +/// A name and model of a host device. +/// +/// This used to be a String only in Pre 1.6.0 wallets, so +/// we have a custom Deserialize impl of it. +#[derive( + Serialize, + Clone, + Debug, + PartialEq, + Eq, + Hash, + derive_more::Display, + uniffi::Record, +)] +#[display("{name} ({model})")] +pub struct DeviceInfoDescription { + /// Host device name, e.g. "My Precious" + pub name: String, + + /// Host device model, e.g. "iPhone 15 Pro" + pub model: String, +} + +impl DeviceInfoDescription { + pub fn new(name: impl AsRef, model: impl AsRef) -> Self { + Self { + name: name.as_ref().to_owned(), + model: model.as_ref().to_owned(), + } + } +} + +impl<'de> Deserialize<'de> for DeviceInfoDescription { + fn deserialize>( + deserializer: D, + ) -> Result { + #[derive(Deserialize, Serialize)] + struct NewFormat { + pub name: String, + pub model: String, + } + + #[derive(Deserialize, Serialize)] + #[serde(untagged)] + enum Wrapper { + NewFormat(NewFormat), + OldFormat(String), + } + + match Wrapper::deserialize(deserializer)? { + Wrapper::NewFormat(new_format) => Ok(Self { + name: new_format.name, + model: new_format.model, + }), + Wrapper::OldFormat(description) => { + Ok(Self::from(description.as_ref())) + } + } + } +} + +impl From<&str> for DeviceInfoDescription { + fn from(description: &str) -> Self { + // Swift used: "\(model) (\(name))" + let swift_name_suffix = " (iPhone)"; + if description.ends_with(swift_name_suffix) { + let model = description.split(swift_name_suffix).next().unwrap(); + return Self::new("iPhone", model); + } + // FIXME: Android + Self::new(description, description) + } +} + +impl HasSampleValues for DeviceInfoDescription { + fn sample() -> Self { + Self::new("My precious", "iPhone 15 Pro") + } + + fn sample_other() -> Self { + Self::new("R2", "OnePlus Open") + } +} + +#[cfg(test)] +mod test_device_info_description { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = DeviceInfoDescription; + + #[test] + fn json_new_format() { + let sut = SUT::sample(); + assert_eq_after_json_roundtrip( + &sut, + r#" + { + "name": "My precious", + "model": "iPhone 15 Pro" + } + "#, + ) + } + + #[test] + fn json_old_format_iphone_iphone() { + let json = json!("iPhone (iPhone)"); + let sut = serde_json::from_value::(json).unwrap(); + assert_eq!(sut.clone(), SUT::new("iPhone", "iPhone")); + + assert_eq_after_json_roundtrip( + &sut, + r#" + { + "name": "iPhone", + "model": "iPhone" + } + "#, + ); + } + + #[test] + fn json_old_format_iphone15_pro_max_iphone() { + let json = json!("iPhone 15 Pro Max (iPhone)"); + let sut = serde_json::from_value::(json).unwrap(); + assert_eq!(sut.clone(), SUT::new("iPhone", "iPhone 15 Pro Max")); + + assert_eq_after_json_roundtrip( + &sut, + r#" + { + "name": "iPhone", + "model": "iPhone 15 Pro Max" + } + "#, + ); + } + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/profile/v100/header/device_info_description_uniffi_fn.rs b/src/profile/v100/header/device_info_description_uniffi_fn.rs new file mode 100644 index 000000000..bd57acf14 --- /dev/null +++ b/src/profile/v100/header/device_info_description_uniffi_fn.rs @@ -0,0 +1,48 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_device_info_description_sample() -> DeviceInfoDescription { + DeviceInfoDescription::sample() +} + +#[uniffi::export] +pub fn new_device_info_description_sample_other() -> DeviceInfoDescription { + DeviceInfoDescription::sample_other() +} + +#[uniffi::export] +pub fn device_info_description_to_string( + device_info_description: &DeviceInfoDescription, +) -> String { + device_info_description.to_string() +} + +#[cfg(test)] +mod test { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = DeviceInfoDescription; + + #[test] + fn test_to_string() { + let sut = SUT::sample(); + + assert_eq!(sut.to_string(), device_info_description_to_string(&sut)) + } + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_device_info_description_sample(), + new_device_info_description_sample_other(), + // duplicates should get removed + new_device_info_description_sample(), + new_device_info_description_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/profile/v100/header/device_info_uniffi_fn.rs b/src/profile/v100/header/device_info_uniffi_fn.rs index 62eb994bf..9fe05664b 100644 --- a/src/profile/v100/header/device_info_uniffi_fn.rs +++ b/src/profile/v100/header/device_info_uniffi_fn.rs @@ -12,11 +12,12 @@ pub fn new_device_info_sample_other() -> DeviceInfo { DeviceInfo::sample_other() } -/// Instantiates a new `DeviceInfo` with "iPhone" as description, and -/// generates a new `id` and will use the current `date` for creation date. #[uniffi::export] -pub fn new_device_info_iphone() -> DeviceInfo { - DeviceInfo::new_iphone() +pub fn new_device_info_from_host_info( + host_id: &HostId, + host_info: &HostInfo, +) -> DeviceInfo { + DeviceInfo::new_from_info(host_id, host_info) } #[cfg(test)] @@ -42,7 +43,13 @@ mod tests { } #[test] - fn test_new_device_info_iphone() { - assert_eq!(new_device_info_iphone().description, "iPhone".to_owned()) + fn test_new_from_host_info() { + let host_id = HostId::sample(); + let host_info = HostInfo::sample(); + + assert_eq!( + new_device_info_from_host_info(&host_id, &host_info), + DeviceInfo::new_from_info(&host_id, &host_info) + ) } } diff --git a/src/profile/v100/header/header.rs b/src/profile/v100/header/header.rs index 934dfb872..0c3b4a693 100644 --- a/src/profile/v100/header/header.rs +++ b/src/profile/v100/header/header.rs @@ -77,44 +77,28 @@ impl Identifiable for Header { } } -impl Default for Header { - fn default() -> Self { - Self::new(DeviceInfo::default()) - } -} - impl HasSampleValues for Header { /// A sample used to facilitate unit tests. fn sample() -> Self { - let date = Timestamp::parse("2023-09-11T16:05:56Z").unwrap(); - let device = DeviceInfo::new( - Uuid::from_str("66f07ca2-a9d9-49e5-8152-77aca3d1dd74").unwrap(), - date, - "iPhone", - ); + let device_info = DeviceInfo::sample(); Header::with_values( ProfileID::from_str("12345678-bbbb-cccc-dddd-abcd12345678") .unwrap(), - device, + device_info.clone(), ContentHint::with_counters(4, 0, 2), - date, + device_info.date, ) } /// A sample used to facilitate unit tests. fn sample_other() -> Self { - let date = Timestamp::parse("2023-12-20T16:05:56Z").unwrap(); - let device = DeviceInfo::new( - Uuid::from_str("aabbccdd-a9d9-49e5-8152-beefbeefbeef").unwrap(), - date, - "iPhone", - ); + let device_info = DeviceInfo::sample_other(); Header::with_values( ProfileID::from_str("87654321-bbbb-cccc-dddd-87654321dcba") .unwrap(), - device, + device_info.clone(), ContentHint::new(), - date, + device_info.date, ) } } @@ -149,12 +133,12 @@ pub mod tests { "creatingDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastUsedOnDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastModified": "2023-09-11T16:05:56.000Z", "contentHint": { @@ -167,65 +151,22 @@ pub mod tests { ); } - #[test] - fn last_updated() { - let a = SUT::default(); - let b = SUT::default(); - assert_ne!(a.last_modified, b.last_modified); - } - #[test] fn display() { - let date = Timestamp::parse("2023-09-11T16:05:56Z").unwrap(); - let device = DeviceInfo::new( - Uuid::from_str("66f07ca2-a9d9-49e5-8152-77aca3d1dd74").unwrap(), - date, - "iPhone", - ); - let sut = SUT::with_values( - ProfileID::from_str("12345678-bbbb-cccc-dddd-abcd12345678") - .unwrap(), - device, - ContentHint::new(), - date, - ); - assert_eq!(format!("{sut}"), "#12345678-bbbb-cccc-dddd-abcd12345678 v=100, content: #networks: 0, #accounts: 0, #personas: 0"); - } - - #[test] - fn creating_device() { - let value = DeviceInfo::new_iphone(); - let sut = SUT { - creating_device: value.clone(), - ..Default::default() - }; - assert_eq!(sut.creating_device, value) - } - - #[test] - fn get_id() { - let value = profile_id(); - let sut = SUT { - id: value, - ..Default::default() - }; - assert_eq!(sut.id, value) + let sut = SUT::sample(); + pretty_assertions::assert_eq!(format!("{sut}"), "#12345678-bbbb-cccc-dddd-abcd12345678 v=100, content: #networks: 2, #accounts: 4, #personas: 0"); } #[test] fn snapshot_version() { let value = ProfileSnapshotVersion::default(); - let sut = SUT { - snapshot_version: value, - ..Default::default() - }; + let sut = SUT::sample(); assert_eq!(sut.snapshot_version, value) } } #[cfg(test)] mod uniffi_tests { - use crate::{new_header_sample, new_header_sample_other, HasSampleValues}; use super::*; diff --git a/src/profile/v100/header/mod.rs b/src/profile/v100/header/mod.rs index 07d068e32..04a620759 100644 --- a/src/profile/v100/header/mod.rs +++ b/src/profile/v100/header/mod.rs @@ -1,12 +1,18 @@ mod content_hint; +mod device_id; mod device_info; +mod device_info_description; +mod device_info_description_uniffi_fn; mod device_info_uniffi_fn; mod header; mod header_uniffi_fn; mod profile_id; pub use content_hint::*; +pub use device_id::*; pub use device_info::*; +pub use device_info_description::*; +pub use device_info_description_uniffi_fn::*; pub use device_info_uniffi_fn::*; pub use header::*; pub use header_uniffi_fn::*; diff --git a/src/profile/v100/header/profile_id.rs b/src/profile/v100/header/profile_id.rs index 8118332f3..da6d81a9a 100644 --- a/src/profile/v100/header/profile_id.rs +++ b/src/profile/v100/header/profile_id.rs @@ -29,11 +29,11 @@ impl FromStr for ProfileID { impl HasSampleValues for ProfileID { fn sample() -> Self { - ProfileID(Uuid::from_bytes([0xff; 16])) + ProfileID(Uuid::sample()) } fn sample_other() -> Self { - ProfileID(Uuid::from_bytes([0xde; 16])) + ProfileID(Uuid::sample_other()) } } diff --git a/src/profile/v100/networks/network/accounts.rs b/src/profile/v100/networks/network/accounts.rs index 94f21337b..e912af791 100644 --- a/src/profile/v100/networks/network/accounts.rs +++ b/src/profile/v100/networks/network/accounts.rs @@ -7,6 +7,14 @@ decl_identified_vec_of!( Account ); +impl OnSameNetworkValidating for Accounts { + type Element = Account; + + fn is_empty(&self) -> bool { + self.len() == 0 + } +} + impl HasSampleValues for Accounts { /// A sample used to facilitate unit tests. fn sample() -> Self { @@ -69,6 +77,69 @@ mod tests { ) } + #[test] + fn test_assert_elements_on_same_network_empty_is_ok_none() { + assert_eq!(SUT::new().assert_elements_on_same_network(), Ok(None)) + } + + #[test] + fn test_assert_elements_not_empty_and_on_same_network_err_if_empty() { + assert_eq!( + SUT::new().assert_elements_not_empty_and_on_same_network(), + Err(CommonError::ExpectedNonEmptyCollection) + ) + } + + #[test] + fn on_same_network_mainnet() { + assert_eq!( + SUT::sample() + .assert_elements_not_empty_and_on_same_network() + .unwrap(), + NetworkID::Mainnet + ) + } + + #[test] + fn on_same_network_throws_error_if_on_different_mainnet_first() { + assert_eq!( + SUT::from_iter([ + Account::sample_mainnet(), + Account::sample_stokenet() + ]) + .assert_elements_not_empty_and_on_same_network(), + Err(CommonError::NetworkDiscrepancy { + expected: NetworkID::Mainnet, + actual: NetworkID::Stokenet + }) + ) + } + + #[test] + fn on_same_network_throws_error_if_on_different_stokenet_first() { + assert_eq!( + SUT::from_iter([ + Account::sample_stokenet(), + Account::sample_mainnet() + ]) + .assert_elements_not_empty_and_on_same_network(), + Err(CommonError::NetworkDiscrepancy { + expected: NetworkID::Stokenet, + actual: NetworkID::Mainnet + }) + ) + } + + #[test] + fn on_same_network_stokenet() { + assert_eq!( + SUT::sample_other() + .assert_elements_not_empty_and_on_same_network() + .unwrap(), + NetworkID::Stokenet + ) + } + #[test] fn with_one() { assert_eq!(SUT::just(Account::sample()).len(), 1) @@ -88,7 +159,7 @@ mod tests { AppearanceID::default(), ); let accounts = SUT::just(account.clone()); - assert_eq!(accounts.get_id(&address), Some(&account)); + assert_eq!(accounts.get_id(address), Some(&account)); } #[test] @@ -97,96 +168,98 @@ mod tests { assert_eq_after_json_roundtrip( &sut, r#" - [ - { - "securityState": { - "unsecuredEntityControl": { - "transactionSigning": { - "badge": { - "virtualSource": { - "hierarchicalDeterministicPublicKey": { - "publicKey": { - "curve": "curve25519", - "compressedData": "18c7409458a82281711b668f833b0485e8fb58a3ceb8a728882bf6b83d3f06a9" - }, - "derivationPath": { - "scheme": "cap26", - "path": "m/44H/1022H/2H/525H/1460H/0H" - } - }, - "discriminator": "hierarchicalDeterministicPublicKey" - }, - "discriminator": "virtualSource" - }, - "factorSourceID": { - "fromHash": { - "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" - }, - "discriminator": "fromHash" - } - } - }, - "discriminator": "unsecured" - }, - "networkID": 2, - "appearanceID": 0, - "flags": [], - "displayName": "Nadia", - "onLedgerSettings": { - "thirdPartyDeposits": { - "depositRule": "acceptAll", - "assetsExceptionList": [], - "depositorsAllowList": [] - } - }, - "address": "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql" - }, - { - "securityState": { - "unsecuredEntityControl": { - "transactionSigning": { - "badge": { - "virtualSource": { - "hierarchicalDeterministicPublicKey": { - "publicKey": { - "curve": "curve25519", - "compressedData": "26b3fd7f65f01ff8e418a56722fde9cc6fc18dc983e0474e6eb6c1cf3bd44f23" - }, - "derivationPath": { - "scheme": "cap26", - "path": "m/44H/1022H/2H/525H/1460H/1H" - } - }, - "discriminator": "hierarchicalDeterministicPublicKey" - }, - "discriminator": "virtualSource" - }, - "factorSourceID": { - "fromHash": { - "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" - }, - "discriminator": "fromHash" - } - } - }, - "discriminator": "unsecured" - }, - "networkID": 2, - "appearanceID": 1, - "flags": ["deletedByUser"], - "displayName": "Olivia", - "onLedgerSettings": { - "thirdPartyDeposits": { - "depositRule": "acceptAll", - "assetsExceptionList": [], - "depositorsAllowList": [] - } - }, - "address": "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" - } - ] + [ + { + "networkID": 2, + "address": "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "displayName": "Nadia", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "535e0b74beffc99d96acd36ae73444c0e35ebb5707f077f9bf1120b1bb8894c0" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/2H/525H/1460H/0H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 2, + "address": "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp", + "displayName": "Olivia", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "436c67c678713be6a4306bf2a64d62d29c9bccb92a776175e5cb6e95e87be55d" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/2H/525H/1460H/1H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [ + "deletedByUser" + ], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + } + ] "#, ); } @@ -197,96 +270,96 @@ mod tests { assert_eq_after_json_roundtrip( &sut, r#" - [ - { - "securityState": { - "unsecuredEntityControl": { - "transactionSigning": { - "badge": { - "virtualSource": { - "hierarchicalDeterministicPublicKey": { - "publicKey": { - "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" - }, - "derivationPath": { - "scheme": "cap26", - "path": "m/44H/1022H/1H/525H/1460H/0H" - } - }, - "discriminator": "hierarchicalDeterministicPublicKey" - }, - "discriminator": "virtualSource" - }, - "factorSourceID": { - "fromHash": { - "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" - }, - "discriminator": "fromHash" - } - } - }, - "discriminator": "unsecured" - }, - "networkID": 1, - "appearanceID": 0, - "flags": [], - "displayName": "Alice", - "onLedgerSettings": { - "thirdPartyDeposits": { - "depositRule": "acceptAll", - "assetsExceptionList": [], - "depositorsAllowList": [] - } - }, - "address": "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8" - }, - { - "securityState": { - "unsecuredEntityControl": { - "transactionSigning": { - "badge": { - "virtualSource": { - "hierarchicalDeterministicPublicKey": { - "publicKey": { - "curve": "curve25519", - "compressedData": "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf" - }, - "derivationPath": { - "scheme": "cap26", - "path": "m/44H/1022H/1H/525H/1460H/1H" - } - }, - "discriminator": "hierarchicalDeterministicPublicKey" - }, - "discriminator": "virtualSource" - }, - "factorSourceID": { - "fromHash": { - "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" - }, - "discriminator": "fromHash" - } - } - }, - "discriminator": "unsecured" - }, - "networkID": 1, - "appearanceID": 1, - "flags": [], - "displayName": "Bob", - "onLedgerSettings": { - "thirdPartyDeposits": { - "depositRule": "acceptAll", - "assetsExceptionList": [], - "depositorsAllowList": [] - } - }, - "address": "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" - } - ] + [ + { + "networkID": 1, + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "displayName": "Alice", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/0H" + } + } + } + } + } + } + }, + "appearanceID": 0, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + }, + { + "networkID": 1, + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", + "displayName": "Bob", + "securityState": { + "discriminator": "unsecured", + "unsecuredEntityControl": { + "transactionSigning": { + "factorSourceID": { + "discriminator": "fromHash", + "fromHash": { + "kind": "device", + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" + } + }, + "badge": { + "discriminator": "virtualSource", + "virtualSource": { + "discriminator": "hierarchicalDeterministicPublicKey", + "hierarchicalDeterministicPublicKey": { + "publicKey": { + "curve": "curve25519", + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" + }, + "derivationPath": { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/1H" + } + } + } + } + } + } + }, + "appearanceID": 1, + "flags": [], + "onLedgerSettings": { + "thirdPartyDeposits": { + "depositRule": "acceptAll", + "assetsExceptionList": [], + "depositorsAllowList": [] + } + } + } + ] "#, ); } diff --git a/src/profile/v100/networks/network/authorized_dapp/authorized_dapp.rs b/src/profile/v100/networks/network/authorized_dapp/authorized_dapp.rs index 61d0c69a4..cdb014e51 100644 --- a/src/profile/v100/networks/network/authorized_dapp/authorized_dapp.rs +++ b/src/profile/v100/networks/network/authorized_dapp/authorized_dapp.rs @@ -206,7 +206,7 @@ mod tests { "displayName": "Radix Dashboard", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -214,8 +214,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -243,7 +243,7 @@ mod tests { } }, { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -251,7 +251,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -294,7 +294,7 @@ mod tests { "displayName": "Gumball Club", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -302,7 +302,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -346,7 +346,7 @@ mod tests { "displayName": "Dev Console", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "identityAddress": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -354,8 +354,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -381,7 +381,7 @@ mod tests { } }, { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -389,7 +389,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -432,7 +432,7 @@ mod tests { "displayName": "Sandbox", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -440,7 +440,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/networks/network/authorized_dapp/authorized_persona_simple.rs b/src/profile/v100/networks/network/authorized_dapp/authorized_persona_simple.rs index beb9cf6d8..2a25ba6d0 100644 --- a/src/profile/v100/networks/network/authorized_dapp/authorized_persona_simple.rs +++ b/src/profile/v100/networks/network/authorized_dapp/authorized_persona_simple.rs @@ -181,7 +181,7 @@ mod tests { &model, r#" { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -189,8 +189,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -228,7 +228,7 @@ mod tests { &model, r#" { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -236,7 +236,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/networks/network/authorized_dapp/shared_to_dapp_with_persona_account_addresses.rs b/src/profile/v100/networks/network/authorized_dapp/shared_to_dapp_with_persona_account_addresses.rs index 398424cb3..541798c36 100644 --- a/src/profile/v100/networks/network/authorized_dapp/shared_to_dapp_with_persona_account_addresses.rs +++ b/src/profile/v100/networks/network/authorized_dapp/shared_to_dapp_with_persona_account_addresses.rs @@ -6,7 +6,7 @@ declare_shared_with_dapp!( SharedToDappWithPersonaAccountAddresses, AccountAddress, "Exactly: 2 - #2 ids shared", - "Exactly: 2 - shared ids: [account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8, account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69]", + "Exactly: 2 - shared ids: [account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87, account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7]", r#" { "request": { @@ -14,8 +14,8 @@ declare_shared_with_dapp!( "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] } "# diff --git a/src/profile/v100/networks/network/authorized_dapps.rs b/src/profile/v100/networks/network/authorized_dapps.rs index a5919980e..c73229ede 100644 --- a/src/profile/v100/networks/network/authorized_dapps.rs +++ b/src/profile/v100/networks/network/authorized_dapps.rs @@ -85,7 +85,7 @@ mod tests { let authorized_dapp = AuthorizedDapp::sample(); let address = authorized_dapp.dapp_definition_address; let authorized_dapps = AuthorizedDapps::just(authorized_dapp.clone()); - assert_eq!(authorized_dapps.get_id(&address), Some(&authorized_dapp)); + assert_eq!(authorized_dapps.get_id(address), Some(&authorized_dapp)); } #[test] @@ -101,7 +101,7 @@ mod tests { "displayName": "Radix Dashboard", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -109,8 +109,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -138,7 +138,7 @@ mod tests { } }, { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -146,7 +146,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -179,7 +179,7 @@ mod tests { "displayName": "Gumball Club", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -187,7 +187,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -232,7 +232,7 @@ mod tests { "displayName": "Dev Console", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "identityAddress": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -240,8 +240,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -267,7 +267,7 @@ mod tests { } }, { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -275,7 +275,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -308,7 +308,7 @@ mod tests { "displayName": "Sandbox", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -316,7 +316,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/networks/network/personas.rs b/src/profile/v100/networks/network/personas.rs index 0fec49d41..6db3eb890 100644 --- a/src/profile/v100/networks/network/personas.rs +++ b/src/profile/v100/networks/network/personas.rs @@ -81,7 +81,7 @@ mod tests { let persona = Persona::sample(); let address = persona.address; let personas = Personas::just(persona.clone()); - assert_eq!(personas.get_id(&address), Some(&persona)); + assert_eq!(personas.get_id(address), Some(&persona)); } #[test] @@ -93,7 +93,7 @@ mod tests { [ { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "Satoshi", "securityState": { "discriminator": "unsecured", @@ -103,7 +103,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -113,7 +113,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", @@ -160,7 +160,7 @@ mod tests { }, { "networkID": 1, - "address": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "address": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "displayName": "Batman", "securityState": { "discriminator": "unsecured", @@ -170,7 +170,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -180,7 +180,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "1fe80badc0520334ee339e4010491d417ca3aed0c9621698b10655529f0ee506" + "compressedData": "675aa54df762f24df8f6b38122e75058a18fe55a3dbb030b4c0bb504bacc7e81" }, "derivationPath": { "scheme": "cap26", @@ -231,7 +231,7 @@ mod tests { [ { "networkID": 2, - "address": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "address": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "displayName": "Skywalker", "securityState": { "discriminator": "unsecured", @@ -241,7 +241,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -251,7 +251,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "3c4d6f1267485854313c1ed81aea193b8f750cd081e3aa4dea29b93c34ca2261" + "compressedData": "d3dd2992834813ba76d6619021560b759e81f7391a5cdbb8478feb3bfa8cb9e4" }, "derivationPath": { "scheme": "cap26", @@ -290,7 +290,7 @@ mod tests { }, { "networkID": 2, - "address": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "address": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "displayName": "Granger", "securityState": { "discriminator": "unsecured", @@ -300,7 +300,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -310,7 +310,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "b6885032393165d56cce19850c2a3dbb80733d21c78c7314223e9c3a75f64c8d" + "compressedData": "c287e135eac194e4d6b6c65a2545988686b941509043bab026ef9717fd6b4f4e" }, "derivationPath": { "scheme": "cap26", diff --git a/src/profile/v100/networks/network/profile_network.rs b/src/profile/v100/networks/network/profile_network.rs index b553db527..ab917c15f 100644 --- a/src/profile/v100/networks/network/profile_network.rs +++ b/src/profile/v100/networks/network/profile_network.rs @@ -65,10 +65,12 @@ impl Identifiable for ProfileNetwork { } impl ProfileNetwork { - /// Instantiates a new `Network` from `network_id` and `accounts`. + /// Instantiates a new `ProfileNetwork` from `network_id`, `accounts`, `personas` + /// and `authorized_dapps`. /// - /// Panics if not any account in `accounts` is on another - /// network than `network_id` + /// # Panic + /// Panics if not all account in `accounts` are on network with id `network_id`, + /// and same for `personas` and `authorized_dapps`. pub fn new( network_id: impl Into, accounts: impl Into, @@ -107,6 +109,17 @@ impl ProfileNetwork { authorized_dapps, } } + + /// Instantiates a new empty `ProfileNetwork` from `network_id`, i.e. + /// Accounts, Personas, AuthorizedDapps all being empty. + pub fn new_empty_on(network_id: impl Into) -> Self { + Self::new( + network_id, + Accounts::new(), + Personas::new(), + AuthorizedDapps::new(), + ) + } } impl ProfileNetwork { @@ -256,7 +269,7 @@ mod tests { "accounts": [ { "networkID": 1, - "address": "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", "displayName": "Alice", "securityState": { "discriminator": "unsecured", @@ -266,7 +279,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -276,7 +289,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -300,7 +313,7 @@ mod tests { }, { "networkID": 1, - "address": "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69", + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", "displayName": "Bob", "securityState": { "discriminator": "unsecured", @@ -310,7 +323,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -320,7 +333,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf" + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" }, "derivationPath": { "scheme": "cap26", @@ -346,7 +359,7 @@ mod tests { "personas": [ { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "Satoshi", "securityState": { "discriminator": "unsecured", @@ -356,7 +369,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -366,7 +379,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", @@ -413,7 +426,7 @@ mod tests { }, { "networkID": 1, - "address": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "address": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "displayName": "Batman", "securityState": { "discriminator": "unsecured", @@ -423,7 +436,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -433,7 +446,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "1fe80badc0520334ee339e4010491d417ca3aed0c9621698b10655529f0ee506" + "compressedData": "675aa54df762f24df8f6b38122e75058a18fe55a3dbb030b4c0bb504bacc7e81" }, "derivationPath": { "scheme": "cap26", @@ -478,7 +491,7 @@ mod tests { "displayName": "Radix Dashboard", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -486,8 +499,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -515,7 +528,7 @@ mod tests { } }, { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -523,7 +536,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -556,7 +569,7 @@ mod tests { "displayName": "Gumball Club", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -564,7 +577,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -608,7 +621,7 @@ mod tests { "accounts": [ { "networkID": 2, - "address": "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", + "address": "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", "displayName": "Nadia", "securityState": { "discriminator": "unsecured", @@ -618,7 +631,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -628,7 +641,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "18c7409458a82281711b668f833b0485e8fb58a3ceb8a728882bf6b83d3f06a9" + "compressedData": "535e0b74beffc99d96acd36ae73444c0e35ebb5707f077f9bf1120b1bb8894c0" }, "derivationPath": { "scheme": "cap26", @@ -652,7 +665,7 @@ mod tests { }, { "networkID": 2, - "address": "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr", + "address": "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp", "displayName": "Olivia", "securityState": { "discriminator": "unsecured", @@ -662,7 +675,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -672,7 +685,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "26b3fd7f65f01ff8e418a56722fde9cc6fc18dc983e0474e6eb6c1cf3bd44f23" + "compressedData": "436c67c678713be6a4306bf2a64d62d29c9bccb92a776175e5cb6e95e87be55d" }, "derivationPath": { "scheme": "cap26", @@ -700,7 +713,7 @@ mod tests { "personas": [ { "networkID": 2, - "address": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "address": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "displayName": "Skywalker", "securityState": { "discriminator": "unsecured", @@ -710,7 +723,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -720,7 +733,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "3c4d6f1267485854313c1ed81aea193b8f750cd081e3aa4dea29b93c34ca2261" + "compressedData": "d3dd2992834813ba76d6619021560b759e81f7391a5cdbb8478feb3bfa8cb9e4" }, "derivationPath": { "scheme": "cap26", @@ -759,7 +772,7 @@ mod tests { }, { "networkID": 2, - "address": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "address": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "displayName": "Granger", "securityState": { "discriminator": "unsecured", @@ -769,7 +782,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -779,7 +792,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "b6885032393165d56cce19850c2a3dbb80733d21c78c7314223e9c3a75f64c8d" + "compressedData": "c287e135eac194e4d6b6c65a2545988686b941509043bab026ef9717fd6b4f4e" }, "derivationPath": { "scheme": "cap26", @@ -826,7 +839,7 @@ mod tests { "displayName": "Dev Console", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "identityAddress": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -834,8 +847,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -861,7 +874,7 @@ mod tests { } }, { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -869,7 +882,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -902,7 +915,7 @@ mod tests { "displayName": "Sandbox", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -910,7 +923,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/networks/profile_networks.rs b/src/profile/v100/networks/profile_networks.rs index 9136cee25..2a4a1b896 100644 --- a/src/profile/v100/networks/profile_networks.rs +++ b/src/profile/v100/networks/profile_networks.rs @@ -9,7 +9,7 @@ decl_identified_vec_of!( impl ProfileNetworks { pub fn get_account(&self, address: &AccountAddress) -> Option { - self.get_id(&address.network_id()) + self.get_id(address.network_id()) .and_then(|n| n.accounts.get_id(address)) .cloned() } @@ -23,7 +23,7 @@ impl ProfileNetworks { where F: FnMut(&mut Account), { - self.update_with(&address.network_id(), |n| { + self.update_with(address.network_id(), |n| { _ = n.update_account(address, |a| mutate(a)) }); self.get_account(address) @@ -57,24 +57,39 @@ impl HasSampleValues for ProfileNetworks { mod tests { use super::*; + #[allow(clippy::upper_case_acronyms)] + type SUT = ProfileNetworks; + #[test] fn inequality() { - assert_ne!(ProfileNetworks::sample(), ProfileNetworks::sample_other()); + assert_ne!(SUT::sample(), SUT::sample_other()); } #[test] fn equality() { - assert_eq!(ProfileNetworks::sample(), ProfileNetworks::sample()); - assert_eq!( - ProfileNetworks::sample_other(), - ProfileNetworks::sample_other() - ); + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn append_is_noop_if_already_contains() { + let mut sut = SUT::sample(); + assert_eq!(sut.len(), 2); + assert_eq!(sut[1].accounts.len(), 2); + + let outcome = + sut.append(ProfileNetwork::new_empty_on(NetworkID::Stokenet)); + assert_eq!(outcome, (false, 1)); + + // assert NOOP + assert_eq!(sut.len(), 2); + assert_eq!(sut[1].accounts.len(), 2); } #[test] fn duplicates_are_prevented() { assert_eq!( - ProfileNetworks::from_iter( + SUT::from_iter( [ProfileNetwork::sample(), ProfileNetwork::sample()] .into_iter() ) @@ -85,7 +100,7 @@ mod tests { #[test] fn duplicates_are_prevented_and_first_added_is_retained() { - let mut sut = ProfileNetworks::from_iter([ProfileNetwork::new( + let mut sut = SUT::from_iter([ProfileNetwork::new( NetworkID::Mainnet, Accounts::from_iter([ Account::sample_mainnet_alice(), @@ -105,7 +120,7 @@ mod tests { ); assert_eq!( - sut.get_id(&NetworkID::Mainnet).unwrap().accounts.items(), + sut.get_id(NetworkID::Mainnet).unwrap().accounts.items(), [ Account::sample_mainnet_alice(), Account::sample_mainnet_bob() @@ -115,14 +130,14 @@ mod tests { #[test] fn update_account() { - let mut sut = ProfileNetworks::sample(); + let mut sut = SUT::sample(); let id = &NetworkID::Mainnet; let account_address = Account::sample().address; assert_eq!( sut.get_id(id) .unwrap() .accounts - .get_id(&account_address) + .get_id(account_address) .unwrap() .display_name .value, @@ -137,7 +152,7 @@ mod tests { sut.get_id(id) .unwrap() .accounts - .get_id(&account_address) + .get_id(account_address) .unwrap() .display_name .value, @@ -147,11 +162,11 @@ mod tests { #[test] fn update_account_unknown_network() { - let mut sut = ProfileNetworks::sample(); + let mut sut = SUT::sample(); let id = &NetworkID::Mainnet; let account_address = Account::sample_nebunet().address; assert_eq!( - sut.get_id(id).unwrap().accounts.get_id(&account_address), + sut.get_id(id).unwrap().accounts.get_id(account_address), None ); @@ -162,16 +177,16 @@ mod tests { .is_none()); // Assert unchanged - assert_eq!(sut, ProfileNetworks::sample()); + assert_eq!(sut, SUT::sample()); } #[test] fn update_account_unknown_account() { - let mut sut = ProfileNetworks::sample(); + let mut sut = SUT::sample(); let id = &NetworkID::Mainnet; let account_address = Account::sample_mainnet_carol().address; assert_eq!( - sut.get_id(id).unwrap().accounts.get_id(&account_address), + sut.get_id(id).unwrap().accounts.get_id(account_address), None ); @@ -182,7 +197,7 @@ mod tests { .is_none()); // Assert unchanged - assert_eq!(sut, ProfileNetworks::sample()); + assert_eq!(sut, SUT::sample()); } #[test] @@ -193,20 +208,20 @@ mod tests { Personas::default(), AuthorizedDapps::default(), ); - assert_eq!(ProfileNetworks::just(network).len(), 1); + assert_eq!(SUT::just(network).len(), 1); } #[test] fn content_hint() { assert_eq!( - ProfileNetworks::sample().content_hint(), + SUT::sample().content_hint(), ContentHint::with_counters(4, 0, 2) ); } #[test] fn json_roundtrip() { - let sut = ProfileNetworks::sample(); + let sut = SUT::sample(); assert_eq_after_json_roundtrip( &sut, r#" @@ -216,7 +231,7 @@ mod tests { "accounts": [ { "networkID": 1, - "address": "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", "displayName": "Alice", "securityState": { "discriminator": "unsecured", @@ -226,7 +241,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -236,7 +251,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -260,7 +275,7 @@ mod tests { }, { "networkID": 1, - "address": "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69", + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", "displayName": "Bob", "securityState": { "discriminator": "unsecured", @@ -270,7 +285,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -280,7 +295,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf" + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" }, "derivationPath": { "scheme": "cap26", @@ -306,7 +321,7 @@ mod tests { "personas": [ { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "Satoshi", "securityState": { "discriminator": "unsecured", @@ -316,7 +331,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -326,7 +341,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", @@ -373,7 +388,7 @@ mod tests { }, { "networkID": 1, - "address": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "address": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "displayName": "Batman", "securityState": { "discriminator": "unsecured", @@ -383,7 +398,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -393,7 +408,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "1fe80badc0520334ee339e4010491d417ca3aed0c9621698b10655529f0ee506" + "compressedData": "675aa54df762f24df8f6b38122e75058a18fe55a3dbb030b4c0bb504bacc7e81" }, "derivationPath": { "scheme": "cap26", @@ -438,7 +453,7 @@ mod tests { "displayName": "Radix Dashboard", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -446,8 +461,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -475,7 +490,7 @@ mod tests { } }, { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -483,7 +498,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -516,7 +531,7 @@ mod tests { "displayName": "Gumball Club", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -524,7 +539,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -558,7 +573,7 @@ mod tests { "accounts": [ { "networkID": 2, - "address": "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", + "address": "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", "displayName": "Nadia", "securityState": { "discriminator": "unsecured", @@ -568,7 +583,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -578,7 +593,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "18c7409458a82281711b668f833b0485e8fb58a3ceb8a728882bf6b83d3f06a9" + "compressedData": "535e0b74beffc99d96acd36ae73444c0e35ebb5707f077f9bf1120b1bb8894c0" }, "derivationPath": { "scheme": "cap26", @@ -602,7 +617,7 @@ mod tests { }, { "networkID": 2, - "address": "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr", + "address": "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp", "displayName": "Olivia", "securityState": { "discriminator": "unsecured", @@ -612,7 +627,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -622,7 +637,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "26b3fd7f65f01ff8e418a56722fde9cc6fc18dc983e0474e6eb6c1cf3bd44f23" + "compressedData": "436c67c678713be6a4306bf2a64d62d29c9bccb92a776175e5cb6e95e87be55d" }, "derivationPath": { "scheme": "cap26", @@ -650,7 +665,7 @@ mod tests { "personas": [ { "networkID": 2, - "address": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "address": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "displayName": "Skywalker", "securityState": { "discriminator": "unsecured", @@ -660,7 +675,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -670,7 +685,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "3c4d6f1267485854313c1ed81aea193b8f750cd081e3aa4dea29b93c34ca2261" + "compressedData": "d3dd2992834813ba76d6619021560b759e81f7391a5cdbb8478feb3bfa8cb9e4" }, "derivationPath": { "scheme": "cap26", @@ -709,7 +724,7 @@ mod tests { }, { "networkID": 2, - "address": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "address": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "displayName": "Granger", "securityState": { "discriminator": "unsecured", @@ -719,7 +734,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -729,7 +744,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "b6885032393165d56cce19850c2a3dbb80733d21c78c7314223e9c3a75f64c8d" + "compressedData": "c287e135eac194e4d6b6c65a2545988686b941509043bab026ef9717fd6b4f4e" }, "derivationPath": { "scheme": "cap26", @@ -776,7 +791,7 @@ mod tests { "displayName": "Dev Console", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "identityAddress": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -784,8 +799,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -811,7 +826,7 @@ mod tests { } }, { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -819,7 +834,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -852,7 +867,7 @@ mod tests { "displayName": "Sandbox", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -860,7 +875,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/profile.rs b/src/profile/v100/profile.rs index 7a9c95e95..a185ab2ba 100644 --- a/src/profile/v100/profile.rs +++ b/src/profile/v100/profile.rs @@ -1,9 +1,11 @@ use crate::prelude::*; -/// Representation of the Radix Wallet, contains a list of -/// users Accounts, Personas, Authorized Dapps per network -/// the user has used. It also contains all FactorSources, -/// FactorInstances and wallet App preferences. +/// The canonical representation of a users accounts, personas, +/// authorized dapps, security factors, settings and more. +/// +/// This large structure of values is called 'wallet backup data' +/// in user facing tests in host applications, but internally at +/// RDX Works known as "the Profile". /// /// ``` /// extern crate sargon; @@ -86,26 +88,68 @@ impl Profile { } impl Profile { - /// Creates a new Profile from the `DeviceFactorSource`, without any - /// networks (thus no accounts), with creating device info as "unknown". - pub fn new( + /// Creates a new Profile from the `DeviceFactorSource` and `DeviceInfo`. + /// + /// The Profile is initialized with a Mainnet ProfileNetwork, which is + /// "empty" (no Accounts, Personas etc). + /// + /// # Panics + /// Panics if the `device_factor_source` is not a BDFS and not marked "main". + pub fn from_device_factor_source( device_factor_source: DeviceFactorSource, - creating_device_name: impl AsRef, + host_id: HostId, + host_info: HostInfo, ) -> Self { - let creating_device_name = creating_device_name.as_ref(); - let creating_device = DeviceInfo::with_description( - format!( - "{} - {}", - creating_device_name, device_factor_source.hint.model - ) - .as_str(), - ); - let header = Header::new(creating_device); + if !device_factor_source.is_main_bdfs() { + panic!("DeviceFactorSource is not main BDFS"); + } + let bdfs = device_factor_source; + let header = + Header::new(DeviceInfo::new_from_info(&host_id, &host_info)); Self::with( header, - FactorSources::with_bdfs(device_factor_source), + FactorSources::with_bdfs(bdfs), AppPreferences::default(), - ProfileNetworks::new(), + ProfileNetworks::just(ProfileNetwork::new_empty_on( + NetworkID::Mainnet, + )), + ) + } + + /// Creates a new Profile from the `MnemonicWithPassphrase` and `DeviceInfo`, + /// by initializing a `DeviceFactorInstance` using `DeviceInfo` as source for + /// `DeviceFactorSourceHint` which will be the BDFS of the Profile. + /// + /// The Profile is initialized with a Mainnet ProfileNetwork, which is + /// "empty" (no Accounts, Personas etc). + pub fn from_mnemonic_with_passphrase( + mnemonic_with_passphrase: MnemonicWithPassphrase, + host_id: HostId, + host_info: HostInfo, + ) -> Self { + let bdfs = DeviceFactorSource::babylon( + true, + &mnemonic_with_passphrase, + &host_info, + ); + Self::from_device_factor_source(bdfs, host_id, host_info) + } + + /// Creates a new Profile from the `Mnemonic` (no passphrase) and `DeviceInfo`, + /// by initializing a `DeviceFactorInstance` using `DeviceInfo` as source for + /// `DeviceFactorSourceHint` which will be the BDFS of the Profile. + /// + /// The Profile is initialized with a Mainnet ProfileNetwork, which is + /// "empty" (no Accounts, Personas etc). + pub fn new( + mnemonic: Mnemonic, + host_id: HostId, + host_info: HostInfo, + ) -> Self { + Self::from_mnemonic_with_passphrase( + MnemonicWithPassphrase::new(mnemonic), + host_id, + host_info, ) } @@ -118,6 +162,7 @@ impl Profile { if factor_sources.is_empty() { panic!("FactorSources MUST NOT be empty.") } + debug!("Creating new Profile, header: {:?}", &header); Self { header, factor_sources, @@ -168,6 +213,39 @@ impl Profile { self.networks.update_account(address, mutate) } + pub fn update_last_used_of_factor_source( + &mut self, + id: &FactorSourceID, + ) -> Result<()> { + self.update_any_factor_source_common(id, |common| { + common.last_used_on = now(); + }) + } + + pub fn update_factor_source_remove_flag_main( + &mut self, + id: &FactorSourceID, + ) -> Result<()> { + self.update_any_factor_source_common(id, |common| { + common.flags.remove_id(&FactorSourceFlag::Main); + }) + } + + pub fn update_any_factor_source_common( + &mut self, + factor_source_id: &FactorSourceID, + mut mutate: F, + ) -> Result<()> + where + F: FnMut(&mut FactorSourceCommon), + { + self.update_any_factor_source(factor_source_id, |fs| { + let mut common = fs.common_properties(); + mutate(&mut common); + fs.set_common_properties(common); + }) + } + pub fn update_factor_source( &mut self, factor_source_id: &FactorSourceID, @@ -189,6 +267,18 @@ impl Profile { }) }) } + + pub fn update_any_factor_source( + &mut self, + factor_source_id: &FactorSourceID, + mutate: F, + ) -> Result<()> + where + F: FnMut(&mut FactorSource), + { + self.factor_sources + .try_update_with(factor_source_id, mutate) + } } impl ProtoProfileMaybeWithLegacyP2PLinks { @@ -278,6 +368,18 @@ mod tests { assert_eq!(SUT::sample_other(), SUT::sample_other()); } + #[test] + fn new_creates_empty_mainnet_network() { + let sut = + SUT::new(Mnemonic::sample(), HostId::sample(), HostInfo::sample()); + assert_eq!( + sut.networks, + ProfileNetworks::just(ProfileNetwork::new_empty_on( + NetworkID::Mainnet + )) + ); + } + #[should_panic(expected = "FactorSources MUST NOT be empty.")] #[test] fn not_allowed_to_create_profile_with_empty_factor_source() { @@ -320,6 +422,16 @@ mod tests { ); } + #[test] + #[should_panic(expected = "DeviceFactorSource is not main BDFS")] + fn new_from_non_main_bdfs_panics() { + let _ = SUT::from_device_factor_source( + DeviceFactorSource::sample_other(), + HostId::sample(), + HostInfo::sample(), + ); + } + #[test] fn update_factor_source_not_update_when_factor_source_not_found() { let mut sut = SUT::sample(); @@ -339,9 +451,9 @@ mod tests { fn change_supported_curve_of_factor_source() { let mut sut = SUT::sample(); let id: &FactorSourceID = &DeviceFactorSource::sample().id.into(); - assert!(sut - .factor_sources - .contains_id(&DeviceFactorSource::sample().id.into())); + assert!(sut.factor_sources.contains_id(FactorSourceID::from( + DeviceFactorSource::sample().id + ))); assert_eq!( sut.factor_sources @@ -393,9 +505,9 @@ mod tests { let mut sut = SUT::sample(); let id: &FactorSourceID = &DeviceFactorSource::sample().id.into(); - assert!(sut - .factor_sources - .contains_id(&DeviceFactorSource::sample().id.into())); + assert!(sut.factor_sources.contains_id(FactorSourceID::from( + DeviceFactorSource::sample().id + ))); assert_eq!( sut.factor_sources @@ -467,7 +579,7 @@ mod tests { let mut sut = SUT::sample(); let account = sut .networks - .get_id(&NetworkID::Mainnet) + .get_id(NetworkID::Mainnet) .unwrap() .accounts .get_at_index(0) @@ -482,7 +594,7 @@ mod tests { assert_eq!( sut.networks - .get_id(&NetworkID::Mainnet) + .get_id(NetworkID::Mainnet) .unwrap() .accounts .get_at_index(0) @@ -499,12 +611,9 @@ mod tests { let set = (0..n) .map(|_| { SUT::new( - PrivateHierarchicalDeterministicFactorSource::generate_new_babylon( - true, - WalletClientModel::Unknown, - ) - .factor_source, - "Foo", + Mnemonic::generate_new(), + HostId::sample(), + HostInfo::sample(), ) }) .collect::>(); @@ -659,12 +768,12 @@ mod tests { "creatingDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastUsedOnDevice": { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", "date": "2023-09-11T16:05:56.000Z", - "description": "iPhone" + "description": "iPhone (iPhone)" }, "lastModified": "2023-09-11T16:05:56.000Z", "contentHint": { @@ -679,7 +788,7 @@ mod tests { "device": { "id": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" }, "common": { "cryptoParameters": { @@ -697,9 +806,12 @@ mod tests { ] }, "hint": { - "name": "Unknown Name", - "model": "iPhone", - "mnemonicWordCount": 24 + "name": "My precious", + "model": "iPhone SE 2nd gen", + "mnemonicWordCount": 24, + "systemVersion": "iOS 17.4.1", + "hostAppVersion": "1.6.4", + "hostVendor": "Apple" } } }, @@ -708,7 +820,7 @@ mod tests { "ledgerHQHardwareWallet": { "id": { "kind": "ledgerHQHardwareWallet", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "ab59987eedd181fe98e512c1ba0f5ff059f11b5c7c56f15614dcc9fe03fec58b" }, "common": { "cryptoParameters": { @@ -721,9 +833,7 @@ mod tests { }, "addedOn": "2023-09-11T16:05:56.000Z", "lastUsedOn": "2023-09-11T16:05:56.000Z", - "flags": [ - "main" - ] + "flags": [] }, "hint": { "name": "Orange, scratched", @@ -738,16 +848,8 @@ mod tests { "fiatCurrencyPriceTarget": "usd" }, "gateways": { - "current": "https://rcnet-v3.radixdlt.com/", + "current": "https://mainnet.radixdlt.com/", "saved": [ - { - "network": { - "name": "zabanet", - "id": 14, - "displayDescription": "RCnet-V3 (Test Network)" - }, - "url": "https://rcnet-v3.radixdlt.com/" - }, { "network": { "name": "mainnet", @@ -769,7 +871,7 @@ mod tests { "security": { "isCloudProfileSyncEnabled": true, "isDeveloperModeEnabled": true, - "structureConfigurationReferences": [] + "securityStructuresOfFactorSourceIDs": [] }, "transaction": { "defaultDepositGuarantee": "0.975" @@ -781,7 +883,7 @@ mod tests { "accounts": [ { "networkID": 1, - "address": "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", + "address": "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", "displayName": "Alice", "securityState": { "discriminator": "unsecured", @@ -791,7 +893,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -801,7 +903,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "d24cc6af91c3f103d7f46e5691ce2af9fea7d90cfb89a89d5bba4b513b34be3b" + "compressedData": "c05f9fa53f203a01cbe43e89086cae29f6c7cdd5a435daa9e52b69e656739b36" }, "derivationPath": { "scheme": "cap26", @@ -825,7 +927,7 @@ mod tests { }, { "networkID": 1, - "address": "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69", + "address": "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7", "displayName": "Bob", "securityState": { "discriminator": "unsecured", @@ -835,7 +937,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -845,7 +947,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "08740a2fd178c40ce71966a6537f780978f7f00548cfb59196344b5d7d67e9cf" + "compressedData": "a3a14ce3c0e549ac35f1875738c243bb6f4037f08d7d2a52ef749091a92a0c71" }, "derivationPath": { "scheme": "cap26", @@ -871,7 +973,7 @@ mod tests { "personas": [ { "networkID": 1, - "address": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "address": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "displayName": "Satoshi", "securityState": { "discriminator": "unsecured", @@ -881,7 +983,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -891,7 +993,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "983ab1d3a77dd6b30bb8a5d59d490a0380cc0aa9ab464983d3fc581fcf64543f" + "compressedData": "e284e28bfca2103d554854d7cce822a2682610eb16b4c27bcd1b9cbd78bb931a" }, "derivationPath": { "scheme": "cap26", @@ -938,7 +1040,7 @@ mod tests { }, { "networkID": 1, - "address": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "address": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "displayName": "Batman", "securityState": { "discriminator": "unsecured", @@ -948,7 +1050,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -958,7 +1060,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "1fe80badc0520334ee339e4010491d417ca3aed0c9621698b10655529f0ee506" + "compressedData": "675aa54df762f24df8f6b38122e75058a18fe55a3dbb030b4c0bb504bacc7e81" }, "derivationPath": { "scheme": "cap26", @@ -1003,7 +1105,7 @@ mod tests { "displayName": "Radix Dashboard", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx122kttqch0eehzj6f9nkkxcw7msfeg9udurq5u0ysa0e92c59w0mg6x", + "identityAddress": "identity_rdx122yy9pkfdrkam4evxcwh235c4qc52wujkwnt52q7vqxefhnlen489g", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1011,8 +1113,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8", - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87", + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -1040,7 +1142,7 @@ mod tests { } }, { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1048,7 +1150,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -1081,7 +1183,7 @@ mod tests { "displayName": "Gumball Club", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_rdx12gcd4r799jpvztlffgw483pqcen98pjnay988n8rmscdswd872xy62", + "identityAddress": "identity_rdx12tw6rt9c4l56rz6p866e35tmzp556nymxmpj8hagfewq82kspctdyw", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1089,7 +1191,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69" + "account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7" ] }, "sharedPersonaData": { @@ -1123,7 +1225,7 @@ mod tests { "accounts": [ { "networkID": 2, - "address": "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", + "address": "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", "displayName": "Nadia", "securityState": { "discriminator": "unsecured", @@ -1133,7 +1235,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -1143,7 +1245,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "18c7409458a82281711b668f833b0485e8fb58a3ceb8a728882bf6b83d3f06a9" + "compressedData": "535e0b74beffc99d96acd36ae73444c0e35ebb5707f077f9bf1120b1bb8894c0" }, "derivationPath": { "scheme": "cap26", @@ -1167,7 +1269,7 @@ mod tests { }, { "networkID": 2, - "address": "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr", + "address": "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp", "displayName": "Olivia", "securityState": { "discriminator": "unsecured", @@ -1177,7 +1279,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -1187,7 +1289,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "26b3fd7f65f01ff8e418a56722fde9cc6fc18dc983e0474e6eb6c1cf3bd44f23" + "compressedData": "436c67c678713be6a4306bf2a64d62d29c9bccb92a776175e5cb6e95e87be55d" }, "derivationPath": { "scheme": "cap26", @@ -1215,7 +1317,7 @@ mod tests { "personas": [ { "networkID": 2, - "address": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "address": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "displayName": "Skywalker", "securityState": { "discriminator": "unsecured", @@ -1225,7 +1327,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -1235,7 +1337,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "3c4d6f1267485854313c1ed81aea193b8f750cd081e3aa4dea29b93c34ca2261" + "compressedData": "d3dd2992834813ba76d6619021560b759e81f7391a5cdbb8478feb3bfa8cb9e4" }, "derivationPath": { "scheme": "cap26", @@ -1274,7 +1376,7 @@ mod tests { }, { "networkID": 2, - "address": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "address": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "displayName": "Granger", "securityState": { "discriminator": "unsecured", @@ -1284,7 +1386,7 @@ mod tests { "discriminator": "fromHash", "fromHash": { "kind": "device", - "body": "3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "body": "f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" } }, "badge": { @@ -1294,7 +1396,7 @@ mod tests { "hierarchicalDeterministicPublicKey": { "publicKey": { "curve": "curve25519", - "compressedData": "b6885032393165d56cce19850c2a3dbb80733d21c78c7314223e9c3a75f64c8d" + "compressedData": "c287e135eac194e4d6b6c65a2545988686b941509043bab026ef9717fd6b4f4e" }, "derivationPath": { "scheme": "cap26", @@ -1341,7 +1443,7 @@ mod tests { "displayName": "Dev Console", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12fk6qyu2860xyx2jk7j6ex464ccrnxrve4kpaa8qyxx99y5627ahhc", + "identityAddress": "identity_tdx_2_122r7248dkyjwt2kxf36de26w7htdwpzsm3lyjr4p0nvrgwn025dds8", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1349,8 +1451,8 @@ mod tests { "quantity": 2 }, "ids": [ - "account_tdx_2_1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql4kxceql", - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4pqn48m", + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -1376,7 +1478,7 @@ mod tests { } }, { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1384,7 +1486,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { @@ -1417,7 +1519,7 @@ mod tests { "displayName": "Sandbox", "referencesToAuthorizedPersonas": [ { - "identityAddress": "identity_tdx_2_12gr0d9da3jvye7mdrreljyqs35esjyjsl9r8t5v96hq6fq367cln08", + "identityAddress": "identity_tdx_2_12tltwh00wvvur4yymv63pwhhwhjzvu4za2fy7vnyue36v5dtq3pgvq", "lastLogin": "2024-01-31T14:23:45.000Z", "sharedAccounts": { "request": { @@ -1425,7 +1527,7 @@ mod tests { "quantity": 1 }, "ids": [ - "account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr" + "account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp" ] }, "sharedPersonaData": { diff --git a/src/profile/v100/profile_uniffi_fn.rs b/src/profile/v100/profile_uniffi_fn.rs index 3f0b8da00..a5fde7958 100644 --- a/src/profile/v100/profile_uniffi_fn.rs +++ b/src/profile/v100/profile_uniffi_fn.rs @@ -32,12 +32,24 @@ impl Profile { } } +#[uniffi::export] +pub fn new_profile_with_mnemonic( + mnemonic: Mnemonic, + host_id: HostId, + host_info: HostInfo, +) -> Profile { + Profile::new(mnemonic, host_id, host_info) +} + +/// # Panics +/// Panics if `device_factor_source` is not a main BDFS. #[uniffi::export] pub fn new_profile( device_factor_source: DeviceFactorSource, - creating_device_name: String, + host_id: HostId, + host_info: HostInfo, ) -> Profile { - Profile::new(device_factor_source, creating_device_name.as_str()) + Profile::from_device_factor_source(device_factor_source, host_id, host_info) } #[uniffi::export] @@ -134,12 +146,33 @@ mod uniffi_tests { ) } + #[test] + fn test_new_with_mnemonic() { + assert_eq!( + new_profile_with_mnemonic( + Mnemonic::sample(), + HostId::sample(), + HostInfo::sample() + ) + .bdfs() + .id, + Profile::new( + Mnemonic::sample(), + HostId::sample(), + HostInfo::sample() + ) + .bdfs() + .id, + ); + } + #[test] fn new_private_hd() { let private = PrivateHierarchicalDeterministicFactorSource::sample(); - let lhs = super::new_profile( + let lhs = new_profile( private.factor_source.clone(), - "iPhone".to_string(), + HostId::sample(), + HostInfo::sample(), ); assert_eq!( lhs.bdfs().factor_source_id(), @@ -149,8 +182,8 @@ mod uniffi_tests { #[test] fn to_string_and_debug_string() { - assert_eq!(profile_to_string(&SUT::sample()).len(), 4314); - assert_eq!(profile_to_debug_string(&SUT::sample()).len(), 27076); + assert_eq!(profile_to_string(&SUT::sample()).len(), 4292); + assert_eq!(profile_to_debug_string(&SUT::sample()).len(), 27145); assert_ne!( profile_to_debug_string(&SUT::sample()), profile_to_debug_string(&SUT::sample_other()) diff --git a/src/radix_connect/mobile/client.rs b/src/radix_connect/mobile/client.rs index 372d8ab4d..ec4a984e8 100644 --- a/src/radix_connect/mobile/client.rs +++ b/src/radix_connect/mobile/client.rs @@ -42,12 +42,12 @@ impl RadixConnectMobile { impl RadixConnectMobile { #[uniffi::constructor] pub fn new( - network_antenna: Arc, + networking_driver: Arc, session_storage: Arc, ) -> Self { Self::init( - Arc::new(RelayService::new_with_network_antenna( - network_antenna.clone(), + Arc::new(RelayService::new_with_networking_driver( + networking_driver.clone(), )), session_storage, ) diff --git a/src/radix_connect/mobile/relay_service/service.rs b/src/radix_connect/mobile/relay_service/service.rs index 888dadc0f..70527f871 100644 --- a/src/radix_connect/mobile/relay_service/service.rs +++ b/src/radix_connect/mobile/relay_service/service.rs @@ -29,10 +29,10 @@ impl Service { } } - pub fn new_with_network_antenna( - network_antenna: Arc, + pub fn new_with_networking_driver( + networking_driver: Arc, ) -> Self { - Self::new(HttpClient::new(network_antenna)) + Self::new(HttpClient::new(networking_driver)) } } @@ -61,7 +61,7 @@ impl WalletInteractionTransport for Service { wallet_to_dapp_interaction_response_to_json_bytes(&response); let mut encryption_key = session.encryption_key; - let encrypted_response: Vec = self + let encrypted_response = self .encryption_scheme .encrypt(serialized_response.to_vec(), &mut encryption_key); @@ -82,13 +82,15 @@ impl WalletInteractionTransport for Service { #[cfg(test)] impl Service { fn new_always_failing() -> Self { - Self::new_with_network_antenna(Arc::new( - MockAntenna::new_always_failing(), + Self::new_with_networking_driver(Arc::new( + MockNetworkingDriver::new_always_failing(), )) } fn new_succeeding_http_client(request: Vec) -> Self { - Self::new_with_network_antenna(Arc::new(MockAntenna::new(200, request))) + Self::new_with_networking_driver(Arc::new(MockNetworkingDriver::new( + 200, request, + ))) } } @@ -124,7 +126,7 @@ mod tests { #[actix_rt::test] async fn test_send_wallet_interaction_response() { - let mock_antenna = MockAntenna::with_spy(200, (), |request| { + let mock_antenna = MockNetworkingDriver::with_spy(200, (), |request| { // Prepare encryption keys let mut encryption_key = Session::sample().encryption_key; let mut decryption_key = encryption_key; @@ -185,7 +187,8 @@ mod tests { ) }); - let service = Service::new_with_network_antenna(Arc::new(mock_antenna)); + let service = + Service::new_with_networking_driver(Arc::new(mock_antenna)); let session = Session::sample(); let req = service.send_wallet_interaction_response( diff --git a/src/radix_connect/mobile/session/session.rs b/src/radix_connect/mobile/session/session.rs index aba075148..2dfcc5886 100644 --- a/src/radix_connect/mobile/session/session.rs +++ b/src/radix_connect/mobile/session/session.rs @@ -18,7 +18,7 @@ pub struct Session { /// The encryption key shared by both the dApp and the Wallet, that allows the dApp to decrypt the responses sent /// by the Wallet over the Relay Server. The encryption key is unique per session id and is created after performing a Diffie Hellman key exchange. - pub encryption_key: SymmetricKey, + pub encryption_key: EncryptionKey, /// The dapp public key sent over with the request that was used to generate the encryption key. /// The main purpose of having this stored in the session, is verify the validity of any subsequent dApp requests @@ -41,7 +41,7 @@ impl Session { pub fn new( id: impl Into, origin: SessionOrigin, - encryption_key: impl Into, + encryption_key: impl Into, dapp_public_key: KeyAgreementPublicKey, dapp_identity_public_key: Ed25519PublicKey, wallet_public_key: KeyAgreementPublicKey, @@ -83,7 +83,7 @@ impl HasSampleValues for Session { Self::new( SessionID::sample(), SessionOrigin::sample(), - Exactly32Bytes::sample(), + EncryptionKey::sample(), KeyAgreementPublicKey::sample(), Ed25519PublicKey::sample(), KeyAgreementPublicKey::sample(), @@ -94,7 +94,7 @@ impl HasSampleValues for Session { Self::new( SessionID::sample_other(), SessionOrigin::sample_other(), - Exactly32Bytes::sample_other(), + EncryptionKey::sample_other(), KeyAgreementPublicKey::sample_other(), Ed25519PublicKey::sample_other(), KeyAgreementPublicKey::sample_other(), diff --git a/src/radix_connect/p2p_links/link_connection_qr_data.rs b/src/radix_connect/p2p_links/link_connection_qr_data.rs index e34a95b64..4b3796d75 100644 --- a/src/radix_connect/p2p_links/link_connection_qr_data.rs +++ b/src/radix_connect/p2p_links/link_connection_qr_data.rs @@ -105,7 +105,7 @@ mod tests { fn debug() { assert_eq!( format!("{:?}", SUT::sample()), - "LinkConnectionQRData { purpose: 'general', password: 'deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead', public_key_of_other_party: 'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf', signature: '2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b' }" + "LinkConnectionQRData { purpose: 'general', password: 'deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead', public_key_of_other_party: 'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf', signature: 'fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103' }" ); } @@ -127,7 +127,7 @@ mod tests { "purpose": "general", "password": "deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead", "publicKey": "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", - "signature": "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b" + "signature": "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103" } "#, ); diff --git a/src/radix_connect/well_known_client/client.rs b/src/radix_connect/well_known_client/client.rs index ee973e32a..d166a9bc1 100644 --- a/src/radix_connect/well_known_client/client.rs +++ b/src/radix_connect/well_known_client/client.rs @@ -14,10 +14,10 @@ impl WellKnownClient { Self { http_client } } - pub fn new_with_network_antenna( - network_antenna: Arc, + pub fn new_with_networking_driver( + networking_driver: Arc, ) -> Self { - Self::new(HttpClient::new(network_antenna)) + Self::new(HttpClient::new(networking_driver)) } } @@ -44,8 +44,8 @@ impl WellKnownClient { #[cfg(test)] impl WellKnownClient { fn new_always_failing() -> Self { - Self::new_with_network_antenna(Arc::new( - MockAntenna::new_always_failing(), + Self::new_with_networking_driver(Arc::new( + MockNetworkingDriver::new_always_failing(), )) } } @@ -78,23 +78,24 @@ mod tests { #[actix_rt::test] async fn test_get_well_known_file_correct_request_made() { // ARRANGE - let mock_antenna_with_spy = MockAntenna::with_spy(200, vec![], |_| { - let request = NetworkRequest::get_well_known( - Url::from_str(TEST_ORIGIN).unwrap(), - ); - - let expected_request = NetworkRequest::new_get( - Url::from_str(TEST_ORIGIN) - .unwrap() - .join(SUFFIX_WELL_KNOWN_FILE) - .unwrap(), - ); - - // ASSERT - pretty_assertions::assert_eq!(request, expected_request); - }); - - let client = WellKnownClient::new_with_network_antenna(Arc::new( + let mock_antenna_with_spy = + MockNetworkingDriver::with_spy(200, vec![], |_| { + let request = NetworkRequest::get_well_known( + Url::from_str(TEST_ORIGIN).unwrap(), + ); + + let expected_request = NetworkRequest::new_get( + Url::from_str(TEST_ORIGIN) + .unwrap() + .join(SUFFIX_WELL_KNOWN_FILE) + .unwrap(), + ); + + // ASSERT + pretty_assertions::assert_eq!(request, expected_request); + }); + + let client = WellKnownClient::new_with_networking_driver(Arc::new( mock_antenna_with_spy, )); // ACT diff --git a/src/system/bios/bios.rs b/src/system/bios/bios.rs new file mode 100644 index 000000000..cb642fc94 --- /dev/null +++ b/src/system/bios/bios.rs @@ -0,0 +1,15 @@ +use crate::prelude::*; + +#[derive(Debug, uniffi::Object)] +pub struct Bios { + pub(crate) drivers: Arc, +} + +#[uniffi::export] +impl Bios { + #[uniffi::constructor] + pub fn new(drivers: Arc) -> Arc { + install_logger(drivers.logging.clone()); + Arc::new(Bios { drivers }) + } +} diff --git a/src/system/bios/mod.rs b/src/system/bios/mod.rs new file mode 100644 index 000000000..7e2d0dc55 --- /dev/null +++ b/src/system/bios/mod.rs @@ -0,0 +1,3 @@ +mod bios; + +pub use bios::*; diff --git a/src/system/clients/README.md b/src/system/clients/README.md new file mode 100644 index 000000000..8f868b78f --- /dev/null +++ b/src/system/clients/README.md @@ -0,0 +1,3 @@ +# Clients + +A "client" needs a "driver", just like a "subsystem", however, unlike the subsystems the clients are typically owned, controlled and used by the SargonOS itself. diff --git a/src/system/clients/client/entropy_client/entropy_client.rs b/src/system/clients/client/entropy_client/entropy_client.rs new file mode 100644 index 000000000..1030aea38 --- /dev/null +++ b/src/system/clients/client/entropy_client/entropy_client.rs @@ -0,0 +1,16 @@ +use crate::prelude::*; + +#[derive(Debug)] +pub struct EntropyClient { + driver: Arc, +} + +impl EntropyClient { + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } + + pub fn bip39_entropy(&self) -> BIP39Entropy { + BIP39Entropy::from(self.driver.generate_secure_random_bytes()) + } +} diff --git a/src/system/clients/client/entropy_client/mod.rs b/src/system/clients/client/entropy_client/mod.rs new file mode 100644 index 000000000..6fa5c43c3 --- /dev/null +++ b/src/system/clients/client/entropy_client/mod.rs @@ -0,0 +1,3 @@ +mod entropy_client; + +pub use entropy_client::*; diff --git a/src/system/clients/client/event_bus_client/event_bus_client.rs b/src/system/clients/client/event_bus_client/event_bus_client.rs new file mode 100644 index 000000000..7770c2827 --- /dev/null +++ b/src/system/clients/client/event_bus_client/event_bus_client.rs @@ -0,0 +1,20 @@ +use crate::prelude::*; + +#[derive(Debug)] +pub struct EventBusClient { + driver: Arc, +} + +impl EventBusClient { + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } +} + +impl EventBusClient { + pub async fn emit(&self, event_notification: EventNotification) { + self.driver + .handle_event_notification(event_notification) + .await + } +} diff --git a/src/system/clients/client/event_bus_client/mod.rs b/src/system/clients/client/event_bus_client/mod.rs new file mode 100644 index 000000000..f5a8f1dba --- /dev/null +++ b/src/system/clients/client/event_bus_client/mod.rs @@ -0,0 +1,3 @@ +mod event_bus_client; + +pub use event_bus_client::*; diff --git a/src/system/clients/client/file_system_client/file_system_client.rs b/src/system/clients/client/file_system_client/file_system_client.rs new file mode 100644 index 000000000..13f671c97 --- /dev/null +++ b/src/system/clients/client/file_system_client/file_system_client.rs @@ -0,0 +1,173 @@ +use crate::prelude::*; +use std::path::Path; + +#[derive(Debug)] +pub struct FileSystemClient { + #[allow(dead_code)] + driver: Arc, +} + +impl FileSystemClient { + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } +} + +#[allow(dead_code)] +pub(crate) fn path_to_string(path: impl AsRef) -> Result { + path.as_ref() + .to_str() + .ok_or(CommonError::InvalidPath { + bad_value: format!("{:?}", path.as_ref()), + }) + .map(|s| s.to_owned()) +} + +#[allow(dead_code)] +impl FileSystemClient { + async fn load_from_file( + &self, + path: impl AsRef, + ) -> Result> { + let path = path_to_string(path.as_ref())?; + self.driver + .load_from_file(path) + // tarpaulin will incorrectly flag next line is missed + .await + } + + async fn save_to_file( + &self, + path: impl AsRef, + data: impl AsRef<[u8]>, + ) -> Result<()> { + let path = path_to_string(path.as_ref())?; + let data = BagOfBytes::from(data.as_ref()); + self.driver + .save_to_file(path, data) + // tarpaulin will incorrectly flag next line is missed + .await + } + + async fn delete_file(&self, path: impl AsRef) -> Result<()> { + let path = path_to_string(path.as_ref())?; + self.driver + .delete_file(path) + // tarpaulin will incorrectly flag next line is missed + .await + } +} + +#[cfg(test)] +mod tests { + + use std::path::PathBuf; + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = FileSystemClient; + + fn file_in_dir(dir_path: impl AsRef) -> PathBuf { + let dir_path = dir_path.as_ref(); + assert!(std::fs::create_dir_all(dir_path).is_ok()); + + let file_name = format!("delete-this--generated-by-test-{}.txt", id()); + dir_path.join(file_name) + } + + fn file_in_tmp() -> PathBuf { + let dir_path = Path::new(env!("CARGO_MANIFEST_DIR")).join("target/tmp"); + file_in_dir(dir_path) + } + + fn make_contents(suffix: impl AsRef) -> BagOfBytes { + let suffix = suffix.as_ref(); + let str = format!("this file is completely safe to delete. it was generated by FileSystemClient test. Suffix: {}", suffix); + BagOfBytes::from(str.as_bytes()) + } + fn contents() -> BagOfBytes { + make_contents("first") + } + fn other_contents() -> BagOfBytes { + make_contents("second") + } + + impl FileSystemClient { + pub(crate) fn test() -> Self { + Self::new(RustFileSystemDriver::new()) + } + } + + #[actix_rt::test] + async fn test_create_load_delete() { + let sut = SUT::test(); + let file = file_in_tmp(); + + let data = contents(); + sut.save_to_file(file.clone(), data.clone()).await.unwrap(); + let loaded = sut.load_from_file(file.clone()).await.unwrap().unwrap(); + assert_eq!(loaded, data); + + // Assert can be updated + let new_data = other_contents(); + sut.save_to_file(file.clone(), new_data.clone()) + .await + .unwrap(); + let loaded = sut.load_from_file(file.clone()).await.unwrap().unwrap(); + assert_eq!(loaded, new_data); + + assert!(sut.delete_file(file.clone()).await.is_ok()); + } + + #[actix_rt::test] + async fn test_load_non_existing_is_ok() { + let sut = SUT::test(); + let res = sut.load_from_file("non-existing".to_owned()).await; + assert_eq!(res, Ok(None)); + } + + #[actix_rt::test] + async fn test_load_fail() { + let sut = SUT::test(); + let res = sut.load_from_file("/".to_owned()).await; + assert_eq!( + res, + Err(CommonError::FailedToLoadFile { + path: "/".to_owned() + }) + ); + } + + #[actix_rt::test] + async fn test_delete_non_existing_is_ok() { + let sut = SUT::test(); + let res = sut.delete_file("does not exist".to_owned()).await; + assert_eq!(res, Ok(())); + } + + #[actix_rt::test] + async fn test_save_to_root_is_err() { + let sut = SUT::test(); + let path = file_in_dir(Path::new("/")); + let res = sut.save_to_file(path.clone(), contents()).await; + assert_eq!( + res, + Err(CommonError::FailedToSaveFile { + path: path.to_str().unwrap().to_owned() + }) + ); + } + + #[actix_rt::test] + async fn test_delete_dir_does_not_work() { + let path = String::from( + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("target/") + .to_string_lossy(), + ); + let sut = SUT::test(); + let res = sut.delete_file(path.clone()).await; + assert_eq!(res, Err(CommonError::FailedToDeleteFile { path })); + } +} diff --git a/src/system/clients/client/file_system_client/mod.rs b/src/system/clients/client/file_system_client/mod.rs new file mode 100644 index 000000000..515604f32 --- /dev/null +++ b/src/system/clients/client/file_system_client/mod.rs @@ -0,0 +1,3 @@ +mod file_system_client; + +pub use file_system_client::*; diff --git a/src/system/clients/client/host_info_client/host_info_client.rs b/src/system/clients/client/host_info_client/host_info_client.rs new file mode 100644 index 000000000..9e0db3fce --- /dev/null +++ b/src/system/clients/client/host_info_client/host_info_client.rs @@ -0,0 +1,67 @@ +use crate::prelude::*; + +#[derive(Debug)] +pub struct HostInfoClient { + driver: Arc, +} + +impl HostInfoClient { + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } + + pub(crate) async fn summary(&self) -> String { + let host_model = self.driver.host_device_model().await; + let host_os = self.driver.host_os().await; + let host_app_version = self.driver.host_app_version().await; + format!( + "App v{} running in host OS: {} on device: {}", + host_app_version, host_os, host_model + ) + } + + pub async fn resolve_host_info(&self) -> HostInfo { + let host_device_name = self.driver.host_device_name().await; + let host_device_model = self.driver.host_device_model().await; + let host_app_version = self.driver.host_app_version().await; + let host_os = self.driver.host_os().await; + + HostInfo { + description: DeviceInfoDescription::new( + host_device_name, + host_device_model, + ), + host_os, + host_app_version, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_rt::time::timeout; + use std::{future::Future, time::Duration}; + #[allow(clippy::upper_case_acronyms)] + type SUT = HostInfoClient; + + #[actix_rt::test] + async fn test_resolve_host_info() { + let sut = SUT::new(RustHostInfoDriver::new()); + let mut info = sut.resolve_host_info().await; + // Mutating this in order to keep tests stable + info.host_app_version = "1.0.0".to_owned(); + + pretty_assertions::assert_eq!( + info, + HostInfo::new( + DeviceInfoDescription::new( + "Rosebud", + "Rust Sargon Unknown Device Model", + ), + HostOS::other("macos", "Apple", "14.5"), + "1.0.0" + ) + ); + } +} diff --git a/src/system/clients/client/host_info_client/mod.rs b/src/system/clients/client/host_info_client/mod.rs new file mode 100644 index 000000000..7971f493c --- /dev/null +++ b/src/system/clients/client/host_info_client/mod.rs @@ -0,0 +1,3 @@ +mod host_info_client; + +pub use host_info_client::*; diff --git a/src/http_client/client.rs b/src/system/clients/client/http_client/http_client.rs similarity index 69% rename from src/http_client/client.rs rename to src/system/clients/client/http_client/http_client.rs index 9fe1ed4f7..7b238178e 100644 --- a/src/http_client/client.rs +++ b/src/system/clients/client/http_client/http_client.rs @@ -3,16 +3,17 @@ use serde_json::Value; /// A `HttpClient` needs a "network antenna" to be able to execute the /// network requests - which is a trait that clients implement on the FFI side (iOS/Android). +#[derive(Debug)] pub struct HttpClient { - /// An object implementing the `NetworkAntenna` traits, which iOS/Android + /// An object implementing the `NetworkingDriver` traits, which iOS/Android /// clients pass into the constructor of this GatewayClient, so that it can /// execute network requests. - pub network_antenna: Arc, + pub driver: Arc, } impl HttpClient { - pub fn new(network_antenna: Arc) -> Self { - Self { network_antenna } + pub fn new(driver: Arc) -> Self { + Self { driver } } } @@ -21,10 +22,7 @@ impl HttpClient { &self, request: NetworkRequest, ) -> Result { - let response = self - .network_antenna - .execute_network_request(request) - .await?; + let response = self.driver.execute_network_request(request).await?; // Check for valid status code if !(200..=299).contains(&response.status_code) { @@ -89,10 +87,10 @@ mod tests { #[actix_rt::test] async fn execute_network_request_invalid_url() { - let mock_antenna = MockAntenna::new(200, ()); + let mock_networking_driver = MockNetworkingDriver::new(200, ()); let base = "http://example.com"; let sut = SUT::with_gateway( - Arc::new(mock_antenna), + Arc::new(mock_networking_driver), Gateway::declare(base, NetworkID::Stokenet), ); let bad_path = "https://exa%23mple.org"; @@ -107,11 +105,12 @@ mod tests { #[actix_rt::test] async fn execute_network_request_bad_status_code() { - let mock_antenna = MockAntenna::new( + let mock_networking_driver = MockNetworkingDriver::new( 404, // bad code (), ); - let sut = SUT::new(Arc::new(mock_antenna), NetworkID::Stokenet); + let sut = + SUT::new(Arc::new(mock_networking_driver), NetworkID::Stokenet); let req = sut.current_epoch(); let result = timeout(MAX, req).await.unwrap(); assert_eq!(result, Err(CommonError::NetworkResponseBadCode)) @@ -119,11 +118,12 @@ mod tests { #[actix_rt::test] async fn execute_network_request_invalid_json() { - let mock_antenna = MockAntenna::new( + let mock_networking_driver = MockNetworkingDriver::new( 200, BagOfBytes::sample_aced(), // wrong JSON ); - let sut = SUT::new(Arc::new(mock_antenna), NetworkID::Stokenet); + let sut = + SUT::new(Arc::new(mock_networking_driver), NetworkID::Stokenet); let req = sut.current_epoch(); let result = timeout(MAX, req).await.unwrap(); assert_eq!( @@ -136,26 +136,28 @@ mod tests { #[actix_rt::test] async fn spy_headers() { - let mock_antenna = MockAntenna::with_spy(200, (), |request| { - assert_eq!( - request - .headers - .keys() - .map(|v| v.to_string()) - .collect::>(), - [ - "RDX-Client-Version", - "RDX-Client-Name", - "accept", - "content-Type", - "user-agent" - ] - .into_iter() - .map(|s| s.to_owned()) - .collect::>() - ) - }); - let sut = SUT::new(Arc::new(mock_antenna), NetworkID::Stokenet); + let mock_networking_driver = + MockNetworkingDriver::with_spy(200, (), |request| { + assert_eq!( + request + .headers + .keys() + .map(|v| v.to_string()) + .collect::>(), + [ + "RDX-Client-Version", + "RDX-Client-Name", + "accept", + "content-Type", + "user-agent" + ] + .into_iter() + .map(|s| s.to_owned()) + .collect::>() + ) + }); + let sut = + SUT::new(Arc::new(mock_networking_driver), NetworkID::Stokenet); let req = sut.current_epoch(); drop(timeout(MAX, req).await.unwrap()); } diff --git a/src/system/clients/client/http_client/mod.rs b/src/system/clients/client/http_client/mod.rs new file mode 100644 index 000000000..73bcdca8d --- /dev/null +++ b/src/system/clients/client/http_client/mod.rs @@ -0,0 +1,3 @@ +mod http_client; + +pub use http_client::*; diff --git a/src/system/clients/client/mod.rs b/src/system/clients/client/mod.rs new file mode 100644 index 000000000..4182f77b1 --- /dev/null +++ b/src/system/clients/client/mod.rs @@ -0,0 +1,15 @@ +mod entropy_client; +mod event_bus_client; +mod file_system_client; +mod host_info_client; +mod http_client; +mod secure_storage_client; +mod unsafe_storage_client; + +pub use entropy_client::*; +pub use event_bus_client::*; +pub use file_system_client::*; +pub use host_info_client::*; +pub use http_client::*; +pub use secure_storage_client::*; +pub use unsafe_storage_client::*; diff --git a/src/system/clients/client/secure_storage_client/mod.rs b/src/system/clients/client/secure_storage_client/mod.rs new file mode 100644 index 000000000..5efb3fcc7 --- /dev/null +++ b/src/system/clients/client/secure_storage_client/mod.rs @@ -0,0 +1,3 @@ +mod secure_storage_client; + +pub use secure_storage_client::*; diff --git a/src/system/clients/client/secure_storage_client/secure_storage_client.rs b/src/system/clients/client/secure_storage_client/secure_storage_client.rs new file mode 100644 index 000000000..daec8bf66 --- /dev/null +++ b/src/system/clients/client/secure_storage_client/secure_storage_client.rs @@ -0,0 +1,462 @@ +use crate::prelude::*; + +/// An abstraction of an implementing host's secure storage, used to +/// save and load models, most prominently `Profile` and `MnemonicWithPassphrase`. +/// +/// It uses the lower level CRUD trait `SecureStorageDriver` which works on bytes (Vec), +/// by instead working with JSON. +#[derive(Debug)] +pub struct SecureStorageClient { + /// Low level CRUD traits that works on bytes, passed from host via BIOS when + /// booting the SargonOS + driver: Arc, +} + +impl SecureStorageClient { + /// Creates a new SecureStorageClient using an implementation of + /// `SecureStorageDriver`. + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } +} + +impl SecureStorageClient { + //====== + // Save T + //====== + pub async fn save(&self, key: SecureStorageKey, value: &T) -> Result<()> + where + T: serde::Serialize, + { + let json = serde_json::to_vec(value) + .map_err(|_| CommonError::FailedToSerializeToJSON)?; + self.driver + .save_data(key, BagOfBytes::from(json)) + // tarpaulin will incorrectly flag next line is missed + .await + } + + //====== + // Load T + //====== + /// Loads bytes from SecureStorageDriver and deserializes them into `T`. + /// + /// Returns `Ok(None)` if no bytes were found, returns Err if failed + /// to load bytes or failed to deserialize the JSON into a `T`. + pub async fn load(&self, key: SecureStorageKey) -> Result> + where + T: for<'a> serde::Deserialize<'a>, + { + self.driver.load_data(key).await.and_then(|o| match o { + None => Ok(None), + Some(j) => serde_json::from_slice(j.as_slice()) + .map_failed_to_deserialize_bytes::(j.as_slice()), + }) + } + + /// Loads bytes from SecureStorageDriver and deserializes them into `T`. + /// + /// Returns Err if failed to load bytes or failed to deserialize the JSON into a `T`, + /// unlike `load` this method returns given `err` if `None` bytes were found. + pub async fn load_or( + &self, + key: SecureStorageKey, + err: CommonError, + ) -> Result + where + T: for<'a> serde::Deserialize<'a>, + { + self.load(key).await.and_then(|o| o.ok_or(err)) + } + + /// Loads bytes from SecureStorageDriver and deserializes them into `T`. + /// + /// Returns Err if failed to load bytes or failed to deserialize the JSON into a `T`, + /// unlike `load` this method returns `default` if `None` bytes were found. + pub async fn load_unwrap_or( + &self, + key: SecureStorageKey, + default: T, + ) -> T + where + T: for<'a> serde::Deserialize<'a> + Clone, + { + self.load(key) + .await + .map(|o| o.unwrap_or(default.clone())) + .unwrap_or(default) + } + + //====== + // Profile CR(U)D + //====== + + /// Loads the active Profile if any, by first loading the active + /// profile id. + pub async fn load_active_profile(&self) -> Result> { + debug!("Loading active profile"); + let Some(id) = self.load_active_profile_id().await? else { + trace!("Found no active profile id"); + return Ok(None); + }; + self.load_profile_with_id(id).await.map(Some) + } + + /// Loads the Profile with the given `profile_id`. + pub async fn load_profile_with_id( + &self, + profile_id: ProfileID, + ) -> Result { + debug!("Loading profile profile with id: {}", profile_id); + self.load_or( + SecureStorageKey::ProfileSnapshot { profile_id }, + CommonError::UnableToLoadProfileFromSecureStorage { profile_id }, + ) + .await + .inspect(|_| debug!("Loaded profile")) + .inspect_err(|e| error!("Failed to load profile, error {e}")) + } + + /// Loads the active ProfileID if any + pub async fn load_active_profile_id(&self) -> Result> { + trace!("Loading active profile id"); + self.load(SecureStorageKey::ActiveProfileID).await + } + + /// Save `profile` and saves its id as active profile id + pub async fn save_profile_and_active_profile_id( + &self, + profile: &Profile, + ) -> Result<()> { + debug!( + "Saving profile, id: {}, and setting it as active", + &profile.id() + ); + self.save_profile(profile).await?; + self.save_active_profile_id(profile.id()).await + } + + /// Save `profile` + pub async fn save_profile(&self, profile: &Profile) -> Result<()> { + let profile_id = profile.id(); + debug!("Saving profile with id: {}", profile_id); + self.save(SecureStorageKey::ProfileSnapshot { profile_id }, profile) + .await + .inspect(|_| debug!("Saved profile with id {}", profile_id)) + .inspect_err(|e| error!("Failed to save profile, error {e}")) + } + + /// Save `profile_id` as the active profile id + pub async fn save_active_profile_id( + &self, + profile_id: ProfileID, + ) -> Result<()> { + debug!("Saving active profile id: {}", profile_id); + self.save(SecureStorageKey::ActiveProfileID, &profile_id) + .await + .inspect(|_| debug!("Saved active profile id")) + .inspect_err(|e| { + error!("Failed to save active profile id, error {e}") + }) + } + + //====== + // HostId CR(U)D + //====== + + /// Loads the HostId if any + pub async fn load_host_id(&self) -> Result> { + trace!("Loading host id"); + self.load(SecureStorageKey::HostID).await + } + + /// Saves [`DeviceInfo`] + pub async fn save_host_id(&self, host_id: &HostId) -> Result<()> { + debug!("Saving new host id: {:?}", host_id); + self.save(SecureStorageKey::HostID, host_id) + .await + .inspect(|_| debug!("Saved new host id.")) + .map_err(|e| { + error!("Failed to save host id to secure storage - error {e}",); + CommonError::UnableToSaveHostIdToSecureStorage + }) + } + + //====== + // Mnemonic CR(U)D + //====== + + /// Saves the MnemonicWithPassphrase of the private hd factor source + pub async fn save_private_hd_factor_source( + &self, + private_hd_factor_source: &PrivateHierarchicalDeterministicFactorSource, + ) -> Result<()> { + self.save_mnemonic_with_passphrase( + &private_hd_factor_source.mnemonic_with_passphrase, + &private_hd_factor_source.factor_source.id, + ) + .await + } + + /// Saves a MnemonicWithPassphrase under a given `FactorSourceIDFromHash` + pub async fn save_mnemonic_with_passphrase( + &self, + mnemonic_with_passphrase: &MnemonicWithPassphrase, + id: &FactorSourceIDFromHash, + ) -> Result<()> { + self.save( + SecureStorageKey::DeviceFactorSourceMnemonic { + factor_source_id: *id, + }, + mnemonic_with_passphrase, + ) + .await + .map_err(|_| { + CommonError::UnableToSaveMnemonicToSecureStorage { bad_value: *id } + }) + } + + /// Loads a MnemonicWithPassphrase with a `FactorSourceIDFromHash` + pub async fn load_mnemonic_with_passphrase( + &self, + id: &FactorSourceIDFromHash, + ) -> Result { + self.load_or( + SecureStorageKey::DeviceFactorSourceMnemonic { + factor_source_id: *id, + }, + CommonError::UnableToLoadMnemonicFromSecureStorage { + bad_value: *id, + }, + ) + .await + } + + /// Deletes a MnemonicWithPassphrase with a `FactorSourceIDFromHash` + pub async fn delete_mnemonic( + &self, + id: &FactorSourceIDFromHash, + ) -> Result<()> { + self.driver + .delete_data_for_key(SecureStorageKey::DeviceFactorSourceMnemonic { + factor_source_id: *id, + }) + .await + } + + pub async fn delete_profile(&self, id: ProfileID) -> Result<()> { + warn!("Deleting profile with id: {}", id); + self.driver + .delete_data_for_key(SecureStorageKey::ProfileSnapshot { + profile_id: id, + }) + .await + } + + pub async fn delete_active_profile_id(&self) -> Result<()> { + warn!("Deleting active profile id"); + self.driver + .delete_data_for_key(SecureStorageKey::ActiveProfileID) + .await + } +} + +#[cfg(test)] +impl SecureStorageClient { + pub(crate) fn ephemeral( + ) -> (SecureStorageClient, Arc) { + let storage = EphemeralSecureStorage::new(); + (SecureStorageClient::new(storage.clone()), storage) + } + + pub(crate) fn always_fail() -> Self { + SecureStorageClient::new(Arc::new(AlwaysFailSecureStorage {})) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_sut() -> SecureStorageClient { + SecureStorageClient::ephemeral().0 + } + + #[actix_rt::test] + async fn load_ok_when_none() { + let sut = make_sut(); + assert_eq!( + sut.load::(SecureStorageKey::ActiveProfileID).await, + Ok(None) + ); + } + + #[actix_rt::test] + async fn load_fail_to_deserialize_json() { + let sut = make_sut(); + + assert!(sut + .save( + SecureStorageKey::ActiveProfileID, + &0u8, // obviously a u8 is not a Profile + ) + .await + .is_ok()); + assert_eq!( + sut.load::(SecureStorageKey::ActiveProfileID).await, + Err(CommonError::FailedToDeserializeJSONToValue { + json_byte_count: 1, + type_name: "Profile".to_owned(), + serde_message: "invalid type: integer `0`, expected struct Profile at line 1 column 1".to_owned(), + }) + ); + } + + #[actix_rt::test] + async fn load_successful() { + let sut = make_sut(); + + assert!(sut + .save(SecureStorageKey::ActiveProfileID, &Profile::sample()) + .await + .is_ok()); + assert_eq!( + sut.load::(SecureStorageKey::ActiveProfileID).await, + Ok(Some(Profile::sample())) + ); + } + + #[actix_rt::test] + async fn load_unwrap_or_some_default_not_used() { + let sut = make_sut(); + + assert!(sut + .save(SecureStorageKey::ActiveProfileID, &Profile::sample()) + .await + .is_ok()); + assert_eq!( + sut.load_unwrap_or::( + SecureStorageKey::ActiveProfileID, + Profile::sample_other() + ) + .await, + Profile::sample() + ); + } + + #[actix_rt::test] + async fn load_unwrap_or_none_default_is_used() { + let sut = make_sut(); + + assert_eq!( + sut.load_unwrap_or::( + SecureStorageKey::ActiveProfileID, + Profile::sample_other() + ) + .await, + Profile::sample_other() + ); + } + + #[actix_rt::test] + async fn save_mnemonic_with_passphrase() { + let private = PrivateHierarchicalDeterministicFactorSource::sample(); + let factor_source_id = private.factor_source.id; + let (sut, storage) = SecureStorageClient::ephemeral(); + let key = + SecureStorageKey::DeviceFactorSourceMnemonic { factor_source_id }; + assert_eq!(storage.load_data(key.clone()).await, Ok(None)); // not yet saved + assert!(sut + .save_mnemonic_with_passphrase( + &private.mnemonic_with_passphrase, + &factor_source_id.clone() + ) + .await + .is_ok()); + + // Assert indeed was saved. + assert!(storage + .load_data(key) + .await + .map(|b| String::from_utf8(b.unwrap().to_vec()).unwrap()) + .unwrap() + .contains("device")); + } + + #[actix_rt::test] + async fn save_mnemonic_with_passphrase_failure() { + let sut = SecureStorageClient::always_fail(); + let id = FactorSourceIDFromHash::sample(); + assert_eq!( + sut.save_mnemonic_with_passphrase( + &MnemonicWithPassphrase::sample(), + &id + ) + .await, + Err(CommonError::UnableToSaveMnemonicToSecureStorage { + bad_value: id + }) + ); + } + + #[actix_rt::test] + async fn delete_mnemonic() { + // ARRANGE + let private = + PrivateHierarchicalDeterministicFactorSource::sample_other(); + let factor_source_id = private.factor_source.id; + let (sut, storage) = SecureStorageClient::ephemeral(); + let key = + SecureStorageKey::DeviceFactorSourceMnemonic { factor_source_id }; + assert!(storage + .save_data(key.clone(), BagOfBytes::from(vec![0xde, 0xad])) + .await + .is_ok()); + assert_eq!( + storage.load_data(key.clone()).await, + Ok(Some(BagOfBytes::from(vec![0xde, 0xad]))) + ); // assert save worked + + // ACT + assert!(sut.delete_mnemonic(&factor_source_id).await.is_ok()); + + // ASSERT + assert_eq!(storage.load_data(key).await, Ok(None)); + } + + #[actix_rt::test] + async fn save_fail_to_serialize() { + use serde::Serialize; + struct AlwaysFailSerialize {} + impl Serialize for AlwaysFailSerialize { + fn serialize( + &self, + _serializer: S, + ) -> core::result::Result + where + S: Serializer, + { + Err(serde::ser::Error::custom(CommonError::Unknown)) + } + } + + let (sut, _) = SecureStorageClient::ephemeral(); + assert_eq!( + sut.save( + SecureStorageKey::ActiveProfileID, + &AlwaysFailSerialize {} + ) + .await, + Err(CommonError::FailedToSerializeToJSON) + ); + } + + #[actix_rt::test] + async fn save_fail_save_host_id() { + let sut = SecureStorageClient::always_fail(); + assert_eq!( + sut.save_host_id(&HostId::sample()).await, + Err(CommonError::UnableToSaveHostIdToSecureStorage) + ); + } +} diff --git a/src/system/clients/client/unsafe_storage_client/mod.rs b/src/system/clients/client/unsafe_storage_client/mod.rs new file mode 100644 index 000000000..3bde2361c --- /dev/null +++ b/src/system/clients/client/unsafe_storage_client/mod.rs @@ -0,0 +1,3 @@ +mod unsafe_storage_client; + +pub use unsafe_storage_client::*; diff --git a/src/system/clients/client/unsafe_storage_client/unsafe_storage_client.rs b/src/system/clients/client/unsafe_storage_client/unsafe_storage_client.rs new file mode 100644 index 000000000..1b95e1051 --- /dev/null +++ b/src/system/clients/client/unsafe_storage_client/unsafe_storage_client.rs @@ -0,0 +1,13 @@ +use crate::prelude::*; + +#[derive(Debug)] +pub struct UnsafeStorageClient { + #[allow(dead_code)] + driver: Arc, +} + +impl UnsafeStorageClient { + pub(crate) fn new(driver: Arc) -> Self { + Self { driver } + } +} diff --git a/src/system/clients/clients.rs b/src/system/clients/clients.rs new file mode 100644 index 000000000..2f4329d9e --- /dev/null +++ b/src/system/clients/clients.rs @@ -0,0 +1,39 @@ +use crate::prelude::*; + +#[derive(Debug)] +pub struct Clients { + pub host: HostInfoClient, + pub secure_storage: SecureStorageClient, + pub entropy: EntropyClient, + pub http_client: HttpClient, + pub unsafe_storage: UnsafeStorageClient, + pub file_system: FileSystemClient, + pub event_bus: EventBusClient, +} + +impl Clients { + pub fn with_drivers(drivers: Arc) -> Self { + let host = HostInfoClient::new(drivers.host_info.clone()); + let secure_storage = + SecureStorageClient::new(drivers.secure_storage.clone()); + let entropy = EntropyClient::new(drivers.entropy_provider.clone()); + let http_client = HttpClient::new(drivers.networking.clone()); + let unsafe_storage = + UnsafeStorageClient::new(drivers.unsafe_storage.clone()); + let file_system = FileSystemClient::new(drivers.file_system.clone()); + let event_bus = EventBusClient::new(drivers.event_bus.clone()); + Self { + host, + secure_storage, + entropy, + http_client, + unsafe_storage, + file_system, + event_bus, + } + } + + pub fn new(bios: Arc) -> Self { + Self::with_drivers(bios.drivers.clone()) + } +} diff --git a/src/system/clients/mod.rs b/src/system/clients/mod.rs new file mode 100644 index 000000000..75dc24407 --- /dev/null +++ b/src/system/clients/mod.rs @@ -0,0 +1,5 @@ +mod client; +mod clients; + +pub use client::*; +pub use clients::*; diff --git a/src/system/drivers/README.md b/src/system/drivers/README.md new file mode 100644 index 000000000..cbb6a51f3 --- /dev/null +++ b/src/system/drivers/README.md @@ -0,0 +1,5 @@ +# Driver + +"Drivers" are traits implemented by the FFI host with methods we call from Rust. + +Driver are created during initialization of the BIOS and are passed to appropriate "subsystems" during POST of the BIOS. When the BIOS is used to boot the (Sargon)OS, the OS creates "clients" and keeps them around for the duration of the OS lifetime. diff --git a/src/system/drivers/drivers.rs b/src/system/drivers/drivers.rs new file mode 100644 index 000000000..a5798106a --- /dev/null +++ b/src/system/drivers/drivers.rs @@ -0,0 +1,232 @@ +use crate::prelude::*; + +#[derive(Debug, uniffi::Object)] +pub struct Drivers { + pub networking: Arc, + pub secure_storage: Arc, + pub entropy_provider: Arc, + pub host_info: Arc, + pub logging: Arc, + pub event_bus: Arc, + pub file_system: Arc, + pub unsafe_storage: Arc, +} + +#[uniffi::export] +impl Drivers { + #[uniffi::constructor] + #[allow(clippy::too_many_arguments)] + pub fn new( + networking: Arc, + secure_storage: Arc, + entropy_provider: Arc, + host_info: Arc, + logging: Arc, + event_bus: Arc, + file_system: Arc, + unsafe_storage: Arc, + ) -> Arc { + Arc::new(Self { + networking, + secure_storage, + entropy_provider, + host_info, + logging, + event_bus, + file_system, + unsafe_storage, + }) + } +} + +#[cfg(test)] +impl Drivers { + pub fn test() -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_networking(networking: Arc) -> Arc { + Drivers::new( + networking, + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_secure_storage( + secure_storage: Arc, + ) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + secure_storage, + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_entropy_provider( + entropy_provider: Arc, + ) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + entropy_provider, + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_host_info(host_info: Arc) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + host_info, + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_logging(logging: Arc) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + logging, + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_event_bus(event_bus: Arc) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + event_bus, + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_file_system( + file_system: Arc, + ) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + file_system, + EphemeralUnsafeStorage::new(), + ) + } + + pub fn with_unsafe_storage( + unsafe_storage: Arc, + ) -> Arc { + Drivers::new( + RustNetworkingDriver::new(), + EphemeralSecureStorage::new(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + RustEventBusDriver::new(), + RustFileSystemDriver::new(), + unsafe_storage, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Drivers; + + #[test] + fn get_networking() { + let d = RustNetworkingDriver::new(); + let sut = SUT::with_networking(d.clone()); + assert_eq!(Arc::as_ptr(&sut.networking), Arc::as_ptr(&d)); + } + + #[test] + fn get_secure_storage() { + let d = EphemeralSecureStorage::new(); + let sut = SUT::with_secure_storage(d.clone()); + assert_eq!(Arc::as_ptr(&sut.secure_storage), Arc::as_ptr(&d)); + } + + #[test] + fn get_entropy_provider() { + let d = RustEntropyDriver::new(); + let sut = SUT::with_entropy_provider(d.clone()); + assert_eq!(Arc::as_ptr(&sut.entropy_provider), Arc::as_ptr(&d)); + } + + #[test] + fn get_host_info() { + let d = RustHostInfoDriver::new(); + let sut = SUT::with_host_info(d.clone()); + assert_eq!(Arc::as_ptr(&sut.host_info), Arc::as_ptr(&d)); + } + + #[test] + fn get_logging() { + let d = RustLoggingDriver::new(); + let sut = SUT::with_logging(d.clone()); + assert_eq!(Arc::as_ptr(&sut.logging), Arc::as_ptr(&d)); + } + + #[test] + fn get_event_bus() { + let d = RustEventBusDriver::new(); + let sut = SUT::with_event_bus(d.clone()); + assert_eq!(Arc::as_ptr(&sut.event_bus), Arc::as_ptr(&d)); + } + + #[test] + fn get_file_system() { + let d = RustFileSystemDriver::new(); + let sut = SUT::with_file_system(d.clone()); + assert_eq!(Arc::as_ptr(&sut.file_system), Arc::as_ptr(&d)); + } + + #[test] + fn get_unsafe_storage() { + let d = EphemeralUnsafeStorage::new(); + let sut = SUT::with_unsafe_storage(d.clone()); + assert_eq!(Arc::as_ptr(&sut.unsafe_storage), Arc::as_ptr(&d)); + } +} diff --git a/src/system/drivers/entropy_provider_driver/entropy_provider_driver.rs b/src/system/drivers/entropy_provider_driver/entropy_provider_driver.rs new file mode 100644 index 000000000..1abfac426 --- /dev/null +++ b/src/system/drivers/entropy_provider_driver/entropy_provider_driver.rs @@ -0,0 +1,6 @@ +use crate::prelude::*; + +#[uniffi::export(with_foreign)] +pub trait EntropyProviderDriver: Send + Sync + std::fmt::Debug { + fn generate_secure_random_bytes(&self) -> Entropy32Bytes; +} diff --git a/src/system/drivers/entropy_provider_driver/mod.rs b/src/system/drivers/entropy_provider_driver/mod.rs new file mode 100644 index 000000000..e8799bd67 --- /dev/null +++ b/src/system/drivers/entropy_provider_driver/mod.rs @@ -0,0 +1,5 @@ +mod entropy_provider_driver; +mod support; + +pub use entropy_provider_driver::*; +pub use support::*; diff --git a/src/system/drivers/entropy_provider_driver/support/mod.rs b/src/system/drivers/entropy_provider_driver/support/mod.rs new file mode 100644 index 000000000..9abea5028 --- /dev/null +++ b/src/system/drivers/entropy_provider_driver/support/mod.rs @@ -0,0 +1,3 @@ +mod test; + +pub use test::*; diff --git a/src/system/drivers/entropy_provider_driver/support/test/mod.rs b/src/system/drivers/entropy_provider_driver/support/test/mod.rs new file mode 100644 index 000000000..0644e0179 --- /dev/null +++ b/src/system/drivers/entropy_provider_driver/support/test/mod.rs @@ -0,0 +1,3 @@ +mod rust_entropy_driver; + +pub use rust_entropy_driver::*; diff --git a/src/system/drivers/entropy_provider_driver/support/test/rust_entropy_driver.rs b/src/system/drivers/entropy_provider_driver/support/test/rust_entropy_driver.rs new file mode 100644 index 000000000..3295359e3 --- /dev/null +++ b/src/system/drivers/entropy_provider_driver/support/test/rust_entropy_driver.rs @@ -0,0 +1,17 @@ +use crate::prelude::*; + +/// A **Rust** entropy driver using `osrnd`. +#[derive(Debug)] +pub struct RustEntropyDriver; + +impl RustEntropyDriver { + pub fn new() -> Arc { + Arc::new(RustEntropyDriver) + } +} + +impl EntropyProviderDriver for RustEntropyDriver { + fn generate_secure_random_bytes(&self) -> Entropy32Bytes { + Entropy32Bytes::new(generate_byte_array::<32>()) + } +} diff --git a/src/system/drivers/event_bus_driver/event_bus_driver.rs b/src/system/drivers/event_bus_driver/event_bus_driver.rs new file mode 100644 index 000000000..2966bbe76 --- /dev/null +++ b/src/system/drivers/event_bus_driver/event_bus_driver.rs @@ -0,0 +1,26 @@ +use crate::prelude::*; + +/// A driver which received and asynchronously *handles* event notifications +/// emitted by the `SargonOS`. Letting the method be async allows for Rust side +/// to wait for host clients to complete something which might require user +/// attention. E.g. presentation of an alert and await user input. +/// +/// Due to limitations in UniFFI and lack of first class citizen support of +/// async sequences (like we have in Swift) we cannot export an accessor of the +/// received events here. Instead implementing types on the FFI side SHOULD +/// create the driver as a singleton object they can reference later and build +/// async streams in that implementing type. +/// +/// See Swifts EventBus implementation for more details. +#[uniffi::export(with_foreign)] +#[async_trait::async_trait] +pub trait EventBusDriver: Send + Sync + std::fmt::Debug { + /// Asynchronously *handles* event notifications + /// emitted by the `SargonOS`. Letting the method be async allows for Rust side + /// to wait for host clients to complete something which might require user + /// attention. E.g. presentation of an alert and await user input. + async fn handle_event_notification( + &self, + event_notification: EventNotification, + ); +} diff --git a/src/system/drivers/event_bus_driver/mod.rs b/src/system/drivers/event_bus_driver/mod.rs new file mode 100644 index 000000000..e3865cd27 --- /dev/null +++ b/src/system/drivers/event_bus_driver/mod.rs @@ -0,0 +1,5 @@ +mod event_bus_driver; +mod support; + +pub use event_bus_driver::*; +pub use support::*; diff --git a/src/system/drivers/event_bus_driver/support/event.rs b/src/system/drivers/event_bus_driver/support/event.rs new file mode 100644 index 000000000..9127a0bd6 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/event.rs @@ -0,0 +1,125 @@ +use crate::prelude::*; +use crate::EventKind::{ + AccountUpdated, AccountsAdded, Booted, ProfileImported, ProfileSaved, +}; + +/// SargonOS event contain information about something of interest that has +/// happened to the SargonOS, most prominently to the Profile. Host device +/// can subscribe to these events by use of `EventBusDriver`. +#[derive(Debug, Clone, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum Event { + /// The SargonOS just booted. + Booted, + + /// Current Gateway changed + GatewayChangedCurrent { to: Gateway, is_new: bool }, + + /// Profile has been saved, typically it has been modified and the new + /// changed Profile got persisted into secure storage. + ProfileSaved, + + /// A profile has been imported and has been set to active profile, + /// and saved into secure storage. + ProfileImported { id: ProfileID }, + + /// The active profile has been modified (might not have been saved yet). + ProfileModified { change: EventProfileModified }, + + /// The Profile was last used on another device, user ought to claim it. + ProfileUsedOnOtherDevice(DeviceInfo), +} + +impl Event { + pub fn profile_modified(change: EventProfileModified) -> Self { + Self::ProfileModified { change } + } + + pub fn profile_used_on_other_device(device: DeviceInfo) -> Self { + Self::ProfileUsedOnOtherDevice(device) + } +} + +impl HasEventKind for Event { + fn kind(&self) -> EventKind { + match self { + Self::Booted => EventKind::Booted, + Self::GatewayChangedCurrent { to: _, is_new: _ } => { + EventKind::GatewayChangedCurrent + } + Self::ProfileModified { change } => change.kind(), + Self::ProfileUsedOnOtherDevice(_) => { + EventKind::ProfileUsedOnOtherDevice + } + Self::ProfileImported { id: _ } => EventKind::ProfileImported, + Self::ProfileSaved => EventKind::ProfileSaved, + } + } +} + +impl HasSampleValues for Event { + fn sample() -> Self { + Self::Booted + } + + fn sample_other() -> Self { + Self::ProfileModified { + change: EventProfileModified::sample_other(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Event; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn last_used_on_other_device() { + let device = DeviceInfo::sample(); + let sut = SUT::profile_used_on_other_device(device.clone()); + assert_eq!(sut, SUT::ProfileUsedOnOtherDevice(device)) + } + + #[test] + fn test_kind() { + let test = |s: SUT, exp: EventKind| { + assert_eq!(s.kind(), exp); + }; + test( + SUT::ProfileImported { + id: ProfileID::sample(), + }, + EventKind::ProfileImported, + ); + test(SUT::ProfileSaved, EventKind::ProfileSaved); + test( + SUT::GatewayChangedCurrent { + to: Gateway::sample(), + is_new: false, + }, + EventKind::GatewayChangedCurrent, + ); + let change = EventProfileModified::AccountAdded { + address: AccountAddress::sample(), + }; + test( + SUT::ProfileModified { + change: change.clone(), + }, + change.kind(), + ); + } +} diff --git a/src/system/drivers/event_bus_driver/support/event_kind.rs b/src/system/drivers/event_bus_driver/support/event_kind.rs new file mode 100644 index 000000000..efb913c6b --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/event_kind.rs @@ -0,0 +1,338 @@ +use crate::prelude::*; + +/// A discriminator identifying the kind of `Event`, this has no associated +/// values and flattens the otherwise nested `Event` enum. +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + Hash, + enum_iterator::Sequence, + uniffi::Enum, +)] +pub enum EventKind { + /* Sort lexicographically */ + /// Profile updated with a new account. + AccountAdded, + + /// Profile updated with new accounts. + AccountsAdded, + + /// An existing account has been updated + AccountUpdated, + + /// SargonOS did boot. + Booted, + + /// Current Gateway changed + GatewayChangedCurrent, + + /// Profile was saved. + ProfileSaved, + + /// A profile has been imported and has been set to active profile, + /// and saved into secure storage. + ProfileImported, + + /// Profile was last used on another device. + ProfileUsedOnOtherDevice, + + /// Profile updated with a new factor source. + FactorSourceAdded, + + /// Profile updated with multiple new factor sources. + FactorSourcesAdded, + + /// An existing factor source has been updated + FactorSourceUpdated, + + /// Profile updated with a new Security Structure. + SecurityStructureAdded, +} + +impl EventKind { + /// Returns collection of all different EventKinds + pub fn all() -> Vec { + all::().collect() + } + + /// If hosts should fetch account list due to an action which triggered the + /// event of this kind to be emitted. + /// + /// E.g. if an account was saved into Profile, an event with the kind + /// `EventKind::AccountAdded` will be emitted, which hosts SHOULD react to + /// and thus fetch the account list and possibly update UI. + pub fn affects_current_accounts(&self) -> bool { + use EventKind::*; + matches!( + *self, + Booted + | ProfileImported + | AccountAdded + | AccountsAdded + | AccountUpdated + | GatewayChangedCurrent + ) + } + + /// If hosts should check the current network due to an action which triggered the + /// event of this kind to be emitted. + /// + /// E.g. if the current gateway was changed by the user, an event with the kind + /// `EventKind::GatewayChangedCurrent` will be emitted, which hosts SHOULD react to + /// and check the network of the new gateway and possibly update UI. + pub fn affects_current_network(&self) -> bool { + use EventKind::*; + matches!(*self, Booted | ProfileImported | GatewayChangedCurrent) + } + + /// If hosts should check saved gateways due to an action which triggered the + /// event of this kind to be emitted. + /// + /// E.g. if the current gateway was changed by the user, an event with the kind + /// `EventKind::GatewayChangedCurrent` will be emitted, which hosts SHOULD + /// react to and fetch saved gateways and possibly update UI. + pub fn affects_saved_gateways(&self) -> bool { + use EventKind::*; + matches!(*self, Booted | ProfileImported | GatewayChangedCurrent) + } + + /// If security structures have changed + pub fn affects_security_structures(&self) -> bool { + use EventKind::*; + matches!(*self, Booted | ProfileImported | SecurityStructureAdded) + } + + /// If hosts UI displaying factor sources (of any kind) should re-fetch + /// the list from SargonOS. + /// + /// E.g. if a new account is created using factor source `X` then `x.common.last_used`, + /// is updated and an event of kind `FactorSourceUpdated` is emitted, which does + /// affect factor sources shown by host. + pub fn affects_factor_sources(&self) -> bool { + use EventKind::*; + matches!( + *self, + Booted + | ProfileImported + | FactorSourceAdded + | FactorSourceUpdated + | FactorSourcesAdded + ) + } +} + +#[uniffi::export] +pub fn event_kind_affects_current_accounts(event_kind: EventKind) -> bool { + event_kind.affects_current_accounts() +} + +#[uniffi::export] +pub fn event_kind_affects_current_network(event_kind: EventKind) -> bool { + event_kind.affects_current_network() +} + +#[uniffi::export] +pub fn event_kind_affects_saved_gateways(event_kind: EventKind) -> bool { + event_kind.affects_saved_gateways() +} + +#[uniffi::export] +pub fn event_kind_affects_factor_sources(event_kind: EventKind) -> bool { + event_kind.affects_factor_sources() +} + +#[uniffi::export] +pub fn event_kind_affects_security_structures(event_kind: EventKind) -> bool { + event_kind.affects_security_structures() +} + +#[uniffi::export] +pub fn event_kind_all() -> Vec { + EventKind::all() +} + +impl HasSampleValues for EventKind { + fn sample() -> Self { + Self::Booted + } + + fn sample_other() -> Self { + Self::ProfileSaved + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::EventKind::{ + AccountAdded, AccountUpdated, AccountsAdded, Booted, ProfileImported, + ProfileSaved, + }; + + #[allow(clippy::upper_case_acronyms)] + type SUT = EventKind; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_event_kind_affects_current_accounts() { + use EventKind::*; + SUT::all() + .into_iter() + .map(|sut| (sut, sut.affects_current_accounts())) + .for_each(|(sut, affects)| match sut { + Booted + | ProfileImported + | AccountAdded + | AccountsAdded + | AccountUpdated + | GatewayChangedCurrent => assert!(affects), + ProfileUsedOnOtherDevice + | ProfileSaved + | SecurityStructureAdded + | FactorSourceAdded + | FactorSourcesAdded + | FactorSourceUpdated => { + assert!(!affects) + } + }) + } + + #[test] + fn event_kind_affects_current_network() { + use EventKind::*; + SUT::all() + .into_iter() + .map(|sut| (sut, sut.affects_current_network())) + .for_each(|(sut, affects)| match sut { + Booted | ProfileImported | GatewayChangedCurrent => { + assert!(affects) + } + ProfileUsedOnOtherDevice + | FactorSourceAdded + | FactorSourceUpdated + | ProfileSaved + | AccountAdded + | SecurityStructureAdded + | FactorSourcesAdded + | AccountsAdded + | AccountUpdated => assert!(!affects), + }) + } + + #[test] + fn event_kind_affects_security_structures() { + use EventKind::*; + SUT::all() + .into_iter() + .map(|sut| (sut, sut.affects_security_structures())) + .for_each(|(sut, affects)| match sut { + Booted | ProfileImported | SecurityStructureAdded => { + assert!(affects) + } + ProfileUsedOnOtherDevice + | FactorSourceAdded + | FactorSourceUpdated + | ProfileSaved + | AccountAdded + | GatewayChangedCurrent + | FactorSourcesAdded + | AccountsAdded + | AccountUpdated => assert!(!affects), + }) + } + + #[test] + fn event_kind_affects_saved_gateways() { + use EventKind::*; + SUT::all() + .into_iter() + .map(|sut| (sut, sut.affects_saved_gateways())) + .for_each(|(sut, affects)| match sut { + Booted | ProfileImported | GatewayChangedCurrent => { + assert!(affects) + } + ProfileUsedOnOtherDevice + | FactorSourceAdded + | FactorSourceUpdated + | ProfileSaved + | AccountAdded + | FactorSourcesAdded + | SecurityStructureAdded + | AccountsAdded + | AccountUpdated => assert!(!affects), + }) + } + + #[test] + fn event_kind_affects_factor_source() { + use EventKind::*; + SUT::all() + .into_iter() + .map(|sut| (sut, sut.affects_factor_sources())) + .for_each(|(sut, affects)| match sut { + Booted | ProfileImported | FactorSourceAdded + | FactorSourcesAdded | FactorSourceUpdated => { + assert!(affects) + } + ProfileUsedOnOtherDevice + | GatewayChangedCurrent + | ProfileSaved + | SecurityStructureAdded + | AccountAdded + | AccountsAdded + | AccountUpdated => assert!(!affects), + }) + } +} + +mod uniffi_tests { + + use super::*; + use crate::EventKind::{ + AccountAdded, AccountUpdated, AccountsAdded, Booted, ProfileImported, + ProfileSaved, + }; + + #[test] + fn test_event_kind_all() { + assert!(event_kind_all().into_iter().contains(&Booted)); + } + + #[test] + fn test_event_kind_affects_current_accounts() { + assert!(event_kind_affects_current_accounts(Booted)); + } + + #[test] + fn test_event_kind_affects_current_network() { + assert!(event_kind_affects_current_network(Booted)); + } + + #[test] + fn test_event_kind_affects_saved_gateways() { + assert!(event_kind_affects_saved_gateways(Booted)); + } + + #[test] + fn test_event_kind_affects_security_structures() { + assert!(event_kind_affects_security_structures(Booted)); + } + + #[test] + fn test_event_kind_affects_factor_sources() { + assert!(event_kind_affects_factor_sources(Booted)); + } +} diff --git a/src/system/drivers/event_bus_driver/support/event_notification.rs b/src/system/drivers/event_bus_driver/support/event_notification.rs new file mode 100644 index 000000000..efca7fef0 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/event_notification.rs @@ -0,0 +1,65 @@ +use crate::prelude::*; + +/// A notification containing a timestamped and unique `event`, host client +/// can subscribe to these notifications by using the EventBusDriver. +#[derive(Debug, Clone, PartialEq, Eq, Hash, uniffi::Record)] +pub struct EventNotification { + pub id: Uuid, + pub event: Event, + pub timestamp: Timestamp, +} + +impl EventNotification { + pub fn new(event: Event) -> Self { + Self { + id: id(), + event, + timestamp: now(), + } + } + + pub fn profile_modified(change: EventProfileModified) -> Self { + Self::new(Event::profile_modified(change)) + } + + pub fn profile_used_on_other_device(other_device: DeviceInfo) -> Self { + Self::new(Event::profile_used_on_other_device(other_device)) + } +} + +impl HasSampleValues for EventNotification { + fn sample() -> Self { + Self { + id: Uuid::sample(), + event: Event::sample(), + timestamp: Timestamp::sample(), + } + } + + fn sample_other() -> Self { + Self { + id: Uuid::sample_other(), + event: Event::sample_other(), + timestamp: Timestamp::sample_other(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = EventNotification; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } +} diff --git a/src/system/drivers/event_bus_driver/support/event_profile_modified.rs b/src/system/drivers/event_bus_driver/support/event_profile_modified.rs new file mode 100644 index 000000000..7149ecdf0 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/event_profile_modified.rs @@ -0,0 +1,136 @@ +use crate::prelude::*; + +/// The active profile has been modified (might not have been saved yet). +#[derive(Debug, Clone, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum EventProfileModified { + /// A new account with `address` was inserted into the active profile + AccountAdded { address: AccountAddress }, + + /// New accounts with `addresses` were inserted into the active profile + AccountsAdded { addresses: Vec }, + + /// An existing account has been updated + AccountUpdated { address: AccountAddress }, + + /// Profile updated with a new factor source. + FactorSourceAdded { id: FactorSourceID }, + + /// Profile updated with many new factor sources. + FactorSourcesAdded { ids: Vec }, + + /// An existing factor source has been updated + FactorSourceUpdated { id: FactorSourceID }, + + /// Profile updated with a new Security Structure. + SecurityStructureAdded { id: SecurityStructureID }, +} + +impl HasEventKind for EventProfileModified { + fn kind(&self) -> EventKind { + match self { + Self::AccountUpdated { address: _ } => EventKind::AccountUpdated, + Self::AccountAdded { address: _ } => EventKind::AccountAdded, + Self::AccountsAdded { addresses: _ } => EventKind::AccountsAdded, + Self::FactorSourcesAdded { ids: _ } => { + EventKind::FactorSourcesAdded + } + Self::FactorSourceAdded { id: _ } => EventKind::FactorSourceAdded, + Self::FactorSourceUpdated { id: _ } => { + EventKind::FactorSourceUpdated + } + Self::SecurityStructureAdded { id: _ } => { + EventKind::SecurityStructureAdded + } + } + } +} + +impl HasSampleValues for EventProfileModified { + fn sample() -> Self { + Self::AccountAdded { + address: AccountAddress::sample(), + } + } + + fn sample_other() -> Self { + Self::AccountsAdded { + addresses: vec![ + AccountAddress::sample_mainnet_other(), + AccountAddress::sample_mainnet(), + ], + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = EventProfileModified; + + #[test] + fn equality() { + assert_eq!(SUT::sample(), SUT::sample()); + assert_eq!(SUT::sample_other(), SUT::sample_other()); + } + + #[test] + fn inequality() { + assert_ne!(SUT::sample(), SUT::sample_other()); + } + + #[test] + fn test_kind() { + let test = |s: SUT, exp: EventKind| { + assert_eq!(s.kind(), exp); + }; + test( + SUT::AccountAdded { + address: AccountAddress::sample(), + }, + EventKind::AccountAdded, + ); + + test( + SUT::AccountUpdated { + address: AccountAddress::sample(), + }, + EventKind::AccountUpdated, + ); + test( + SUT::AccountsAdded { + addresses: vec![AccountAddress::sample()], + }, + EventKind::AccountsAdded, + ); + + test( + SUT::FactorSourcesAdded { + ids: vec![FactorSourceID::sample()], + }, + EventKind::FactorSourcesAdded, + ); + + test( + SUT::FactorSourceAdded { + id: FactorSourceID::sample(), + }, + EventKind::FactorSourceAdded, + ); + + test( + SUT::SecurityStructureAdded { + id: SecurityStructureID::sample(), + }, + EventKind::SecurityStructureAdded, + ); + + test( + SUT::FactorSourceUpdated { + id: FactorSourceID::sample(), + }, + EventKind::FactorSourceUpdated, + ); + } +} diff --git a/src/system/drivers/event_bus_driver/support/event_uniffi_fn.rs b/src/system/drivers/event_bus_driver/support/event_uniffi_fn.rs new file mode 100644 index 000000000..be8988628 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/event_uniffi_fn.rs @@ -0,0 +1,19 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn event_kind(event: &Event) -> EventKind { + event.kind() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = Event; + + #[test] + fn test_kind() { + assert_eq!(event_kind(&SUT::Booted), EventKind::Booted); + } +} diff --git a/src/system/drivers/event_bus_driver/support/has_event_kind.rs b/src/system/drivers/event_bus_driver/support/has_event_kind.rs new file mode 100644 index 000000000..4644366f7 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/has_event_kind.rs @@ -0,0 +1,7 @@ +use crate::prelude::*; + +/// Event which can be turned into a discriminant `EventKind`, +/// which does not have any associated values. +pub trait HasEventKind { + fn kind(&self) -> EventKind; +} diff --git a/src/system/drivers/event_bus_driver/support/mod.rs b/src/system/drivers/event_bus_driver/support/mod.rs new file mode 100644 index 000000000..22d3a96ac --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/mod.rs @@ -0,0 +1,15 @@ +mod event; +mod event_kind; +mod event_notification; +mod event_profile_modified; +mod event_uniffi_fn; +mod has_event_kind; +mod test; + +pub use event::*; +pub use event_kind::*; +pub use event_notification::*; +pub use event_profile_modified::*; +pub use event_uniffi_fn::*; +pub use has_event_kind::*; +pub use test::*; diff --git a/src/system/drivers/event_bus_driver/support/test/mod.rs b/src/system/drivers/event_bus_driver/support/test/mod.rs new file mode 100644 index 000000000..c77d65e6a --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/test/mod.rs @@ -0,0 +1,3 @@ +mod rust_event_bus_driver; + +pub use rust_event_bus_driver::*; diff --git a/src/system/drivers/event_bus_driver/support/test/rust_event_bus_driver.rs b/src/system/drivers/event_bus_driver/support/test/rust_event_bus_driver.rs new file mode 100644 index 000000000..cc61f9795 --- /dev/null +++ b/src/system/drivers/event_bus_driver/support/test/rust_event_bus_driver.rs @@ -0,0 +1,37 @@ +use crate::prelude::*; +use std::sync::RwLock; + +#[derive(Debug)] +pub struct RustEventBusDriver { + recorded: RwLock>, + spy: fn(EventNotification) -> (), +} + +#[async_trait::async_trait] +impl EventBusDriver for RustEventBusDriver { + async fn handle_event_notification( + &self, + event_notification: EventNotification, + ) { + self.recorded + .try_write() + .unwrap() + .push(event_notification.clone()); + (self.spy)(event_notification) + } +} + +impl RustEventBusDriver { + pub fn recorded(&self) -> Vec { + self.recorded.try_read().unwrap().clone() + } + pub fn new() -> Arc { + Self::with_spy(|_| {}) + } + pub fn with_spy(spy: fn(EventNotification) -> ()) -> Arc { + Arc::new(Self { + spy, + recorded: RwLock::new(Vec::new()), + }) + } +} diff --git a/src/system/drivers/file_system_driver/file_system_driver.rs b/src/system/drivers/file_system_driver/file_system_driver.rs new file mode 100644 index 000000000..74c849fda --- /dev/null +++ b/src/system/drivers/file_system_driver/file_system_driver.rs @@ -0,0 +1,11 @@ +use crate::prelude::*; + +#[uniffi::export(with_foreign)] +#[async_trait::async_trait] +pub trait FileSystemDriver: Send + Sync + std::fmt::Debug { + async fn load_from_file(&self, path: String) -> Result>; + + async fn save_to_file(&self, path: String, data: BagOfBytes) -> Result<()>; + + async fn delete_file(&self, path: String) -> Result<()>; +} diff --git a/src/system/drivers/file_system_driver/mod.rs b/src/system/drivers/file_system_driver/mod.rs new file mode 100644 index 000000000..e722fda5c --- /dev/null +++ b/src/system/drivers/file_system_driver/mod.rs @@ -0,0 +1,5 @@ +mod file_system_driver; +mod support; + +pub use file_system_driver::*; +pub use support::*; diff --git a/src/system/drivers/file_system_driver/support/mod.rs b/src/system/drivers/file_system_driver/support/mod.rs new file mode 100644 index 000000000..9abea5028 --- /dev/null +++ b/src/system/drivers/file_system_driver/support/mod.rs @@ -0,0 +1,3 @@ +mod test; + +pub use test::*; diff --git a/src/system/drivers/file_system_driver/support/test/mod.rs b/src/system/drivers/file_system_driver/support/test/mod.rs new file mode 100644 index 000000000..31fa20b3b --- /dev/null +++ b/src/system/drivers/file_system_driver/support/test/mod.rs @@ -0,0 +1,3 @@ +mod rust_file_system_driver; + +pub use rust_file_system_driver::*; diff --git a/src/system/drivers/file_system_driver/support/test/rust_file_system_driver.rs b/src/system/drivers/file_system_driver/support/test/rust_file_system_driver.rs new file mode 100644 index 000000000..d0f6349fa --- /dev/null +++ b/src/system/drivers/file_system_driver/support/test/rust_file_system_driver.rs @@ -0,0 +1,139 @@ +use std::path::{Path, PathBuf}; + +use crate::prelude::*; + +#[derive(Debug)] +pub struct RustFileSystemDriver; + +impl RustFileSystemDriver { + pub fn new() -> Arc { + Arc::new(RustFileSystemDriver) + } +} + +#[allow(dead_code)] +pub(crate) fn path_from_str(str: String, require: bool) -> Result { + let path = PathBuf::from_str(&str).map_err(|_| CommonError::Unknown)?; + if require { + path.try_exists().map_err(|_| CommonError::Unknown)?; + } + Ok(path) +} + +#[async_trait::async_trait] +impl FileSystemDriver for RustFileSystemDriver { + async fn load_from_file(&self, path: String) -> Result> { + let path_buf = path_from_str(path.clone(), true)?; + match fs::read(path_buf) { + Err(e) => match e.kind() { + std::io::ErrorKind::NotFound => Ok(None), + _ => Err(CommonError::FailedToLoadFile { path }), + }, + Ok(contents) => Ok(Some(BagOfBytes::from(contents))), + } + } + + async fn save_to_file(&self, path: String, data: BagOfBytes) -> Result<()> { + let path_buf = path_from_str(path.clone(), false)?; + fs::write(path_buf, data.as_ref()) + .map_err(|_| CommonError::FailedToSaveFile { path })?; + Ok(()) + } + + async fn delete_file(&self, path: String) -> Result<()> { + let path_buf = path_from_str(path.clone(), false)?; + match fs::remove_file(path_buf) { + Ok(_) => Ok(()), + Err(e) => match e.kind() { + std::io::ErrorKind::NotFound => Ok(()), + _ => Err(CommonError::FailedToDeleteFile { path }), + }, + } + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = RustFileSystemDriver; + + fn file_in_dir(dir_path: impl AsRef) -> String { + let dir_path = dir_path.as_ref(); + assert!(std::fs::create_dir_all(dir_path).is_ok()); + + let file_name = format!("delete-me--generated-by-test-{}.txt", id()); + let file_path_buf = dir_path.join(file_name); + let file = String::from(file_path_buf.to_string_lossy()); + file + } + + fn file_in_tmp() -> String { + let dir_path = Path::new(env!("CARGO_MANIFEST_DIR")).join("target/tmp"); + file_in_dir(dir_path) + } + + fn contents() -> BagOfBytes { + BagOfBytes::from("this file is completely safe to delete. it was generated by RustFileSystemDriver test.".as_bytes()) + } + + #[actix_rt::test] + async fn test_create_load_delete() { + let sut = SUT::new(); + let file = file_in_tmp(); + + let data = contents(); + sut.save_to_file(file.clone(), data.clone()).await.unwrap(); + let loaded = sut.load_from_file(file.clone()).await.unwrap().unwrap(); + assert_eq!(loaded, data); + assert!(sut.delete_file(file.clone()).await.is_ok()); + } + + #[actix_rt::test] + async fn test_load_non_existing_is_ok() { + let sut = SUT::new(); + let res = sut.load_from_file("non-existing".to_owned()).await; + assert_eq!(res, Ok(None)); + } + + #[actix_rt::test] + async fn test_load_fail() { + let sut = SUT::new(); + let res = sut.load_from_file("/".to_owned()).await; + assert_eq!( + res, + Err(CommonError::FailedToLoadFile { + path: "/".to_owned() + }) + ); + } + + #[actix_rt::test] + async fn test_delete_non_existing_is_ok() { + let sut = SUT::new(); + let res = sut.delete_file("does not exist".to_owned()).await; + assert_eq!(res, Ok(())); + } + + #[actix_rt::test] + async fn test_save_to_root_is_err() { + let sut = SUT::new(); + let path = file_in_dir(Path::new("/")); + let res = sut.save_to_file(path.clone(), contents()).await; + assert_eq!(res, Err(CommonError::FailedToSaveFile { path })); + } + + #[actix_rt::test] + async fn test_delete_dir_does_not_work() { + let sut = SUT::new(); + let path = String::from( + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("target/") + .to_string_lossy(), + ); + let res = sut.delete_file(path.clone()).await; + assert_eq!(res, Err(CommonError::FailedToDeleteFile { path })); + } +} diff --git a/src/system/drivers/host_info_driver/host_info_driver.rs b/src/system/drivers/host_info_driver/host_info_driver.rs new file mode 100644 index 000000000..739bda39c --- /dev/null +++ b/src/system/drivers/host_info_driver/host_info_driver.rs @@ -0,0 +1,17 @@ +use crate::prelude::*; + +#[uniffi::export(with_foreign)] +#[async_trait::async_trait] +pub trait HostInfoDriver: Send + Sync + std::fmt::Debug { + /// The **current** device's operating system, e.g. "iOS 17.4.1" + async fn host_os(&self) -> HostOS; + + /// The name of the host device (iPhone/Android), e.g. "My Red iPhone" + async fn host_device_name(&self) -> String; + + /// The **current** version of the host app, for example the Radix iOS Wallet version - e.g. "1.6.1". + async fn host_app_version(&self) -> String; + + /// The model of the host device (iPhone/Android), .e.g. "iPhone SE 2nd Gen" + async fn host_device_model(&self) -> String; +} diff --git a/src/system/drivers/host_info_driver/mod.rs b/src/system/drivers/host_info_driver/mod.rs new file mode 100644 index 000000000..f4e4e27b7 --- /dev/null +++ b/src/system/drivers/host_info_driver/mod.rs @@ -0,0 +1,5 @@ +mod host_info_driver; +mod support; + +pub use host_info_driver::*; +pub use support::*; diff --git a/src/system/drivers/host_info_driver/support/mod.rs b/src/system/drivers/host_info_driver/support/mod.rs new file mode 100644 index 000000000..9abea5028 --- /dev/null +++ b/src/system/drivers/host_info_driver/support/mod.rs @@ -0,0 +1,3 @@ +mod test; + +pub use test::*; diff --git a/src/system/drivers/host_info_driver/support/test/mod.rs b/src/system/drivers/host_info_driver/support/test/mod.rs new file mode 100644 index 000000000..a1f11acc1 --- /dev/null +++ b/src/system/drivers/host_info_driver/support/test/mod.rs @@ -0,0 +1,3 @@ +mod rust_host_info_driver; + +pub use rust_host_info_driver::*; diff --git a/src/system/drivers/host_info_driver/support/test/rust_host_info_driver.rs b/src/system/drivers/host_info_driver/support/test/rust_host_info_driver.rs new file mode 100644 index 000000000..a0ce1fb96 --- /dev/null +++ b/src/system/drivers/host_info_driver/support/test/rust_host_info_driver.rs @@ -0,0 +1,35 @@ +use std::env; + +use crate::prelude::*; + +#[derive(Debug)] +pub struct RustHostInfoDriver; + +impl RustHostInfoDriver { + pub fn new() -> Arc { + Arc::new(RustHostInfoDriver) + } +} + +#[async_trait::async_trait] +impl HostInfoDriver for RustHostInfoDriver { + /// The **current** device's operating system, e.g. "iOS 17.4.1" + async fn host_os(&self) -> HostOS { + HostOS::other("macos", "Apple", "14.5") + } + + /// The name of the host device (iPhone/Android), e.g. "My Red iPhone" + async fn host_device_name(&self) -> String { + "Rosebud".to_owned() + } + + /// The **current** version of the host app, for example the Radix iOS Wallet version - e.g. "1.6.1". + async fn host_app_version(&self) -> String { + env!("CARGO_PKG_VERSION").to_owned() + } + + /// The model of the host device (iPhone/Android), .e.g. "iPhone SE 2nd Gen" + async fn host_device_model(&self) -> String { + "Rust Sargon Unknown Device Model".to_owned() + } +} diff --git a/src/system/drivers/logging_driver/logging_driver.rs b/src/system/drivers/logging_driver/logging_driver.rs new file mode 100644 index 000000000..5f64099f1 --- /dev/null +++ b/src/system/drivers/logging_driver/logging_driver.rs @@ -0,0 +1,11 @@ +use crate::prelude::*; + +/// * Trace +/// * Debug +/// * Info +/// * Warning +/// * Error +#[uniffi::export(with_foreign)] +pub trait LoggingDriver: Send + Sync + std::fmt::Debug { + fn log(&self, level: LogLevel, msg: String); +} diff --git a/src/system/drivers/logging_driver/mod.rs b/src/system/drivers/logging_driver/mod.rs new file mode 100644 index 000000000..53aab3cad --- /dev/null +++ b/src/system/drivers/logging_driver/mod.rs @@ -0,0 +1,5 @@ +mod logging_driver; +mod support; + +pub use logging_driver::*; +pub use support::*; diff --git a/src/system/drivers/logging_driver/support/log_level.rs b/src/system/drivers/logging_driver/support/log_level.rs new file mode 100644 index 000000000..26e487960 --- /dev/null +++ b/src/system/drivers/logging_driver/support/log_level.rs @@ -0,0 +1,189 @@ +use crate::prelude::*; + +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + enum_iterator::Sequence, + uniffi::Enum, +)] +#[repr(u8)] +pub enum LogLevel { + /// The "error" level. + /// + /// Designates very serious errors. + Error = 1, + + /// The "warn" level. + /// + /// Designates hazardous situations. + Warn, + + /// The "info" level. + /// + /// Designates useful information. + Info, + + /// The "debug" level. + /// + /// Designates lower priority information. + Debug, + + /// The "trace" level. + /// + /// Designates very low priority, often extremely verbose, information. + Trace, +} + +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + enum_iterator::Sequence, + uniffi::Enum, +)] +#[repr(u8)] +pub enum LogFilter { + /// Logging is turned off + Off = 0, + + /// The "error" level. + /// + /// Designates very serious errors. + Error, + + /// The "warn" level. + /// + /// Designates hazardous situations. + Warn, + + /// The "info" level. + /// + /// Designates useful information. + Info, + + /// The "debug" level. + /// + /// Designates lower priority information. + Debug, + + /// The "trace" level. + /// + /// Designates very low priority, often extremely verbose, information. + Trace, +} + +impl From for LogLevel { + fn from(value: log::Level) -> Self { + match value { + log::Level::Error => Self::Error, + log::Level::Warn => Self::Warn, + log::Level::Info => Self::Info, + log::Level::Debug => Self::Debug, + log::Level::Trace => Self::Trace, + } + } +} + +impl From for log::Level { + fn from(value: LogLevel) -> Self { + match value { + LogLevel::Error => Self::Error, + LogLevel::Warn => Self::Warn, + LogLevel::Info => Self::Info, + LogLevel::Debug => Self::Debug, + LogLevel::Trace => Self::Trace, + } + } +} + +impl From for log::LevelFilter { + fn from(value: LogFilter) -> Self { + match value { + LogFilter::Off => Self::Off, + LogFilter::Error => Self::Error, + LogFilter::Warn => Self::Warn, + LogFilter::Info => Self::Info, + LogFilter::Debug => Self::Debug, + LogFilter::Trace => Self::Trace, + } + } +} + +impl From for LogFilter { + fn from(value: log::LevelFilter) -> Self { + match value { + log::LevelFilter::Off => Self::Off, + log::LevelFilter::Error => Self::Error, + log::LevelFilter::Warn => Self::Warn, + log::LevelFilter::Info => Self::Info, + log::LevelFilter::Debug => Self::Debug, + log::LevelFilter::Trace => Self::Trace, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_filter_from_log() { + let test = |l: log::LevelFilter, exp: LogFilter| { + let x = LogFilter::from(l); + assert_eq!(x, exp); + }; + test(log::LevelFilter::Off, LogFilter::Off); + test(log::LevelFilter::Error, LogFilter::Error); + test(log::LevelFilter::Warn, LogFilter::Warn); + test(log::LevelFilter::Info, LogFilter::Info); + test(log::LevelFilter::Debug, LogFilter::Debug); + test(log::LevelFilter::Trace, LogFilter::Trace); + } + + #[test] + fn test_filter_to_log() { + let test = |l: LogFilter, exp: log::LevelFilter| { + let x = log::LevelFilter::from(l); + assert_eq!(x, exp); + }; + test(LogFilter::Off, log::LevelFilter::Off); + test(LogFilter::Error, log::LevelFilter::Error); + test(LogFilter::Warn, log::LevelFilter::Warn); + test(LogFilter::Info, log::LevelFilter::Info); + test(LogFilter::Debug, log::LevelFilter::Debug); + test(LogFilter::Trace, log::LevelFilter::Trace); + } + + #[test] + fn test_level_to_log() { + let test = |l: LogLevel, exp: log::Level| { + let x = log::Level::from(l); + assert_eq!(x, exp); + }; + test(LogLevel::Error, log::Level::Error); + test(LogLevel::Warn, log::Level::Warn); + test(LogLevel::Info, log::Level::Info); + test(LogLevel::Debug, log::Level::Debug); + test(LogLevel::Trace, log::Level::Trace); + } + + #[test] + fn test_level_from_log() { + let test = |l: log::Level, exp: LogLevel| { + let x = LogLevel::from(l); + assert_eq!(x, exp); + }; + test(log::Level::Error, LogLevel::Error); + test(log::Level::Warn, LogLevel::Warn); + test(log::Level::Info, LogLevel::Info); + test(log::Level::Debug, LogLevel::Debug); + test(log::Level::Trace, LogLevel::Trace); + } +} diff --git a/src/system/drivers/logging_driver/support/mod.rs b/src/system/drivers/logging_driver/support/mod.rs new file mode 100644 index 000000000..0694d6b87 --- /dev/null +++ b/src/system/drivers/logging_driver/support/mod.rs @@ -0,0 +1,5 @@ +mod log_level; +mod test; + +pub use log_level::*; +pub use test::*; diff --git a/src/system/drivers/logging_driver/support/test/mod.rs b/src/system/drivers/logging_driver/support/test/mod.rs new file mode 100644 index 000000000..8d2514c42 --- /dev/null +++ b/src/system/drivers/logging_driver/support/test/mod.rs @@ -0,0 +1,3 @@ +mod rust_logging_driver; + +pub use rust_logging_driver::*; diff --git a/src/system/drivers/logging_driver/support/test/rust_logging_driver.rs b/src/system/drivers/logging_driver/support/test/rust_logging_driver.rs new file mode 100644 index 000000000..9bb224d6e --- /dev/null +++ b/src/system/drivers/logging_driver/support/test/rust_logging_driver.rs @@ -0,0 +1,29 @@ +use log::Log; + +use crate::prelude::*; + +#[derive(Debug)] +pub struct RustLoggingDriver { + logger: pretty_env_logger::env_logger::Logger, +} + +impl RustLoggingDriver { + pub fn new() -> Arc { + Arc::new(Self { + logger: pretty_env_logger::env_logger::builder() + .parse_default_env() + .build(), + }) + } +} + +impl LoggingDriver for RustLoggingDriver { + fn log(&self, level: LogLevel, msg: String) { + self.logger.log( + &log::Record::builder() + .level(level.into()) + .args(format_args!("{}", msg)) + .build(), + ); + } +} diff --git a/src/system/drivers/mod.rs b/src/system/drivers/mod.rs new file mode 100644 index 000000000..849788d03 --- /dev/null +++ b/src/system/drivers/mod.rs @@ -0,0 +1,19 @@ +mod drivers; +mod entropy_provider_driver; +mod event_bus_driver; +mod file_system_driver; +mod host_info_driver; +mod logging_driver; +mod networking_driver; +mod secure_storage_driver; +mod unsafe_storage_driver; + +pub use drivers::*; +pub use entropy_provider_driver::*; +pub use event_bus_driver::*; +pub use file_system_driver::*; +pub use host_info_driver::*; +pub use logging_driver::*; +pub use networking_driver::*; +pub use secure_storage_driver::*; +pub use unsafe_storage_driver::*; diff --git a/src/system/drivers/networking_driver/mod.rs b/src/system/drivers/networking_driver/mod.rs new file mode 100644 index 000000000..706a34f1a --- /dev/null +++ b/src/system/drivers/networking_driver/mod.rs @@ -0,0 +1,5 @@ +mod networking_driver; +mod support; + +pub use networking_driver::*; +pub use support::*; diff --git a/src/system/drivers/networking_driver/networking_driver.rs b/src/system/drivers/networking_driver/networking_driver.rs new file mode 100644 index 000000000..b39371c56 --- /dev/null +++ b/src/system/drivers/networking_driver/networking_driver.rs @@ -0,0 +1,16 @@ +use crate::prelude::*; + +/// Trait for executing network requests, to be implemented by hosts, so that +/// Sargon can make network requests with some HTTP client. +#[uniffi::export(with_foreign)] +#[async_trait::async_trait] +pub trait NetworkingDriver: Send + Sync + std::fmt::Debug { + /// Method invoked by Sargon Rust side, telling an implementing type to + /// execute a `NetworkRequest` and pass the Result back to Sargon Rust side. + /// + /// Either: `Err` or `Ok(NetworkResponse)`. + async fn execute_network_request( + &self, + request: NetworkRequest, + ) -> Result; +} diff --git a/src/http_client/network_antenna/mod.rs b/src/system/drivers/networking_driver/support/mod.rs similarity index 60% rename from src/http_client/network_antenna/mod.rs rename to src/system/drivers/networking_driver/support/mod.rs index c7e3dfc08..e5879b18f 100644 --- a/src/http_client/network_antenna/mod.rs +++ b/src/system/drivers/networking_driver/support/mod.rs @@ -1,9 +1,13 @@ -mod network_antenna; mod network_method; +mod network_method_uniffi_fn; mod network_request; mod network_response; -pub use network_antenna::*; +mod test; + pub use network_method::*; +pub use network_method_uniffi_fn::*; pub use network_request::*; pub use network_response::*; + +pub use test::*; diff --git a/src/http_client/network_antenna/network_method.rs b/src/system/drivers/networking_driver/support/network_method.rs similarity index 52% rename from src/http_client/network_antenna/network_method.rs rename to src/system/drivers/networking_driver/support/network_method.rs index e51eb4489..8dac1ca4b 100644 --- a/src/http_client/network_antenna/network_method.rs +++ b/src/system/drivers/networking_driver/support/network_method.rs @@ -1,15 +1,28 @@ use crate::prelude::*; -#[derive(Clone, Copy, Debug, PartialEq, Eq, uniffi::Enum)] +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + strum::EnumString, + strum::Display, + uniffi::Enum, +)] +#[strum(serialize_all = "UPPERCASE")] pub enum NetworkMethod { Post, Get, + Head, } impl HasSampleValues for NetworkMethod { fn sample() -> Self { NetworkMethod::Post } + fn sample_other() -> Self { NetworkMethod::Get } @@ -32,4 +45,16 @@ mod tests { fn inequality() { assert_ne!(SUT::sample(), SUT::sample_other()); } + + #[test] + fn str_roundtrip() { + let test = |m: SUT, s: &str| { + assert_eq!(SUT::from_str(s).unwrap(), m); + assert_eq!(m.to_string(), s); + assert_eq!(SUT::from_str(&m.to_string()).unwrap(), m); + }; + test(SUT::Post, "POST"); + test(SUT::Get, "GET"); + test(SUT::Head, "HEAD"); + } } diff --git a/src/system/drivers/networking_driver/support/network_method_uniffi_fn.rs b/src/system/drivers/networking_driver/support/network_method_uniffi_fn.rs new file mode 100644 index 000000000..6c2f07e56 --- /dev/null +++ b/src/system/drivers/networking_driver/support/network_method_uniffi_fn.rs @@ -0,0 +1,45 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_network_method_sample() -> NetworkMethod { + NetworkMethod::sample() +} + +#[uniffi::export] +pub fn new_network_method_sample_other() -> NetworkMethod { + NetworkMethod::sample_other() +} + +#[uniffi::export] +pub fn network_method_to_string(method: &NetworkMethod) -> String { + method.to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = NetworkMethod; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_network_method_sample(), + new_network_method_sample_other(), + // duplicates should get removed + new_network_method_sample(), + new_network_method_sample_other(), + ]) + .len(), + 2 + ); + } + + #[test] + fn test_network_method_to_string() { + let sut = SUT::Post; + assert_eq!(network_method_to_string(&sut), sut.to_string()); + } +} diff --git a/src/http_client/network_antenna/network_request.rs b/src/system/drivers/networking_driver/support/network_request.rs similarity index 100% rename from src/http_client/network_antenna/network_request.rs rename to src/system/drivers/networking_driver/support/network_request.rs diff --git a/src/system/drivers/networking_driver/support/network_request_uniffi_fn.rs b/src/system/drivers/networking_driver/support/network_request_uniffi_fn.rs new file mode 100644 index 000000000..aff15ff83 --- /dev/null +++ b/src/system/drivers/networking_driver/support/network_request_uniffi_fn.rs @@ -0,0 +1,34 @@ +use crate::prelude::*; + +#[uniffi::export] +pub fn new_network_request_sample() -> NetworkRequest { + NetworkRequest::sample() +} + +#[uniffi::export] +pub fn new_network_request_sample_other() -> NetworkRequest { + NetworkRequest::sample_other() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = NetworkRequest; + + #[test] + fn hash_of_samples() { + assert_eq!( + HashSet::::from_iter([ + new_network_request_sample(), + new_network_request_sample_other(), + // duplicates should get removed + new_network_request_sample(), + new_network_request_sample_other(), + ]) + .len(), + 2 + ); + } +} diff --git a/src/http_client/network_antenna/network_response.rs b/src/system/drivers/networking_driver/support/network_response.rs similarity index 100% rename from src/http_client/network_antenna/network_response.rs rename to src/system/drivers/networking_driver/support/network_response.rs diff --git a/src/http_client/network_antenna/network_antenna.rs b/src/system/drivers/networking_driver/support/test/mock_networking_driver.rs similarity index 62% rename from src/http_client/network_antenna/network_antenna.rs rename to src/system/drivers/networking_driver/support/test/mock_networking_driver.rs index 80ee1b50c..65e038d2c 100644 --- a/src/http_client/network_antenna/network_antenna.rs +++ b/src/system/drivers/networking_driver/support/test/mock_networking_driver.rs @@ -1,31 +1,17 @@ -use crate::prelude::*; +#![cfg(test)] -/// Trait for executing network requests, to be implemented on the FFI side -/// (iOS/Android), so that Sargon can with some HTTP client perform make network -/// requests. -#[uniffi::export(with_foreign)] -#[async_trait::async_trait] -pub trait NetworkAntenna: Send + Sync { - /// Method invoked by Sargon Rust side, telling an implementing type to - /// execute a `NetworkRequest` and pass the Result back to Sargon Rust side. - /// - /// Either: `Err` or `Ok(NetworkResponse)`. - async fn execute_network_request( - &self, - request: NetworkRequest, - ) -> Result; -} +use crate::prelude::*; /// A mocked network antenna, useful for testing. #[derive(Debug)] -pub struct MockAntenna { +pub struct MockNetworkingDriver { hard_coded_status: u16, hard_coded_body: BagOfBytes, spy: fn(NetworkRequest) -> (), } #[allow(unused)] -impl MockAntenna { +impl MockNetworkingDriver { pub fn with_spy( status: u16, body: impl Into, @@ -56,7 +42,7 @@ impl MockAntenna { } #[async_trait::async_trait] -impl NetworkAntenna for MockAntenna { +impl NetworkingDriver for MockNetworkingDriver { async fn execute_network_request( &self, request: NetworkRequest, diff --git a/src/system/drivers/networking_driver/support/test/mod.rs b/src/system/drivers/networking_driver/support/test/mod.rs new file mode 100644 index 000000000..c94cd42c1 --- /dev/null +++ b/src/system/drivers/networking_driver/support/test/mod.rs @@ -0,0 +1,9 @@ +mod rust_networking_driver; + +pub use rust_networking_driver::*; + +#[cfg(test)] +mod mock_networking_driver; + +#[cfg(test)] +pub use mock_networking_driver::*; diff --git a/tests/integration/network_antenna_reqwest.rs b/src/system/drivers/networking_driver/support/test/rust_networking_driver.rs similarity index 50% rename from tests/integration/network_antenna_reqwest.rs rename to src/system/drivers/networking_driver/support/test/rust_networking_driver.rs index 899d4ef75..7f1068aee 100644 --- a/tests/integration/network_antenna_reqwest.rs +++ b/src/system/drivers/networking_driver/support/test/rust_networking_driver.rs @@ -1,21 +1,36 @@ +use crate::prelude::*; + use async_trait::async_trait; use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; -use sargon::prelude::*; use std::sync::Arc; -fn map_method(method: NetworkMethod) -> reqwest::Method { - match method { - NetworkMethod::Post => reqwest::Method::POST, - NetworkMethod::Get => reqwest::Method::GET, +impl From for reqwest::Method { + fn from(value: NetworkMethod) -> Self { + match value { + NetworkMethod::Post => reqwest::Method::POST, + NetworkMethod::Get => reqwest::Method::GET, + NetworkMethod::Head => reqwest::Method::HEAD, + } } } -struct RustAntenna { +/// A **Rust** networking driver using `reqwest`. +#[derive(Debug)] +pub struct RustNetworkingDriver { client: reqwest::Client, } +impl RustNetworkingDriver { + pub fn new() -> Arc { + let reqwest_client = reqwest::Client::new(); + Arc::new(Self { + client: reqwest_client, + }) + } +} + #[async_trait] -impl NetworkAntenna for RustAntenna { +impl NetworkingDriver for RustNetworkingDriver { async fn execute_network_request( &self, request: NetworkRequest, @@ -29,7 +44,7 @@ impl NetworkAntenna for RustAntenna { } let request = self .client - .request(map_method(request.method), request.url) + .request(reqwest::Method::from(request.method), request.url) .body(request.body.to_vec()) .headers(headers) .build() @@ -50,10 +65,18 @@ impl NetworkAntenna for RustAntenna { } } -pub(crate) fn new_gateway_client(network_id: NetworkID) -> GatewayClient { - let reqwest_client = reqwest::Client::new(); - let network_antenna = RustAntenna { - client: reqwest_client, - }; - GatewayClient::new(Arc::new(network_antenna), network_id) +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_map_method() { + let test = |m: NetworkMethod, exp: reqwest::Method| { + assert_eq!(reqwest::Method::from(m), exp); + }; + test(NetworkMethod::Post, reqwest::Method::POST); + test(NetworkMethod::Get, reqwest::Method::GET); + test(NetworkMethod::Head, reqwest::Method::HEAD); + } } diff --git a/src/system/drivers/secure_storage_driver/mod.rs b/src/system/drivers/secure_storage_driver/mod.rs new file mode 100644 index 000000000..ecb97ae2b --- /dev/null +++ b/src/system/drivers/secure_storage_driver/mod.rs @@ -0,0 +1,5 @@ +mod secure_storage_driver; +mod support; + +pub use secure_storage_driver::*; +pub use support::*; diff --git a/src/system/drivers/secure_storage_driver/secure_storage_driver.rs b/src/system/drivers/secure_storage_driver/secure_storage_driver.rs new file mode 100644 index 000000000..ba01ebebd --- /dev/null +++ b/src/system/drivers/secure_storage_driver/secure_storage_driver.rs @@ -0,0 +1,18 @@ +use crate::prelude::*; + +#[uniffi::export(with_foreign)] +#[async_trait::async_trait] +pub trait SecureStorageDriver: Send + Sync + std::fmt::Debug { + async fn load_data( + &self, + key: SecureStorageKey, + ) -> Result>; + + async fn save_data( + &self, + key: SecureStorageKey, + data: BagOfBytes, + ) -> Result<()>; + + async fn delete_data_for_key(&self, key: SecureStorageKey) -> Result<()>; +} diff --git a/src/system/drivers/secure_storage_driver/support/mod.rs b/src/system/drivers/secure_storage_driver/support/mod.rs new file mode 100644 index 000000000..42cb13564 --- /dev/null +++ b/src/system/drivers/secure_storage_driver/support/mod.rs @@ -0,0 +1,5 @@ +mod secure_storage_key; +mod test; + +pub use secure_storage_key::*; +pub use test::*; diff --git a/src/wallet/secure_storage/secure_storage_key.rs b/src/system/drivers/secure_storage_driver/support/secure_storage_key.rs similarity index 89% rename from src/wallet/secure_storage/secure_storage_key.rs rename to src/system/drivers/secure_storage_driver/support/secure_storage_key.rs index 962ebde76..28b55b4ce 100644 --- a/src/wallet/secure_storage/secure_storage_key.rs +++ b/src/system/drivers/secure_storage_driver/support/secure_storage_key.rs @@ -4,6 +4,7 @@ use crate::prelude::*; pub enum SecureStorageKey { SnapshotHeadersList, ActiveProfileID, + HostID, DeviceFactorSourceMnemonic { factor_source_id: FactorSourceIDFromHash, }, @@ -11,6 +12,7 @@ pub enum SecureStorageKey { profile_id: ProfileID, }, } + impl SecureStorageKey { #[cfg(not(tarpaulin_include))] // false negative pub fn identifier(&self) -> String { @@ -18,8 +20,9 @@ impl SecureStorageKey { "secure_storage_key_{}", match self { SecureStorageKey::ActiveProfileID => - "activeProfileID".to_string(), - SecureStorageKey::SnapshotHeadersList => "headers".to_string(), + "activeProfileID".to_owned(), + SecureStorageKey::SnapshotHeadersList => "headers".to_owned(), + SecureStorageKey::HostID => "host_id".to_owned(), SecureStorageKey::DeviceFactorSourceMnemonic { factor_source_id, } => format!("device_factor_source_{}", factor_source_id), @@ -54,7 +57,7 @@ mod tests { factor_source_id: FactorSourceIDFromHash::sample() } .identifier(), - "secure_storage_key_device_factor_source_device:3c986ebf9dcd9167a97036d3b2c997433e85e6cc4e4422ad89269dac7bfea240" + "secure_storage_key_device_factor_source_device:f1a93d324dd0f2bff89963ab81ed6e0c2ee7e18c0827dc1d3576b2d9f26bbd0a" ); assert_eq!( SecureStorageKey::ProfileSnapshot { diff --git a/src/wallet/secure_storage/ephemeral_secure_storage.rs b/src/system/drivers/secure_storage_driver/support/test/ephemeral_secure_storage.rs similarity index 67% rename from src/wallet/secure_storage/ephemeral_secure_storage.rs rename to src/system/drivers/secure_storage_driver/support/test/ephemeral_secure_storage.rs index df1ed791c..55d0f2764 100644 --- a/src/wallet/secure_storage/ephemeral_secure_storage.rs +++ b/src/system/drivers/secure_storage_driver/support/test/ephemeral_secure_storage.rs @@ -6,8 +6,9 @@ use std::sync::RwLock; /// Used for testing - a type which saves into memory. #[derive(Debug)] pub struct EphemeralSecureStorage { - pub storage: RwLock>>, + pub storage: RwLock>, } + impl EphemeralSecureStorage { pub fn new() -> Arc { Arc::new(EphemeralSecureStorage { @@ -16,15 +17,23 @@ impl EphemeralSecureStorage { } } -impl SecureStorage for EphemeralSecureStorage { - fn load_data(&self, key: SecureStorageKey) -> Result>> { +#[async_trait::async_trait] +impl SecureStorageDriver for EphemeralSecureStorage { + async fn load_data( + &self, + key: SecureStorageKey, + ) -> Result> { self.storage .try_read() .map_err(|_| CommonError::SecureStorageReadError) .map(|s| s.get(&key).cloned()) } - fn save_data(&self, key: SecureStorageKey, value: Vec) -> Result<()> { + async fn save_data( + &self, + key: SecureStorageKey, + value: BagOfBytes, + ) -> Result<()> { let mut storage = self .storage .try_write() @@ -34,7 +43,7 @@ impl SecureStorage for EphemeralSecureStorage { Ok(()) } - fn delete_data_for_key(&self, key: SecureStorageKey) -> Result<()> { + async fn delete_data_for_key(&self, key: SecureStorageKey) -> Result<()> { let mut storage = self .storage .try_write() diff --git a/src/system/drivers/secure_storage_driver/support/test/fail_secure_storage.rs b/src/system/drivers/secure_storage_driver/support/test/fail_secure_storage.rs new file mode 100644 index 000000000..ddb1470b5 --- /dev/null +++ b/src/system/drivers/secure_storage_driver/support/test/fail_secure_storage.rs @@ -0,0 +1,28 @@ +#![cfg(test)] + +use crate::prelude::*; + +#[derive(Debug)] +pub(crate) struct AlwaysFailSecureStorage {} + +#[async_trait::async_trait] +impl SecureStorageDriver for AlwaysFailSecureStorage { + async fn load_data( + &self, + _key: SecureStorageKey, + ) -> Result> { + panic!("AlwaysFailStorage does not implement `load_data"); + } + + async fn save_data( + &self, + _key: SecureStorageKey, + _data: BagOfBytes, + ) -> Result<()> { + Err(CommonError::Unknown) + } + + async fn delete_data_for_key(&self, _key: SecureStorageKey) -> Result<()> { + panic!("AlwaysFailStorage does not implement `delete_data_for_key"); + } +} diff --git a/src/system/drivers/secure_storage_driver/support/test/mod.rs b/src/system/drivers/secure_storage_driver/support/test/mod.rs new file mode 100644 index 000000000..9c870f08b --- /dev/null +++ b/src/system/drivers/secure_storage_driver/support/test/mod.rs @@ -0,0 +1,11 @@ +#[cfg(test)] +mod ephemeral_secure_storage; + +#[cfg(test)] +pub use ephemeral_secure_storage::*; + +#[cfg(test)] +mod fail_secure_storage; + +#[cfg(test)] +pub use fail_secure_storage::*; diff --git a/src/system/drivers/unsafe_storage_driver/mod.rs b/src/system/drivers/unsafe_storage_driver/mod.rs new file mode 100644 index 000000000..6f454aeba --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/mod.rs @@ -0,0 +1,5 @@ +mod support; +mod unsafe_storage_driver; + +pub use support::*; +pub use unsafe_storage_driver::*; diff --git a/src/system/drivers/unsafe_storage_driver/support/mod.rs b/src/system/drivers/unsafe_storage_driver/support/mod.rs new file mode 100644 index 000000000..25fb683bc --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/support/mod.rs @@ -0,0 +1,5 @@ +mod test; +mod unsafe_storage_key; + +pub use test::*; +pub use unsafe_storage_key::*; diff --git a/src/system/drivers/unsafe_storage_driver/support/test/ephemeral_unsafe_storage.rs b/src/system/drivers/unsafe_storage_driver/support/test/ephemeral_unsafe_storage.rs new file mode 100644 index 000000000..05f7714de --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/support/test/ephemeral_unsafe_storage.rs @@ -0,0 +1,51 @@ +#![cfg(test)] +use crate::prelude::*; + +use std::sync::RwLock; + +/// Used for testing - a type which saves into memory. +#[derive(Debug)] +pub struct EphemeralUnsafeStorage { + pub storage: RwLock>, +} + +impl EphemeralUnsafeStorage { + pub fn new() -> Arc { + Arc::new(EphemeralUnsafeStorage { + storage: RwLock::new(HashMap::new()), + }) + } +} + +impl UnsafeStorageDriver for EphemeralUnsafeStorage { + fn load_data(&self, key: UnsafeStorageKey) -> Result> { + self.storage + .try_read() + .map_err(|_| CommonError::UnsafeStorageReadError) + .map(|s| s.get(&key).cloned()) + } + + fn save_data( + &self, + key: UnsafeStorageKey, + value: BagOfBytes, + ) -> Result<()> { + let mut storage = self + .storage + .try_write() + .map_err(|_| CommonError::UnsafeStorageWriteError)?; + + storage.insert(key, value); + Ok(()) + } + + fn delete_data_for_key(&self, key: UnsafeStorageKey) -> Result<()> { + let mut storage = self + .storage + .try_write() + .map_err(|_| CommonError::UnsafeStorageWriteError)?; + + storage.remove_entry(&key); + Ok(()) + } +} diff --git a/src/system/drivers/unsafe_storage_driver/support/test/fail_unsafe_storage.rs b/src/system/drivers/unsafe_storage_driver/support/test/fail_unsafe_storage.rs new file mode 100644 index 000000000..48abdf731 --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/support/test/fail_unsafe_storage.rs @@ -0,0 +1,24 @@ +#![cfg(test)] + +use crate::prelude::*; + +#[derive(Debug)] +pub(crate) struct AlwaysFailUnsafeStorage {} + +impl UnsafeStorageDriver for AlwaysFailUnsafeStorage { + fn load_data(&self, _key: UnsafeStorageKey) -> Result> { + panic!("AlwaysFailStorage does not implement `load_data"); + } + + fn save_data( + &self, + _key: UnsafeStorageKey, + _data: BagOfBytes, + ) -> Result<()> { + Err(CommonError::Unknown) + } + + fn delete_data_for_key(&self, _key: UnsafeStorageKey) -> Result<()> { + panic!("AlwaysFailStorage does not implement `delete_data_for_key"); + } +} diff --git a/src/system/drivers/unsafe_storage_driver/support/test/mod.rs b/src/system/drivers/unsafe_storage_driver/support/test/mod.rs new file mode 100644 index 000000000..0b9cdd32e --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/support/test/mod.rs @@ -0,0 +1,11 @@ +#[cfg(test)] +mod ephemeral_unsafe_storage; + +#[cfg(test)] +pub use ephemeral_unsafe_storage::*; + +#[cfg(test)] +mod fail_unsafe_storage; + +#[cfg(test)] +pub use fail_unsafe_storage::*; diff --git a/src/system/drivers/unsafe_storage_driver/support/unsafe_storage_key.rs b/src/system/drivers/unsafe_storage_driver/support/unsafe_storage_key.rs new file mode 100644 index 000000000..911cfb71b --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/support/unsafe_storage_key.rs @@ -0,0 +1,38 @@ +use crate::prelude::*; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum UnsafeStorageKey { + FactorSourceUserHasWrittenDown, +} + +impl UnsafeStorageKey { + pub fn identifier(&self) -> String { + format!( + "unsafe_storage_key_{}", + match self { + UnsafeStorageKey::FactorSourceUserHasWrittenDown => + "factor_source_user_has_written_down".to_owned(), + } + ) + } +} + +#[uniffi::export] +pub fn unsafe_storage_key_identifier(key: &UnsafeStorageKey) -> String { + key.identifier() +} + +#[cfg(test)] +mod tests { + use crate::prelude::*; + + #[test] + fn identifier() { + assert_eq!( + unsafe_storage_key_identifier( + &UnsafeStorageKey::FactorSourceUserHasWrittenDown + ), + "unsafe_storage_key_factor_source_user_has_written_down" + ); + } +} diff --git a/src/system/drivers/unsafe_storage_driver/unsafe_storage_driver.rs b/src/system/drivers/unsafe_storage_driver/unsafe_storage_driver.rs new file mode 100644 index 000000000..a3b51d9a1 --- /dev/null +++ b/src/system/drivers/unsafe_storage_driver/unsafe_storage_driver.rs @@ -0,0 +1,10 @@ +use crate::prelude::*; + +#[uniffi::export(with_foreign)] +pub trait UnsafeStorageDriver: Send + Sync + std::fmt::Debug { + fn load_data(&self, key: UnsafeStorageKey) -> Result>; + + fn save_data(&self, key: UnsafeStorageKey, data: BagOfBytes) -> Result<()>; + + fn delete_data_for_key(&self, key: UnsafeStorageKey) -> Result<()>; +} diff --git a/src/system/mod.rs b/src/system/mod.rs new file mode 100644 index 000000000..cef8e8932 --- /dev/null +++ b/src/system/mod.rs @@ -0,0 +1,11 @@ +mod bios; +mod clients; +mod drivers; +mod sargon_os; +mod subsystems; + +pub use bios::*; +pub use clients::*; +pub use drivers::*; +pub use sargon_os::*; +pub use subsystems::*; diff --git a/src/system/sargon_os/mod.rs b/src/system/sargon_os/mod.rs new file mode 100644 index 000000000..b85c3232c --- /dev/null +++ b/src/system/sargon_os/mod.rs @@ -0,0 +1,15 @@ +mod profile_holder; +mod sargon_os; +mod sargon_os_accounts; +mod sargon_os_factors; +mod sargon_os_gateway; +mod sargon_os_profile; +mod sargon_os_security_structures; + +pub use profile_holder::*; +pub use sargon_os::*; +pub use sargon_os_accounts::*; +pub use sargon_os_factors::*; +pub use sargon_os_gateway::*; +pub use sargon_os_profile::*; +pub use sargon_os_security_structures::*; diff --git a/src/system/sargon_os/profile_holder.rs b/src/system/sargon_os/profile_holder.rs new file mode 100644 index 000000000..abe55a0bb --- /dev/null +++ b/src/system/sargon_os/profile_holder.rs @@ -0,0 +1,117 @@ +use crate::prelude::*; +use std::{ + borrow::Borrow, + sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}, +}; + +#[derive(Debug, uniffi::Object)] +#[allow(dead_code)] +pub struct ProfileHolder { + // This is pub(crate) for testing purposes only, i.e. causing the RwLock to be poisoned. + pub(crate) profile: RwLock, +} + +impl ProfileHolder { + pub fn new(profile: Profile) -> Self { + Self { + profile: RwLock::new(profile), + } + } +} + +impl ProfileHolder { + /// Clone the profile and return it. + pub(super) fn profile(&self) -> Profile { + self.access_profile_with(|p| p.clone()) + } + + pub fn current_network_id(&self) -> NetworkID { + self.access_profile_with(|p| p.current_network_id()) + } + + pub fn current_gateway(&self) -> Gateway { + self.access_profile_with(|p| p.current_gateway().clone()) + } + + pub fn gateways(&self) -> SavedGateways { + self.access_profile_with(|p| p.app_preferences.gateways.clone()) + } + + pub fn current_network(&self) -> ProfileNetwork { + self.access_profile_with(|p| p.current_network().clone()) + } + + /// Returns the non-hidden accounts on the current network, empty if no accounts + /// on the network + pub fn accounts_on_current_network(&self) -> Accounts { + self.access_profile_with(|p| p.accounts_on_current_network()) + } + + /// Returns all the SecurityStructuresOfFactorSources, + /// by trying to map FactorSourceID level -> FactorSource Level + pub fn security_structures_of_factor_sources( + &self, + ) -> Result { + self.access_profile_with(|p| p.security_structures_of_factor_sources()) + } + + /// Returns the non-hidden accounts on the current network as `AccountForDisplay` + pub fn accounts_for_display_on_current_network( + &self, + ) -> AccountsForDisplay { + self.access_profile_with(|p| { + p.accounts_for_display_on_current_network() + }) + } + + /// Looks up the account by account address, returns Err if the account is + /// unknown, will return a hidden account if queried for. + pub fn account_by_address( + &self, + address: AccountAddress, + ) -> Result { + self.access_profile_with(|p| p.account_by_address(address)) + } + + pub(super) fn access_profile_with(&self, access: F) -> T + where + F: Fn(RwLockReadGuard<'_, Profile>) -> T, + { + self.profile + .try_read() + .map(access) + .expect("Implementing hosts should not read and write Profile from multiple threads.") + } + + pub(super) fn try_access_profile_with(&self, access: F) -> Result + where + F: Fn(RwLockReadGuard<'_, Profile>) -> Result, + { + let guard = self.profile.try_read().expect("Implementing hosts should not read and write Profile from multiple threads."); + access(guard) + } + + /// Sets the profile held by this ProfileHolder to `profile`. + pub(super) fn replace_profile_with(&self, profile: Profile) -> Result<()> { + let mut lock = self + .profile + .try_write() + .map_err(|_| CommonError::UnableToAcquireWriteLockForProfile)?; + + *lock = profile; + Ok(()) + } + + /// Updates the in-memory profile held by this `ProfileHolder`, you might + /// wanna also persist the change in the `SargonOS` by saving it to secure + /// storage. + pub(super) fn update_profile_with(&self, mutate: F) -> Result + where + F: Fn(RwLockWriteGuard<'_, Profile>) -> Result, + { + self.profile + .try_write() + .map_err(|_| CommonError::UnableToAcquireWriteLockForProfile) + .and_then(mutate) + } +} diff --git a/src/system/sargon_os/sargon_os.rs b/src/system/sargon_os/sargon_os.rs new file mode 100644 index 000000000..563187e8d --- /dev/null +++ b/src/system/sargon_os/sargon_os.rs @@ -0,0 +1,495 @@ +use std::sync::Once; + +use crate::prelude::*; + +/// The Sargon "Operating System" is the root "manager" of the Sargon library +/// which holds an in-memory Profile and a collection of "clients" which are +/// created from "drivers" which the hosts (iOS/Android wallets) "installs" +/// during app launch, enabling the Sargon "Operating System" to e.g read/write +/// to secure storage and make use of the network connection of the iPhone/Android +/// phone. +#[derive(Debug, uniffi::Object)] +pub struct SargonOS { + pub(crate) profile_holder: ProfileHolder, + pub(crate) clients: Clients, +} + +/// So that we do not have to go through `self.clients`, +/// but can use e.g. `self.secure_storage` directly. +impl Deref for SargonOS { + type Target = Clients; + + fn deref(&self) -> &Self::Target { + &self.clients + } +} + +#[uniffi::export] +impl SargonOS { + #[uniffi::constructor] + pub async fn boot(bios: Arc) -> Result> { + Self::boot_with_bdfs(bios, None).await + } +} + +impl SargonOS { + pub async fn boot_with_bdfs( + bios: Arc, + bdfs_mnemonic: Option, + ) -> Result> { + let clients = Clients::new(bios); + + let sargon_info = SargonBuildInformation::get(); + let version = sargon_info.sargon_version; + let ret_version = sargon_info.dependencies.radix_engine_toolkit; + info!("Booting SargonOS {} (RET: {})", &version, &ret_version); + let host_info = clients.host.summary().await; + info!("Host: {}", host_info); + + let secure_storage = &clients.secure_storage; + + if let Some(loaded) = secure_storage.load_active_profile().await? { + info!("Loaded saved profile {}", &loaded.header); + let is_owner = Self::check_is_allowed_to_update_provided_profile( + &clients, &loaded, false, + ) + .await?; + + if !is_owner { + warn!("Loaded saved profile was last used on another device, will continue booting OS, but will unable to update Profile."); + } + + Ok(Arc::new(Self { + clients, + profile_holder: ProfileHolder::new(loaded), + })) + } else { + info!("No saved profile found, creating a new one..."); + let (profile, bdfs) = + Self::create_new_profile_with_bdfs(&clients, bdfs_mnemonic) + .await?; + + secure_storage.save_private_hd_factor_source(&bdfs).await?; + + secure_storage + .save_profile_and_active_profile_id(&profile) + .await?; + + info!("Saved new Profile and BDFS, finish booting SargonOS"); + + let os = Arc::new(Self { + clients, + profile_holder: ProfileHolder::new(profile), + }); + os.event_bus + .emit(EventNotification::new(Event::Booted)) + .await; + Ok(os) + } + } +} + +impl SargonOS { + pub(crate) async fn new_profile_and_bdfs( + &self, + ) -> Result<(Profile, PrivateHierarchicalDeterministicFactorSource)> { + Self::create_new_profile_with_bdfs(&self.clients, None).await + } + + async fn create_new_profile_with_bdfs( + clients: &Clients, + mnemonic_with_passphrase: Option, + ) -> Result<(Profile, PrivateHierarchicalDeterministicFactorSource)> { + debug!("Creating new Profile and BDFS"); + + let host_id = Self::get_host_id(clients).await?; + let host_info = Self::get_host_info(clients).await; + + let is_main = true; + let private_bdfs = match mnemonic_with_passphrase { + Some(mwp) => { + debug!("Using specified MnemonicWithPassphrase, perhaps we are running in at test..."); + + PrivateHierarchicalDeterministicFactorSource::new_babylon_with_mnemonic_with_passphrase(is_main, mwp, &host_info) + } + None => { + debug!("Generating mnemonic (using Host provided entropy) for a new 'Babylon' `DeviceFactorSource` ('BDFS')"); + + let entropy: BIP39Entropy = clients.entropy.bip39_entropy(); + + PrivateHierarchicalDeterministicFactorSource::new_babylon_with_entropy( + is_main, + entropy, + BIP39Passphrase::default(), + &host_info + ) + } + }; + debug!("Created BDFS (unsaved)"); + + debug!("Creating new Profile..."); + let profile = Profile::from_device_factor_source( + private_bdfs.factor_source.clone(), + host_id, + host_info, + ); + info!("Created new (unsaved) Profile with ID {}", profile.id()); + Ok((profile, private_bdfs)) + } + + pub(crate) async fn host_id(&self) -> Result { + Self::get_host_id(&self.clients).await + } + + pub(crate) async fn get_host_id(clients: &Clients) -> Result { + debug!("Get Host ID"); + let secure_storage = &clients.secure_storage; + + match secure_storage.load_host_id().await? { + Some(loaded_host_id) => { + debug!("Found saved host id: {:?}", &loaded_host_id); + Ok(loaded_host_id) + } + None => { + debug!("Found no saved host id, creating new."); + let new_host_id = HostId::generate_new(); + debug!("Created new host id: {:?}", &new_host_id); + secure_storage.save_host_id(&new_host_id).await?; + debug!("Saved new host id"); + Ok(new_host_id) + } + } + } + + pub(crate) async fn host_info(&self) -> HostInfo { + Self::get_host_info(&self.clients).await + } + + pub(crate) async fn get_host_info(clients: &Clients) -> HostInfo { + debug!("Get Host info"); + clients.host.resolve_host_info().await + } +} + +#[cfg(test)] +pub(crate) const SARGON_OS_TEST_MAX_ASYNC_DURATION: std::time::Duration = + std::time::Duration::from_millis(50); + +#[cfg(test)] +impl SargonOS { + pub async fn with_timeout<'a, F, Fut, T>(&'a self, func: F) -> T + where + F: Fn(&'a SargonOS) -> Fut, + Fut: std::future::Future, + { + let sut = func(self); + actix_rt::time::timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, sut) + .await + .unwrap() + } + + pub async fn boot_test() -> Result> { + Self::boot_test_with_bdfs_mnemonic(None).await + } + + pub async fn boot_test_with_bdfs_mnemonic( + bdfs_mnemonic: impl Into>, + ) -> Result> { + let test_drivers = Drivers::test(); + let bios = Bios::new(test_drivers); + Self::boot_with_bdfs(bios, bdfs_mnemonic.into()).await + } + + pub async fn fast_boot() -> Arc { + Self::fast_boot_bdfs(None).await + } + + pub async fn fast_boot_bdfs( + bdfs_mnemonic: impl Into>, + ) -> Arc { + let req = Self::boot_test_with_bdfs_mnemonic(bdfs_mnemonic); + + actix_rt::time::timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, req) + .await + .unwrap() + .unwrap() + } +} + +#[cfg(test)] +mod tests { + use std::time::Duration; + + use actix_rt::time::timeout; + + use super::*; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn test_new_profile_is_active_profile() { + // ARRANGE (and ACT) + let os = SUT::fast_boot().await; + + // ASSERT + let active_profile_id = os + .with_timeout(|x| x.secure_storage.load_active_profile_id()) + .await + .unwrap() + .unwrap(); + + assert_eq!(active_profile_id, os.profile().id()); + } + + #[actix_rt::test] + async fn test_boot_with_existing_profile_is_profile_held() { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let profile = Profile::sample(); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::with_secure_storage(secure_storage_driver); + let bios = Bios::new(drivers); + + // ACT + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ASSERT + let active_profile = os.profile(); + assert_eq!(active_profile.id(), profile.id()); + } + + #[actix_rt::test] + async fn test_boot_with_existing_unowned_profile_cannot_be_mutated() { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let profile = Profile::sample(); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::with_secure_storage(secure_storage_driver); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + let host_id = os.with_timeout(|x| x.host_id()).await.unwrap(); + + // ACT + let add_res = + os.with_timeout(|x| x.add_account(Account::sample())).await; + + // ASSERT + assert_eq!( + add_res, + Err(CommonError::ProfileUsedOnOtherDevice { + other_device_id: profile.header.last_used_on_device.id, + this_device_id: host_id.id + }) + ); + } + + #[actix_rt::test] + async fn test_boot_with_existing_unowned_profile_is_not_mutated_if_tried_to( + ) { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let profile = Profile::new( + Mnemonic::sample(), + HostId::sample(), + HostInfo::sample(), + ); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::with_secure_storage(secure_storage_driver); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + let new_account = Account::sample_stokenet(); + // ACT + let _ = os + .with_timeout(|x| x.add_account(new_account.clone())) + .await; + + // ASSERT + assert_eq!(os.profile(), profile.clone()); // not changed in memory + + let loaded_profile = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + assert_eq!(loaded_profile, profile); // not changed in secure storage + } + + #[actix_rt::test] + async fn test_boot_with_existing_unowned_profile_when_claimed_can_be_changed( + ) { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let profile = Profile::new( + Mnemonic::sample(), + HostId::sample(), + HostInfo::sample(), + ); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::with_secure_storage(secure_storage_driver); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + let new_account = Account::sample_stokenet(); + // ACT + let claim_was_needed = + os.with_timeout(|x| x.claim_active_profile()).await.unwrap(); + let _ = os + .with_timeout(|x| x.add_account(new_account.clone())) + .await; + + // ASSERT + assert!(claim_was_needed); + assert_ne!(os.profile(), profile.clone()); // was changed in memory + assert_eq!( + os.profile() + .networks + .get_id(NetworkID::Stokenet) + .unwrap() + .accounts[0], + new_account.clone() + ); + + let loaded_profile = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + assert_ne!(loaded_profile.clone(), profile); // was changed in secure storage + + assert_eq!( + loaded_profile + .networks + .get_id(NetworkID::Stokenet) + .unwrap() + .accounts[0], + new_account.clone() + ); + } + + #[actix_rt::test] + async fn test_boot_not_owned_emits_event() { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let event_bus_driver = RustEventBusDriver::new(); + let profile = Profile::sample(); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::new( + RustNetworkingDriver::new(), + secure_storage_driver.clone(), + RustEntropyDriver::new(), + RustHostInfoDriver::new(), + RustLoggingDriver::new(), + event_bus_driver.clone(), + RustFileSystemDriver::new(), + EphemeralUnsafeStorage::new(), + ); + let bios = Bios::new(drivers); + + // ACT + let _ = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ASSERT + assert!(event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::ProfileUsedOnOtherDevice)); + } + + #[actix_rt::test] + async fn test_boot_with_existing_profile_active_profile_id() { + // ARRANGE (and ACT) + let secure_storage_driver = EphemeralSecureStorage::new(); + let profile = Profile::sample(); + let secure_storage_client = + SecureStorageClient::new(secure_storage_driver.clone()); + secure_storage_client.save_profile(&profile).await.unwrap(); + secure_storage_client + .save_active_profile_id(profile.id()) + .await + .unwrap(); + let drivers = Drivers::with_secure_storage(secure_storage_driver); + let bios = Bios::new(drivers); + + // ACT + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ASSERT + let active_profile_id = os + .with_timeout(|x| x.secure_storage.load_active_profile_id()) + .await + .unwrap() + .unwrap(); + + assert_eq!(active_profile_id, profile.id()); + } + + #[actix_rt::test] + async fn test_change_log_level() { + // ARRANGE (and ACT) + let _ = SUT::fast_boot().await; + + rust_logger_get_all_filters().into_iter().for_each(|l| { + rust_logger_set_level(l); + assert_eq!(rust_logger_get_level(), l); + println!( + "Testing logging at every level with log level set to: {:?}", + l + ); + rust_logger_log_at_every_level() + }); + } +} diff --git a/src/system/sargon_os/sargon_os_accounts.rs b/src/system/sargon_os/sargon_os_accounts.rs new file mode 100644 index 000000000..eddf3eeed --- /dev/null +++ b/src/system/sargon_os/sargon_os_accounts.rs @@ -0,0 +1,938 @@ +use std::sync::RwLockWriteGuard; + +use crate::prelude::*; + +// ================== +// Create Unsaved Account(s) +// ================== +#[uniffi::export] +impl SargonOS { + /// Returns the non-hidden accounts on the current network, empty if no accounts + /// on the network + pub fn accounts_on_current_network(&self) -> Accounts { + self.profile_holder.accounts_on_current_network() + } + + /// Returns the non-hidden accounts on the current network as `AccountForDisplay` + pub fn accounts_for_display_on_current_network( + &self, + ) -> AccountsForDisplay { + self.profile_holder + .accounts_for_display_on_current_network() + } + + /// Looks up the account by account address, returns Err if the account is + /// unknown, will return a hidden account if queried for. + pub fn account_by_address( + &self, + address: AccountAddress, + ) -> Result { + self.profile_holder.account_by_address(address) + } + + /// Creates a new unsaved mainnet account named "Unnamed {N}", where `N` is the + /// index of the next account for the BDFS. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::FactorSourceUpdated }` + pub async fn create_unsaved_unnamed_mainnet_account( + &self, + ) -> Result { + self.create_unsaved_account( + NetworkID::Mainnet, + DisplayName::new("Unnamed").unwrap(), + ) + .await + } + + /// Uses `create_unsaved_account` specifying `NetworkID::Mainnet`. + pub async fn create_unsaved_mainnet_account( + &self, + name: DisplayName, + ) -> Result { + self.create_unsaved_account(NetworkID::Mainnet, name).await + } + + /// Creates a new non securified account **WITHOUT** adding it to Profile, + /// using the *main* "Babylon" `DeviceFactorSource` and the "next" index for + /// this FactorSource as derivation path. + /// + /// If you want to add it to Profile, call `os.add_account(account)`. + /// + /// # Emits Event + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage, since the `last_used_on` date + /// of the factor source has been updated. + /// + /// Also emits `EventNotification::ProfileModified { change: EventProfileModified::FactorSourceUpdated { id } }` + pub async fn create_unsaved_account( + &self, + network_id: NetworkID, + name: DisplayName, + ) -> Result { + let profile = self.profile(); + + let (factor_source_id, account) = profile + .create_unsaved_account(network_id, name, async move |fs| { + self.load_private_device_factor_source(&fs).await + }) + .await?; + + // Change of `last_used_on` of FactorSource + self.update_last_used_of_factor_source(factor_source_id) + .await?; + + Ok(account) + } + + /// Create a new mainnet Account named "Unnamed" and adds it to the active Profile. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::AccountAdded }` + pub async fn create_and_save_new_unnamed_mainnet_account( + &self, + ) -> Result { + self.create_and_save_new_mainnet_account( + DisplayName::new("Unnamed").unwrap(), + ) + .await + } + + /// Create a new mainnet Account and adds it to the active Profile. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::AccountAdded }` + pub async fn create_and_save_new_mainnet_account( + &self, + name: DisplayName, + ) -> Result { + self.create_and_save_new_account(NetworkID::Mainnet, name) + .await + } + + /// Create a new Account and adds it to the active Profile. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::AccountAdded }` + pub async fn create_and_save_new_account( + &self, + network_id: NetworkID, + name: DisplayName, + ) -> Result { + debug!("Creating account."); + let account = self.create_unsaved_account(network_id, name).await?; + debug!("Created account, now saving it to profile."); + self.add_account(account.clone()).await?; + info!( + "Created account and saved new account into profile, address: {}", + account.address + ); + Ok(account) + } + + /// The account names will be ` ` + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::AccountAdded }` + /// + /// And also emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub async fn batch_create_many_accounts_then_save_once( + &self, + count: u16, + network_id: NetworkID, + name_prefix: String, + ) -> Result<()> { + debug!("Batch creating #{} accounts.", count); + let accounts = self + .batch_create_unsaved_accounts(network_id, count, name_prefix) + .await?; + debug!("Created #{} accounts, now saving them to profile.", count); + self.add_accounts(accounts).await?; + info!( + "Created account and saved #{} new accounts into profile", + count + ); + Ok(()) + } + + /// Creates many new non securified accounts **WITHOUT** add them to Profile, using the *main* "Babylon" + /// `DeviceFactorSource` and the "next" indices for this FactorSource as derivation paths. + /// + /// If you want to add them to Profile, call `add_accounts(accounts)` + /// + /// # Emits Event + /// Emits `Event::FactorSourceUpdated { id: FactorSourceID }` since the date in + /// `factor_source.common.last_used` is updated. + pub async fn batch_create_unsaved_accounts( + &self, + network_id: NetworkID, + count: u16, + name_prefix: String, + ) -> Result { + let profile = self.profile(); + + let (factor_source_id, accounts) = profile + .create_unsaved_accounts( + network_id, + count, + |idx| { + DisplayName::new(format!("{} {}", name_prefix, idx)) + .expect("Should not use a long name_prefix") + }, + async move |fs| { + self.load_private_device_factor_source(&fs).await + }, + ) + .await?; + + // Change of `last_used_on` of FactorSource + self.update_last_used_of_factor_source(factor_source_id) + .await?; + + Ok(accounts) + } +} + +// ================== +// Add (Save) Account(s) +// ================== +#[uniffi::export] +impl SargonOS { + /// Add the `account` to active profile and **saves** the updated profile to + /// secure storage. + /// + /// Returns `Ok(())` if the `account` was new and successfully added. If + /// saving failed or if the account was already present in Profile, an + /// error is returned. + /// + /// # Emits Events + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + /// + /// And also emits `Event::ProfileModified { change: EventProfileModified::AccountsAdded { addresses } }` + pub async fn add_account(&self, account: Account) -> Result<()> { + let address = account.address; + + debug!("Adding account address: {} to profile", address); + + self.add_accounts_without_emitting_account_added_event(Accounts::just( + account, + )) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::AccountAdded { address }, + )) + .await; + + Ok(()) + } + + /// Adds the `accounts` to active profile and **saves** the updated profile to + /// secure storage. + /// + /// Returns `Ok(())` if the `accounts` were new and successfully added. If + /// saving failed or if the accounts were already present in Profile, an + /// error is returned. + /// + /// # Emits Events + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + /// + /// And also emits `Event::ProfileModified { change: EventProfileModified::AccountsAdded { addresses } }` + pub async fn add_accounts(&self, accounts: Accounts) -> Result<()> { + let addresses = accounts + .clone() + .into_iter() + .map(|a| a.address) + .collect_vec(); + + self.add_accounts_without_emitting_account_added_event(accounts) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::AccountsAdded { addresses }, + )) + .await; + + Ok(()) + } +} + +// ================== +// Update Account(s) +// ================== +#[uniffi::export] +impl SargonOS { + /// Updates the account `updated` by mutating current profile and persisting + /// the change to secure storage. Throws `UnknownAccount` error if the account + /// is not found. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::AccountUpdated { address } }` + pub async fn update_account(&self, updated: Account) -> Result<()> { + self.update_profile_with(|mut p| { + if p.update_account(&updated.address, |old| *old = updated.clone()) + .is_none() + { + Err(CommonError::UnknownAccount) + } else { + Ok(()) + } + }) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::AccountUpdated { + address: updated.address, + }, + )) + .await; + + Ok(()) + } +} + +impl SargonOS { + /// Adds the `accounts` to active profile and **saves** the updated profile to + /// secure storage, without emitting `Event::AccountAdded`, but we DO emit + /// `Event::ProfileSaved`.` + /// + /// Returns `Ok(())` if the `accounts` were new and successfully added. If + /// saving failed or if the accounts were already present in Profile, an + /// error is returned. + /// + /// # Emits + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + async fn add_accounts_without_emitting_account_added_event( + &self, + accounts: Accounts, + ) -> Result<()> { + if accounts.is_empty() { + warn!("Tried to add empty accounts..."); + return Ok(()); + } + + let number_of_accounts_to_add = accounts.len(); + + let network_id = accounts + .assert_elements_on_same_network()? + .expect("Should have handled empty accounts case already."); + + debug!("Adding #{} accounts to Profile Network with ID: {} - or creating a Profile Network if it does not exist", number_of_accounts_to_add, network_id); + + self.update_profile_with(|mut p| { + let networks = &mut p.networks; + + if networks.contains_id(network_id) { + debug!("Profile already contained network to add #{} account(s) to, network_id: {}", number_of_accounts_to_add, network_id); + networks + .try_try_update_with(&network_id, |network| { + let count_before = network.accounts.len(); + debug!("Profile Network to add #{} account(s) to contains #{} accounts (before adding).", number_of_accounts_to_add, count_before); + network.accounts.extend(accounts.clone()); + let count_after = network.accounts.len(); + debug!("Profile Network now contains: #{} accounts", count_after); + if network.accounts.len() == count_before + number_of_accounts_to_add { + Ok(()) + } else { + Err(CommonError::UnableToAddAllAccountsDuplicatesFound) + } + }) + } else { + debug!("No Profile Network exists with ID {}, creating it...", network_id); + let network = ProfileNetwork::new( + network_id, + accounts.clone(), + Personas::default(), + AuthorizedDapps::default(), + ); + networks.append(network); + Ok(()) + } + }) + .await + } +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_rt::time::timeout; + use std::{future::Future, time::Duration}; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn test_first_add_account() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.add_account(Account::sample())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.profile().networks[0].accounts.len(), 1); + } + + #[actix_rt::test] + async fn test_content_hint_is_updated_when_accounts_are_added() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.add_account(Account::sample())) + .await + .unwrap(); + + // ASSERT + assert_eq!( + os.profile() + .header + .content_hint + .number_of_accounts_on_all_networks_in_total, + 1 + ); + assert_eq!(os.profile().header.content_hint.number_of_networks, 1); + } + + #[actix_rt::test] + async fn test_first_create_unsaved_account() { + // ARRANGE + let os = SUT::fast_boot_bdfs(MnemonicWithPassphrase::sample()).await; + + // ACT + let unsaved_account = os + .with_timeout(|x| { + x.create_unsaved_mainnet_account( + DisplayName::new("Alice").unwrap(), + ) + }) + .await + .unwrap(); + + // ASSERT + assert_eq!(unsaved_account, Account::sample()); + assert_eq!(os.profile().networks[0].accounts.len(), 0); // not added + } + + #[actix_rt::test] + async fn test_create_unsaved_account_twice_yield_same_accounts() { + // ARRANGE + let os = SUT::fast_boot_bdfs(MnemonicWithPassphrase::sample()).await; + + // ACT + let first = os + .with_timeout(|x| x.create_unsaved_unnamed_mainnet_account()) + .await + .unwrap(); + + let second = os + .with_timeout(|x| x.create_unsaved_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!(first, second); + } + + #[actix_rt::test] + async fn test_first_create_and_add_account_is_added() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let account = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.profile().networks[0].accounts, Accounts::just(account)); + } + + #[actix_rt::test] + async fn test_first_create_and_add_account_has_index_0() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let account = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!( + account + .security_state + .into_unsecured() + .unwrap() + .transaction_signing + .derivation_path() + .hd_path() + .components + .last() + .unwrap() + .index(), + 0 + ); + } + + #[actix_rt::test] + async fn test_second_create_and_add_account_has_index_1() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let _ = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + let second = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!( + second + .security_state + .into_unsecured() + .unwrap() + .transaction_signing + .derivation_path() + .hd_path() + .components + .last() + .unwrap() + .index(), + 1 + ); + } + + #[actix_rt::test] + async fn batch_create_account_then_n_accounts_are_saved_and_have_indices_0_through_n( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let n: u32 = 3; + os.with_timeout(|x| { + x.batch_create_many_accounts_then_save_once( + n as u16, + NetworkID::Mainnet, + "test".to_owned(), + ) + }) + .await + .unwrap(); + + // ASSERT + let indices = os.profile().networks[0] + .accounts + .iter() + .map(|x| { + x.security_state + .into_unsecured() + .unwrap() + .transaction_signing + .derivation_path() + .hd_path() + .components + .last() + .unwrap() + .index() + }) + .collect_vec(); + assert_eq!(indices, (0u32..n).collect_vec()); + } + + #[actix_rt::test] + async fn test_batch_create_and_add_account_n_has_names_with_index_appended_to_prefix( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let n: u32 = 3; + os.with_timeout(|x| { + x.batch_create_many_accounts_then_save_once( + n as u16, + NetworkID::Mainnet, + "test".to_owned(), + ) + }) + .await + .unwrap(); + + // ASSERT + let names = os.profile().networks[0] + .accounts + .iter() + .map(|x| x.display_name.value.clone()) + .collect_vec(); + + assert_eq!( + names, + ["test 0", "test 1", "test 2"] + .into_iter() + .map(|x| x.to_owned()) + .collect_vec() + ); + } + + #[actix_rt::test] + async fn batch_create_account_then_n_accounts_are_saved_and_have_appearance_id_0_through_max( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let n = AppearanceID::all().len() as u32 * 2; + os.with_timeout(|x| { + x.batch_create_many_accounts_then_save_once( + n as u16, + NetworkID::Mainnet, + "test".to_owned(), + ) + }) + .await + .unwrap(); + + // ASSERT + let appearance_ids = os.profile().networks[0] + .accounts + .iter() + .map(|x| x.appearance_id) + .collect_vec(); + + assert_eq!( + appearance_ids, + [AppearanceID::all(), AppearanceID::all()].concat() + ); + } + + #[actix_rt::test] + async fn batch_create_account_unsaved_are_not_saved() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| { + x.batch_create_unsaved_accounts( + NetworkID::Mainnet, + 3, + "test".to_owned(), + ) + }) + .await + .unwrap(); + + // ASSERT + assert!(os.profile().networks[0].accounts.is_empty()) + } + + #[actix_rt::test] + async fn test_create_unsaved_account_emits_factor_source_updated() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + os.with_timeout(|x| x.create_unsaved_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert!(event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::FactorSourceUpdated)); + } + + #[actix_rt::test] + async fn test_create_and_save_new_account_emits_events() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + os.with_timeout(|x| { + x.create_and_save_new_account( + NetworkID::Mainnet, + DisplayName::sample(), + ) + }) + .await + .unwrap(); + + // ASSERT + let events = event_bus_driver + .recorded() + .iter() + .map(|e| e.event.kind()) + .collect_vec(); + + use EventKind::*; + assert_eq!( + events, + vec![ + Booted, + ProfileSaved, + FactorSourceUpdated, + ProfileSaved, + AccountAdded + ] + ); + } + + impl DisplayName { + fn random() -> Self { + Self::new(format!( + "random-{}", + id().to_string().drain(0..20).collect::() + )) + .unwrap() + } + } + + #[actix_rt::test] + async fn update_account_updates_in_memory_profile() { + // ARRANGE + let os = SUT::fast_boot().await; + + let mut account = Account::sample(); + os.with_timeout(|x| x.add_account(account.clone())) + .await + .unwrap(); + + // ACT + account.display_name = DisplayName::random(); + os.with_timeout(|x| x.update_account(account.clone())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.profile().networks[0].accounts[0], account.clone()) + } + + #[actix_rt::test] + async fn update_account_updates_saved_profile() { + // ARRANGE + let os = SUT::fast_boot().await; + + let mut account = Account::sample(); + os.with_timeout(|x| x.add_account(account.clone())) + .await + .unwrap(); + + // ACT + account.display_name = DisplayName::random(); + os.with_timeout(|x| x.update_account(account.clone())) + .await + .unwrap(); + + // ASSERT + let saved_profile = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + + assert_eq!(saved_profile.networks[0].accounts[0], account.clone()) + } + + #[actix_rt::test] + async fn test_update_account_emits() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + let mut account = Account::sample(); + os.with_timeout(|x| x.add_account(account.clone())) + .await + .unwrap(); + + // ACT + account.display_name = DisplayName::random(); + os.with_timeout(|x| x.update_account(account.clone())) + .await + .unwrap(); + + // ASSERT + assert!(event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::AccountUpdated)); + } + + #[actix_rt::test] + async fn update_account_unknown_accounts_throws() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let result = os + .with_timeout(|x| x.update_account(Account::sample())) + .await; + + // ASSERT + assert_eq!(result, Err(CommonError::UnknownAccount)) + } + + #[actix_rt::test] + async fn add_accounts_empty_is_ok() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let result = os.with_timeout(|x| x.add_accounts(Accounts::new())).await; + + // ASSERT + assert!(result.is_ok()) + } + + #[actix_rt::test] + async fn add_accounts_duplicates_throws() { + // ARRANGE + let os = SUT::fast_boot().await; + + let account = Account::sample(); + os.with_timeout(|x| x.add_account(account.clone())) + .await + .unwrap(); + + // ACT + let result = os + .with_timeout(|x| x.add_accounts(Accounts::just(account.clone()))) + .await; + + // ASSERT + assert_eq!( + result, + Err(CommonError::UnableToAddAllAccountsDuplicatesFound) + ) + } + + #[actix_rt::test] + async fn test_accounts_on_current_network_empty() { + let os = SUT::fast_boot().await; + assert_eq!(os.accounts_on_current_network(), Accounts::new()); + } + + #[actix_rt::test] + async fn test_accounts_on_current_network_non_empty() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let account = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.accounts_on_current_network(), Accounts::just(account)); + } + + #[actix_rt::test] + async fn test_accounts_on_current_network_empty_when_switched_network() { + // ARRANGE + let os = SUT::fast_boot().await; + + let _ = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ACT + let _ = os + .with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.accounts_on_current_network(), Accounts::new()); + } + + #[actix_rt::test] + async fn test_accounts_for_display_on_current_network() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let account = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!( + os.accounts_for_display_on_current_network(), + AccountsForDisplay::just(AccountForDisplay::from(account)) + ); + } + + #[actix_rt::test] + async fn test_account_by_address_exists() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let account = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.account_by_address(account.address), Ok(account)); + } + + #[actix_rt::test] + async fn test_account_by_address_not_exists() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + // so that we have at least one network (with one account) + let _ = os + .with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert_eq!( + os.account_by_address(AccountAddress::sample_mainnet()), + Err(CommonError::UnknownAccount) + ); + } +} diff --git a/src/system/sargon_os/sargon_os_factors.rs b/src/system/sargon_os/sargon_os_factors.rs new file mode 100644 index 000000000..3eb365df0 --- /dev/null +++ b/src/system/sargon_os/sargon_os_factors.rs @@ -0,0 +1,713 @@ +use crate::prelude::*; + +/// If we wanna create an Olympia DeviceFactorSource or +/// a Babylon one, either main or not. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, uniffi::Enum)] +pub enum DeviceFactorSourceType { + Babylon { is_main: bool }, + Olympia, +} + +#[uniffi::export] +impl SargonOS { + /// Returns the "main Babylon" `DeviceFactorSource` of the current account as + /// a `DeviceFactorSource`. + pub fn bdfs(&self) -> DeviceFactorSource { + self.profile_holder.access_profile_with(|p| p.bdfs()) + } + + /// Returns all the factor sources + pub fn factor_sources(&self) -> FactorSources { + self.profile_holder + .access_profile_with(|p| p.factor_sources.clone()) + } + + /// Updates the factor source `updated` by mutating current profile and persisting + /// the change to secure storage. Throws `UpdateFactorSourceMutateFailed` error if the + /// factor source is not found. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::FactorSourceUpdated { id } }` + pub async fn update_factor_source( + &self, + updated: FactorSource, + ) -> Result<()> { + let id = updated.factor_source_id(); + + debug!("Updating FactorSource with ID: {}", &id); + + self.update_profile_with(|mut p| { + // p.update_last_used_of_factor_source(&id) + p.update_any_factor_source(&id, |fs| *fs = updated.clone()) + .map_err(|_| CommonError::UpdateFactorSourceMutateFailed) + }) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::FactorSourceUpdated { id }, + )) + .await; + + Ok(()) + } + + /// Returns `Ok(false)` if the Profile already contained a factor source with the + /// same id (Profile unchanged occurred). + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::FactorSourceAdded }` + /// + /// And also emits `Event::ProfileModified { change: EventProfileModified::FactorSourceUpdated }`, + /// if the newly added FactorSource is a new **main** flag, then we remove the + /// main flag from the old BDFS. + /// + /// And also emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub async fn add_factor_source( + &self, + factor_source: FactorSource, + ) -> Result { + let id = factor_source.factor_source_id(); + + let contains = self.factor_source_ids().contains(&id); + + if contains { + return Ok(false); + } + + self.add_factor_sources_without_emitting_factor_sources_added( + FactorSources::just(factor_source), + ) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::FactorSourceAdded { id }, + )) + .await; + + Ok(true) + } + + /// Adds all of the provided `factor_sources` to Profile in one single go. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::FactorSourcesAdded }` + /// + /// And also emits `Event::ProfileModified { change: EventProfileModified::FactorSourceUpdated }`, + /// if the newly added FactorSource is a new **main** flag, then we remove the + /// main flag from the old BDFS. + /// + /// And also emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub async fn add_factor_sources( + &self, + factor_sources: FactorSources, + ) -> Result> { + let ids = self + .add_factor_sources_without_emitting_factor_sources_added( + factor_sources, + ) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::FactorSourcesAdded { ids: ids.clone() }, + )) + .await; + + Ok(ids) + } + + pub async fn debug_add_all_sample_factors( + &self, + ) -> Result> { + let mwp = MnemonicWithPassphrase::sample_device(); + let id = FactorSourceIDFromHash::new_for_device(&mwp); + self.clients + .secure_storage + .save_mnemonic_with_passphrase(&mwp, &id) + .await?; + + let mwp = MnemonicWithPassphrase::sample_device_other(); + let id = FactorSourceIDFromHash::new_for_device(&mwp); + self.clients + .secure_storage + .save_mnemonic_with_passphrase(&mwp, &id) + .await?; + + let mwp = MnemonicWithPassphrase::sample_device_12_words(); + let id = FactorSourceIDFromHash::new_for_device(&mwp); + self.clients + .secure_storage + .save_mnemonic_with_passphrase(&mwp, &id) + .await?; + + self.add_factor_sources(FactorSources::sample_values_all()) + .await + } + + /// Creates a new unsaved DeviceFactorSource from the provided `mnemonic_with_passphrase`, + /// either a "BDFS" or an "Olympia" one. + pub async fn create_device_factor_source( + &self, + mnemonic_with_passphrase: MnemonicWithPassphrase, + factor_type: DeviceFactorSourceType, + ) -> Result { + let host_info = self.host_info().await; + let factor_source = match factor_type { + DeviceFactorSourceType::Olympia => DeviceFactorSource::olympia( + &mnemonic_with_passphrase, + &host_info, + ), + DeviceFactorSourceType::Babylon { is_main } => { + DeviceFactorSource::babylon( + is_main, + &mnemonic_with_passphrase, + &host_info, + ) + } + }; + Ok(factor_source) + } + + /// Loads a `MnemonicWithPassphrase` with the `id` of `device_factor_source`, + /// from SecureStorage, and returns a `PrivateHierarchicalDeterministicFactorSource` + /// built from both. + /// + /// Useful for when you will want to sign transactions or derive public keys for + /// creation of new entities. + /// + /// Returns `Err` if loading or decoding of `MnemonicWithPassphrase` from + /// SecureStorage fails. + pub async fn load_private_device_factor_source_by_id( + &self, + id: &FactorSourceIDFromHash, + ) -> Result { + let device_factor_source = self + .profile_holder + .access_profile_with(|p| p.device_factor_source_by_id(id))?; + self.load_private_device_factor_source(&device_factor_source) + .await + } +} + +impl SargonOS { + /// Adds all factor sources to Profile. + /// + /// # Emits Event + /// Emits `Event::ProfileModified { change: EventProfileModified::FactorSourceUpdated }`, + /// if any of the newly added FactorSources has **main** flag, then we remove the + /// main flag from the old BDFS. + /// + /// And also emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + async fn add_factor_sources_without_emitting_factor_sources_added( + &self, + factor_sources: FactorSources, + ) -> Result> { + let ids_of_factors_to_add = factor_sources + .iter() + .map(|x| x.id()) + .collect::>(); + let existing_ids = self + .factor_source_ids() + .into_iter() + .collect::>(); + + let ids_of_new_factor_sources = ids_of_factors_to_add + .difference(&existing_ids) + .cloned() + .collect::>(); + + let new_factors_only = factor_sources + .iter() + .filter(|x| { + ids_of_new_factor_sources.contains(&x.factor_source_id()) + }) + .collect::(); + + let is_any_of_new_factors_main_bdfs = + new_factors_only.iter().any(|x| x.is_main_bdfs()); + let id_of_old_bdfs = self.bdfs().factor_source_id(); + + self.update_profile_with(|mut p| { + p.factor_sources.extend(new_factors_only.clone()); + Ok(()) + }) + .await?; + + if is_any_of_new_factors_main_bdfs { + self.update_factor_source_remove_flag_main(id_of_old_bdfs) + .await?; + assert!( + ids_of_factors_to_add.contains(&self.bdfs().factor_source_id()) + ) + } + + Ok(ids_of_new_factor_sources.into_iter().collect_vec()) + } + + /// Returns IDs of all the factor sources. + pub fn factor_source_ids(&self) -> HashSet { + self.profile_holder.access_profile_with(|p| { + HashSet::from_iter(p.factor_sources.iter().map(|s| s.id())) + }) + } + + /// Updates the `last_used_on` for the factor source and emits events. + /// + /// # Emits Event + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + /// + /// Also emits `EventNotification::ProfileModified { change: EventProfileModified::FactorSourceUpdated { id } }` + pub async fn update_last_used_of_factor_source( + &self, + factor_source_id: impl Into, + ) -> Result<()> { + let id = factor_source_id.into(); + + debug!( + "Updating 'last_used_on' date for FactorSource with ID: {}", + &id + ); + + self.update_profile_with(|mut p| { + p.update_last_used_of_factor_source(&id) + }) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::FactorSourceUpdated { id }, + )) + .await; + + Ok(()) + } + + pub async fn update_factor_source_remove_flag_main( + &self, + factor_source_id: impl Into, + ) -> Result<()> { + let id = factor_source_id.into(); + + debug!( + "Updating 'flags', removing main, for FactorSource with ID: {}", + &id + ); + + self.update_profile_with(|mut p| { + p.update_factor_source_remove_flag_main(&id) + }) + .await?; + + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::FactorSourceUpdated { id }, + )) + .await; + + Ok(()) + } +} + +impl SargonOS { + /// Tries to load a `MnemonicWithPassphrase` from secure storage + /// by `id` of type `FactorSourceIDFromHash`. + pub async fn mnemonic_with_passphrase_of_device_factor_source_by_id( + &self, + id: &FactorSourceIDFromHash, + ) -> Result { + self.secure_storage.load_mnemonic_with_passphrase(id).await + } + + /// Loads a `MnemonicWithPassphrase` with the `id` of `device_factor_source`, + /// from SecureStorage, and returns a `PrivateHierarchicalDeterministicFactorSource` + /// built from both. + /// + /// Useful for when you will want to sign transactions or derive public keys for + /// creation of new entities. + /// + /// Returns `Err` if loading or decoding of `MnemonicWithPassphrase` from + /// SecureStorage fails. + pub async fn load_private_device_factor_source( + &self, + device_factor_source: &DeviceFactorSource, + ) -> Result { + info!( + "Load Private DeviceFactorSource from SecureStorage, factor source id: {}", + &device_factor_source.id + ); + self.mnemonic_with_passphrase_of_device_factor_source_by_id( + &device_factor_source.id, + ) + .await + .map(|mwp| { + PrivateHierarchicalDeterministicFactorSource::new( + mwp, + device_factor_source.clone(), + ) + }) + .log_info( + "Successfully loaded Private DeviceFactorSource from SecureStorage", + ) + } + + /// Tries to load a `MnemonicWithPassphrase` from secure storage + /// by `factor_source_id`. + pub async fn mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id( + &self, + factor_source_id: &FactorSourceID, + ) -> Result { + let id = (*factor_source_id) + .into_hash() + .map_err(|_| CommonError::FactorSourceIDNotFromHash)?; + self.mnemonic_with_passphrase_of_device_factor_source_by_id(&id) + // tarpaulin will incorrectly flag next line is missed + .await + } + + /// Tries to load the `MnemonicWithPassphrase` for the main "Babylon" + /// `DeviceFactorSource` from secure storage. + pub async fn main_bdfs_mnemonic_with_passphrase( + &self, + ) -> Result { + let bdfs = self.profile_holder.access_profile_with(|p| p.bdfs()); + self.mnemonic_with_passphrase_of_device_factor_source_by_id(&bdfs.id) + // tarpaulin will incorrectly flag next line is missed + .await + } +} + +#[cfg(test)] +mod tests { + + use super::*; + use actix_rt::time::timeout; + use std::{future::Future, time::Duration}; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn test_load_private_device_factor_source_by_id() { + // ARRANGE + let mwp = MnemonicWithPassphrase::sample(); + let factor_source_id = FactorSourceIDFromHash::new_for_device(&mwp); + let os = SUT::fast_boot_bdfs(mwp.clone()).await; + + // ACT + let private = os + .with_timeout(|x| { + x.load_private_device_factor_source_by_id(&factor_source_id) + }) + .await + .unwrap(); + + // ASSERT + assert_eq!(private.mnemonic_with_passphrase, mwp); + } + + #[actix_rt::test] + async fn test_bdfs() { + // ARRANGE + let mwp = MnemonicWithPassphrase::sample(); + let os = SUT::fast_boot_bdfs(mwp.clone()).await; + + // ACT + let loaded = os.bdfs(); + + // ASSERT + assert_eq!( + loaded.factor_source_id(), + FactorSourceIDFromHash::new_for_device(&mwp).into() + ); + } + + #[actix_rt::test] + async fn test_mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id( + ) { + // ARRANGE + let mwp = MnemonicWithPassphrase::sample(); + let factor_source_id = FactorSourceIDFromHash::new_for_device(&mwp); + let id = FactorSourceID::from(factor_source_id); + let os = SUT::fast_boot_bdfs(mwp.clone()).await; + + // ACT + let loaded = os + .with_timeout(|x| { + x.mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id(&id) + }) + .await + .unwrap(); + + // ASSERT + assert_eq!(loaded, mwp); + } + + #[actix_rt::test] + async fn test_add_ledger_factor_source() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let inserted = os + .with_timeout(|x| x.add_factor_source(FactorSource::sample_other())) + .await + .unwrap(); + + // ASSERT + assert!(inserted); + assert!(os + .profile() + .factor_sources + .contains_by_id(&FactorSource::sample_other())); + } + + #[actix_rt::test] + async fn test_add_ledger_factor_source_new_bdfs_removes_main_from_existing_bdfs( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + let old_bdfs_id = os.bdfs().factor_source_id(); + let new_bdfs = DeviceFactorSource::babylon( + true, + &MnemonicWithPassphrase::sample(), + &HostInfo::sample(), + ); + assert_ne!(old_bdfs_id, new_bdfs.factor_source_id()); + + // ACT + let inserted = os + .with_timeout(|x| { + x.add_factor_source(FactorSource::from(new_bdfs.clone())) + }) + .await + .unwrap(); + + // ASSERT + assert!(inserted); + assert_eq!(os.bdfs(), new_bdfs); + let old_bdfs = os + .profile() + .factor_sources + .get_id(old_bdfs_id) + .unwrap() + .clone() + .into_device() + .unwrap(); + assert!(!old_bdfs.is_main_bdfs()); + } + + #[actix_rt::test] + async fn test_add_existing_factor_source_is_noop() { + // ARRANGE + let mwp = MnemonicWithPassphrase::sample(); + let os = SUT::fast_boot_bdfs(mwp.clone()).await; + + let bdfs = os.bdfs(); + + // ACT + let inserted = os + .with_timeout(|x| { + x.add_factor_source( + DeviceFactorSource::babylon( + false, + &mwp, + &HostInfo::sample_other(), + ) + .into(), + ) + }) + .await + .unwrap(); + + // ASSERT + assert!(!inserted); // already exists + assert_eq!( + os.profile().factor_sources, + FactorSources::just(bdfs.into()) + ); + } + + #[actix_rt::test] + async fn test_create_device_factor_source_babylon_main() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let bdfs = os + .with_timeout(|x| { + x.create_device_factor_source( + MnemonicWithPassphrase::sample(), + DeviceFactorSourceType::Babylon { is_main: true }, + ) + }) + .await + .unwrap(); + + // ASSERT + assert!(bdfs.is_main_bdfs()); + } + + #[actix_rt::test] + async fn test_create_device_factor_source_babylon_not_main() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let bdfs = os + .with_timeout(|x| { + x.create_device_factor_source( + MnemonicWithPassphrase::sample(), + DeviceFactorSourceType::Babylon { is_main: false }, + ) + }) + .await + .unwrap(); + + // ASSERT + assert!(!bdfs.common.is_main_bdfs()); + assert!(bdfs.common.supports_babylon()); + } + + #[actix_rt::test] + async fn test_create_device_factor_source_olympia() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let dfs = os + .with_timeout(|x| { + x.create_device_factor_source( + MnemonicWithPassphrase::sample_device_12_words(), + DeviceFactorSourceType::Olympia, + ) + }) + .await + .unwrap(); + + // ASSERT + assert!(!dfs.common.is_main_bdfs()); + assert!(!dfs.common.supports_babylon()); + assert!(dfs.common.supports_olympia()); + assert_eq!( + dfs.factor_source_id(), + DeviceFactorSource::sample_other().factor_source_id() + ); + } + + #[actix_rt::test] + async fn when_adding_many_factor_sources_event_factor_sources_added_is_emitted( + ) { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + let ids = os + .with_timeout(|x| { + x.add_factor_sources(FactorSources::sample_values_all()) + }) + .await + .unwrap(); + + // ASSERT + assert_eq!( + ids.clone(), + FactorSources::sample_values_all() + .into_iter() + .map(|x| x.id()) + .collect_vec(), + ); + assert!(event_bus_driver.recorded().iter().any(|e| e.event + == Event::ProfileModified { + change: EventProfileModified::FactorSourcesAdded { + ids: ids.clone() + } + })); + } + + #[actix_rt::test] + async fn test_debug_add_all_sample_factors_saves_mnemonics_to_secure_storage( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.debug_add_all_sample_factors()) + .await + .unwrap(); + + // ASSERT + // First + let expected = MnemonicWithPassphrase::sample_device(); + let id = FactorSourceIDFromHash::new_for_device(&expected); + let loaded = os + .with_timeout(|x| { + x.secure_storage.load_mnemonic_with_passphrase(&id) + }) + .await + .unwrap(); + assert_eq!(loaded, expected); + + // Second + let expected = MnemonicWithPassphrase::sample_device_other(); + let id = FactorSourceIDFromHash::new_for_device(&expected); + let loaded = os + .with_timeout(|x| { + x.secure_storage.load_mnemonic_with_passphrase(&id) + }) + .await + .unwrap(); + assert_eq!(loaded, expected); + + // Third + let expected = MnemonicWithPassphrase::sample_device_12_words(); + let id = FactorSourceIDFromHash::new_for_device(&expected); + let loaded = os + .with_timeout(|x| { + x.secure_storage.load_mnemonic_with_passphrase(&id) + }) + .await + .unwrap(); + assert_eq!(loaded, expected); + } + + #[actix_rt::test] + async fn test_update_factor_source() { + // ARRANGE + let os = SUT::fast_boot().await; + let mut factor = ArculusCardFactorSource::sample(); + os.with_timeout(|x| x.add_factor_source(factor.clone().into())) + .await + .unwrap(); + + // ACT + let new_name = "new important name"; + factor.hint.name = new_name.to_owned(); + os.with_timeout(|x| x.update_factor_source(factor.clone().into())) + .await + .unwrap(); + + // ASSERT + assert!(os.profile().factor_sources.into_iter().any(|f| { + match f { + FactorSource::ArculusCard { value } => { + value.hint.name == *new_name + } + _ => false, + } + })); + } +} diff --git a/src/system/sargon_os/sargon_os_gateway.rs b/src/system/sargon_os/sargon_os_gateway.rs new file mode 100644 index 000000000..1e7c2aab6 --- /dev/null +++ b/src/system/sargon_os/sargon_os_gateway.rs @@ -0,0 +1,205 @@ +use crate::prelude::*; + +// ================== +// Get Current Gateway/Network +// ================== +#[uniffi::export] +impl SargonOS { + /// Returns the id of the Network of the current Gateway set in AppPreferences + /// of the active Profile. This is the canonical value of "current network", + /// which affects which accounts host clients display to end user and to + /// which network transactions are submitted, amongst other behaviors. + pub fn current_network_id(&self) -> NetworkID { + self.profile_holder.current_network_id() + } + + /// The current gateway host client is using, which affects `current_network_id`. + /// All Network Requests reading from Radix ledger and submission of new + /// transactions will go the the Radix Network of the current Gateway. + pub fn current_gateway(&self) -> Gateway { + self.profile_holder.current_gateway().clone() + } + + /// Returns the `gateways` values of the current Profile. + pub fn gateways(&self) -> SavedGateways { + self.profile_holder.gateways().clone() + } + + /// Returns the `ProfileNetwork` corresponding to the network ID set by the + /// current gateway. + pub fn current_network(&self) -> ProfileNetwork { + self.profile_holder.current_network().clone() + } +} + +// ================== +// Change Current Gateway +// ================== +#[uniffi::export] +impl SargonOS { + /// Changes the current Gateway to `to`, if it is not already the current. + /// Returns the outcome of the change, if we did in fact switch (current != to), + /// and if we switched then if `to` is new. + /// + /// If we did in fact change current, an `EventNotification` is emitted. + /// + /// # Emits Event + /// Emits `Event::GatewayChangedCurrent` if we changed the gateway. + pub async fn change_current_gateway( + &self, + to: Gateway, + ) -> Result { + info!("Changing current gateway to: {}", &to); + let network_id = to.network.id; + let outcome = self + .update_profile_with(|mut p| { + let outcome = + p.app_preferences.gateways.change_current(to.clone()); + match outcome { + ChangeGatewayOutcome::DidChange { is_new: _ } => { + if !p.networks.contains_id(network_id) { + p.networks.append(ProfileNetwork::new_empty_on( + network_id, + )); + } + Ok(outcome) + } + ChangeGatewayOutcome::NoChange => Ok(outcome), + } + }) + .await?; + + match outcome { + ChangeGatewayOutcome::DidChange { is_new } => { + self.event_bus + .emit(EventNotification::new( + Event::GatewayChangedCurrent { to, is_new }, + )) + .await; + } + ChangeGatewayOutcome::NoChange => {} + }; + + debug!("Change current gateway outcome: {:?}", &outcome); + + Ok(outcome) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_rt::time::timeout; + use std::{future::Future, time::Duration}; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn test_change_gateway_creates_empty_network_if_needed() { + // ARRANGE + let os = SUT::fast_boot().await; + let number_of_networks_before_change = os.profile().networks.len(); + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert_eq!( + os.profile().networks.len(), + number_of_networks_before_change + 1 + ); + } + + #[actix_rt::test] + async fn test_change_gateway_gateways_returns_updated() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.gateways().current, Gateway::stokenet()) + } + + #[actix_rt::test] + async fn test_change_gateway_current_returns_updated() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.current_gateway(), Gateway::stokenet()) + } + + #[actix_rt::test] + async fn test_change_gateway_current_returns_updated_network_id() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.current_network_id(), NetworkID::Stokenet) + } + + #[actix_rt::test] + async fn test_change_gateway_emits_event() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::stokenet())) + .await + .unwrap(); + + // ASSERT + assert!(event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::GatewayChangedCurrent)); + } + + #[actix_rt::test] + async fn test_change_to_current_gateway_does_not_emits_event() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + os.with_timeout(|x| x.change_current_gateway(Gateway::mainnet())) + .await + .unwrap(); + + // ASSERT + assert!(!event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::GatewayChangedCurrent)); + } +} diff --git a/src/system/sargon_os/sargon_os_profile.rs b/src/system/sargon_os/sargon_os_profile.rs new file mode 100644 index 000000000..ac560fe56 --- /dev/null +++ b/src/system/sargon_os/sargon_os_profile.rs @@ -0,0 +1,757 @@ +#![allow(deprecated)] + +use std::sync::RwLockWriteGuard; + +use crate::prelude::*; + +impl SargonOS { + /// Returns `true` if claim was needed, i.e. if `profile.header.last_used_on_device` was + /// different than `device_info` before claim occurred. + fn claim_provided_profile( + profile: &mut Profile, + device_info: DeviceInfo, + ) -> bool { + let was_needed = + profile.header.last_used_on_device.id != device_info.id; + profile.update_header(device_info); + was_needed + } + + /// "Claims" the `profile`, meaning the last_used_on_device is updated in the + /// header + pub async fn claim_profile(&self, profile: &mut Profile) -> Result<()> { + debug!("Claiming profile, id: {}", &profile.id()); + let host_id = self.host_id().await?; + let host_info = self.host_info().await; + let claiming_device_info = + DeviceInfo::new_from_info(&host_id, &host_info); + + Self::claim_provided_profile(profile, claiming_device_info); + info!( + "Claimed profile, id: {}, with device info: {}", + &profile.id(), + host_info + ); + Ok(()) + } +} + +#[uniffi::export] +impl SargonOS { + /// Checks if current Profile contains any `ProfileNetwork`s. + pub fn has_any_network(&self) -> bool { + self.profile_holder + .access_profile_with(|p| !p.networks.is_empty()) + } + + /// Has **any** account, at all, including hidden, on any network. + pub fn has_any_account_on_any_network(&self) -> bool { + self.profile_holder + .access_profile_with(|p| p.has_any_account_on_any_network()) + } + + /// Returns the current profile in full. This is a COSTLY operation + /// and hosts SHOULD NOT do it lightheartedly, prefer using more specific + /// reading operations such as `os.current_network_id` or `os.accounts_for_display_on_current_network` etc, which are cheap operations compared + /// to using this. + /// + /// In the future will will most likely deprecate this method. + pub fn profile(&self) -> Profile { + self.profile_holder.profile() + } + + #[allow(non_snake_case)] + #[deprecated( + since = "0.0.1", + note = "Hosts SHOULD migrate to use more specialized methods on SargonOS instead, e.g. `createAndSaveNewAccount`. And SargonOS should be the SOLE object to perform the mutation and persisting." + )] + pub async fn DEPRECATED_save_ffi_changed_profile( + &self, + profile: Profile, + ) -> Result<()> { + if profile.id() != self.profile().id() { + return Err( + CommonError::TriedToUpdateProfileWithOneWithDifferentID, + ); + } + self.update_profile_with(|mut p| { + *p = profile.clone(); + Ok(()) + }) + .await + } + + /// Imports the `profile`, claims it, set it as active (current) one and + /// saves it into secure storage (with the claim modification). + /// + /// # Emits Event + /// Emits `EventNotification::new(Event::ProfileImported))` event if successful. + pub async fn import_profile(&self, profile: Profile) -> Result<()> { + let imported_id = profile.id(); + debug!("Importing profile, id: {}", imported_id); + let mut profile = profile; + self.claim_profile(&mut profile).await?; + + self.secure_storage + .save_profile_and_active_profile_id(&profile) + .await?; + + debug!( + "Saved imported profile into secure storage, id: {}", + imported_id + ); + + self.profile_holder.replace_profile_with(profile)?; + debug!( + "Replaced held profile with imported one, id: {}", + imported_id + ); + + self.event_bus + .emit(EventNotification::new(Event::ProfileImported { + id: imported_id, + })) + .await; + + info!("Successfully imported profile, id: {}", imported_id); + + Ok(()) + } + + /// Claims the active profile, meaning the `last_used_on_device` in `header` + /// is updated. + /// + /// Returns `true` if the profile was changed (i.e. if claim was indeed needed), + /// `false`` otherwise. + pub async fn claim_active_profile(&self) -> Result { + let host_id = self.host_id().await?; + let host_info = self.host_info().await; + + self.maybe_validate_ownership_update_profile_with( + false, // we do NOT validate ownership, since this method is claiming + |mut p| { + Ok(Self::claim_provided_profile( + &mut p, + DeviceInfo::new_from_info(&host_id, &host_info), + )) + }, + ) + .await + } + + /// Deletes the profile and the active profile id and all references Device + /// factor sources from secure storage, and creates a new empty profile + /// and a new bdfs, and saves those into secure storage, returns the ID of + /// the new profile. + pub async fn delete_profile_then_create_new_with_bdfs( + &self, + ) -> Result { + let (profile, bdfs) = self + .delete_profile_and_mnemonics_replace_in_memory_without_persisting() + .await?; + let profile_id = profile.id(); + self.secure_storage + .save_private_hd_factor_source(&bdfs) + .await?; + + self.secure_storage + .save_profile_and_active_profile_id(&profile) + .await?; + + Ok(profile_id) + } + + /// Do NOT use in production. Instead use `delete_profile_then_create_new_with_bdfs` + /// in production. This method does not persist the new profile. + pub async fn emulate_fresh_install(&self) -> Result<()> { + warn!("Emulate fresh install of app. Will delete Profile and secrets from secure storage, without saving the new. BAD state."); + let _ = self + .delete_profile_and_mnemonics_replace_in_memory_without_persisting() + .await?; + Ok(()) + } +} + +impl SargonOS { + /// Returns `Err`` if the **active** profile is not 'owned by host', + /// meaning `profile.header.last_used_on_device.id != device_info.id`. + /// + /// # Emits Event + /// Emits `Event::ProfileUsedOnOtherDevice` if `profile` is not 'owned by + /// host'. + pub(crate) async fn validate_is_allowed_to_mutate_active_profile( + &self, + ) -> Result<()> { + Self::validate_is_allowed_to_update_provided_profile( + &self.clients, + &self.profile(), + ) + .await + } + + /// Returns `Err` if the **provided** `profile` is not 'owned by host', + /// meaning `profile.header.last_used_on_device.id != device_info.id`. + /// + /// # Emits Event + /// Emits `Event::ProfileUsedOnOtherDevice` if `profile` is not 'owned by + /// host'. + pub(crate) async fn validate_is_allowed_to_update_provided_profile( + clients: &Clients, + profile: &Profile, + ) -> Result<()> { + Self::check_is_allowed_to_update_provided_profile( + clients, profile, true, + ) + .await?; + Ok(()) + } + + /// Checks if the **provided** `profile` is not 'owned by host', + /// meaning `profile.header.last_used_on_device.id != device_info.id`, + /// and if `err_on_lack_of_ownership` an Err is returns, otherwise `Ok(false)` + /// is returned. + /// + /// # Emits Event + /// Emits `Event::ProfileUsedOnOtherDevice` if `profile` is not 'owned by + /// host'. + pub(crate) async fn check_is_allowed_to_update_provided_profile( + clients: &Clients, + profile: &Profile, + err_on_lack_of_ownership: bool, + ) -> Result { + debug!("Checking if profile.header.last_used_on_device is self.device_info"); + let host_id = Self::get_host_id(clients).await?; + let last_used = profile.header.last_used_on_device.clone(); + if last_used.id == host_id.id { + debug!("Ownership check passed (profile.header.last_used_on_device == self.device_info)"); + Ok(true) + } else { + warn!("Profile was last used on another device, will not be able to update it until it has been claimed."); + clients + .event_bus + .emit(EventNotification::profile_used_on_other_device( + last_used.clone(), + )) + .await; + if err_on_lack_of_ownership { + Err(CommonError::ProfileUsedOnOtherDevice { + other_device_id: last_used.id, + this_device_id: host_id.id, + }) + } else { + // used by SargonOS::boot + Ok(false) + } + } + } + + /// Validates ownership of Profile, then updates and **saves** it to + /// secure storage, after mutating it with `mutate`. + /// + /// # Emits + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub(crate) async fn update_profile_with(&self, mutate: F) -> Result + where + F: Fn(RwLockWriteGuard<'_, Profile>) -> Result, + { + self.maybe_validate_ownership_update_profile_with(true, mutate) + .await + } + + /// Updates and **saves** profile to secure storage, after + /// mutating it with `mutate`, optionally validating ownership of Profile + /// first. + /// + /// The only function to pass `false` to the `validate_ownership` parameter + /// is the `SargonOS::claim_active_profile` method. + /// + /// # Emits + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub(crate) async fn maybe_validate_ownership_update_profile_with( + &self, + validate_ownership: bool, // should only ever pass `false` from `claim` + mutate: F, + ) -> Result + where + F: Fn(RwLockWriteGuard<'_, Profile>) -> Result, + { + if validate_ownership { + self.validate_is_allowed_to_mutate_active_profile().await?; + } + let res = self.profile_holder.update_profile_with(mutate)?; + self.profile_holder.update_profile_with(|mut p| { + p.update_header(None); + Ok(()) + })?; + self.save_existing_profile() + // tarpaulin will incorrectly flag next line is missed + .await?; + Ok(res) + } + + /// Saves the **active** profile into secure storage, if profile is 'owned by host'. + /// + /// # Emits Event + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub(crate) async fn save_existing_profile(&self) -> Result<()> { + self.save_profile(&self.profile()).await + } + + /// Saves **provided** `profile`` into secure storage, if it's 'owned by host'. + /// + /// # Emits Event + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + pub(crate) async fn save_profile(&self, profile: &Profile) -> Result<()> { + self.validate_is_allowed_to_mutate_active_profile().await?; + + let secure_storage = &self.secure_storage; + + secure_storage + .save( + SecureStorageKey::ProfileSnapshot { + profile_id: profile.header.id, + }, + profile, + ) + .await?; + + self.event_bus + .emit(EventNotification::new(Event::ProfileSaved)) + .await; + + Ok(()) + } + + /// Deletes the profile and the active profile id and all references Device + /// factor sources from secure storage, does **NOT** change the in-memory + /// profile in `profile_holder`. + async fn delete_profile_and_mnemonics(&self) -> Result<()> { + let secure_storage = &self.secure_storage; + let device_factor_sources = self + .profile_holder + .access_profile_with(|p| p.device_factor_sources()); + + for dfs in device_factor_sources.iter() { + secure_storage.delete_mnemonic(&dfs.id).await? + } + + secure_storage.delete_profile(self.profile().id()).await?; + secure_storage.delete_active_profile_id().await?; + Ok(()) + } + + /// Deletes the profile and the active profile id and all references Device + /// factor sources from secure storage, and creates a new empty profile + /// and a new bdfs and replaces the in-memory profile held by profile_holder, + /// **without** persisting the neither the profile nor the new BDFS to secure + /// storage. + /// + /// This method is typically only relevant for testing purposes, emulating a + /// fresh install of wallet apps, wallet apps can call this method and then + /// force quit, which should be equivalent with a fresh install of the app. + pub async fn delete_profile_and_mnemonics_replace_in_memory_without_persisting( + &self, + ) -> Result<(Profile, PrivateHierarchicalDeterministicFactorSource)> { + self.delete_profile_and_mnemonics().await?; + let (profile, bdfs) = self.new_profile_and_bdfs().await?; + self.profile_holder.replace_profile_with(profile.clone())?; + Ok((profile, bdfs)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_rt::time::timeout; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn new_profile_has_a_mainnet_network_which_is_empty() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT - nothing done. + + // ASSERT + assert_eq!( + os.current_network(), + ProfileNetwork::new_empty_on(NetworkID::Mainnet) + ); + } + + #[actix_rt::test] + async fn create_first_account_has_networks_is_true() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert!(os.has_any_network()); + } + + #[actix_rt::test] + async fn create_first_account_has_accounts_on_any_network() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.create_and_save_new_unnamed_mainnet_account()) + .await + .unwrap(); + + // ASSERT + assert!(os.has_any_account_on_any_network()); + } + + #[actix_rt::test] + async fn test_import_profile_is_current_by_id() { + // ARRANGE + let os = SUT::fast_boot().await; + let p = Profile::sample(); + + // ACT + os.with_timeout(|x| x.import_profile(p.clone())) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.profile().id(), p.id()); + } + + #[actix_rt::test] + async fn test_import_profile_emits_event() { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + let p = Profile::sample(); + + // ACT + os.with_timeout(|x| x.import_profile(p.clone())) + .await + .unwrap(); + + // ASSERT + assert!(event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::ProfileImported)); + } + + #[actix_rt::test] + async fn test_import_profile_is_saved_into_storage() { + // ARRANGE + let os = SUT::fast_boot().await; + let p = Profile::sample(); + + // ACT + os.with_timeout(|x| x.import_profile(p.clone())) + .await + .unwrap(); + + // ASSERT + let saved = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + + assert_eq!(saved.id(), p.id()); + } + + #[actix_rt::test] + async fn test_import_profile_last_used_on_device_is_set() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.import_profile(Profile::sample())) + .await + .unwrap(); + + // ASSERT + let host_id = os.host_id().await.unwrap(); + let host_info = os.host_info().await; + assert_eq!( + os.profile().header.last_used_on_device, + DeviceInfo::new_from_info(&host_id, &host_info) + ); + } + + #[actix_rt::test] + async fn test_import_profile_last_modified_is_set() { + // ARRANGE + let os = SUT::fast_boot().await; + let profile = Profile::sample(); + let last_modified = &profile.header.last_modified; + + // ACT + os.with_timeout(|x| x.import_profile(profile.clone())) + .await + .unwrap(); + + // ASSERT + assert_ne!(&os.profile().header.last_modified, last_modified); + } + + #[actix_rt::test] + async fn test_import_profile_is_claimed_and_can_be_edited() { + // ARRANGE + let os = SUT::fast_boot().await; + let profile = Profile::sample(); + + // ACT + os.with_timeout(|x| x.import_profile(profile.clone())) + .await + .unwrap(); + + let new_account = Account::sample_stokenet_paige(); + os.with_timeout(|x| x.add_account(new_account.clone())) + .await + .unwrap(); + + // ASSERT + assert!(os + .profile() + .networks + .get_id(NetworkID::Stokenet) + .unwrap() + .accounts + .contains_id(new_account.id())); + + let loaded = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + assert!(loaded + .networks + .get_id(NetworkID::Stokenet) + .unwrap() + .accounts + .contains_id(new_account.id())); + } + + #[actix_rt::test] + async fn test_import_profile_active_profile_id_is_set() { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + os.with_timeout(|x| x.import_profile(Profile::sample())) + .await + .unwrap(); + + // ASSERT + let active_profile_id = os + .with_timeout(|x| x.secure_storage.load_active_profile_id()) + .await + .unwrap() + .unwrap(); + + assert_eq!(active_profile_id, os.profile().id()); + } + + #[actix_rt::test] + async fn test_delete_profile_then_create_new_with_bdfs_old_bdfs_is_deleted() + { + // ARRANGE + let bdfs = MnemonicWithPassphrase::sample(); + let os = SUT::fast_boot_bdfs(bdfs.clone()).await; + + // ACT + os.with_timeout(|x| x.delete_profile_then_create_new_with_bdfs()) + .await + .unwrap(); + + // ASSERT + let id = FactorSourceIDFromHash::new_for_device(&bdfs); + let old_bdfs = os + .with_timeout(|x| { + x.secure_storage.load_mnemonic_with_passphrase(&id) + }) + .await; + + assert!(old_bdfs.is_err()); + } + + #[actix_rt::test] + async fn test_delete_profile_then_create_new_with_bdfs_old_profile_is_deleted( + ) { + // ARRANGE + let bdfs = MnemonicWithPassphrase::sample(); + let os = SUT::fast_boot_bdfs(bdfs.clone()).await; + let profile_id = os.profile().id(); + + // ACT + os.with_timeout(|x| x.delete_profile_then_create_new_with_bdfs()) + .await + .unwrap(); + + // ASSERT + let load_old_profile_result = os + .with_timeout(|x| x.secure_storage.load_profile_with_id(profile_id)) + .await; + + assert!(load_old_profile_result.is_err()); + } + + #[actix_rt::test] + async fn test_delete_profile_then_create_new_with_bdfs_new_bdfs_is_saved() { + // ARRANGE + let bdfs = MnemonicWithPassphrase::sample(); + let os = SUT::fast_boot_bdfs(bdfs.clone()).await; + + // ACT + os.with_timeout(|x| x.delete_profile_then_create_new_with_bdfs()) + .await + .unwrap(); + + // ASSERT + let saved_bdfs = os + .with_timeout(|x| x.main_bdfs_mnemonic_with_passphrase()) + .await + .unwrap(); + + assert_ne!(saved_bdfs, bdfs); + } + + #[actix_rt::test] + async fn test_delete_profile_then_create_new_with_bdfs_new_profile_is_saved( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + let profile = Profile::sample(); + os.with_timeout(|x| x.import_profile(profile.clone())) + .await + .unwrap(); + + // ACT + os.with_timeout(|x| x.delete_profile_then_create_new_with_bdfs()) + .await + .unwrap(); + + // ASSERT + let active_profile = os + .with_timeout(|x| x.secure_storage.load_active_profile()) + .await + .unwrap() + .unwrap(); + + assert_ne!(active_profile.id(), profile.id()); + } + + #[actix_rt::test] + async fn test_delete_profile_then_create_new_with_bdfs_device_info_is_unchanged( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + let host_id = os.with_timeout(|x| x.host_id()).await.unwrap(); + let host_info = os.with_timeout(|x| x.host_info()).await; + assert_eq!( + &os.profile().header.creating_device, + &DeviceInfo::new_from_info(&host_id, &host_info) + ); + + // ACT + os.with_timeout(|x| x.delete_profile_then_create_new_with_bdfs()) + .await + .unwrap(); + + // ASSERT + let host_id = os.with_timeout(|x| x.host_id()).await.unwrap(); + let host_info = os.with_timeout(|x| x.host_info()).await; + assert_eq!( + &os.profile().header.creating_device, + &DeviceInfo::new_from_info(&host_id, &host_info) + ); + } + + #[actix_rt::test] + async fn test_emulate_fresh_install_does_not_save_new() { + // ARRANGE + let os = SUT::fast_boot().await; + let first = os.profile().id(); + + // ACT + os.with_timeout(|x| x.emulate_fresh_install()) + .await + .unwrap(); + + // ASSERT + let second = os.profile().id(); + assert_ne!(second, first); + let load_profile_res = os + .with_timeout(|x| x.secure_storage.load_profile_with_id(second)) + .await; + + assert_eq!( + load_profile_res, + Err(CommonError::UnableToLoadProfileFromSecureStorage { + profile_id: second + }) + ); + } + + #[actix_rt::test] + async fn test_deprecated_save_ffi_changed_profile() { + // ARRANGE + let os = SUT::fast_boot().await; + + let mut profile = os.profile(); + let new_network = ProfileNetwork::new( + NetworkID::Stokenet, + Accounts::just(Account::sample_stokenet()), + Personas::new(), + AuthorizedDapps::new(), + ); + + profile.networks.append(new_network.clone()); + + // ACT + os.with_timeout(|x| { + x.DEPRECATED_save_ffi_changed_profile(profile.clone()) + }) + .await + .unwrap(); + + // ASSERT + assert_eq!(os.profile().networks, profile.networks); // header has been updated so cannot do full profile comparison. + } + + #[actix_rt::test] + async fn test_deprecated_save_ffi_changed_profile_is_err_when_different_profile_id( + ) { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let res = os + .with_timeout(|x| { + x.DEPRECATED_save_ffi_changed_profile(Profile::sample()) + }) + .await; + + // ASSERT + assert_eq!( + res, + Err(CommonError::TriedToUpdateProfileWithOneWithDifferentID) + ); + } +} diff --git a/src/system/sargon_os/sargon_os_security_structures.rs b/src/system/sargon_os/sargon_os_security_structures.rs new file mode 100644 index 000000000..40bcce36f --- /dev/null +++ b/src/system/sargon_os/sargon_os_security_structures.rs @@ -0,0 +1,306 @@ +use crate::prelude::*; + +#[uniffi::export] +impl SargonOS { + /// Returns all the SecurityStructuresOfFactorSources, + /// by trying to map FactorSourceID level -> FactorSource Level + pub fn security_structures_of_factor_sources( + &self, + ) -> Result { + self.profile_holder + .access_profile_with(|p| p.security_structures_of_factor_sources()) + } + + /// Returns all the `SecurityStructuresOfFactorSourceIDs` which are stored + /// in profile. + pub fn security_structures_of_factor_source_ids( + &self, + ) -> SecurityStructuresOfFactorSourceIDs { + self.profile_holder.access_profile_with(|p| { + p.app_preferences + .security + .security_structures_of_factor_source_ids + .clone() + }) + } + + /// Returns all the `SecurityStructuresOfFactorSourceIDs` which are stored + /// in profile. + pub fn security_structure_of_factor_sources_from_security_structure_of_factor_source_ids( + &self, + structure_of_ids: &SecurityStructureOfFactorSourceIDs, + ) -> Result { + self.profile_holder.try_access_profile_with(|p| { + SecurityStructureOfFactorSources::try_from(( + structure_of_ids, + &p.factor_sources, + )) + }) + } + + /// Adds the security structureof factor sources to Profile if none with the + /// same ID already exists, and if all factors it references are found in Profile. + /// + /// If `structure` references a FactorSource by ID which is unknown to Profile, + /// `Err(CommonError::StructureReferencesUnknownFactorSource)` is returned. + /// + /// If Profile already contains a structure with the same ID, `Ok(false)` is + /// returned **without** modifying the existing one. + /// + /// # Emits Events + /// Emits `Event::ProfileSaved` after having successfully written the JSON + /// of the active profile to secure storage. + /// + /// And also emits `Event::ProfileModified { change: EventProfileModified::SecurityStructureAdded { id } }` + pub async fn add_security_structure_of_factor_sources( + &self, + structure: &SecurityStructureOfFactorSources, + ) -> Result { + let id = structure.id(); + let structure_id_level = + SecurityStructureOfFactorSourceIDs::from(structure.clone()); + + let ids_of_factors_in_profile = self.factor_source_ids(); + let ids_in_structure = structure_id_level + .all_factors() + .into_iter() + .cloned() + .collect::>(); + + let factors_only_in_structure = + ids_in_structure.difference(&ids_of_factors_in_profile); + // If `structure` references factors by ID which are not present in Profile + let has_unknown_factors = + !factors_only_in_structure.collect_vec().is_empty(); + + if has_unknown_factors { + return Err(CommonError::StructureReferencesUnknownFactorSource); + } + + let inserted = self + .update_profile_with(|mut p| { + Ok(p.app_preferences + .security + .security_structures_of_factor_source_ids + .append(structure_id_level.clone()) + .0) + }) + .await?; + + if inserted { + self.event_bus + .emit(EventNotification::profile_modified( + EventProfileModified::SecurityStructureAdded { id }, + )) + .await; + } + Ok(inserted) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + use actix_rt::time::timeout; + use std::{future::Future, time::Duration}; + + #[allow(clippy::upper_case_acronyms)] + type SUT = SargonOS; + + #[actix_rt::test] + async fn add_structure() { + // ARRANGE + let os = SUT::fast_boot().await; + + os.with_timeout(|x| x.debug_add_all_sample_factors()) + .await + .unwrap(); + + // ACT + let structure_factor_source_level = + SecurityStructureOfFactorSources::sample(); + let inserted = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources( + &structure_factor_source_level, + ) + }) + .await + .unwrap(); + + let structure_factor_id_level = + SecurityStructureOfFactorSourceIDs::from( + structure_factor_source_level.clone(), + ); + + // ASSERT + assert!(inserted); + assert!(os + .profile() + .app_preferences + .security + .security_structures_of_factor_source_ids + .contains_by_id(&structure_factor_id_level)); + + let structures = + os.security_structures_of_factor_sources().unwrap().items(); + + assert!(structures.contains(&structure_factor_source_level)); + } + + #[actix_rt::test] + async fn when_adding_structure_referencing_unknown_factors_error_is_thrown() + { + // ARRANGE + let os = SUT::fast_boot().await; + + // ACT + let structure = SecurityStructureOfFactorSources::sample(); + let res = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources(&structure) + }) + .await; + + // ASSERT + assert_eq!( + res, + Err(CommonError::StructureReferencesUnknownFactorSource) + ); + } + + #[actix_rt::test] + async fn add_when_failed_to_add_structure_no_security_structure_related_event_is_emitted( + ) { + // ARRANGE (and ACT) + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + // ACT + let structure = SecurityStructureOfFactorSources::sample(); + let res = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources(&structure) + }) + .await; + + // ASSERT + assert!(res.is_err()); + assert!(!event_bus_driver + .recorded() + .iter() + .any(|e| e.event.kind() == EventKind::SecurityStructureAdded)); + } + + #[actix_rt::test] + async fn add_structure_emits_event() { + // ARRANGE + let event_bus_driver = RustEventBusDriver::new(); + let drivers = Drivers::with_event_bus(event_bus_driver.clone()); + let bios = Bios::new(drivers); + + let os = timeout(SARGON_OS_TEST_MAX_ASYNC_DURATION, SUT::boot(bios)) + .await + .unwrap() + .unwrap(); + + os.with_timeout(|x| x.debug_add_all_sample_factors()) + .await + .unwrap(); + + // ACT + let structure = SecurityStructureOfFactorSources::sample(); + let id = structure.metadata.id; + let inserted = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources(&structure) + }) + .await + .unwrap(); + + // ASSERT + assert!(inserted); + assert!(event_bus_driver.recorded().iter().any(|e| e.event + == Event::ProfileModified { + change: EventProfileModified::SecurityStructureAdded { id } + })); + } + + #[actix_rt::test] + async fn get_structure_from_id() { + // ARRANGE + let os = SUT::fast_boot().await; + + for fs in FactorSources::sample_values_all().into_iter() { + os.add_factor_source(fs).await.unwrap(); + } + + // ACT + let structure_source_sample = + SecurityStructureOfFactorSources::sample(); + let structure_source_sample_other = + SecurityStructureOfFactorSources::sample_other(); + let inserted = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources( + &structure_source_sample, + ) + }) + .await + .unwrap(); + assert!(inserted); + + let inserted = os + .with_timeout(|x| { + x.add_security_structure_of_factor_sources( + &structure_source_sample_other, + ) + }) + .await + .unwrap(); + assert!(inserted); + + let structure_id_sample = SecurityStructureOfFactorSourceIDs::from( + structure_source_sample.clone(), + ); + let structure_id_sample_other = + SecurityStructureOfFactorSourceIDs::from( + structure_source_sample_other.clone(), + ); + + // ASSERT + assert_eq!( + os.security_structures_of_factor_source_ids(), + SecurityStructuresOfFactorSourceIDs::from_iter([ + structure_id_sample.clone(), + structure_id_sample_other.clone(), + ]) + ); + + let structures = os.security_structures_of_factor_sources().unwrap(); + + let sample_by_lookup = os.security_structure_of_factor_sources_from_security_structure_of_factor_source_ids( + &structure_id_sample, + ).unwrap(); + + let sample_by_lookup_other = + os.security_structure_of_factor_sources_from_security_structure_of_factor_source_ids( + &structure_id_sample_other, + ).unwrap(); + + let sources_by_id_lookup = + SecurityStructuresOfFactorSources::from_iter([ + sample_by_lookup, + sample_by_lookup_other, + ]); + + assert_eq!(sources_by_id_lookup, structures); + } +} diff --git a/src/system/subsystems/README.md b/src/system/subsystems/README.md new file mode 100644 index 000000000..eb468f546 --- /dev/null +++ b/src/system/subsystems/README.md @@ -0,0 +1,6 @@ +# Subsystem + +A subsystem needs a "driver" (just like a "client"), but they don't need to be owned by the SargonOS and is never directly accessed, since they have have a static instance with their own lifecycle. + +An example of a subsystem is the `log` for which we install a Driver from FFI host, and is initialized +during creation of the BIOS, but it is not a client, since we wanna be able to log from anywhere inside of the Sargon crate, not specifically tied to the SargonOS instance. diff --git a/src/system/subsystems/log_system/log_system.rs b/src/system/subsystems/log_system/log_system.rs new file mode 100644 index 000000000..74bdb88b6 --- /dev/null +++ b/src/system/subsystems/log_system/log_system.rs @@ -0,0 +1,123 @@ +use std::{ffi::OsStr, sync::Once}; + +use crate::prelude::*; + +#[derive(Debug)] +struct LogSystem(RwLock>>); + +static LOG: LogSystem = LogSystem(RwLock::new(None)); + +impl log::Log for LogSystem { + fn enabled(&self, _: &log::Metadata<'_>) -> bool { + true + } + + fn log(&self, record: &log::Record<'_>) { + if !self.enabled(record.metadata()) { + return; + } + let msg = record.args().to_string(); + let level = record.level(); + if let Some(driver) = &*self.0.read().unwrap() { + driver.log(LogLevel::from(level), msg) + } + } + + fn flush(&self) {} +} + +fn init() { + static ONCE: Once = Once::new(); + ONCE.call_once(|| { + log::set_logger(&LOG) + .expect("Should always be able to install a logger."); + log::set_max_level(log::LevelFilter::Trace); + }); +} + +pub(crate) fn install_logger(logging_driver: Arc) { + init(); + *LOG.0.write().unwrap() = Some(logging_driver); + rust_logger_set_level(LogFilter::Trace); // can be called from FFI later + debug!("Finished installing logger"); +} + +/// Do not call this when you are using the SargonOS, it will have installed +/// a logger already. This is useful in tests which are NOT SargonOS tests, +/// or BIOS tests. +#[uniffi::export] +pub fn rust_logger_init() { + install_logger(RustLoggingDriver::new()) +} + +#[uniffi::export] +pub fn rust_logger_set_level(level: LogFilter) { + let log_level = log::LevelFilter::from(level); + log::set_max_level(log_level); + std::env::set_var( + "RUST_LOG", + std::ffi::OsStr::new(&format!("{:?}", log_level)), + ); +} + +/// Returns every supported LogFilter +#[uniffi::export] +pub fn rust_logger_get_all_filters() -> Vec { + all::().collect() +} + +/// Returns every supported LogLevel +#[uniffi::export] +pub fn rust_logger_get_all_levels() -> Vec { + all::().collect() +} + +#[uniffi::export] +pub fn rust_logger_get_level() -> LogFilter { + LogFilter::from(log::max_level()) +} + +#[uniffi::export] +pub fn rust_logger_log_at_every_level() { + error!("Rust test: 'error'"); + warn!("Rust test: 'warn'"); + info!("Rust test: 'info'"); + debug!("Rust test: 'debug'"); + trace!("Rust test: 'trace'"); +} + +#[cfg(test)] +mod tests { + + use log::Log; + + use super::*; + + #[test] + fn install_rust_logger_change_level() { + install_logger(RustLoggingDriver::new()); + let new = LogFilter::Warn; + rust_logger_set_level(new); + assert_eq!(rust_logger_get_level(), new) + } + + #[test] + fn test_flush() { + let driver = RustLoggingDriver::new(); + install_logger(driver); + LOG.flush(); + } + + #[test] + fn test_rust_logger_init() { + rust_logger_init() + } + + #[test] + fn test_rust_logger_get_all_levels() { + assert_eq!( + rust_logger_get_all_levels(), + all::().collect_vec() + ); + } +} diff --git a/src/system/subsystems/log_system/mod.rs b/src/system/subsystems/log_system/mod.rs new file mode 100644 index 000000000..a11b45516 --- /dev/null +++ b/src/system/subsystems/log_system/mod.rs @@ -0,0 +1,3 @@ +mod log_system; + +pub use log_system::*; diff --git a/src/system/subsystems/mod.rs b/src/system/subsystems/mod.rs new file mode 100644 index 000000000..a11b45516 --- /dev/null +++ b/src/system/subsystems/mod.rs @@ -0,0 +1,3 @@ +mod log_system; + +pub use log_system::*; diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs deleted file mode 100644 index d44ae22d3..000000000 --- a/src/wallet/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -mod home_cards; -mod secure_storage; -mod wallet; -mod wallet_accounts; -mod wallet_device_factor_sources; -mod wallet_profile_io; - -pub use home_cards::*; -pub use secure_storage::*; -pub use wallet::*; -pub use wallet_accounts::*; -pub use wallet_device_factor_sources::*; -pub use wallet_profile_io::*; diff --git a/src/wallet/secure_storage/always_fail_storage.rs b/src/wallet/secure_storage/always_fail_storage.rs deleted file mode 100644 index a8a0d5b1a..000000000 --- a/src/wallet/secure_storage/always_fail_storage.rs +++ /dev/null @@ -1,20 +0,0 @@ -#![cfg(test)] - -use crate::prelude::*; - -#[derive(Debug)] -pub(crate) struct AlwaysFailStorage {} - -impl SecureStorage for AlwaysFailStorage { - fn load_data(&self, _key: SecureStorageKey) -> Result>> { - panic!("AlwaysFailStorage does not implement `load_data"); - } - - fn save_data(&self, _key: SecureStorageKey, _data: Vec) -> Result<()> { - Err(CommonError::Unknown) - } - - fn delete_data_for_key(&self, _key: SecureStorageKey) -> Result<()> { - panic!("AlwaysFailStorage does not implement `delete_data_for_key"); - } -} diff --git a/src/wallet/secure_storage/mod.rs b/src/wallet/secure_storage/mod.rs deleted file mode 100644 index ec2aaff90..000000000 --- a/src/wallet/secure_storage/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -mod secure_storage; -mod secure_storage_key; -mod wallet_client_storage; - -pub use secure_storage::*; -pub use secure_storage_key::*; -pub use wallet_client_storage::*; - -#[cfg(test)] -mod ephemeral_secure_storage; - -#[cfg(test)] -pub use ephemeral_secure_storage::*; - -#[cfg(test)] -mod always_fail_storage; - -#[cfg(test)] -pub use always_fail_storage::*; diff --git a/src/wallet/secure_storage/secure_storage.rs b/src/wallet/secure_storage/secure_storage.rs deleted file mode 100644 index 983cc3fc9..000000000 --- a/src/wallet/secure_storage/secure_storage.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::prelude::*; - -#[uniffi::export(with_foreign)] -pub trait SecureStorage: Send + Sync + std::fmt::Debug { - fn load_data(&self, key: SecureStorageKey) -> Result>>; - fn save_data(&self, key: SecureStorageKey, data: Vec) -> Result<()>; - fn delete_data_for_key(&self, key: SecureStorageKey) -> Result<()>; -} diff --git a/src/wallet/secure_storage/wallet_client_storage.rs b/src/wallet/secure_storage/wallet_client_storage.rs deleted file mode 100644 index 1aa648154..000000000 --- a/src/wallet/secure_storage/wallet_client_storage.rs +++ /dev/null @@ -1,314 +0,0 @@ -use crate::prelude::*; - -/// An abstraction of an implementing WalletClients's secure storage, used by `Wallet` to -/// save and load models, most prominently `Profile` and `MnemonicWithPassphrase`. -/// -/// It uses the lower level CRUD trait `SecureStorage` which works on bytes (Vec), -/// by instead working with JSON. -/// -/// The typical usage is that `Wallet` uses this to build even higher level API's that work -/// with application level types such as `PrivateHierarchicalDeterministicFactorSource`, which -/// apart from `MnemonicWithPassphrase` read from SecureStorage using this `WalletClientStorage`, -/// also has to load the DeviceFactorSource from Profile, given a FactorSourceID only. -#[derive(Debug)] -pub struct WalletClientStorage { - /// Low level CRUD traits injected from implementing Wallet Client, that works on bytes. - interface: Arc, -} - -impl WalletClientStorage { - /// Creates a new WalletClientStorage using an implementation of - /// `SecureStorage`. - pub(crate) fn new(interface: Arc) -> Self { - Self { interface } - } -} - -//====== -// Save T -//====== -impl WalletClientStorage { - pub fn save(&self, key: SecureStorageKey, value: &T) -> Result<()> - where - T: serde::Serialize, - { - serde_json::to_vec(value) - .map_err(|_| CommonError::FailedToSerializeToJSON) - .and_then(|j| self.interface.save_data(key, j)) - } -} - -//====== -// Load T -//====== -impl WalletClientStorage { - /// Loads bytes from SecureStorage and deserializes them into `T`. - /// - /// Returns `Ok(None)` if no bytes were found, returns Err if failed - /// to load bytes or failed to deserialize the JSON into a `T`. - #[cfg(not(tarpaulin_include))] // false negative - pub fn load(&self, key: SecureStorageKey) -> Result> - where - T: for<'a> serde::Deserialize<'a>, - { - self.interface.load_data(key).and_then(|o| match o { - None => Ok(None), - Some(j) => serde_json::from_slice(j.as_slice()) - .map_failed_to_deserialize_bytes::(&j), - }) - } - - /// Loads bytes from SecureStorage and deserializes them into `T`. - /// - /// Returns Err if failed to load bytes or failed to deserialize the JSON into a `T`, - /// unlike `load` this method returns an error if `None` bytes were found. - pub fn load_or( - &self, - key: SecureStorageKey, - err: CommonError, - ) -> Result - where - T: for<'a> serde::Deserialize<'a>, - { - self.load(key).and_then(|o| o.ok_or(err)) - } - - /// Loads bytes from SecureStorage and deserializes them into `T`. - /// - /// Returns Err if failed to load bytes or failed to deserialize the JSON into a `T`, - /// unlike `load` this method returns `default` if `None` bytes were found. - pub fn load_unwrap_or(&self, key: SecureStorageKey, default: T) -> T - where - T: for<'a> serde::Deserialize<'a> + Clone, - { - self.load(key) - .map(|o| o.unwrap_or(default.clone())) - .unwrap_or(default) - } -} - -//====== -// Mnemonic CR(U)D -//====== -impl WalletClientStorage { - /// Saves a MnemonicWithPassphrase under a given `FactorSourceIDFromHash` - pub fn save_mnemonic_with_passphrase( - &self, - mnemonic_with_passphrase: &MnemonicWithPassphrase, - id: &FactorSourceIDFromHash, - ) -> Result<()> { - self.save( - SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: *id, - }, - mnemonic_with_passphrase, - ) - .map_err(|_| { - CommonError::UnableToSaveMnemonicToSecureStorage { bad_value: *id } - }) - } - - /// Loads a MnemonicWithPassphrase with a `FactorSourceIDFromHash` - pub fn load_mnemonic_with_passphrase( - &self, - id: &FactorSourceIDFromHash, - ) -> Result { - self.load_or( - SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: *id, - }, - CommonError::UnableToLoadMnemonicFromSecureStorage { - bad_value: *id, - }, - ) - } - - /// Deletes a MnemonicWithPassphrase with a `FactorSourceIDFromHash` - pub fn delete_mnemonic(&self, id: &FactorSourceIDFromHash) -> Result<()> { - self.interface.delete_data_for_key( - SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: *id, - }, - ) - } -} - -#[cfg(test)] -impl WalletClientStorage { - pub(crate) fn ephemeral( - ) -> (WalletClientStorage, Arc) { - let storage = EphemeralSecureStorage::new(); - (WalletClientStorage::new(storage.clone()), storage) - } - - pub(crate) fn always_fail() -> Self { - WalletClientStorage::new(Arc::new(AlwaysFailStorage {})) - } -} - -#[cfg(test)] -mod tests { - use ::hex::FromHex; - - use crate::{prelude::*, wallet::secure_storage::ephemeral_secure_storage}; - use std::{fmt::Write, sync::RwLock}; - - fn make_sut() -> WalletClientStorage { - WalletClientStorage::ephemeral().0 - } - - #[test] - fn load_ok_when_none() { - let sut = make_sut(); - assert_eq!( - sut.load::(SecureStorageKey::ActiveProfileID), - Ok(None) - ); - } - - #[test] - fn load_fail_to_deserialize_json() { - let sut = make_sut(); - - assert!(sut - .save( - SecureStorageKey::ActiveProfileID, - &0u8, // obviously a u8 is not a Profile - ) - .is_ok()); - assert_eq!( - sut.load::(SecureStorageKey::ActiveProfileID), - Err(CommonError::FailedToDeserializeJSONToValue { - json_byte_count: 1, - type_name: "Profile".to_string(), - serde_message: "invalid type: integer `0`, expected struct Profile at line 1 column 1".to_string() - }) - ); - } - - #[test] - fn load_successful() { - let sut = make_sut(); - - assert!(sut - .save(SecureStorageKey::ActiveProfileID, &Profile::sample()) - .is_ok()); - assert_eq!( - sut.load::(SecureStorageKey::ActiveProfileID), - Ok(Some(Profile::sample())) - ); - } - - #[test] - fn load_unwrap_or_some_default_not_used() { - let sut = make_sut(); - - assert!(sut - .save(SecureStorageKey::ActiveProfileID, &Profile::sample()) - .is_ok()); - assert_eq!( - sut.load_unwrap_or::( - SecureStorageKey::ActiveProfileID, - Profile::sample_other() - ), - Profile::sample() - ); - } - - #[test] - fn load_unwrap_or_none_default_is_used() { - let sut = make_sut(); - - assert_eq!( - sut.load_unwrap_or::( - SecureStorageKey::ActiveProfileID, - Profile::sample_other() - ), - Profile::sample_other() - ); - } - - #[test] - fn save_mnemonic_with_passphrase() { - let private = - PrivateHierarchicalDeterministicFactorSource::sample_other(); - let factor_source_id = private.factor_source.id; - let (sut, storage) = WalletClientStorage::ephemeral(); - let key = - SecureStorageKey::DeviceFactorSourceMnemonic { factor_source_id }; - assert_eq!(storage.load_data(key.clone()), Ok(None)); // not yet saved - assert!(sut - .save_mnemonic_with_passphrase( - &private.mnemonic_with_passphrase, - &factor_source_id.clone() - ) - .is_ok()); - - // Assert indeed was saved. - assert!(storage - .load_data(key) - .map(|b| String::from_utf8(b.unwrap()).unwrap()) - .unwrap() - .contains("zoo")); - } - - #[test] - fn save_mnemonic_with_passphrase_failure() { - let sut = WalletClientStorage::always_fail(); - let id = FactorSourceIDFromHash::sample(); - assert_eq!( - sut.save_mnemonic_with_passphrase( - &MnemonicWithPassphrase::sample(), - &id - ), - Err(CommonError::UnableToSaveMnemonicToSecureStorage { - bad_value: id - }) - ); - } - - #[test] - fn delete_mnemonic() { - // ARRANGE - let private = - PrivateHierarchicalDeterministicFactorSource::sample_other(); - let factor_source_id = private.factor_source.id; - let (sut, storage) = WalletClientStorage::ephemeral(); - let key = - SecureStorageKey::DeviceFactorSourceMnemonic { factor_source_id }; - assert!(storage.save_data(key.clone(), vec![0xde, 0xad]).is_ok()); - assert_eq!(storage.load_data(key.clone()), Ok(Some(vec![0xde, 0xad]))); // assert save worked - - // ACT - assert!(sut.delete_mnemonic(&factor_source_id).is_ok()); - - // ASSERT - assert_eq!(storage.load_data(key), Ok(None)); - } - - #[test] - fn save_fail_to_serialize() { - use serde::Serialize; - struct AlwaysFailSerialize {} - impl Serialize for AlwaysFailSerialize { - fn serialize( - &self, - _serializer: S, - ) -> core::result::Result - where - S: Serializer, - { - Err(serde::ser::Error::custom(CommonError::Unknown)) - } - } - - let (sut, _) = WalletClientStorage::ephemeral(); - assert_eq!( - sut.save( - SecureStorageKey::ActiveProfileID, - &AlwaysFailSerialize {} - ), - Err(CommonError::FailedToSerializeToJSON) - ); - } -} diff --git a/src/wallet/wallet.rs b/src/wallet/wallet.rs deleted file mode 100644 index 7c3135230..000000000 --- a/src/wallet/wallet.rs +++ /dev/null @@ -1,374 +0,0 @@ -use crate::prelude::*; -use std::sync::{Once, RwLock, RwLockReadGuard, RwLockWriteGuard}; - -pub type HeadersList = IdentifiedVecOf
; - -#[derive(Debug, uniffi::Object)] -pub struct Wallet { - // This is pub(crate) for testing purposes only, i.e. causing the RwLock to be poisoned. - pub(crate) profile: RwLock, - pub(crate) wallet_client_storage: WalletClientStorage, -} - -impl Wallet { - /// Initializes logging - fn init_logging() { - static ONCE: Once = Once::new(); - ONCE.call_once(|| { - pretty_env_logger::formatted_builder() - .filter_level(log::LevelFilter::Trace) - .try_init() - .expect("Should be able to setup a logger."); - }); - } - - fn with_imported_profile( - profile: Profile, - secure_storage: Arc, - ) -> Self { - // Init WalletClient's storage - let wallet_client_storage = WalletClientStorage::new(secure_storage); - - // Init wallet - let wallet = Self { - profile: RwLock::new(profile.clone()), - wallet_client_storage, - }; - - // Save new profile (also sets activeProfileID) - wallet.save_new_profile_or_panic(&profile); - - wallet - } - - fn new_load_profile_with_id( - profile_id: ProfileID, - wallet_client_storage: WalletClientStorage, - ) -> Result { - // Form storage key - let profile_key = SecureStorageKey::ProfileSnapshot { profile_id }; - - // Load Profile from storage with key - let profile: Profile = wallet_client_storage.load_or( - profile_key, - CommonError::ProfileSnapshotNotFound { - bad_value: profile_id, - }, - )?; - - // Create wallet - let wallet = Self { - profile: RwLock::new(profile), - wallet_client_storage, - }; - - // Set active profile ID - wallet.save_active_profile_id_or_panic(&profile_id); - - Ok(wallet) - } -} - -//======== -// CONSTRUCTOR -//======== -#[uniffi::export] -impl Wallet { - /// Creates a new Mnemonic from `entropy` (without BIP39 passphrase) and creates a new Profile, - /// saving both the Mnemonic and Profile into secure storage and returns a new Wallet. - #[uniffi::constructor] - pub fn by_creating_new_profile_and_secrets_with_entropy( - entropy: NonEmptyMax32Bytes, // yes would be more correct to pass `BIP39Entropy` here, but I wanna avoid UniFFI exporting it. - wallet_client_model: WalletClientModel, - wallet_client_name: String, - secure_storage: Arc, - ) -> Result { - Wallet::init_logging(); - - log::info!("Instantiating Wallet by creating a new Profile from entropy (provided), for client: {}", wallet_client_model); - let entropy = BIP39Entropy::try_from(entropy)?; - - let private_hd_factor_source = - PrivateHierarchicalDeterministicFactorSource::new_babylon_with_entropy( - true, - entropy, - BIP39Passphrase::default(), - wallet_client_model, - ); - - let profile = Profile::new( - private_hd_factor_source.factor_source.clone(), - wallet_client_name.as_str(), - ); - - let wallet = Self::with_imported_profile(profile, secure_storage); - - wallet.wallet_client_storage.save( - SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: private_hd_factor_source.factor_source.id, - }, - &private_hd_factor_source.mnemonic_with_passphrase, - )?; - - Ok(wallet) - } - - /// Creates wallet by *importing* a Profile. - #[uniffi::constructor] - pub fn by_importing_profile( - profile: Profile, - secure_storage: Arc, - ) -> Self { - Wallet::init_logging(); - - log::info!( - "Instantiating Wallet by importing a Profile with ID: {}", - profile.id() - ); - - Self::with_imported_profile(profile, secure_storage) - } - - #[uniffi::constructor] - pub fn by_loading_profile( - secure_storage: Arc, - ) -> Result { - Wallet::init_logging(); - - log::info!( - "Instantiating Wallet by loading the active Profile from storage" - ); - - // Init WalletClient's storage - let wallet_client_storage = WalletClientStorage::new(secure_storage); - - // Load active profile ID - let active_profile_id: ProfileID = wallet_client_storage.load_or( - SecureStorageKey::ActiveProfileID, - CommonError::NoActiveProfileIDSet, - )?; - - Self::new_load_profile_with_id(active_profile_id, wallet_client_storage) - } - - #[uniffi::constructor] - pub fn by_loading_profile_with_id( - profile_id: ProfileID, - secure_storage: Arc, - ) -> Result { - Wallet::init_logging(); - - log::info!( - "Instantiating Wallet by loading the Profile with ID {} from storage", - profile_id - ); - - Self::new_load_profile_with_id( - profile_id, - WalletClientStorage::new(secure_storage), - ) - } -} - -#[cfg(test)] -impl Wallet { - pub(crate) fn ephemeral( - profile: Profile, - ) -> (Self, Arc) { - let storage = EphemeralSecureStorage::new(); - ( - Self::by_importing_profile(profile, storage.clone()), - storage, - ) - } -} -#[cfg(test)] -impl HasSampleValues for Wallet { - fn sample() -> Self { - Self::ephemeral(Profile::sample()).0 - } - - fn sample_other() -> Self { - Self::ephemeral(Profile::sample_other()).0 - } -} - -//======== -// GET -//======== -#[uniffi::export] -impl Wallet { - /// Takes a snapshot of the profile and serialize it as a String of JSON. - pub fn json_snapshot(&self) -> String { - serde_json::to_string(&self.profile()) - .expect("Should always be able to JSON serialize a Profile.") - } - - /// Clone the profile and return it. - pub fn profile(&self) -> Profile { - self.access_profile_with(|p| p.clone()) - } -} - -impl Wallet { - pub(crate) fn access_profile_with(&self, access: F) -> T - where - F: Fn(RwLockReadGuard<'_, Profile>) -> T, - { - self.profile - .try_read() - .map(access) - .expect("Implementing Wallet clients should not read and write Profile from Wallet from multiple threads.") - } - - pub(crate) fn update_profile_with(&self, mutate: F) -> R - where - F: Fn(RwLockWriteGuard<'_, Profile>) -> R, - { - let value = self.profile - .try_write() - .map(mutate) - .expect("Implementing Wallet clients should not read and write Profile from Wallet from multiple threads."); - - self.save_existing_profile() - .expect("Failed to save Profile to secure storage."); - - value - } - - #[cfg(not(tarpaulin_include))] // false negative - pub(crate) fn try_update_profile_with(&self, mutate: F) -> Result - where - F: Fn(RwLockWriteGuard<'_, Profile>) -> Result, - { - let res = self - .profile - .try_write() - .map_err(|_| CommonError::UnableToAcquireWriteLockForProfile) - .and_then(mutate)?; - - self.save_existing_profile()?; - - Ok(res) - } -} - -#[cfg(test)] -mod tests { - - use crate::prelude::*; - #[test] - fn read_header() { - let wallet = Wallet::sample(); - wallet.access_profile_with(|p| { - assert_eq!(p.header, Profile::sample().header) - }) - } - - #[test] - fn take_snapshot() { - let wallet = Wallet::sample(); - assert_eq!(wallet.profile(), Profile::sample()) - } -} - -#[cfg(test)] -mod uniffi_tests { - use crate::prelude::*; - - #[test] - fn by_loading_profile_with_id() { - let profile = Profile::sample(); - let secure_storage = EphemeralSecureStorage::new(); - let data = serde_json::to_vec(&profile).unwrap(); - assert!(secure_storage - .save_data( - SecureStorageKey::ProfileSnapshot { - profile_id: profile.id(), - }, - data, - ) - .is_ok()); - assert_eq!( - secure_storage.load_data(SecureStorageKey::ActiveProfileID), - Ok(None) - ); // we dont have any ActiveID yet. - let wallet = Wallet::by_loading_profile_with_id( - profile.id(), - secure_storage.clone(), - ) - .unwrap(); - assert_eq!(wallet.profile(), profile); - - // Assert an ActiveProfileID has been saved. - assert_eq!( - secure_storage.load_data(SecureStorageKey::ActiveProfileID), - Ok(Some(serde_json::to_vec(&profile.id()).unwrap())) - ); - } - - #[test] - fn by_loading_profile() { - let profile = Profile::sample(); - let secure_storage = EphemeralSecureStorage::new(); - let active_profile_id_data = serde_json::to_vec(&profile.id()).unwrap(); - assert!(secure_storage - .save_data( - SecureStorageKey::ActiveProfileID, - active_profile_id_data - ) - .is_ok()); - let data = serde_json::to_vec(&profile).unwrap(); - assert!(secure_storage - .save_data( - SecureStorageKey::ProfileSnapshot { - profile_id: profile.id(), - }, - data, - ) - .is_ok()); - let wallet = Wallet::by_loading_profile(secure_storage).unwrap(); - assert_eq!(wallet.profile(), profile); - } - - #[test] - fn snapshot_json() { - let profile = Profile::sample(); - let secure_storage = EphemeralSecureStorage::new(); - let wallet = - Wallet::by_importing_profile(profile.clone(), secure_storage); - let expected_json = serde_json::to_string(&profile).unwrap(); - assert_eq!(wallet.json_snapshot(), expected_json); - } - - #[test] - fn by_creating_new_profile_and_secrets_with_entropy() { - let secure_storage = EphemeralSecureStorage::new(); - let wallet = Wallet::by_creating_new_profile_and_secrets_with_entropy( - Entropy32Bytes::new([0xff; 32]).into(), - WalletClientModel::Unknown, - "Test".to_string(), - secure_storage.clone(), - ) - .unwrap(); - let mnemonic_json = secure_storage - .load_data(SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: wallet.profile().bdfs().id, - }) - .unwrap() - .unwrap(); - let mwp = - serde_json::from_slice::(&mnemonic_json) - .unwrap(); - assert_eq!(mwp.mnemonic.phrase(), "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote"); - - let active_id_data = secure_storage - .load_data(SecureStorageKey::ActiveProfileID) - .unwrap() - .unwrap(); - - let active_id = - serde_json::from_slice::(&active_id_data).unwrap(); - assert_eq!(active_id, wallet.profile().id()); - } -} diff --git a/src/wallet/wallet_accounts.rs b/src/wallet/wallet_accounts.rs deleted file mode 100644 index c4a77abad..000000000 --- a/src/wallet/wallet_accounts.rs +++ /dev/null @@ -1,559 +0,0 @@ -use crate::prelude::*; - -impl Wallet { - /// Adds a device factor source to Profile and SecureStorage, this method will only - /// return `Ok` if both the mnemonic was successfully saved to SecureStorage and the - /// DeviceFactorSource present in Profile and Profile also successfully updated in - /// SecureStorage. - /// - /// Returns `Err` if it is already present in Profile. It is Wallet Client - /// dependent if it throws if already present in SecureStorage. - /// - /// If saving of `MnemonicWithPassphrase` to SecureStorage succeeds, but adding - /// `DeviceFactorSource` to Profile/saving of Profile to SecureStorage fails, then - /// this method will try to remove the newly saved `MnemonicWithPassphrase` from - /// `SecureStorage`. - /// - /// Takes ownership of `PrivateHierarchicalDeterministicFactorSource` - pub fn add_private_device_factor_source( - &self, - private_device_factor_source: PrivateHierarchicalDeterministicFactorSource, - ) -> Result<()> { - let id = private_device_factor_source.factor_source.id; - - info!( - "Save Private DeviceFactorSource to SecureStorage, factor source id: {}", - &id - ); - - self.wallet_client_storage.save_mnemonic_with_passphrase( - &private_device_factor_source.mnemonic_with_passphrase, - &id, - )?; - - self.add_factor_source(private_device_factor_source.factor_source.into()) - .map_err(|e| { - error!( - "Failed to add Private DeviceFactorSource to SecureStorage, factor source id: {}", - id - ); - _ = self.wallet_client_storage.delete_mnemonic(&id); - e - }) - } - - /// Adds `factor_source` to Profile and takes a snapshot of Profile and - /// updates it in SecureStorage. - /// - /// Returns `Err` if `factor_source` is already present in factor source, - /// or if saving to SecureStorage fails. - /// - /// If only saving to SecureStorage fails, the Profile still remains - /// edited. - pub fn add_factor_source(&self, factor_source: FactorSource) -> Result<()> { - self.try_update_profile_with(|mut p| { - trace!( - "About to add FactorSource: {}, to list of factor sources: {}", - &factor_source, - &p.factor_sources - ); - if p.factor_sources.append(factor_source.to_owned()).0 { - debug!("Added FactorSource: {}", &factor_source); - Ok(()) - } else { - error!( - "FactorSource not added, already present: {}", - &factor_source - ); - Err(CommonError::Unknown) - } - }) - .map_err(|_| CommonError::UnableToSaveFactorSourceToProfile { - bad_value: factor_source.factor_source_id(), - }) - } -} - -//======== -// SET - Account -//======== -#[uniffi::export] -impl Wallet { - /// Creates a new non securified account **WITHOUT** add it to Profile, using the *main* "Babylon" - /// `DeviceFactorSource` and the "next" index for this FactorSource as derivation path. - /// - /// If you want to add it to Profile, call `wallet.add_account(account)` - pub fn create_new_account( - &self, - network_id: NetworkID, - name: DisplayName, - ) -> Result { - let profile = &self.profile(); - let bdfs = profile.bdfs(); - - let index = profile - .next_derivation_index_for_entity(EntityKind::Account, network_id); - - let number_of_accounts_on_network = profile - .networks - .get_id(&network_id) - .map(|n| n.accounts.len()) - .unwrap_or(0); - - let appearance_id = AppearanceID::from_number_of_accounts_on_network( - number_of_accounts_on_network, - ); - - let factor_instance = - self.load_private_device_factor_source(&bdfs).map(|p| { - p.derive_entity_creation_factor_instance(network_id, index) - })?; - - let account = Account::new(factor_instance, name, appearance_id); - - Ok(account) - } - - /// Returns `Ok(())` if the `account` was new and successfully added. If saving failed or if the account was already present in Profile, an - /// error is returned. - pub fn add_account(&self, account: Account) -> Result<()> { - // TODO: clean this up, BAD code. messy, mostly because of (my) bad IdentifiedVec API. - let network_id = account.network_id; - let err_exists = CommonError::AccountAlreadyPresent { - bad_value: account.id(), - }; - self.try_update_profile_with(|mut p| { - let networks = &mut p.networks; - if networks.contains_id(&network_id) { - networks.try_try_update_with(&network_id, |network| { - if network.accounts.append(account.clone()).0 { - Ok(()) - } else { - Err(err_exists.clone()) - } - })?; - Ok(()) - } else { - let network = ProfileNetwork::new( - network_id, - Accounts::from_iter([account.to_owned()]), - Personas::default(), - AuthorizedDapps::default(), - ); - networks.append(network); - Ok(()) - } - }) - } - - /// Create a new Account and adds it to the active Profile. - pub fn create_and_save_new_account( - &self, - network_id: NetworkID, - name: DisplayName, - ) -> Result { - let account = self.create_new_account(network_id, name)?; - self.add_account(account.clone())?; - Ok(account) - } - - /// Updates `account` as a whole, if it exists, else an error is thrown. - pub fn update_account(&self, to: Account) -> Result { - self.update_profile_with(|mut p| { - p.update_account(&to.address, |a| *a = to.to_owned()) - }) - .ok_or(CommonError::UnknownAccount) - } - - /// Updates the display name of account with the provided address, throws an error if the account is unknown to the wallet. - pub fn change_name_of_account( - &self, - address: AccountAddress, - to: DisplayName, - ) -> Result { - self.update_profile_with(|mut p| { - p.update_account(&address, |a| a.display_name = to.to_owned()) - }) - .ok_or(CommonError::UnknownAccount) - } -} - -#[cfg(test)] -mod tests { - - use std::{ - borrow::{Borrow, BorrowMut}, - ops::Deref, - sync::atomic::AtomicBool, - }; - - use crate::prelude::*; - pub use pretty_assertions::{assert_eq, assert_ne}; - use std::sync::RwLock; - - #[test] - fn change_display_name_of_accounts() { - let profile = Profile::sample(); - let (wallet, _) = Wallet::ephemeral(profile.clone()); - let account = - wallet.access_profile_with(|p| p.networks[0].accounts[0].clone()); - assert_eq!(account.display_name.value, "Alice"); - assert!(wallet - .change_name_of_account( - account.address, - DisplayName::new("Stella").unwrap() - ) - .is_ok()); - wallet.access_profile_with(|p| { - assert_eq!(p.networks[0].accounts[0].display_name.value, "Stella") - }); - - assert_eq!( - wallet.change_name_of_account( - AccountAddress::sample_other(), - DisplayName::new("not used").unwrap() - ), - Err(CommonError::UnknownAccount) - ); - } - - #[test] - fn update_account() { - let profile = Profile::sample(); - let (wallet, _) = Wallet::ephemeral(profile.clone()); - let mut account = - wallet.access_profile_with(|p| p.networks[0].accounts[0].clone()); - assert_eq!(account.display_name.value, "Alice"); - account.display_name = DisplayName::new("Stella").unwrap(); - account.appearance_id = AppearanceID::new(7).unwrap(); - - // Assert that `Account` returned by method `update_account` is the updated one. - assert_eq!( - wallet.update_account(account).unwrap().display_name.value, - "Stella" - ); - - // Assert account has been updated in `wallet.profile` - wallet.access_profile_with(|p| { - let account = &p.networks[0].accounts[0]; - assert_eq!(account.display_name.value, "Stella"); - assert_eq!(account.appearance_id.value, 7); - }); - } - - #[test] - fn load_private_device_factor_source() { - let private = PrivateHierarchicalDeterministicFactorSource::sample(); - let dfs = private.factor_source; - let profile = Profile::sample(); - let (wallet, storage) = Wallet::ephemeral(profile.clone()); - let data = - serde_json::to_vec(&private.mnemonic_with_passphrase).unwrap(); - let key = SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: dfs.id, - }; - storage.save_data(key.clone(), data.clone()).unwrap(); - assert_eq!( - wallet - .load_private_device_factor_source(&dfs) - .unwrap() - .mnemonic_with_passphrase, - MnemonicWithPassphrase::sample() - ); - } - - #[test] - pub fn add_private_device_factor_source_successful() { - let profile = Profile::sample(); - let new = - PrivateHierarchicalDeterministicFactorSource::generate_new_babylon( - true, - WalletClientModel::Unknown, - ); - let (wallet, storage) = Wallet::ephemeral(profile.clone()); - assert_eq!( - profile - .factor_sources - .contains_id(&new.clone().factor_source.factor_source_id()), - false - ); - assert!(wallet.add_private_device_factor_source(new.clone()).is_ok()); - assert!(storage.storage.read().unwrap().contains_key( - &SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: new.clone().factor_source.id, - }, - )); - assert_eq!( - wallet - .profile() - .factor_sources - .contains_id(&new.clone().factor_source.factor_source_id()), - true - ); - } - - #[test] - pub fn add_private_device_factor_source_ok_storage_when_save_to_profile_fails_then_deleted_from_storage( - ) { - let profile = Profile::sample(); - let new = - PrivateHierarchicalDeterministicFactorSource::generate_new_babylon( - true, - WalletClientModel::Unknown, - ); - - assert_eq!( - profile - .factor_sources - .contains_id(&new.clone().factor_source.factor_source_id()), - false - ); - let delete_data_was_called = - Arc::new(RwLock::new(Option::::None)); - #[derive(Debug)] - struct TestStorage { - delete_data_was_called: Arc>>, - } - impl SecureStorage for TestStorage { - fn load_data( - &self, - _key: SecureStorageKey, - ) -> Result>> { - unreachable!() - } - - fn save_data( - &self, - _key: SecureStorageKey, - _data: Vec, - ) -> Result<()> { - Ok(()) // mnemonic gets saved - } - - fn delete_data_for_key(&self, key: SecureStorageKey) -> Result<()> { - let mut delete_data_was_called = - self.delete_data_was_called.write().unwrap(); - *delete_data_was_called = Some(key); - Ok(()) - } - } - let storage = Arc::new(TestStorage { - delete_data_was_called: delete_data_was_called.clone(), - }); - let wallet = Wallet::by_importing_profile(profile, storage.clone()); - - // Acquire write lock, in order to make `wallet.add_private_device_factor_source` fail (because cant have multiple writers). - let lock = wallet.profile.write().unwrap(); - - assert_eq!( - wallet.add_private_device_factor_source(new.clone()), - Err(CommonError::UnableToSaveFactorSourceToProfile { - bad_value: new.factor_source.factor_source_id() - }) - ); - drop(lock); - - assert_eq!( - wallet - .profile() - .factor_sources - .contains_id(&new.clone().factor_source.factor_source_id()), - false // should not have been saved. - ); - assert_eq!( - delete_data_was_called.read().unwrap().clone().unwrap(), - SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: new.clone().factor_source.id - } - ); - } - - #[test] - fn add_factor_source_fails_when_already_exists() { - let profile = Profile::sample(); - let other = PrivateHierarchicalDeterministicFactorSource::sample(); - let (wallet, _) = Wallet::ephemeral(profile.clone()); - assert_eq!( - wallet.add_factor_source(other.factor_source.clone().into()), - Err(CommonError::UnableToSaveFactorSourceToProfile { - bad_value: other.factor_source.factor_source_id() - }) - ) - } - - #[test] - fn load_private_device_factor_source_by_id() { - let profile = Profile::sample(); - let private = PrivateHierarchicalDeterministicFactorSource::sample(); - let (wallet, storage) = Wallet::ephemeral(profile.clone()); - - let data = - serde_json::to_vec(&private.mnemonic_with_passphrase).unwrap(); - let key = SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: private.clone().factor_source.id, - }; - assert!(storage.save_data(key.clone(), data).is_ok()); - - let loaded = wallet - .load_private_device_factor_source_by_id( - &private.factor_source.id.clone(), - ) - .unwrap(); - assert_eq!(loaded, private); - } - - #[test] - #[ignore] - fn generate_huge_profile_with_super_many_accounts() { - let private = PrivateHierarchicalDeterministicFactorSource::sample(); - - let (wallet, storage) = Wallet::ephemeral(Profile::new( - private.clone().factor_source, - "Test", - )); - - let data = - serde_json::to_vec(&private.mnemonic_with_passphrase).unwrap(); - let key = SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: private.clone().factor_source.id, - }; - assert!(storage.save_data(key.clone(), data).is_ok()); - - let network_id = NetworkID::Mainnet; - - let n = 100; - (0..n).for_each(|index| { - let account_name = - DisplayName::new(format!("Account {index}")).unwrap(); - let _ = wallet - .create_and_save_new_account(network_id, account_name.clone()) - .unwrap(); - }); - - let profile = wallet.profile(); - assert_eq!(profile.networks.first().unwrap().accounts.len(), n); - let profile_json = profile.to_json_bytes(); - - fs::write( - concat!(env!("FIXTURES_VECTOR"), "big_profile_100_accounts.json"), - profile_json, - ) - .expect("Unable to write file"); - } - - // Profile `init_profile`'s BDFS MUST eq `PrivateHierarchicalDeterministicFactorSource::sample()` - fn test_new_account( - init_profile: Profile, - also_save: bool, - assert_before: F, - assert_after: G, - ) where - F: Fn(Profile), - G: Fn(Account, Profile), - { - let private = PrivateHierarchicalDeterministicFactorSource::sample(); - assert_eq!( - init_profile.bdfs().factor_source_id(), - private.clone().factor_source.factor_source_id() - ); - - let (wallet, storage) = Wallet::ephemeral(init_profile); - assert_before(wallet.profile()); - - let data = - serde_json::to_vec(&private.mnemonic_with_passphrase).unwrap(); - let key = SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: private.clone().factor_source.id, - }; - assert!(storage.save_data(key.clone(), data).is_ok()); - - let account_name = DisplayName::new("Test").unwrap(); - let network_id = NetworkID::Mainnet; - let account = if also_save { - wallet.create_and_save_new_account(network_id, account_name.clone()) - } else { - wallet.create_new_account(network_id, account_name.clone()) - } - .unwrap(); - - assert_eq!(account.display_name, account_name); - assert_eq!(account.network_id, network_id); - - assert_after(account, wallet.profile()); - } - - fn test_create_new_account_first_success(also_save: bool, assert_last: F) - where - F: Fn(Account, Profile), - { - test_new_account( - Profile::new( - PrivateHierarchicalDeterministicFactorSource::sample() - .factor_source, - "Test", - ), - also_save, - |p| { - assert_eq!(p.networks.len(), 0); // no accounts yet, no networks even - }, - |a, q| { - assert_eq!( - a.address.address(), - "account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8" - ); - assert_eq!(a.appearance_id, AppearanceID::new(0).unwrap()); // using `0` since first. - - assert_last(a, q); - }, - ); - } - - #[test] - fn create_new_account_first_success() { - test_create_new_account_first_success(false, |_, q| { - assert_eq!(q.networks.len(), 0); - }); - - test_create_new_account_first_success(true, |a, q| { - assert_eq!(q.networks.len(), 1); - assert_eq!(q.networks[0].accounts[0], a); - }) - } - - fn test_create_new_account_not_first_success( - also_save: bool, - assert_last: F, - ) where - F: Fn(Account, Profile), - { - test_new_account( - Profile::sample(), - also_save, - |p| { - assert_eq!(p.networks[0].accounts.len(), 2); - }, - |a, q| { - assert_eq!( - a.address.address(), - "account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x" // pretty cool address! Random! - ); - assert_eq!(a.appearance_id, AppearanceID::new(2).unwrap()); - - assert_last(a, q); - }, - ); - } - - #[test] - fn create_new_account_not_first_success() { - test_create_new_account_not_first_success(false, |_, q| { - // Account SHOULD NOT yet have been saved into Profile, so number of accounts should still be 2 - assert_eq!(q.networks[0].accounts.len(), 2); - }); - - test_create_new_account_not_first_success(true, |a, q| { - assert_eq!(q.networks[0].accounts.len(), 3); - assert_eq!(q.networks[0].accounts[2], a); - }) - } -} diff --git a/src/wallet/wallet_device_factor_sources.rs b/src/wallet/wallet_device_factor_sources.rs deleted file mode 100644 index c7979aa04..000000000 --- a/src/wallet/wallet_device_factor_sources.rs +++ /dev/null @@ -1,126 +0,0 @@ -use crate::prelude::*; - -impl Wallet { - /// Tries to load a `MnemonicWithPassphrase` from secure storage - /// by `id` of type `FactorSourceIDFromHash`. - pub fn mnemonic_with_passphrase_of_device_factor_source_by_id( - &self, - id: &FactorSourceIDFromHash, - ) -> Result { - self.wallet_client_storage.load_mnemonic_with_passphrase(id) - } - - /// Loads a `MnemonicWithPassphrase` with the `id` of `device_factor_source`, - /// from SecureStorage, and returns a `PrivateHierarchicalDeterministicFactorSource` - /// built from both. - /// - /// Useful for when you will want to sign transactions or derive public keys for - /// creation of new entities. - /// - /// Returns `Err` if loading or decoding of `MnemonicWithPassphrase` from - /// SecureStorage fails. - pub fn load_private_device_factor_source( - &self, - device_factor_source: &DeviceFactorSource, - ) -> Result { - info!( - "Load Private DeviceFactorSource from SecureStorage, factor source id: {}", - &device_factor_source.id - ); - self.mnemonic_with_passphrase_of_device_factor_source_by_id( - &device_factor_source.id, - ) - .map(|mwp| { - PrivateHierarchicalDeterministicFactorSource::new( - mwp, - device_factor_source.clone(), - ) - }) - .log_info( - "Successfully loaded Private DeviceFactorSource from SecureStorage", - ) - } - - /// Loads a `MnemonicWithPassphrase` with the `id` of `device_factor_source`, - /// from SecureStorage, and returns a `PrivateHierarchicalDeterministicFactorSource` - /// built from both. - /// - /// Useful for when you will want to sign transactions or derive public keys for - /// creation of new entities. - /// - /// Returns `Err` if loading or decoding of `MnemonicWithPassphrase` from - /// SecureStorage fails. - pub fn load_private_device_factor_source_by_id( - &self, - id: &FactorSourceIDFromHash, - ) -> Result { - let device_factor_source = - self.profile().device_factor_source_by_id(id)?; - self.load_private_device_factor_source(&device_factor_source) - } -} - -#[uniffi::export] -impl Wallet { - /// Tries to load a `MnemonicWithPassphrase` from secure storage - /// by `factor_source_id`. - pub fn mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id( - &self, - factor_source_id: &FactorSourceID, - ) -> Result { - factor_source_id - .clone() - .into_hash() - .map_err(|_| CommonError::FactorSourceIDNotFromHash) - .and_then(|id| { - self.mnemonic_with_passphrase_of_device_factor_source_by_id(&id) - }) - } - - /// Tries to load the `MnemonicWithPassphrase` for the main "Babylon" - /// `DeviceFactorSource` from secure storage. - pub fn main_bdfs_mnemonic_with_passphrase( - &self, - ) -> Result { - let profile = &self.profile(); - let bdfs = profile.bdfs(); - self.mnemonic_with_passphrase_of_device_factor_source_by_id(&bdfs.id) - } -} - -#[cfg(test)] -mod tests { - use crate::prelude::*; - - #[test] - fn main_bdfs_mnemonic_with_passphrase() { - let private = PrivateHierarchicalDeterministicFactorSource::sample(); - let dfs = private.factor_source; - let profile = Profile::sample(); - let (wallet, storage) = Wallet::ephemeral(profile.clone()); - let data = - serde_json::to_vec(&private.mnemonic_with_passphrase).unwrap(); - let key = SecureStorageKey::DeviceFactorSourceMnemonic { - factor_source_id: dfs.id, - }; - storage.save_data(key.clone(), data.clone()).unwrap(); - assert_eq!( - wallet.main_bdfs_mnemonic_with_passphrase().unwrap(), - MnemonicWithPassphrase::sample() - ); - assert_eq!( - wallet.mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id(&dfs.factor_source_id()).unwrap(), - MnemonicWithPassphrase::sample() - ); - } - - #[test] - fn mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id_fail_not_factor_source_id_from_hash( - ) { - let (wallet, _) = Wallet::ephemeral(Profile::sample()); - assert_eq!( - wallet.mnemonic_with_passphrase_of_device_factor_source_by_factor_source_id(&FactorSourceIDFromAddress::sample().into()), - Err(CommonError::FactorSourceIDNotFromHash) - ); - } -} diff --git a/src/wallet/wallet_profile_io.rs b/src/wallet/wallet_profile_io.rs deleted file mode 100644 index 0b9a188f7..000000000 --- a/src/wallet/wallet_profile_io.rs +++ /dev/null @@ -1,202 +0,0 @@ -use crate::prelude::*; - -//======== -// Wallet + SecureStorage -//======== -impl Wallet { - pub(crate) fn save_profile(&self, profile: &Profile) -> Result<()> { - self.wallet_client_storage.save( - SecureStorageKey::ProfileSnapshot { - profile_id: profile.header.id, - }, - profile, - ) - } - pub(crate) fn save_active_profile_id( - &self, - profile_id: &ProfileID, - ) -> Result<()> { - self.wallet_client_storage - .save(SecureStorageKey::ActiveProfileID, profile_id) - } - pub(crate) fn save_active_profile_id_or_panic( - &self, - profile_id: &ProfileID, - ) { - match self.save_active_profile_id(profile_id) { - Ok(_) => log::info!( - "Successfully saved active ProfileID: {}", - profile_id - ), - Err(e) => fatal_error(format!( - "Failed to save active ProfileID: {}, error: {}", - profile_id, e - )), - } - } - - pub(crate) fn save_existing_profile(&self) -> Result<()> { - self.save_profile(&self.profile()) - } - - pub(crate) fn save_profile_or_panic(&self, profile: &Profile) -> bool { - match self.save_profile(profile) { - Ok(_) => { - log::info!( - "Successfully saved profile with ID: {}", - profile.id() - ); - true - } - Err(e) => { - fatal_error(format!( - "Failed to save profile with ID: {}, error: {}", - profile.id(), - e - )); - false - } - } - } - pub(crate) fn save_new_profile_or_panic(&self, profile: &Profile) { - if self.save_profile_or_panic(profile) { - self.save_active_profile_id_or_panic(&profile.id()); - } - } -} - -#[cfg(test)] -mod tests { - use crate::prelude::*; - - #[should_panic( - expected = "Fatal error: 'Failed to save active ProfileID: 12345678-bbbb-cccc-dddd-abcd12345678, error: Unknown Error'" - )] - #[test] - fn save_active_profile_id_or_panic_fail() { - #[derive(Debug)] - struct FailSaveActiveProfileIDStorage {} - - impl SecureStorage for FailSaveActiveProfileIDStorage { - fn load_data( - &self, - _key: SecureStorageKey, - ) -> Result>> { - unreachable!() - } - - fn save_data( - &self, - key: SecureStorageKey, - _data: Vec, - ) -> Result<()> { - match key { - SecureStorageKey::ActiveProfileID => { - Err(CommonError::Unknown) - } - _ => Ok(()), - } - } - - fn delete_data_for_key( - &self, - _key: SecureStorageKey, - ) -> Result<()> { - unreachable!() - } - } - let storage = Arc::new(FailSaveActiveProfileIDStorage {}); - - _ = Wallet::by_importing_profile(Profile::sample(), storage); - } - - #[should_panic( - expected = "Fatal error: 'Failed to save profile with ID: 12345678-bbbb-cccc-dddd-abcd12345678, error: Unknown Error'" - )] - #[test] - fn save_profile_or_panic_fail() { - #[derive(Debug)] - struct FailSaveProfileStorage {} - - impl SecureStorage for FailSaveProfileStorage { - fn load_data( - &self, - _key: SecureStorageKey, - ) -> Result>> { - unreachable!() - } - - fn save_data( - &self, - key: SecureStorageKey, - _data: Vec, - ) -> Result<()> { - match key { - SecureStorageKey::ProfileSnapshot { profile_id: _ } => { - Err(CommonError::Unknown) - } - _ => Ok(()), - } - } - - fn delete_data_for_key( - &self, - _key: SecureStorageKey, - ) -> Result<()> { - unreachable!() - } - } - let storage = Arc::new(FailSaveProfileStorage {}); - - _ = Wallet::by_importing_profile(Profile::sample(), storage); - } - - #[should_panic( - expected = "Fatal error: 'Failed to save active ProfileID: ffffffff-ffff-ffff-ffff-ffffffffffff, error: Unknown Error'" - )] - #[test] - fn new_load_profile_with_id_fail() { - #[derive(Debug)] - struct FailSaveActiveProfileIDStorage {} - - impl SecureStorage for FailSaveActiveProfileIDStorage { - fn load_data( - &self, - key: SecureStorageKey, - ) -> Result>> { - match key { - SecureStorageKey::ProfileSnapshot { profile_id: _ } => { - serde_json::to_vec(&Profile::sample()) - .map(Some) - .map_err(|_| CommonError::Unknown) - } - _ => panic!("FailSaveActiveProfileIDStorage does not implement `load_data` for {:?}", key), - } - } - - fn save_data( - &self, - key: SecureStorageKey, - _data: Vec, - ) -> Result<()> { - match key { - SecureStorageKey::ActiveProfileID => { - Err(CommonError::Unknown) - } - _ => Ok(()), - } - } - - fn delete_data_for_key( - &self, - _key: SecureStorageKey, - ) -> Result<()> { - panic!("FailSaveActiveProfileIDStorage does not implement `delete_data_for_key`"); - } - } - let storage = Arc::new(FailSaveActiveProfileIDStorage {}); - - _ = Wallet::by_loading_profile_with_id(ProfileID::sample(), storage) - .unwrap(); - } -} diff --git a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifest_assets_transfers.rs b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifest_assets_transfers.rs index fb22a4cf1..5165375a3 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifest_assets_transfers.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifest_assets_transfers.rs @@ -314,7 +314,7 @@ mod tests { Bucket("bucket1") ; CALL_METHOD - Address("account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x") + Address("account_rdx129akrrsd9ctuphe99lesa8cf6auc5vqwdd2lu0ej6csncnuw9eedgv") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() @@ -325,7 +325,7 @@ mod tests { Bucket("bucket2") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket2") Enum<0u8>() @@ -342,7 +342,7 @@ mod tests { Bucket("bucket3") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket3") Enum<0u8>() @@ -365,7 +365,7 @@ mod tests { Bucket("bucket4") ; CALL_METHOD - Address("account_rdx12xvg2sssh0rpca6e8xyqv5vf4nqu928083yzf0fdrnvjdz2pvc000x") + Address("account_rdx129akrrsd9ctuphe99lesa8cf6auc5vqwdd2lu0ej6csncnuw9eedgv") "try_deposit_or_abort" Bucket("bucket4") Enum<0u8>() @@ -378,7 +378,7 @@ mod tests { Bucket("bucket5") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket5") Enum<0u8>() @@ -399,7 +399,7 @@ mod tests { Bucket("bucket6") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket6") Enum<0u8>() diff --git a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifests_create_tokens.rs b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifests_create_tokens.rs index 9d8b2c6fc..7d7e1063b 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifests_create_tokens.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/manifests_create_tokens.rs @@ -182,7 +182,7 @@ impl TransactionManifest { let multiple_fungibles: MultipleFungibleTokens = serde_json::from_value(json).unwrap(); - info!("Generating multiple fungibles using bundled file, '\nDescription:\n'{}'", &multiple_fungibles.description); + debug!("Generating multiple fungibles using bundled file, '\nDescription:\n'{}'", &multiple_fungibles.description); let all_fungibles = multiple_fungibles.tokens; let max_count = all_fungibles.len(); let count = count.into().map(|c| c as usize).unwrap_or(max_count); @@ -423,8 +423,8 @@ mod tests { Enum<1u8>( Enum<136u8>( Array
( - Address("account_rdx1289zm062j788dwrjefqkfgfeea5tkkdnh8htqhdrzdvjkql49f4tn9"), - Address("account_rdx129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wynsddje") + Address("account_rdx128jx5fmru80v38a7hun8tdhajf2exef756c92tfg4atwl3y4j0785p"), + Address("account_rdx12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9l00qnqm") ) ) ), diff --git a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/modify_manifest.rs b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/modify_manifest.rs index 050492b9e..bfc945761 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/manifest_building/modify_manifest.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/manifest_building/modify_manifest.rs @@ -251,7 +251,7 @@ CALL_METHOD fn test_modify_manifest_lock_fee() { let instructions_string = r#" CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -262,7 +262,7 @@ TAKE_FROM_WORKTOP Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() @@ -288,7 +288,7 @@ CALL_METHOD Decimal("42") ; CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -299,7 +299,7 @@ CALL_METHOD Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() @@ -324,7 +324,7 @@ CALL_METHOD Decimal("25") ; CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -335,7 +335,7 @@ CALL_METHOD Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() @@ -360,7 +360,7 @@ CALL_METHOD .unwrap(), r#" CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -375,7 +375,7 @@ CALL_METHOD Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() @@ -437,7 +437,7 @@ CALL_METHOD .unwrap(), r#" CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -472,7 +472,7 @@ CALL_METHOD Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() diff --git a/src/wrapped_radix_engine_toolkit/high_level/ret_api.rs b/src/wrapped_radix_engine_toolkit/high_level/ret_api.rs index a332d3234..8a4a5c60c 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/ret_api.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/ret_api.rs @@ -203,7 +203,7 @@ mod tests { "free" ; CALL_METHOD - Address("account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr") + Address("account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp") "try_deposit_batch_or_abort" Expression("ENTIRE_WORKTOP") Enum<0u8>() @@ -220,7 +220,7 @@ mod tests { ), r#" SET_METADATA - Address("account_tdx_2_129663ef7fj8azge3y6sl73lf9vyqt53ewzlf7ul2l76mg5wyqlqlpr") + Address("account_tdx_2_12xvlee7xtg7dx599yv69tzkpeqzn4wr2nlnn3gpsm0zu0v9luqdpnp") "account_type" Enum<0u8>( "dapp definition" diff --git a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_fungible_transfer.rs b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_fungible_transfer.rs index a5d9d7be8..b2e9608e3 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_fungible_transfer.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_fungible_transfer.rs @@ -59,7 +59,7 @@ impl PerAssetFungibleTransfer { pub(crate) fn sample_mainnet_other() -> Self { Self::new(AccountOrAddressOf::AddressOfExternalAccount { - value: AccountAddress::from_str("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69").unwrap() + value: AccountAddress::from_str("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7").unwrap() }, true, Decimal192::from_str("987654.1234").unwrap()) diff --git a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_non_fungible_transfer.rs b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_non_fungible_transfer.rs index 98e6a7439..d152a10a4 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_non_fungible_transfer.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_asset/per_asset_non_fungible_transfer.rs @@ -56,7 +56,7 @@ impl PerAssetNonFungibleTransfer { pub(crate) fn sample_mainnet_other() -> Self { Self::new( AccountOrAddressOf::AddressOfExternalAccount { - value: AccountAddress::from_str("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69").unwrap() + value: AccountAddress::from_str("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7").unwrap() }, true, [NonFungibleLocalId::sample_other()] diff --git a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_recipient/per_recipient_asset_transfers.rs b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_recipient/per_recipient_asset_transfers.rs index 59c6d31dc..614ab0074 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_recipient/per_recipient_asset_transfers.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/assets_transfers/per_recipient/per_recipient_asset_transfers.rs @@ -76,7 +76,7 @@ impl HasSampleValues for PerRecipientAssetTransfers { ], ), PerRecipientAssetTransfer::new( - AccountAddress::from_str("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69").unwrap(), + AccountAddress::from_str("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7").unwrap(), [PerRecipientFungibleTransfer::new( ResourceAddress::sample_mainnet_xrd(), Decimal192::from_str("987654.1234").unwrap(), diff --git a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/build_information/sargon_build_information_uniffi_fn.rs b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/build_information/sargon_build_information_uniffi_fn.rs index 4aa9a272c..af73bb926 100644 --- a/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/build_information/sargon_build_information_uniffi_fn.rs +++ b/src/wrapped_radix_engine_toolkit/high_level/sargon_specific_types/build_information/sargon_build_information_uniffi_fn.rs @@ -12,25 +12,6 @@ pub fn new_sargon_build_information_sample_other() -> SargonBuildInformation { SargonBuildInformation::sample_other() } -#[uniffi::export] -pub fn enable_logging_from_rust() { - init_logging() -} - -/// Initializes logging -#[cfg(not(tarpaulin_include))] // actually tricky, since we init logging from other unit tests -> crash. -pub fn init_logging() { - static ONCE: Once = Once::new(); - ONCE.call_once(|| { - let level = log::LevelFilter::Trace; - pretty_env_logger::formatted_builder() - .filter_level(level) - .try_init() - .expect("Should be able to setup a logger."); - info!("Rust: Logger initialized, log level: {:?}", level); - }); -} - #[cfg(test)] mod tests { use super::*; diff --git a/src/wrapped_radix_engine_toolkit/low_level/notary_signature.rs b/src/wrapped_radix_engine_toolkit/low_level/notary_signature.rs index f7c99ef67..4234570af 100644 --- a/src/wrapped_radix_engine_toolkit/low_level/notary_signature.rs +++ b/src/wrapped_radix_engine_toolkit/low_level/notary_signature.rs @@ -99,18 +99,18 @@ mod tests { #[test] fn parse_ed25519() { assert_eq!( - "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse::().unwrap(), SUT::sample()); + "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse::().unwrap(), SUT::sample()); } #[test] fn parse_secp256k1() { assert_eq!( - "018ad795353658a0cd1b513c4414cbafd0f990d329522977f8885a27876976a7d41ed8a81c1ac34551819627689cf940c4e27cacab217f00a0a899123c021ff6ef".parse::().unwrap(), SUT::sample_other()); + "0001598e989470d125dafac276b95bb1ba21e2ee8e0beb0547599335f83b48a0a830cd6a956a54421039cef5fb7e492ebaa315f751a2dd5b74bd9cebbda997ec12".parse::().unwrap(), SUT::sample_other()); } #[test] fn from_scrypto_notary() { - let sig: radix_common::crypto::Ed25519Signature = "2150c2f6b6c496d197ae03afb23f6adf23b275c675394f23786250abd006d5a2c7543566403cb414f70d0e229b0a9b55b4c74f42fc38cdf1aba2307f97686f0b".parse().unwrap(); + let sig: radix_common::crypto::Ed25519Signature = "fc6a4a15516b886b10f26777094cb1abdccb213c9ebdea7a4bceb83b6fcba50fea181b0136ee5659c3dfae5f771e5b6e6f9abbaa3f0435df0be1f732be965103".parse().unwrap(); let scrypto_notary = ScryptoNotarySignature( radix_transactions::model::SignatureV1::Ed25519(sig), ); diff --git a/src/wrapped_radix_engine_toolkit/low_level/transaction_manifest/instructions/instructions.rs b/src/wrapped_radix_engine_toolkit/low_level/transaction_manifest/instructions/instructions.rs index 3d521e629..62fe72327 100644 --- a/src/wrapped_radix_engine_toolkit/low_level/transaction_manifest/instructions/instructions.rs +++ b/src/wrapped_radix_engine_toolkit/low_level/transaction_manifest/instructions/instructions.rs @@ -217,7 +217,7 @@ impl Instructions { Self::new( r#" CALL_METHOD - Address("account_rdx12yy8n09a0w907vrjyj4hws2yptrm3rdjv84l9sr24e3w7pk7nuxst8") + Address("account_rdx128dtethfy8ujrsfdztemyjk0kvhnah6dafr57frz85dcw2c8z0td87") "withdraw" Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxradxrd") Decimal("1337") @@ -228,7 +228,7 @@ impl Instructions { Bucket("bucket1") ; CALL_METHOD - Address("account_rdx129a9wuey40lducsf6yu232zmzk5kscpvnl6fv472r0ja39f3hced69") + Address("account_rdx12y02nen8zjrq0k0nku98shjq7n05kvl3j9m5d3a6cpduqwzgmenjq7") "try_deposit_or_abort" Bucket("bucket1") Enum<0u8>() diff --git a/tests/integration/main.rs b/tests/integration/main.rs index a25f8f3b6..786e7d2ba 100644 --- a/tests/integration/main.rs +++ b/tests/integration/main.rs @@ -1,5 +1,3 @@ -mod network_antenna_reqwest; - #[cfg(test)] mod integration_tests { @@ -10,10 +8,14 @@ mod integration_tests { use std::collections::HashMap; use url::Url; - use crate::network_antenna_reqwest::new_gateway_client; - const MAX: Duration = Duration::from_secs(5); + #[cfg(test)] + pub fn new_gateway_client(network_id: NetworkID) -> GatewayClient { + let driver = RustNetworkingDriver::new(); + GatewayClient::new(driver, network_id) + } + #[actix_rt::test] async fn test_xrd_balance_of_account_or_zero() { let gateway_client = new_gateway_client(NetworkID::Mainnet); diff --git a/tests/vectors/main.rs b/tests/vectors/main.rs index 90e9efa11..078d6fbfd 100644 --- a/tests/vectors/main.rs +++ b/tests/vectors/main.rs @@ -687,6 +687,7 @@ mod dapp_to_wallet_interaction_tests { #[cfg(test)] mod wallet_to_dapp_interaction_tests { + use super::*; use serde_json::Value; @@ -710,14 +711,14 @@ mod wallet_to_dapp_interaction_tests { AccountAddress::from_str("account_tdx_2_129qeystv8tufmkmjrry2g6kadhhfh4f7rd0x3t9yagcvfhspt62paz") .unwrap(), DisplayName::sample(), - AppearanceID::gradient0(), + AppearanceID::new(0).unwrap(), ); let account_2 = WalletInteractionWalletAccount::new( AccountAddress::from_str("account_tdx_2_128928hvf6pjr3rx2xvdw6ulf7pc8g88ya8ma3j8dtjmntckz09fr3n") .unwrap(), DisplayName::sample_other(), - AppearanceID::gradient1(), + AppearanceID::new(1).unwrap(), ); let authorized_request_response_items = WalletToDappInteractionResponseItems::AuthorizedRequest(