diff --git a/profile/Cargo.toml b/profile/Cargo.toml index ad14a1a8..d97c89a9 100644 --- a/profile/Cargo.toml +++ b/profile/Cargo.toml @@ -11,6 +11,7 @@ serde = { version = "1.0.193", features = ["derive"] } serde_json = { version = "1.0.108", features = ["preserve_order"] } serde_with = { version = "3.0.0", features = ["hex"] } +iso8601-timestamp = { version = "0.2.13", features = ["serde"] } serde_repr = "0.1.17" strum = { version = "0.25.0", features = ["derive"] } hierarchical_deterministic = { path = "../hierarchical_deterministic" } diff --git a/profile/src/v100/entity/account/account.rs b/profile/src/v100/entity/account/account.rs index b30b5886..b344fa56 100644 --- a/profile/src/v100/entity/account/account.rs +++ b/profile/src/v100/entity/account/account.rs @@ -87,6 +87,7 @@ pub struct Account { /// An order set of `EntityFlag`s used to describe certain Off-ledger /// user state about Accounts or Personas, such as if an entity is /// marked as hidden or not. + #[serde(default)] flags: RefCell, /// The on ledger synced settings for this account, contains e.g. @@ -337,7 +338,7 @@ impl Account { #[cfg(test)] mod tests { - use std::collections::BTreeSet; + use std::{collections::BTreeSet, str::FromStr}; use radix_engine_common::prelude::HashSet; use wallet_kit_common::json::assert_eq_after_json_roundtrip; @@ -709,6 +710,75 @@ mod tests { ); } + #[test] + fn json_deserialization_works_without_flags_as_version_1_0_0_of_app() { + let json = serde_json::Value::from_str( + r#" + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "02f669a43024d90fde69351ccc53022c2f86708d9b3c42693640733c5778235da5" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "8bfacfe888d4e3819c6e9528a1c8f680a4ba73e466d7af4ee204591093006589" + }, + "discriminator": "fromHash" + } + }, + "entityIndex": 3 + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 3, + "displayName": "Olympia|Soft|0", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_169s2cfz044euhc4yjg4xe4pg55w97rq2c6jh50zsdcpuz5gk6cag6v" + } + "#, + ).unwrap(); + let account = serde_json::from_value::(json).unwrap(); + assert_eq!(account.display_name(), "Olympia|Soft|0"); // soundness + assert_eq!(account.flags().len(), 0); // assert Default value is empty flags. + } + #[test] fn hash() { assert_eq!( diff --git a/profile/src/v100/entity/display_name.rs b/profile/src/v100/entity/display_name.rs index ae15ff8e..423040b5 100644 --- a/profile/src/v100/entity/display_name.rs +++ b/profile/src/v100/entity/display_name.rs @@ -4,7 +4,7 @@ use wallet_kit_common::error::common_error::CommonError as Error; #[nutype( sanitize(trim), - validate(not_empty, len_char_max = 20), + validate(not_empty, len_char_max = 30), derive( Serialize, Deserialize, @@ -53,6 +53,11 @@ mod tests { ); } + #[test] + fn max_is_ok() { + assert!(DisplayName::try_from("0|RDX|Dev Nano S|Some very lon").is_ok()); + } + #[test] fn valid_try_from() { assert_eq!( diff --git a/profile/src/v100/factors/factor_source_common.rs b/profile/src/v100/factors/factor_source_common.rs index d999d507..c491199d 100644 --- a/profile/src/v100/factors/factor_source_common.rs +++ b/profile/src/v100/factors/factor_source_common.rs @@ -5,6 +5,7 @@ use std::{ }; use chrono::NaiveDateTime; +use iso8601_timestamp::Timestamp; use serde::{Deserialize, Serialize}; use wallet_kit_common::utils::factory::now; @@ -28,7 +29,7 @@ pub struct FactorSourceCommon { crypto_parameters: RefCell, /// When this factor source for originally added by the user. - added_on: NaiveDateTime, + added_on: Timestamp, /// Date of last usage of this factor source /// @@ -38,7 +39,7 @@ pub struct FactorSourceCommon { /// /// Has interior mutability (`Cell`) since every time this /// factor source is used we should update this date. - last_used_on: RefCell, + last_used_on: RefCell, /// Flags which describe a certain state a FactorSource might be in, e.g. `Main` (BDFS). /// @@ -54,7 +55,7 @@ impl FactorSourceCommon { } /// When this factor source for originally added by the user. - pub fn added_on(&self) -> NaiveDateTime { + pub fn added_on(&self) -> Timestamp { self.added_on.clone() } @@ -64,7 +65,7 @@ impl FactorSourceCommon { /// since we will update it every time this FactorSource /// is used. /// - pub fn last_used_on(&self) -> NaiveDateTime { + pub fn last_used_on(&self) -> Timestamp { self.last_used_on.borrow().clone() } @@ -86,7 +87,7 @@ impl FactorSourceCommon { *self.crypto_parameters.borrow_mut() = new } - pub fn set_last_used_on(&self, new: NaiveDateTime) { + pub fn set_last_used_on(&self, new: Timestamp) { *self.last_used_on.borrow_mut() = new } @@ -98,8 +99,8 @@ impl FactorSourceCommon { impl FactorSourceCommon { pub fn with_values( crypto_parameters: FactorSourceCryptoParameters, - added_on: NaiveDateTime, - last_used_on: NaiveDateTime, + added_on: Timestamp, + last_used_on: Timestamp, flags: I, ) -> Self where @@ -117,7 +118,7 @@ impl FactorSourceCommon { where I: IntoIterator, { - let date: NaiveDateTime = now(); + let date = Timestamp::now_utc(); Self::with_values(crypto_parameters, date, date, flags) } @@ -149,8 +150,7 @@ impl FactorSourceCommon { /// A placeholder used to facilitate unit tests. pub fn placeholder_main_babylon() -> Self { - let date = - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + let date = Timestamp::parse("2023-09-11T16:05:56.000Z").unwrap(); FactorSourceCommon::with_values( FactorSourceCryptoParameters::babylon(), date.clone(), @@ -161,8 +161,7 @@ impl FactorSourceCommon { /// A placeholder used to facilitate unit tests. pub fn placeholder_olympia() -> Self { - let date = - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + let date = Timestamp::parse("2023-09-11T16:05:56.000Z").unwrap(); FactorSourceCommon::with_values( FactorSourceCryptoParameters::olympia(), date.clone(), @@ -178,6 +177,7 @@ mod tests { use std::collections::BTreeSet; use chrono::NaiveDateTime; + use iso8601_timestamp::Timestamp; use wallet_kit_common::{json::assert_eq_after_json_roundtrip, utils::factory::now}; use crate::v100::factors::{ @@ -197,14 +197,14 @@ mod tests { #[test] fn new_uses_now_as_date() { - let date0 = now(); + let date0 = Timestamp::now_utc(); let model = FactorSourceCommon::new(FactorSourceCryptoParameters::default(), []); - let mut date1 = now(); + let mut date1 = Timestamp::now_utc(); for _ in 0..10 { // rust is too fast... lol. - date1 = now(); + date1 = Timestamp::now_utc(); } - let do_test = |d: NaiveDateTime| { + let do_test = |d: Timestamp| { assert!(d > date0); assert!(d < date1); }; @@ -214,8 +214,7 @@ mod tests { #[test] fn json_roundtrip() { - let date = - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + let date = Timestamp::parse("2023-09-11T16:05:56.000Z").unwrap(); let model = FactorSourceCommon::with_values( FactorSourceCryptoParameters::default(), date.clone(), @@ -268,7 +267,7 @@ mod tests { #[test] fn set_last_used_on() { let sut = FactorSourceCommon::placeholder_main_babylon(); - let d = now(); + let d = Timestamp::now_utc(); assert_ne!(sut.last_used_on(), d); sut.set_last_used_on(d); assert_eq!(sut.last_used_on(), d); diff --git a/profile/src/v100/header/device_info.rs b/profile/src/v100/header/device_info.rs index b60791c1..e4a80132 100644 --- a/profile/src/v100/header/device_info.rs +++ b/profile/src/v100/header/device_info.rs @@ -1,13 +1,15 @@ use std::fmt::Display; use chrono::NaiveDateTime; +use derive_getters::Getters; +use iso8601_timestamp::Timestamp; use serde::{Deserialize, Serialize}; use uuid::Uuid; use wallet_kit_common::utils::factory::{date, id, now}; /// A short summary of a device the Profile is being used /// on, typically an iPhone or an Android phone. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash, Getters)] pub struct DeviceInfo { /// A best effort stable and unique identifier of this /// device. @@ -16,24 +18,24 @@ 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, + id: Uuid, /// The date this description of the device was made, might /// be equal to when the app was first ever launched on the /// device. - pub date: NaiveDateTime, + date: Timestamp, /// 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. /// /// E.g. "My Red Phone (iPhone SE 2nd Gen)" - pub description: String, + description: String, } impl DeviceInfo { /// Instantiates a new `DeviceInfo` with `id`, `date` and `description`. - pub fn with_values(id: Uuid, date: NaiveDateTime, description: String) -> Self { + pub fn with_values(id: Uuid, date: Timestamp, description: String) -> Self { Self { id, date, @@ -44,7 +46,7 @@ impl DeviceInfo { /// 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: &str) -> Self { - Self::with_values(id(), now(), description.to_string()) + Self::with_values(id(), Timestamp::now_utc(), description.to_string()) } /// Instantiates a new `DeviceInfo` with "iPhone" as description, and @@ -72,7 +74,7 @@ impl Display for DeviceInfo { f, "{} | created: {} | #{}", self.description, - date(&self.date), + &self.date.to_string(), self.id.to_string(), ) } @@ -83,7 +85,7 @@ mod tests { use std::{collections::HashSet, str::FromStr}; use crate::v100::header::device_info::DeviceInfo; - use chrono::{Datelike, NaiveDateTime}; + use iso8601_timestamp::Timestamp; use uuid::Uuid; use wallet_kit_common::json::*; @@ -108,7 +110,7 @@ mod tests { let id = Uuid::from_str(id_str).unwrap(); let sut = DeviceInfo::with_values( id, - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(), + Timestamp::parse("2023-09-11T16:05:56Z").unwrap(), "Foo".to_string(), ); assert_eq!( @@ -133,11 +135,26 @@ mod tests { assert!(DeviceInfo::new_iphone().date.year() >= 2023); } + #[test] + fn can_parse_iso8601_json_without_milliseconds_precision() { + let str = r#" + { + "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", + "date": "2023-09-11T16:05:56Z", + "description": "iPhone" + } + "#; + let model = serde_json::from_str::(str).unwrap(); + assert_eq!(model.date().day(), 11); + let json = serde_json::to_string(&model).unwrap(); + assert!(json.contains("56.000Z")); // but when serialized, `.000` is included. + } + #[test] fn json_roundtrip() { let model = DeviceInfo::with_values( Uuid::from_str("66f07ca2-a9d9-49e5-8152-77aca3d1dd74").unwrap(), - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(), + Timestamp::parse("2023-09-11T16:05:56.000Z").unwrap(), "iPhone".to_string(), ); assert_eq_after_json_roundtrip( @@ -145,7 +162,7 @@ mod tests { r#" { "id": "66f07ca2-a9d9-49e5-8152-77aca3d1dd74", - "date": "2023-09-11T16:05:56", + "date": "2023-09-11T16:05:56.000Z", "description": "iPhone" } "#, @@ -156,7 +173,7 @@ mod tests { r#" { "id": "00000000-0000-0000-0000-000000000000", - "date": "1970-01-01T12:34:56", + "date": "1970-01-01T12:34:56.000Z", "description": "Nokia" } "#, @@ -169,7 +186,7 @@ mod tests { r#" { "id": "invalid-uuid", - "date": "1970-01-01T12:34:56", + "date": "1970-01-01T12:34:56.000Z", "description": "iPhone" } "#, @@ -189,7 +206,7 @@ mod tests { r#" { "missing_key": "id", - "date": "1970-01-01T12:34:56", + "date": "1970-01-01T12:34:56.000Z", "description": "iPhone" } "#, @@ -209,7 +226,7 @@ mod tests { r#" { "id": "00000000-0000-0000-0000-000000000000", - "date": "1970-01-01T12:34:56", + "date": "1970-01-01T12:34:56.000Z", "missing_key": "description" } "#, diff --git a/profile/src/v100/header/header.rs b/profile/src/v100/header/header.rs index 769c08a7..c4c80421 100644 --- a/profile/src/v100/header/header.rs +++ b/profile/src/v100/header/header.rs @@ -6,7 +6,7 @@ use std::{ #[cfg(any(test, feature = "placeholder"))] use std::str::FromStr; -use chrono::NaiveDateTime; +use iso8601_timestamp::Timestamp; use serde::{Deserialize, Serialize}; use uuid::Uuid; @@ -38,7 +38,7 @@ pub struct Header { last_used_on_device: RefCell, /// When the Profile was last modified. - last_modified: Cell, + last_modified: Cell, /// Hint about the contents of the profile, e.g. number of Accounts and Personas. content_hint: RefCell, // `RefCell` needed because `ContentHint` does not impl `Copy`, which it cant because it contains `Cell`s, and `Cell` itself does not impl `Copy`. @@ -51,7 +51,7 @@ impl Header { id: Uuid, creating_device: DeviceInfo, content_hint: ContentHint, - last_modified: NaiveDateTime, + last_modified: Timestamp, ) -> Self { Self { snapshot_version: ProfileSnapshotVersion::default(), @@ -66,7 +66,12 @@ impl Header { /// Instantiates a new `Header` with creating and last used on `DeviceInfo` with /// "Unknown device" as description, and empty content hint pub fn new(creating_device: DeviceInfo) -> Self { - Self::with_values(id(), creating_device, ContentHint::new(), now()) + Self::with_values( + id(), + creating_device, + ContentHint::new(), + Timestamp::now_utc(), + ) } } @@ -117,7 +122,7 @@ impl Header { } /// When the Profile was last modified. - pub fn last_modified(&self) -> NaiveDateTime { + pub fn last_modified(&self) -> Timestamp { self.last_modified.get().clone() } } @@ -126,7 +131,7 @@ impl Header { impl Header { /// Updates the `last_modified` field. pub fn updated(&self) { - self.last_modified.set(now()); + self.last_modified.set(Timestamp::now_utc()); } /// Sets the content hint WITHOUT updating `last_modified`, you SHOULD not @@ -152,8 +157,8 @@ impl Header { impl Header { /// A placeholder used to facilitate unit tests. pub fn placeholder() -> Self { - let date = - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + //let date = NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + let date = Timestamp::parse("2023-09-11T16:05:56Z").unwrap(); let device = DeviceInfo::with_values( Uuid::from_str("66f07ca2-a9d9-49e5-8152-77aca3d1dd74").unwrap(), date.clone(), @@ -178,6 +183,7 @@ pub mod tests { profilesnapshot_version::ProfileSnapshotVersion, }; use chrono::NaiveDateTime; + use iso8601_timestamp::Timestamp; use uuid::Uuid; use wallet_kit_common::{json::assert_eq_after_json_roundtrip, utils::factory::id}; @@ -244,7 +250,7 @@ pub mod tests { #[test] fn update_last_used_on_device() { let sut = Header::default(); - let d0: NaiveDateTime = sut.last_modified(); + let d0 = sut.last_modified(); let device_0 = sut.last_used_on_device(); let end = 10; for n in 1..end { @@ -264,8 +270,7 @@ pub mod tests { #[test] fn display() { - let date = - NaiveDateTime::parse_from_str("2023-09-11T16:05:56", "%Y-%m-%dT%H:%M:%S").unwrap(); + let date = Timestamp::parse("2023-09-11T16:05:56Z").unwrap(); let device = DeviceInfo::with_values( Uuid::from_str("66f07ca2-a9d9-49e5-8152-77aca3d1dd74").unwrap(), date.clone(), diff --git a/profile/tests/tests.rs b/profile/tests/tests.rs new file mode 100644 index 00000000..88c68ff6 --- /dev/null +++ b/profile/tests/tests.rs @@ -0,0 +1,60 @@ +use profile::v100::{header::profilesnapshot_version::ProfileSnapshotVersion, profile::Profile}; +use std::{ + env, + ffi::{OsStr, OsString}, + fs, + path::PathBuf, + str::FromStr, +}; +use thiserror::Error; + +fn crate_dir() -> PathBuf { + env::var("CARGO_MANIFEST_DIR").unwrap().try_into().unwrap() +} + +fn append_to_path(p: impl Into, s: impl AsRef) -> PathBuf { + let mut p = p.into(); + p.push(s); + p.into() +} + +#[derive(Debug, Error)] +pub enum TestingError { + #[error("Failed to open file at path '{0}'")] + FailedToOpenFile(PathBuf), + + #[error("File contents is not valid JSON '{0}'")] + FailedDoesNotContainValidJSON(String), + + #[error("Failed to JSON deserialize string")] + FailedToDeserialize(serde_json::Error), +} + +/// `name` is file name without extension, assuming it is json file +fn vector<'a, T>(name: impl AsRef) -> Result +where + T: for<'de> serde::Deserialize<'de>, +{ + let base = append_to_path(crate_dir(), "/tests/vectors/"); + let base_file_path = append_to_path(base, name); + let path = append_to_path(base_file_path, ".json"); + fs::read_to_string(path.clone()) + .map_err(|_| TestingError::FailedToOpenFile(path)) + .and_then(|j| { + serde_json::Value::from_str(j.as_str()) + .map_err(|_| TestingError::FailedDoesNotContainValidJSON(j)) + }) + .and_then(|v| { + serde_json::from_value::(v).map_err(|e| TestingError::FailedToDeserialize(e)) + }) +} + +#[test] +fn v100_100() { + let profile = vector::("only_plaintext_profile_snapshot_version_100") + .expect("V100 Profile to deserialize"); + assert_eq!( + profile.header().snapshot_version(), + ProfileSnapshotVersion::V100 + ); +} diff --git a/profile/tests/vectors/only_plaintext_profile_snapshot_version_100.json b/profile/tests/vectors/only_plaintext_profile_snapshot_version_100.json new file mode 100644 index 00000000..081459ba --- /dev/null +++ b/profile/tests/vectors/only_plaintext_profile_snapshot_version_100.json @@ -0,0 +1,1554 @@ +{ + "appPreferences": + { + "display": + { + "fiatCurrencyPriceTarget": "usd", + "isCurrencyAmountVisible": true + }, + "security": + { + "isCloudProfileSyncEnabled": true, + "structureConfigurationReferences": + [], + "isDeveloperModeEnabled": true + }, + "p2pLinks": + [ + { + "displayName": "Chrome", + "connectionPassword": "0a54ab49f7c1dac68666945f8cffa17c596e65daa551d739ef6529edcf39d34f" + } + ], + "gateways": + { + "current": "https://rcnet-v3.radixdlt.com/", + "saved": + [ + { + "network": + { + "name": "zabanet", + "id": 14, + "displayDescription": "RCnet-V3 test network" + }, + "url": "https://rcnet-v3.radixdlt.com/" + }, + { + "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" + } + ] + }, + "transaction": + { + "defaultDepositGuarantee": "0.975" + } + }, + "networks": + [ + { + "networkID": 14, + "personas": + [ + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "3c9f6a080e75c28e9210bf53fee777e3f943852790b2c016dc699e46d041477e" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/618H/1460H/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "flags": [], + "displayName": "Sajjon", + "personaData": + { + "postalAddresses": [], + "creditCards": [], + "emailAddresses": + [ + { + "id": "8D8AB282-AB20-4D07-8461-06A31553AF1C", + "value": "alex@cyon.com" + } + ], + "name": + { + "id": "D264960B-1E2B-4E40-AD50-D281B9DBB6D1", + "value": + { + "nickname": "Alex", + "familyName": "Alexander ", + "variant": "western", + "givenNames": "Cyon" + } + }, + "phoneNumbers": + [ + { + "id": "F30A2A14-E25F-4597-8A49-E74FEDB10F44", + "value": "0700838198" + } + ], + "urls": [] + }, + "address": "identity_tdx_e_122k9saakdjazzwm98rlpjlwewy0wvx0csmtvstdut528r0t0z8cy30" + } + ], + "accounts": + [ + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "3feb8194ead2e526fbcc4c1673a7a8b29d8cee0b32bb9393692f739821dd256b" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/525H/1460H/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "flags": ["deletedByUser"], + "networkID": 14, + "appearanceID": 0, + "displayName": "Zaba 0", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_128vkt2fur65p4hqhulfv3h0cknrppwtjsstlttkfamj4jnnpm82gsw" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "3c04690f4ad8890bfdf5a62bac2843b8ee79ab335c9bf4ed1e786ff676709413" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/525H/1460H/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 1, + "flags": ["deletedByUser"], + "displayName": "Zaba 1", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_129fj4fqmz2ldej5lg2hx9laty9s6464snr6ly0243p32jmd757yke7" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "fe6368cf2907d0da61a68c31e461213b8e56ba84f1cfbdb4d79311fce331b7ee" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/525H/1460H/2H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 2, + "flags": ["deletedByUser"], + "displayName": "Zaba 2", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_129enl4x6w6mz6nlh9y4hszx6zwfvv3q80keqdzqkewvltugp8g6g7v" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "02f669a43024d90fde69351ccc53022c2f86708d9b3c42693640733c5778235da5" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "8bfacfe888d4e3819c6e9528a1c8f680a4ba73e466d7af4ee204591093006589" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 3, + "flags": ["deletedByUser"], + "displayName": "Olympia|Soft|0", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_169s2cfz044euhc4yjg4xe4pg55w97rq2c6jh50zsdcpuz5gk6cag6v" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "023a41f437972033fa83c3c4df08dc7d68212ccac07396a29aca971ad5ba3c27c8" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "8bfacfe888d4e3819c6e9528a1c8f680a4ba73e466d7af4ee204591093006589" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 4, + "flags": ["deletedByUser"], + "displayName": "Olympia|Soft|1", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16x88ghu9hd3hz4c9gumqjafrcwqtzk67wmpds7xg6uaz0kf42v5hju" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "0233dc38ad9e8fca2653563199e793ee8d8a1a5071d1fc2996a6c51c9b86b36d8a" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "eda055ed256d156f62013da6cf5fb6104339b5c8666dd3f5512030950b1e3a29" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 5, + "flags": ["deletedByUser"], + "displayName": "S18 | Sajjon | 1", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16yszyl5pd54vdqm4wyazdgtr7j3d5cl33gew3mzy6r9443am5dlsr7" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "035e86fc1679aefcb186a3c758503aa146e2a4e730e84daf6fd735861ccd5d8978" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/3H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "eda055ed256d156f62013da6cf5fb6104339b5c8666dd3f5512030950b1e3a29" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 6, + "flags": ["deletedByUser"], + "displayName": "S18 | Sajjon | 3", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16ysdhjfehs8t80u4ew3w3f8yygkx7v3h3erptrzjacv86sn9l3feln" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "03f43fba6541031ef2195f5ba96677354d28147e45b40cde4662bec9162c361f55" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "41ac202687326a4fc6cb677e9fd92d08b91ce46c669950d58790d4d5e583adc0" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 7, + "flags": ["deletedByUser"], + "displayName": "0|RDX|Dev Nano S|Some very lon", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16x5wz8wmkumuhn49klq0zwgjn9d8xs7n95maxam04vawld2drf2dkj" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "0206ea8842365421f48ab84e6b1b197010e5a43a527952b11bc6efe772965e97cc" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "41ac202687326a4fc6cb677e9fd92d08b91ce46c669950d58790d4d5e583adc0" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 8, + "flags": ["deletedByUser"], + "displayName": "1|RDX|Dev Nano S|Forbidden ___", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16y6q3q6ey64j5qvkex3q0yshtln6z2lmyk254xrjcq393rc070x66z" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "0220e2ef980a86888800573b0f5a30492549c88c1808821475c828aeccdca4cc5a" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "9e2e0a2b4b96e8729f5553ffa8865eaac10088569ef8bcd7b3fa61b89fde1764" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 9, + "flags": ["deletedByUser"], + "displayName": "Shadow 25 | 0", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_16yyhtwlwrtpdqe2jufg2xw2289j4dtnk542dm69m7h89l4x5xm60k7" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "secp256k1", + "compressedData": "034a8a2ee1801d91cf8c9157d8694ae0d8d2c9563021a9764a34580493f75d0c75" + }, + "derivationPath": + { + "scheme": "bip44Olympia", + "path": "m/44H/1022H/0H/0/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "9e2e0a2b4b96e8729f5553ffa8865eaac10088569ef8bcd7b3fa61b89fde1764" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 10, + "flags": ["deletedByUser"], + "displayName": "Shadow 25 | 1", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_169cdlneks2wrrmg82cc36xqtx2ng8qjtkpe0j3sfzddl0xje47janr" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "d24228459e0000d91b7256cac6fd8f9b0cb30dfef209db201912fb0b8d710edb" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/525H/1460H/11H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "41ac202687326a4fc6cb677e9fd92d08b91ce46c669950d58790d4d5e583adc0" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 11, + "flags": ["deletedByUser"], + "displayName": "Babylon Ledger 24", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_12yavnpctf6l2dw76tazge90kkufzks45vq6u28vvarse6cyra5stuv" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "7d918320fdd9d4102f2392aec4a6c43e959645cb525b4bd407cbc9c5bac00495" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/14H/525H/1460H/12H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "ledgerHQHardwareWallet", + "body": "9e2e0a2b4b96e8729f5553ffa8865eaac10088569ef8bcd7b3fa61b89fde1764" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 14, + "appearanceID": 0, + "flags": [], + "displayName": "Babylon ledger 25", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_e_128duqx53e4e6hpz4vxkm9qskpqgu8un0p49gm2t8lfcsfxl9vej4eg" + } + ], + "authorizedDapps": + [ + { + "networkID": 14, + "dAppDefinitionAddress": "account_tdx_e_128uml7z6mqqqtm035t83alawc3jkvap9sxavecs35ud3ct20jxxuhl", + "displayName": "Gumball Club", + "referencesToAuthorizedPersonas": + [ + { + "sharedAccounts": + { + "request": + { + "quantifier": "atLeast", + "quantity": 1 + }, + "ids": + [ + "account_tdx_e_128vkt2fur65p4hqhulfv3h0cknrppwtjsstlttkfamj4jnnpm82gsw", + "account_tdx_e_129fj4fqmz2ldej5lg2hx9laty9s6464snr6ly0243p32jmd757yke7", + "account_tdx_e_129enl4x6w6mz6nlh9y4hszx6zwfvv3q80keqdzqkewvltugp8g6g7v", + "account_tdx_e_169s2cfz044euhc4yjg4xe4pg55w97rq2c6jh50zsdcpuz5gk6cag6v", + "account_tdx_e_16x88ghu9hd3hz4c9gumqjafrcwqtzk67wmpds7xg6uaz0kf42v5hju", + "account_tdx_e_16yszyl5pd54vdqm4wyazdgtr7j3d5cl33gew3mzy6r9443am5dlsr7", + "account_tdx_e_16ysdhjfehs8t80u4ew3w3f8yygkx7v3h3erptrzjacv86sn9l3feln", + "account_tdx_e_16x5wz8wmkumuhn49klq0zwgjn9d8xs7n95maxam04vawld2drf2dkj", + "account_tdx_e_16y6q3q6ey64j5qvkex3q0yshtln6z2lmyk254xrjcq393rc070x66z", + "account_tdx_e_16yyhtwlwrtpdqe2jufg2xw2289j4dtnk542dm69m7h89l4x5xm60k7", + "account_tdx_e_169cdlneks2wrrmg82cc36xqtx2ng8qjtkpe0j3sfzddl0xje47janr", + "account_tdx_e_12yavnpctf6l2dw76tazge90kkufzks45vq6u28vvarse6cyra5stuv", + "account_tdx_e_128duqx53e4e6hpz4vxkm9qskpqgu8un0p49gm2t8lfcsfxl9vej4eg" + ] + }, + "identityAddress": "identity_tdx_e_122k9saakdjazzwm98rlpjlwewy0wvx0csmtvstdut528r0t0z8cy30", + "sharedPersonaData": + {}, + "lastLogin": "2023-09-13T07:24:41Z" + } + ] + }, + { + "networkID": 14, + "dAppDefinitionAddress": "account_tdx_e_168ydk240yx69yl7zdz2mzkdjc3r5p6n4gwypqsype2d6d942m5z2ns", + "displayName": "Radix Sandbox dApp", + "referencesToAuthorizedPersonas": + [ + { + "sharedAccounts": + { + "request": + { + "quantifier": "exactly", + "quantity": 5 + }, + "ids": + [ + "account_tdx_e_16y6q3q6ey64j5qvkex3q0yshtln6z2lmyk254xrjcq393rc070x66z", + "account_tdx_e_12yavnpctf6l2dw76tazge90kkufzks45vq6u28vvarse6cyra5stuv", + "account_tdx_e_128duqx53e4e6hpz4vxkm9qskpqgu8un0p49gm2t8lfcsfxl9vej4eg", + "account_tdx_e_128vkt2fur65p4hqhulfv3h0cknrppwtjsstlttkfamj4jnnpm82gsw", + "account_tdx_e_16yyhtwlwrtpdqe2jufg2xw2289j4dtnk542dm69m7h89l4x5xm60k7" + ] + }, + "identityAddress": "identity_tdx_e_122k9saakdjazzwm98rlpjlwewy0wvx0csmtvstdut528r0t0z8cy30", + "sharedPersonaData": + { + "name": "D264960B-1E2B-4E40-AD50-D281B9DBB6D1" + }, + "lastLogin": "2023-09-11T17:55:07Z" + } + ] + }, + { + "networkID": 14, + "dAppDefinitionAddress": "account_tdx_e_16xygyhqp3x3awxlz3c5dzrm7jqghgpgs776v4af0yfr7xljqmna3ha", + "displayName": "Radix Dashboard", + "referencesToAuthorizedPersonas": + [ + { + "sharedAccounts": + { + "request": + { + "quantifier": "atLeast", + "quantity": 1 + }, + "ids": + [ + "account_tdx_e_128vkt2fur65p4hqhulfv3h0cknrppwtjsstlttkfamj4jnnpm82gsw", + "account_tdx_e_129fj4fqmz2ldej5lg2hx9laty9s6464snr6ly0243p32jmd757yke7", + "account_tdx_e_129enl4x6w6mz6nlh9y4hszx6zwfvv3q80keqdzqkewvltugp8g6g7v", + "account_tdx_e_169s2cfz044euhc4yjg4xe4pg55w97rq2c6jh50zsdcpuz5gk6cag6v", + "account_tdx_e_16x88ghu9hd3hz4c9gumqjafrcwqtzk67wmpds7xg6uaz0kf42v5hju", + "account_tdx_e_16yszyl5pd54vdqm4wyazdgtr7j3d5cl33gew3mzy6r9443am5dlsr7", + "account_tdx_e_16ysdhjfehs8t80u4ew3w3f8yygkx7v3h3erptrzjacv86sn9l3feln", + "account_tdx_e_16x5wz8wmkumuhn49klq0zwgjn9d8xs7n95maxam04vawld2drf2dkj", + "account_tdx_e_16y6q3q6ey64j5qvkex3q0yshtln6z2lmyk254xrjcq393rc070x66z", + "account_tdx_e_16yyhtwlwrtpdqe2jufg2xw2289j4dtnk542dm69m7h89l4x5xm60k7", + "account_tdx_e_169cdlneks2wrrmg82cc36xqtx2ng8qjtkpe0j3sfzddl0xje47janr", + "account_tdx_e_12yavnpctf6l2dw76tazge90kkufzks45vq6u28vvarse6cyra5stuv", + "account_tdx_e_128duqx53e4e6hpz4vxkm9qskpqgu8un0p49gm2t8lfcsfxl9vej4eg" + ] + }, + "identityAddress": "identity_tdx_e_122k9saakdjazzwm98rlpjlwewy0wvx0csmtvstdut528r0t0z8cy30", + "sharedPersonaData": + {}, + "lastLogin": "2023-09-11T17:57:57Z" + } + ] + } + ] + }, + { + "networkID": 2, + "personas": + [ + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "679152f01032dc15895247a394d622d31342017951471922ba8170e0ee4fb90c" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/2H/618H/1460H/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 2, + "flags": ["deletedByUser"], + "displayName": "Stokeman", + "personaData": + { + "postalAddresses": + [], + "creditCards": + [], + "phoneNumbers": + [], + "emailAddresses": + [], + "urls": + [] + }, + "address": "identity_tdx_2_1224clayjwq45swgd0xj2uc4s3gq4l6g7q77f9d290su4flufq2lt9j" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "04d20a076e310d04723c6b3a3e720c0a3ea58be1364c879a451cac9059d5e213" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/2H/618H/1460H/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 2, + "flags": ["deletedByUser"], + "displayName": "Dan", + "personaData": + { + "postalAddresses": + [], + "creditCards": + [], + "emailAddresses": + [ + { + "id": "F6CFE950-100C-4696-9AA2-68766D10B6BE", + "value": "dan@stoke.com" + } + ], + "name": + { + "id": "B114A7B6-6FE3-41B6-8CE6-CE16148ED1D7", + "value": + { + "nickname": "Fuserleer", + "familyName": "Hughes", + "variant": "western", + "givenNames": "Dan" + } + }, + "phoneNumbers": + [ + { + "id": "FB3E1AC2-FCC7-474C-82A2-600E1A2D69E9", + "value": "1337" + } + ], + "urls": + [] + }, + "address": "identity_tdx_2_122tvh7nq6jd2mp7l8ar5kayc3wr5u5z5pew9r86vtvlwnsydx80pne" + } + ], + "accounts": + [ + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "1145c0041719f2640333ebdfa6652b8399bd73f9205af8a94beb25f6375b5900" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/2H/525H/1460H/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 2, + "appearanceID": 0, + "flags": ["deletedByUser"], + "displayName": "Stokenet", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_2_12ygsf87pma439ezvdyervjfq2nhqme6reau6kcxf6jtaysaxl7sqvd" + }, + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "eda9a63d679d6ba3d3c3b1b1e970de9ec3531cc19e2a523375d9654db4a18b75" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/2H/525H/1460H/1H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 2, + "appearanceID": 1, + "flags": ["deletedByUser"], + "displayName": "Stoke on trent!", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_tdx_2_12yymsmxapnaulngrepgdyzlaszflhcynchr2s95nkjfrsfuzq02s8m" + } + ], + "authorizedDapps": + [] + }, + { + "networkID": 1, + "personas": + [], + "accounts": + [ + { + "securityState": + { + "unsecuredEntityControl": + { + "transactionSigning": + { + "badge": + { + "virtualSource": + { + "hierarchicalDeterministicPublicKey": + { + "publicKey": + { + "curve": "curve25519", + "compressedData": "c948443a693de85e55b07cad69324aeed19082f0d15bf28ae64a9ca21e441b4d" + }, + "derivationPath": + { + "scheme": "cap26", + "path": "m/44H/1022H/1H/525H/1460H/0H" + } + }, + "discriminator": "hierarchicalDeterministicPublicKey" + }, + "discriminator": "virtualSource" + }, + "factorSourceID": + { + "fromHash": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "discriminator": "fromHash" + } + } + }, + "discriminator": "unsecured" + }, + "networkID": 1, + "appearanceID": 0, + "flags": ["deletedByUser"], + "displayName": "Main0", + "onLedgerSettings": + { + "thirdPartyDeposits": + { + "depositRule": "acceptAll", + "assetsExceptionList": + [], + "depositorsAllowList": + [] + } + }, + "address": "account_rdx12x20vgu94d96g3demdumxl6yjpvm0jy8dhrr03g75299ghxrwq76uh" + } + ], + "authorizedDapps": + [] + } + ], + "header": + { + "contentHint": + { + "numberOfNetworks": 3, + "numberOfAccountsOnAllNetworksInTotal": 16, + "numberOfPersonasOnAllNetworksInTotal": 3 + }, + "id": "E5E4477B-E47B-4B64-BBC8-F8F40E8BEB74", + "lastUsedOnDevice": + { + "id": "66F07CA2-A9D9-49E5-8152-77ACA3D1DD74", + "date": "2023-09-11T17:14:40Z", + "description": "iPhone (iPhone)" + }, + "creatingDevice": + { + "id": "66F07CA2-A9D9-49E5-8152-77ACA3D1DD74", + "date": "2023-09-11T16:05:55Z", + "description": "iPhone (iPhone)" + }, + "lastModified": "2023-09-13T07:24:55Z", + "snapshotVersion": 100 + }, + "factorSources": + [ + { + "device": + { + "id": + { + "kind": "device", + "body": "c9e67a9028fb3150304c77992710c35c8e479d4fa59f7c45a96ce17f6fdf1d2c" + }, + "common": + { + "flags": [], + "addedOn": "2023-09-11T16:05:55Z", + "cryptoParameters": + { + "supportedCurves": + [ + "curve25519" + ], + "supportedDerivationPathSchemes": + [ + "cap26" + ] + }, + "lastUsedOn": "2023-09-13T07:24:55Z" + }, + "hint": + { + "name": "iPhone", + "model": "iPhone", + "mnemonicWordCount": 24 + } + }, + "discriminator": "device" + }, + { + "device": + { + "id": + { + "kind": "device", + "body": "8bfacfe888d4e3819c6e9528a1c8f680a4ba73e466d7af4ee204591093006589" + }, + "common": + { + "flags": [], + "addedOn": "2023-09-11T16:23:40Z", + "cryptoParameters": + { + "supportedCurves": + [ + "curve25519", + "secp256k1" + ], + "supportedDerivationPathSchemes": + [ + "cap26", + "bip44Olympia" + ] + }, + "lastUsedOn": "2023-09-11T17:17:46Z" + }, + "hint": + { + "name": "", + "model": "", + "mnemonicWordCount": 12 + } + }, + "discriminator": "device" + }, + { + "device": + { + "id": + { + "kind": "device", + "body": "eda055ed256d156f62013da6cf5fb6104339b5c8666dd3f5512030950b1e3a29" + }, + "common": + { + "flags": [], + "addedOn": "2023-09-11T16:26:44Z", + "cryptoParameters": + { + "supportedCurves": + [ + "curve25519", + "secp256k1" + ], + "supportedDerivationPathSchemes": + [ + "cap26", + "bip44Olympia" + ] + }, + "lastUsedOn": "2023-09-11T17:18:33Z" + }, + "hint": + { + "name": "", + "model": "", + "mnemonicWordCount": 18 + } + }, + "discriminator": "device" + }, + { + "ledgerHQHardwareWallet": + { + "id": + { + "kind": "ledgerHQHardwareWallet", + "body": "41ac202687326a4fc6cb677e9fd92d08b91ce46c669950d58790d4d5e583adc0" + }, + "common": + { + "flags": [], + "addedOn": "2023-09-11T16:35:08Z", + "cryptoParameters": + { + "supportedCurves": + [ + "curve25519", + "secp256k1" + ], + "supportedDerivationPathSchemes": + [ + "cap26", + "bip44Olympia" + ] + }, + "lastUsedOn": "2023-09-11T17:19:41Z" + }, + "hint": + { + "name": "Scratched 24", + "model": "nanoS" + } + }, + "discriminator": "ledgerHQHardwareWallet" + }, + { + "ledgerHQHardwareWallet": + { + "id": + { + "kind": "ledgerHQHardwareWallet", + "body": "9e2e0a2b4b96e8729f5553ffa8865eaac10088569ef8bcd7b3fa61b89fde1764" + }, + "common": + { + "flags": + [], + "addedOn": "2023-09-11T16:38:12Z", + "cryptoParameters": + { + "supportedCurves": + [ + "curve25519", + "secp256k1" + ], + "supportedDerivationPathSchemes": + [ + "cap26", + "bip44Olympia" + ] + }, + "lastUsedOn": "2023-09-11T19:51:11Z" + }, + "hint": + { + "name": "Orange 25", + "model": "nanoS+" + } + }, + "discriminator": "ledgerHQHardwareWallet" + } + ] +} \ No newline at end of file