From ac805e300658c70c5d958532f3c2c02bc2be8e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 27 Nov 2024 13:17:34 +0100 Subject: [PATCH 01/35] Add ICRC-106 to supported standards in ICRC ledger --- rs/ledger_suite/icrc1/ledger/src/main.rs | 4 ++++ rs/ledger_suite/tests/sm-tests/src/lib.rs | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 43f23d31c440..147b04bdac78 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -665,6 +665,10 @@ fn supported_standards() -> Vec { name: "ICRC-21".to_string(), url: "https://github.com/dfinity/wg-identity-authentication/blob/main/topics/ICRC-21/icrc_21_consent_msg.md".to_string(), }, + StandardRecord { + name: "ICRC-106".to_string(), + url: "https://github.com/dfinity/ICRC/pull/106".to_string(), + }, ]; standards } diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index e8ae80770bfe..863949981ce8 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -1020,7 +1020,10 @@ where standards.push(standard.name); } standards.sort(); - assert_eq!(standards, vec!["ICRC-1", "ICRC-2", "ICRC-21", "ICRC-3"]); + assert_eq!( + standards, + vec!["ICRC-1", "ICRC-106", "ICRC-2", "ICRC-21", "ICRC-3"] + ); } pub fn test_total_supply(ledger_wasm: Vec, encode_init_args: fn(InitArgs) -> T) @@ -3142,7 +3145,10 @@ where standards.push(standard.name); } standards.sort(); - assert_eq!(standards, vec!["ICRC-1", "ICRC-2", "ICRC-21"]); + assert_eq!( + standards, + vec!["ICRC-1", "ICRC-106", "ICRC-2", "ICRC-21", "ICRC-187"] + ); let block_index = send_approval(&env, canister_id, from.0, &approve_args).expect("approval failed"); From 686aad36dc31d61a393fff2131f102ea6985c2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 27 Nov 2024 14:49:18 +0100 Subject: [PATCH 02/35] Add new types to icrc-ledger-types --- packages/icrc-ledger-types/src/icrc106/errors.rs | 11 +++++++++++ packages/icrc-ledger-types/src/icrc106/mod.rs | 1 + packages/icrc-ledger-types/src/lib.rs | 1 + 3 files changed, 13 insertions(+) create mode 100644 packages/icrc-ledger-types/src/icrc106/errors.rs create mode 100644 packages/icrc-ledger-types/src/icrc106/mod.rs diff --git a/packages/icrc-ledger-types/src/icrc106/errors.rs b/packages/icrc-ledger-types/src/icrc106/errors.rs new file mode 100644 index 000000000000..d6ad6244ad4b --- /dev/null +++ b/packages/icrc-ledger-types/src/icrc106/errors.rs @@ -0,0 +1,11 @@ +use candid::{CandidType, Deserialize, Nat}; +use serde::Serialize; + +#[derive(Debug, CandidType, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub enum Icrc106Error { + IndexNotSet, + GenericError { + error_code: Nat, + description: String, + }, +} diff --git a/packages/icrc-ledger-types/src/icrc106/mod.rs b/packages/icrc-ledger-types/src/icrc106/mod.rs new file mode 100644 index 000000000000..629e98fbf874 --- /dev/null +++ b/packages/icrc-ledger-types/src/icrc106/mod.rs @@ -0,0 +1 @@ +pub mod errors; diff --git a/packages/icrc-ledger-types/src/lib.rs b/packages/icrc-ledger-types/src/lib.rs index f532acb4880c..d304c1d5a817 100644 --- a/packages/icrc-ledger-types/src/lib.rs +++ b/packages/icrc-ledger-types/src/lib.rs @@ -1,5 +1,6 @@ pub mod icrc; pub mod icrc1; +pub mod icrc106; pub mod icrc2; pub mod icrc21; pub mod icrc3; From 48d81000496a9ad4398db89a496cc18658a3f8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 27 Nov 2024 14:54:46 +0100 Subject: [PATCH 03/35] Add index_principal to upgrade args and add new endpoint --- rs/ledger_suite/icrc1/index-ng/tests/tests.rs | 1 + rs/ledger_suite/icrc1/ledger/ledger.did | 13 +++++ rs/ledger_suite/icrc1/ledger/src/lib.rs | 12 +++++ rs/ledger_suite/icrc1/ledger/src/main.rs | 15 +++++- rs/ledger_suite/icrc1/ledger/tests/tests.rs | 28 +++++++++- rs/ledger_suite/tests/sm-tests/src/lib.rs | 53 +++++++++++++++++++ 6 files changed, 119 insertions(+), 3 deletions(-) diff --git a/rs/ledger_suite/icrc1/index-ng/tests/tests.rs b/rs/ledger_suite/icrc1/index-ng/tests/tests.rs index 80369d5d978e..b2b4c362e0e2 100644 --- a/rs/ledger_suite/icrc1/index-ng/tests/tests.rs +++ b/rs/ledger_suite/icrc1/index-ng/tests/tests.rs @@ -57,6 +57,7 @@ fn upgrade_ledger( feature_flags: None, accounts_overflow_trim_quantity: None, change_archive_options: None, + index_principal: None, })); env.upgrade_canister(ledger_id, ledger_wasm(), Encode!(&args).unwrap()) .unwrap() diff --git a/rs/ledger_suite/icrc1/ledger/ledger.did b/rs/ledger_suite/icrc1/ledger/ledger.did index ac3a7bff087f..3b37fe914442 100644 --- a/rs/ledger_suite/icrc1/ledger/ledger.did +++ b/rs/ledger_suite/icrc1/ledger/ledger.did @@ -146,6 +146,7 @@ type UpgradeArgs = record { feature_flags : opt FeatureFlags; accounts_overflow_trim_quantity: opt nat64; change_archive_options : opt ChangeArchiveOptions; + index_principal : opt text; }; type LedgerArg = variant { @@ -481,6 +482,16 @@ type icrc21_consent_message_response = variant { Err: icrc21_error; }; +type GetIndexResult = variant { + Ok : principal; + Err : GetIndexError; +}; + +type GetIndexError = variant { + IndexNotSet; + GenericError : record { error_code : nat; message : text }; +}; + service : (ledger_arg : LedgerArg) -> { archives : () -> (vec ArchiveInfo) query; get_transactions : (GetTransactionsRequest) -> (GetTransactionsResponse) query; @@ -509,4 +520,6 @@ service : (ledger_arg : LedgerArg) -> { icrc21_canister_call_consent_message: (icrc21_consent_message_request) -> (icrc21_consent_message_response); icrc10_supported_standards : () -> (vec record { name : text; url : text }) query; + + icrc106_get_index_principal: () -> (GetIndexResult) query; } diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index e43676ff9411..5f234ddcbe80 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -335,6 +335,8 @@ pub struct UpgradeArgs { pub accounts_overflow_trim_quantity: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub change_archive_options: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub index_principal: Option, } #[derive(Clone, Eq, PartialEq, Debug, CandidType, Deserialize)] @@ -390,6 +392,8 @@ pub struct Ledger { #[serde(default = "default_ledger_version")] pub ledger_version: u64, + + index_principal: Option, } fn default_maximum_number_of_accounts() -> usize { @@ -487,6 +491,7 @@ impl Ledger { .try_into() .unwrap(), ledger_version: LEDGER_VERSION, + index_principal: None, }; for (account, balance) in initial_balances.into_iter() { @@ -618,6 +623,10 @@ impl Ledger { self.decimals } + pub fn index_principal(&self) -> Option { + self.index_principal.clone() + } + pub fn metadata(&self) -> Vec<(String, Value)> { let mut records: Vec<(String, Value)> = self .metadata @@ -702,6 +711,9 @@ impl Ledger { change_archive_options.apply(archive); } } + if let Some(index_principal) = args.index_principal { + self.index_principal = Some(index_principal); + } } /// Returns the root hash of the certified ledger state. diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 147b04bdac78..28154ed4b45f 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -1,8 +1,8 @@ #[cfg(feature = "canbench-rs")] mod benches; -use candid::candid_method; use candid::types::number::Nat; +use candid::{candid_method, Principal}; use ic_canister_log::{declare_log_buffer, export}; use ic_canisters_http_types::{HttpRequest, HttpResponse, HttpResponseBuilder}; use ic_cdk::api::stable::StableReader; @@ -26,6 +26,7 @@ use ic_ledger_core::timestamp::TimeStamp; use ic_ledger_core::tokens::Zero; use ic_stable_structures::reader::{BufferedReader, Reader}; use ic_stable_structures::writer::{BufferedWriter, Writer}; +use icrc_ledger_types::icrc106::errors::Icrc106Error; use icrc_ledger_types::icrc2::approve::{ApproveArgs, ApproveError}; use icrc_ledger_types::icrc21::{ errors::Icrc21Error, lib::build_icrc21_consent_info_for_icrc1_and_icrc2_endpoints, @@ -857,6 +858,18 @@ fn icrc10_supported_standards() -> Vec { supported_standards() } +#[query] +#[candid_method(query)] +fn icrc106_get_index_principal() -> Result { + Access::with_ledger(|ledger| { + if let Some(index_principal) = ledger.index_principal() { + Ok(index_principal) + } else { + Err(Icrc106Error::IndexNotSet) + } + }) +} + #[update] #[candid_method(update)] fn icrc21_canister_call_consent_message( diff --git a/rs/ledger_suite/icrc1/ledger/tests/tests.rs b/rs/ledger_suite/icrc1/ledger/tests/tests.rs index 880002ec269e..96b491d72454 100644 --- a/rs/ledger_suite/icrc1/ledger/tests/tests.rs +++ b/rs/ledger_suite/icrc1/ledger/tests/tests.rs @@ -1,10 +1,10 @@ -use candid::{CandidType, Decode, Encode, Nat}; +use candid::{CandidType, Decode, Encode, Nat, Principal}; use ic_agent::identity::Identity; use ic_base_types::{CanisterId, PrincipalId}; use ic_icrc1::{Block, Operation, Transaction}; use ic_icrc1_ledger::{ ChangeFeeCollector, FeatureFlags, InitArgs, InitArgsBuilder as LedgerInitArgsBuilder, - LedgerArgument, + LedgerArgument, UpgradeArgs, }; use ic_icrc1_test_utils::minter_identity; use ic_ledger_canister_core::archive::ArchiveOptions; @@ -428,6 +428,30 @@ fn test_icrc21_standard() { ic_ledger_suite_state_machine_tests::test_icrc21_standard(ledger_wasm(), encode_init_args); } +fn encode_icrc106_upgrade_args(index_principal: Option) -> LedgerArgument { + LedgerArgument::Upgrade(Some(UpgradeArgs { + metadata: None, + token_name: None, + token_symbol: None, + transfer_fee: None, + change_fee_collector: None, + max_memo_length: None, + feature_flags: None, + accounts_overflow_trim_quantity: None, + change_archive_options: None, + index_principal, + })) +} + +#[test] +fn test_icrc106_standard() { + ic_ledger_suite_state_machine_tests::test_icrc106_standard( + ledger_wasm(), + encode_init_args, + encode_icrc106_upgrade_args, + ); +} + // #[test] // fn test_icrc1_test_suite() { // ic_ledger_suite_state_machine_tests::test_icrc1_test_suite(ledger_wasm(), encode_init_args); diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 863949981ce8..6c4b7d212ffa 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -25,6 +25,7 @@ use icrc_ledger_types::icrc::generic_metadata_value::MetadataValue as Value; use icrc_ledger_types::icrc::generic_value::Value as GenericValue; use icrc_ledger_types::icrc1::account::{Account, Subaccount}; use icrc_ledger_types::icrc1::transfer::{Memo, TransferArg, TransferError}; +use icrc_ledger_types::icrc106::errors::Icrc106Error; use icrc_ledger_types::icrc2::allowance::{Allowance, AllowanceArgs}; use icrc_ledger_types::icrc2::approve::{ApproveArgs, ApproveError}; use icrc_ledger_types::icrc2::transfer_from::{TransferFromArgs, TransferFromError}; @@ -285,6 +286,19 @@ fn icrc21_consent_message( .expect("failed to decode icrc21_canister_call_consent_message response") } +fn icrc106_get_index_principal( + env: &StateMachine, + ledger: CanisterId, +) -> Result { + Decode!( + &env.query(ledger, "icrc106_get_index_principal", Encode!().unwrap()) + .expect("failed to query icrc106_get_index_principal") + .bytes(), + Result + ) + .expect("failed to decode icrc106_get_index_principal response") +} + pub fn get_all_ledger_and_archive_blocks( state_machine: &StateMachine, ledger_id: CanisterId, @@ -4082,6 +4096,45 @@ where ); } +pub fn test_icrc106_standard( + ledger_wasm: Vec, + encode_init_args: fn(InitArgs) -> T, + encode_upgrade_args: fn(Option) -> U, +) where + T: CandidType, + U: CandidType, +{ + fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { + let mut found = false; + for standard in supported_standards(&env, canister_id) { + if standard.name == "ICRC-106" { + found = true; + break; + } + } + assert!(found, "ICRC-106 should be supported"); + } + + let (env, canister_id) = setup(ledger_wasm.clone(), encode_init_args, vec![]); + assert_icrc106_supported(&env, canister_id); + assert_eq!( + Err(Icrc106Error::IndexNotSet), + icrc106_get_index_principal(&env, canister_id) + ); + + let index_principal = PrincipalId::new_user_test_id(1).0; + let args = encode_upgrade_args(Some(index_principal)); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm, encoded_upgrade_args.clone()) + .expect("should successfully upgrade ledger canister"); + + assert_icrc106_supported(&env, canister_id); + assert_eq!( + Ok(index_principal), + icrc106_get_index_principal(&env, canister_id) + ); +} + pub struct TransactionGenerationParameters { pub mint_multiplier: u64, pub transfer_multiplier: u64, From 9d6cdb931ada03de015d15ce7284e8a78f805bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 27 Nov 2024 15:08:59 +0100 Subject: [PATCH 04/35] Add index principal to metadata --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 6 ++++++ rs/ledger_suite/tests/sm-tests/src/lib.rs | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 5f234ddcbe80..01cf4f5bc6ab 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -642,6 +642,12 @@ impl Ledger { "icrc1:max_memo_length", self.max_memo_length() as u64, )); + if let Some(index_principal) = self.index_principal() { + records.push(Value::entry( + "icrc106:index_principal", + index_principal.to_text(), + )); + } records } diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 6c4b7d212ffa..2281da813727 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -21,7 +21,7 @@ use ic_state_machine_tests::{ErrorCode, StateMachine, WasmResult}; use ic_types::Cycles; use ic_universal_canister::{call_args, wasm, UNIVERSAL_CANISTER_WASM}; use icp_ledger::{AccountIdentifier, IcpAllowanceArgs}; -use icrc_ledger_types::icrc::generic_metadata_value::MetadataValue as Value; +use icrc_ledger_types::icrc::generic_metadata_value::{MetadataValue as Value, MetadataValue}; use icrc_ledger_types::icrc::generic_value::Value as GenericValue; use icrc_ledger_types::icrc1::account::{Account, Subaccount}; use icrc_ledger_types::icrc1::transfer::{Memo, TransferArg, TransferError}; @@ -4121,6 +4121,9 @@ pub fn test_icrc106_standard( Err(Icrc106Error::IndexNotSet), icrc106_get_index_principal(&env, canister_id) ); + assert!(metadata(&env, canister_id) + .get("icrc106:index_principal") + .is_none()); let index_principal = PrincipalId::new_user_test_id(1).0; let args = encode_upgrade_args(Some(index_principal)); @@ -4133,6 +4136,12 @@ pub fn test_icrc106_standard( Ok(index_principal), icrc106_get_index_principal(&env, canister_id) ); + assert_eq!( + &MetadataValue::Text(index_principal.to_text()), + metadata(&env, canister_id) + .get("icrc106:index_principal") + .expect("should have index principal metadata") + ); } pub struct TransactionGenerationParameters { From 2308795208fb8aeb8a78ecb63083cddd6556b135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 27 Nov 2024 16:32:37 +0100 Subject: [PATCH 05/35] Clippy --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 01cf4f5bc6ab..a93cccc6cf94 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -624,7 +624,7 @@ impl Ledger { } pub fn index_principal(&self) -> Option { - self.index_principal.clone() + self.index_principal } pub fn metadata(&self) -> Vec<(String, Value)> { From 62bfaf6446a09a75b5958393084b745f60c7eb07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 28 Nov 2024 10:15:50 +0100 Subject: [PATCH 06/35] Candid fixes and renaming --- .../icrc-ledger-types/src/icrc106/errors.rs | 2 +- rs/ledger_suite/icrc1/ledger/ledger.did | 19 ++++++++++++------- rs/ledger_suite/icrc1/ledger/src/main.rs | 2 +- rs/ledger_suite/tests/sm-tests/src/lib.rs | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/icrc-ledger-types/src/icrc106/errors.rs b/packages/icrc-ledger-types/src/icrc106/errors.rs index d6ad6244ad4b..81360d1cdf66 100644 --- a/packages/icrc-ledger-types/src/icrc106/errors.rs +++ b/packages/icrc-ledger-types/src/icrc106/errors.rs @@ -3,7 +3,7 @@ use serde::Serialize; #[derive(Debug, CandidType, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum Icrc106Error { - IndexNotSet, + IndexPrincipalNotSet, GenericError { error_code: Nat, description: String, diff --git a/rs/ledger_suite/icrc1/ledger/ledger.did b/rs/ledger_suite/icrc1/ledger/ledger.did index 3b37fe914442..b7e8d8b81f13 100644 --- a/rs/ledger_suite/icrc1/ledger/ledger.did +++ b/rs/ledger_suite/icrc1/ledger/ledger.did @@ -146,7 +146,7 @@ type UpgradeArgs = record { feature_flags : opt FeatureFlags; accounts_overflow_trim_quantity: opt nat64; change_archive_options : opt ChangeArchiveOptions; - index_principal : opt text; + index_principal : opt principal; }; type LedgerArg = variant { @@ -482,14 +482,19 @@ type icrc21_consent_message_response = variant { Err: icrc21_error; }; -type GetIndexResult = variant { +type GetIndexPrincipalResult = variant { Ok : principal; - Err : GetIndexError; + Err : GetIndexPrincipalError; }; -type GetIndexError = variant { - IndexNotSet; - GenericError : record { error_code : nat; message : text }; +type GetIndexPrincipalError = variant { + IndexPrincipalNotSet; + + // Any error not covered by the above variants. + GenericError: record { + error_code: nat; + description: text; + }; }; service : (ledger_arg : LedgerArg) -> { @@ -521,5 +526,5 @@ service : (ledger_arg : LedgerArg) -> { icrc21_canister_call_consent_message: (icrc21_consent_message_request) -> (icrc21_consent_message_response); icrc10_supported_standards : () -> (vec record { name : text; url : text }) query; - icrc106_get_index_principal: () -> (GetIndexResult) query; + icrc106_get_index_principal: () -> (GetIndexPrincipalResult) query; } diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 28154ed4b45f..ddc3a4708718 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -865,7 +865,7 @@ fn icrc106_get_index_principal() -> Result { if let Some(index_principal) = ledger.index_principal() { Ok(index_principal) } else { - Err(Icrc106Error::IndexNotSet) + Err(Icrc106Error::IndexPrincipalNotSet) } }) } diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 2281da813727..3e70d7636250 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -4118,7 +4118,7 @@ pub fn test_icrc106_standard( let (env, canister_id) = setup(ledger_wasm.clone(), encode_init_args, vec![]); assert_icrc106_supported(&env, canister_id); assert_eq!( - Err(Icrc106Error::IndexNotSet), + Err(Icrc106Error::IndexPrincipalNotSet), icrc106_get_index_principal(&env, canister_id) ); assert!(metadata(&env, canister_id) From a08bb407dd882d2a11817e2d714038a41f7b7a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 28 Nov 2024 10:34:14 +0100 Subject: [PATCH 07/35] Clippy --- rs/ledger_suite/tests/sm-tests/src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 3e70d7636250..97ee9cc4e2a3 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -4106,7 +4106,7 @@ pub fn test_icrc106_standard( { fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { let mut found = false; - for standard in supported_standards(&env, canister_id) { + for standard in supported_standards(env, canister_id) { if standard.name == "ICRC-106" { found = true; break; @@ -4121,9 +4121,7 @@ pub fn test_icrc106_standard( Err(Icrc106Error::IndexPrincipalNotSet), icrc106_get_index_principal(&env, canister_id) ); - assert!(metadata(&env, canister_id) - .get("icrc106:index_principal") - .is_none()); + assert!(!metadata(&env, canister_id).contains_key("icrc106:index_principal")); let index_principal = PrincipalId::new_user_test_id(1).0; let args = encode_upgrade_args(Some(index_principal)); From 23df570c6218f1e2819533634b21abebe17eb81f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 28 Nov 2024 12:59:35 +0100 Subject: [PATCH 08/35] Cleanup --- rs/ledger_suite/tests/sm-tests/src/lib.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 97ee9cc4e2a3..cea7c2eec699 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -3159,10 +3159,7 @@ where standards.push(standard.name); } standards.sort(); - assert_eq!( - standards, - vec!["ICRC-1", "ICRC-106", "ICRC-2", "ICRC-21", "ICRC-187"] - ); + assert_eq!(standards, vec!["ICRC-1", "ICRC-2", "ICRC-21"]); let block_index = send_approval(&env, canister_id, from.0, &approve_args).expect("approval failed"); From ab9c2d0c7c377c44078e7d04ac1fef08a577a7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 19 Dec 2024 14:25:20 +0100 Subject: [PATCH 09/35] Support setting index canister ID in ledger init arguments --- rs/ledger_suite/icrc1/ledger/ledger.did | 1 + rs/ledger_suite/icrc1/ledger/src/lib.rs | 5 +- rs/ledger_suite/icrc1/ledger/src/tests.rs | 1 + rs/ledger_suite/icrc1/ledger/tests/tests.rs | 28 +++- rs/ledger_suite/icrc1/tests/tests.rs | 9 ++ .../tests/sm-tests/src/icrc_106.rs | 140 ++++++++++++++++++ rs/ledger_suite/tests/sm-tests/src/lib.rs | 52 +------ 7 files changed, 187 insertions(+), 49 deletions(-) create mode 100644 rs/ledger_suite/tests/sm-tests/src/icrc_106.rs diff --git a/rs/ledger_suite/icrc1/ledger/ledger.did b/rs/ledger_suite/icrc1/ledger/ledger.did index 6448e44bd1cb..16aa04c7eeaf 100644 --- a/rs/ledger_suite/icrc1/ledger/ledger.did +++ b/rs/ledger_suite/icrc1/ledger/ledger.did @@ -119,6 +119,7 @@ type InitArgs = record { controller_id : principal; more_controller_ids : opt vec principal; }; + index_principal : opt principal; }; type ChangeFeeCollector = variant { diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 8d5d48c61d2b..4237ef4e5be4 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -181,6 +181,7 @@ impl InitArgsBuilder { feature_flags: None, maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, }) } @@ -265,6 +266,7 @@ pub struct InitArgs { pub feature_flags: Option, pub maximum_number_of_accounts: Option, pub accounts_overflow_trim_quantity: Option, + pub index_principal: Option, } #[derive(Clone, Eq, PartialEq, Debug, CandidType, Deserialize)] @@ -636,6 +638,7 @@ impl Ledger { feature_flags, maximum_number_of_accounts, accounts_overflow_trim_quantity, + index_principal, }: InitArgs, now: TimeStamp, ) -> Self { @@ -678,7 +681,7 @@ impl Ledger { .try_into() .unwrap(), ledger_version: LEDGER_VERSION, - index_principal: None, + index_principal, }; for (account, balance) in initial_balances.into_iter() { diff --git a/rs/ledger_suite/icrc1/ledger/src/tests.rs b/rs/ledger_suite/icrc1/ledger/src/tests.rs index ca5634b81d45..d02675059d6f 100644 --- a/rs/ledger_suite/icrc1/ledger/src/tests.rs +++ b/rs/ledger_suite/icrc1/ledger/src/tests.rs @@ -87,6 +87,7 @@ fn default_init_args() -> InitArgs { feature_flags: None, maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, } } diff --git a/rs/ledger_suite/icrc1/ledger/tests/tests.rs b/rs/ledger_suite/icrc1/ledger/tests/tests.rs index 8479419c5961..1a06bd544e4a 100644 --- a/rs/ledger_suite/icrc1/ledger/tests/tests.rs +++ b/rs/ledger_suite/icrc1/ledger/tests/tests.rs @@ -155,6 +155,7 @@ fn encode_init_args(args: ic_ledger_suite_state_machine_tests::InitArgs) -> Ledg feature_flags: args.feature_flags, maximum_number_of_accounts: args.maximum_number_of_accounts, accounts_overflow_trim_quantity: args.accounts_overflow_trim_quantity, + index_principal: args.index_principal, }) } @@ -431,8 +432,25 @@ fn encode_icrc106_upgrade_args(index_principal: Option) -> LedgerArgu } #[test] -fn test_icrc106_standard() { - ic_ledger_suite_state_machine_tests::test_icrc106_standard( +fn test_icrc106_unsupported_if_index_not_set() { + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_unsupported_if_index_not_set( + ledger_wasm(), + encode_init_args, + encode_icrc106_upgrade_args, + ); +} + +#[test] +fn test_icrc106_set_index_in_install() { + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_set_index_in_install( + ledger_wasm(), + encode_init_args, + ); +} + +#[test] +fn test_icrc106_set_index_in_upgrade() { + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_set_index_in_upgrade( ledger_wasm(), encode_init_args, encode_icrc106_upgrade_args, @@ -664,6 +682,7 @@ fn test_icrc2_feature_flag_doesnt_disable_icrc2_endpoints() { feature_flags: Some(FeatureFlags { icrc2: false }), maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, })) .unwrap(); let ledger_id = env @@ -840,6 +859,7 @@ fn test_icrc3_get_archives() { feature_flags: None, maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, }); let args = Encode!(&args).unwrap(); let ledger_id = env @@ -917,6 +937,7 @@ fn test_icrc3_get_blocks() { feature_flags: None, maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, }); let args = Encode!(&args).unwrap(); let ledger_id = env @@ -1193,6 +1214,7 @@ fn test_icrc3_get_blocks_number_of_blocks_limit() { feature_flags: None, maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, }); let args = Encode!(&args).unwrap(); @@ -1629,6 +1651,7 @@ mod verify_written_blocks { feature_flags: Some(FeatureFlags { icrc2: true }), maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, }); let args = Encode!(&ledger_arg_init).unwrap(); @@ -1847,6 +1870,7 @@ mod incompatible_token_type_upgrade { feature_flags: Some(FeatureFlags { icrc2: false }), maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, })) .unwrap() } diff --git a/rs/ledger_suite/icrc1/tests/tests.rs b/rs/ledger_suite/icrc1/tests/tests.rs index c03889627975..148de80a0fc4 100644 --- a/rs/ledger_suite/icrc1/tests/tests.rs +++ b/rs/ledger_suite/icrc1/tests/tests.rs @@ -156,3 +156,12 @@ fn test_encoding_decoding_block_u254() { prop_assert_eq!(block, decoded); }) } + +#[test] +fn test_icrc106_standard() { + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_set_index_in_upgrade( + ledger_wasm(), + encode_init_args, + encode_icrc106_upgrade_args, + ); +} diff --git a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs new file mode 100644 index 000000000000..ae0a59f096ff --- /dev/null +++ b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs @@ -0,0 +1,140 @@ +use super::*; + +pub fn test_icrc106_unsupported_if_index_not_set( + ledger_wasm: Vec, + encode_ledger_init_args: fn(InitArgs) -> T, + encode_upgrade_args: fn(Option) -> U, +) where + T: CandidType, + U: CandidType, +{ + fn assert_index_not_set(env: &StateMachine, ledger_canister_id: CanisterId) { + assert_icrc106_supported(env, ledger_canister_id); + assert_eq!( + Err(Icrc106Error::IndexPrincipalNotSet), + icrc106_get_index_principal(env, ledger_canister_id) + ); + assert_eq!( + None, + metadata(env, ledger_canister_id).get("icrc106:index_principal") + ); + } + + let env = StateMachine::new(); + let ledger_canister_id = env.create_canister(None); + let ledger_init_args = encode_ledger_init_args(init_args(vec![])); + env.install_existing_canister( + ledger_canister_id, + ledger_wasm.clone(), + Encode!(&ledger_init_args).unwrap(), + ) + .expect("should successfully install ledger canister"); + + assert_index_not_set(&env, ledger_canister_id); + + let args = encode_upgrade_args(None); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister( + ledger_canister_id, + ledger_wasm, + encoded_upgrade_args.clone(), + ) + .expect("should successfully upgrade ledger canister"); + + assert_index_not_set(&env, ledger_canister_id); +} + +pub fn test_icrc106_set_index_in_install( + ledger_wasm: Vec, + encode_ledger_init_args: fn(InitArgs) -> T, +) where + T: CandidType, +{ + let env = StateMachine::new(); + let ledger_canister_id = env.create_canister(None); + let index_canister_id = env.create_canister(None); + let index_principal = Principal::from(index_canister_id.get()); + let ledger_init_args = encode_ledger_init_args(InitArgs { + index_principal: Some(index_principal), + ..init_args(vec![]) + }); + env.install_existing_canister( + ledger_canister_id, + ledger_wasm.clone(), + Encode!(&ledger_init_args).unwrap(), + ) + .expect("should successfully install ledger canister"); + + assert_icrc106_supported(&env, ledger_canister_id); + assert_eq!( + Ok(index_principal), + icrc106_get_index_principal(&env, ledger_canister_id) + ); + assert_eq!( + &Value::Text(index_principal.to_text()), + metadata(&env, ledger_canister_id) + .get("icrc106:index_principal") + .expect("should have index principal metadata") + ); +} + +pub fn test_icrc106_set_index_in_upgrade( + ledger_wasm: Vec, + encode_init_args: fn(InitArgs) -> T, + encode_upgrade_args: fn(Option) -> U, +) where + T: CandidType, + U: CandidType, +{ + fn assert_index_set( + env: &StateMachine, + ledger_canister_id: CanisterId, + index_principal: Principal, + ) { + assert_icrc106_supported(&env, ledger_canister_id); + assert_eq!( + Ok(index_principal), + icrc106_get_index_principal(&env, ledger_canister_id) + ); + assert_eq!( + &Value::Text(index_principal.to_text()), + metadata(&env, ledger_canister_id) + .get("icrc106:index_principal") + .expect("should have index principal metadata") + ); + } + + let (env, canister_id) = setup(ledger_wasm.clone(), encode_init_args, vec![]); + assert_icrc106_supported(&env, canister_id); + assert_eq!( + Err(Icrc106Error::IndexPrincipalNotSet), + icrc106_get_index_principal(&env, canister_id) + ); + assert!(!metadata(&env, canister_id).contains_key("icrc106:index_principal")); + + let index_principal = PrincipalId::new_user_test_id(1).0; + let args = encode_upgrade_args(Some(index_principal)); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm.clone(), encoded_upgrade_args) + .expect("should successfully upgrade ledger canister"); + // The index should now be set + assert_index_set(&env, canister_id, index_principal); + + let args = encode_upgrade_args(None); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm, encoded_upgrade_args) + .expect("should successfully upgrade ledger canister"); + // Passing `None` should not change the previously set index + assert_index_set(&env, canister_id, index_principal); +} + +fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { + let mut found = false; + for standard in supported_standards(env, canister_id) { + if standard.name == "ICRC-106" { + found = true; + break; + } + } + assert!(found, "ICRC-106 should be supported"); +} diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index d010735069cc..d2792c501e21 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -63,6 +63,7 @@ use std::{ }; pub mod fee_collector; +pub mod icrc_106; pub mod in_memory_ledger; pub mod metrics; @@ -104,6 +105,7 @@ pub struct InitArgs { pub feature_flags: Option, pub maximum_number_of_accounts: Option, pub accounts_overflow_trim_quantity: Option, + pub index_principal: Option, } #[derive(Clone, Eq, PartialEq, Debug, CandidType)] @@ -910,6 +912,7 @@ fn init_args(initial_balances: Vec<(Account, u64)>) -> InitArgs { feature_flags: Some(FeatureFlags { icrc2: true }), maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, } } @@ -1685,6 +1688,7 @@ pub fn test_archive_controllers(ledger_wasm: Vec) { feature_flags: args.feature_flags, maximum_number_of_accounts: args.maximum_number_of_accounts, accounts_overflow_trim_quantity: args.accounts_overflow_trim_quantity, + index_principal: None, }) } @@ -1715,6 +1719,7 @@ pub fn test_archive_no_additional_controllers(ledger_wasm: Vec) { feature_flags: args.feature_flags, maximum_number_of_accounts: args.maximum_number_of_accounts, accounts_overflow_trim_quantity: args.accounts_overflow_trim_quantity, + index_principal: None, }) } @@ -1750,6 +1755,7 @@ pub fn test_archive_duplicate_controllers(ledger_wasm: Vec) { feature_flags: args.feature_flags, maximum_number_of_accounts: args.maximum_number_of_accounts, accounts_overflow_trim_quantity: args.accounts_overflow_trim_quantity, + index_principal: None, }) } let p100 = PrincipalId::new_user_test_id(100); @@ -4528,52 +4534,6 @@ where ); } -pub fn test_icrc106_standard( - ledger_wasm: Vec, - encode_init_args: fn(InitArgs) -> T, - encode_upgrade_args: fn(Option) -> U, -) where - T: CandidType, - U: CandidType, -{ - fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { - let mut found = false; - for standard in supported_standards(env, canister_id) { - if standard.name == "ICRC-106" { - found = true; - break; - } - } - assert!(found, "ICRC-106 should be supported"); - } - - let (env, canister_id) = setup(ledger_wasm.clone(), encode_init_args, vec![]); - assert_icrc106_supported(&env, canister_id); - assert_eq!( - Err(Icrc106Error::IndexPrincipalNotSet), - icrc106_get_index_principal(&env, canister_id) - ); - assert!(!metadata(&env, canister_id).contains_key("icrc106:index_principal")); - - let index_principal = PrincipalId::new_user_test_id(1).0; - let args = encode_upgrade_args(Some(index_principal)); - let encoded_upgrade_args = Encode!(&args).unwrap(); - env.upgrade_canister(canister_id, ledger_wasm, encoded_upgrade_args.clone()) - .expect("should successfully upgrade ledger canister"); - - assert_icrc106_supported(&env, canister_id); - assert_eq!( - Ok(index_principal), - icrc106_get_index_principal(&env, canister_id) - ); - assert_eq!( - &Value::Text(index_principal.to_text()), - metadata(&env, canister_id) - .get("icrc106:index_principal") - .expect("should have index principal metadata") - ); -} - pub struct TransactionGenerationParameters { pub mint_multiplier: u64, pub transfer_multiplier: u64, From d59a44c6efcd40ee641b3ff0e29f59b2c84d5521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 19 Dec 2024 14:55:39 +0100 Subject: [PATCH 10/35] Fixes --- .../ledger-suite-orchestrator/src/scheduler/mod.rs | 1 + rs/ledger_suite/icrc1/tests/tests.rs | 9 --------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs index 8848c70062a6..656758134c08 100644 --- a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs +++ b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs @@ -934,6 +934,7 @@ fn icrc1_ledger_init_arg( feature_flags: Some(ICRC2_FEATURE), maximum_number_of_accounts: None, accounts_overflow_trim_quantity: None, + index_principal: None, } } diff --git a/rs/ledger_suite/icrc1/tests/tests.rs b/rs/ledger_suite/icrc1/tests/tests.rs index 148de80a0fc4..c03889627975 100644 --- a/rs/ledger_suite/icrc1/tests/tests.rs +++ b/rs/ledger_suite/icrc1/tests/tests.rs @@ -156,12 +156,3 @@ fn test_encoding_decoding_block_u254() { prop_assert_eq!(block, decoded); }) } - -#[test] -fn test_icrc106_standard() { - ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_set_index_in_upgrade( - ledger_wasm(), - encode_init_args, - encode_icrc106_upgrade_args, - ); -} From 509ab756087d090b8cd691ef4ffcc1794c626994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 19 Dec 2024 15:03:18 +0100 Subject: [PATCH 11/35] Clippy --- rs/ledger_suite/tests/sm-tests/src/icrc_106.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs index ae0a59f096ff..f3da22908e57 100644 --- a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs +++ b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs @@ -91,14 +91,14 @@ pub fn test_icrc106_set_index_in_upgrade( ledger_canister_id: CanisterId, index_principal: Principal, ) { - assert_icrc106_supported(&env, ledger_canister_id); + assert_icrc106_supported(env, ledger_canister_id); assert_eq!( Ok(index_principal), - icrc106_get_index_principal(&env, ledger_canister_id) + icrc106_get_index_principal(env, ledger_canister_id) ); assert_eq!( &Value::Text(index_principal.to_text()), - metadata(&env, ledger_canister_id) + metadata(env, ledger_canister_id) .get("icrc106:index_principal") .expect("should have index principal metadata") ); From 3b4cc30736d9ff7f3c0cda40d84a841b2aa97c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 26 Mar 2025 13:15:02 +0100 Subject: [PATCH 12/35] Missing field --- rs/sns/governance/src/types/tests.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rs/sns/governance/src/types/tests.rs b/rs/sns/governance/src/types/tests.rs index 19a831d377f0..31fcd85602ef 100644 --- a/rs/sns/governance/src/types/tests.rs +++ b/rs/sns/governance/src/types/tests.rs @@ -1533,6 +1533,7 @@ fn test_from_manage_ledger_parameters_into_ledger_upgrade_args() { max_memo_length: None, feature_flags: None, change_archive_options: None, + index_principal: None, } ); } @@ -1559,6 +1560,7 @@ fn test_from_manage_ledger_parameters_into_ledger_upgrade_args_no_logo() { max_memo_length: None, feature_flags: None, change_archive_options: None, + index_principal: None, } ); } From 59c27ed5dde37262cc7a024c9cb8844c07c3ab2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 17 Apr 2025 09:44:27 +0200 Subject: [PATCH 13/35] Set index principal for new chain fusion ledgers --- .../ledger-suite-orchestrator/src/scheduler/mod.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs index 5eded3f2d54c..08c27fd9df28 100644 --- a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs +++ b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs @@ -834,6 +834,9 @@ async fn install_ledger_suite( let ledger_canister_id = create_canister_once::(&args.contract, runtime, cycles_for_ledger_creation) .await?; + let index_principal = + create_canister_once::(&args.contract, runtime, cycles_for_index_creation) + .await?; let more_controllers = read_state(|s| s.more_controller_ids().to_vec()) .into_iter() @@ -848,14 +851,12 @@ async fn install_ledger_suite( runtime.id().into(), more_controllers, cycles_for_archive_creation, + Some(index_principal), )), runtime, ) .await?; - let _index_principal = - create_canister_once::(&args.contract, runtime, cycles_for_index_creation) - .await?; let index_arg = Some(IndexArg::Init(IndexInitArg { ledger_id: ledger_canister_id, retrieve_blocks_from_ledger_interval_seconds: None, @@ -898,6 +899,7 @@ fn icrc1_ledger_init_arg( archive_controller_id: PrincipalId, archive_more_controller_ids: Vec, cycles_for_archive_creation: Nat, + index_principal: Option, ) -> LedgerInitArgs { use ic_icrc1_ledger::FeatureFlags as LedgerFeatureFlags; use icrc_ledger_types::icrc::generic_metadata_value::MetadataValue as LedgerMetadataValue; @@ -932,7 +934,7 @@ fn icrc1_ledger_init_arg( ), max_memo_length: Some(MAX_MEMO_LENGTH), feature_flags: Some(ICRC2_FEATURE), - index_principal: None, + index_principal, } } From f794544321491144367ad1a2e4d4ed4c0c412cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 17 Apr 2025 09:44:42 +0200 Subject: [PATCH 14/35] Set index principal for new SNS ledgers --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 5 +++++ rs/sns/init/src/lib.rs | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 4741cbd199d0..c06d15139acf 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -242,6 +242,11 @@ impl InitArgsBuilder { self } + pub fn with_index_principal(mut self, index_principal: Principal) -> Self { + self.0.index_principal = Some(index_principal); + self + } + pub fn with_feature_flags(mut self, flags: FeatureFlags) -> Self { self.0.feature_flags = Some(flags); self diff --git a/rs/sns/init/src/lib.rs b/rs/sns/init/src/lib.rs index 78e0389ee855..d2d97d01ed03 100644 --- a/rs/sns/init/src/lib.rs +++ b/rs/sns/init/src/lib.rs @@ -610,7 +610,8 @@ impl SnsInitPayload { // 10 Trillion cycles cycles_for_archive_creation: Some(10_000_000_000_000), max_transactions_per_response: None, - }); + }) + .with_index_principal(Principal::from(sns_canister_ids.index)); if let Some(token_logo) = &self.token_logo { payload_builder = payload_builder.with_metadata_entry( From 56e4d71d178776ff4822ff253e5711e9efcc43a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 17 Apr 2025 13:44:54 +0200 Subject: [PATCH 15/35] Fix ledger suite orchestrator tests --- .../src/scheduler/tests.rs | 87 ++++++++++++++----- .../ledger-suite-orchestrator/tests/tests.rs | 4 + 2 files changed, 71 insertions(+), 20 deletions(-) diff --git a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/tests.rs b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/tests.rs index c155d2e8167d..b4a6ed769b3c 100644 --- a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/tests.rs +++ b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/tests.rs @@ -189,19 +189,15 @@ async fn should_not_retry_successful_operation_after_failing_one() { let mut runtime = MockCanisterRuntime::new(); runtime.expect_id().return_const(ORCHESTRATOR_PRINCIPAL); + let expected_error = CallError { + method: "create_canister".to_string(), + reason: Reason::OutOfCycles, + }; expect_create_canister_returning( &mut runtime, vec![ORCHESTRATOR_PRINCIPAL], - vec![Ok(LEDGER_PRINCIPAL)], + vec![Err(expected_error.clone())], ); - let expected_error = CallError { - method: "install_code".to_string(), - reason: Reason::OutOfCycles, - }; - runtime - .expect_install_code() - .times(1) - .return_const(Err(expected_error.clone())); let task = TaskExecution { task_type: Task::InstallLedgerSuite(usdc_install_args()), @@ -209,14 +205,12 @@ async fn should_not_retry_successful_operation_after_failing_one() { }; assert_eq!( task.execute(&runtime).await, - Err(TaskError::InstallCodeError(expected_error)) + Err(TaskError::CanisterCreationError(expected_error)) ); assert_eq!( read_state(|s| s.managed_canisters(&usdc_token_id()).cloned()), Some(Canisters { - ledger: Some(LedgerCanister::new(ManagedCanisterStatus::Created { - canister_id: LEDGER_PRINCIPAL - })), + ledger: None, index: None, archives: vec![], metadata: usdc_metadata(), @@ -229,13 +223,16 @@ async fn should_not_retry_successful_operation_after_failing_one() { method: "create_canister".to_string(), reason: Reason::OutOfCycles, }; - runtime.expect_install_code().times(1).return_const(Ok(())); expect_create_canister_returning( &mut runtime, vec![ORCHESTRATOR_PRINCIPAL], - vec![Err(expected_error.clone())], + vec![Ok(LEDGER_PRINCIPAL), Err(expected_error.clone())], ); + let task = TaskExecution { + task_type: Task::InstallLedgerSuite(usdc_install_args()), + execute_at_ns: 0, + }; assert_eq!( task.execute(&runtime).await, Err(TaskError::CanisterCreationError(expected_error)) @@ -243,9 +240,8 @@ async fn should_not_retry_successful_operation_after_failing_one() { assert_eq!( read_state(|s| s.managed_canisters(&usdc_token_id()).cloned()), Some(Canisters { - ledger: Some(LedgerCanister::new(ManagedCanisterStatus::Installed { - canister_id: LEDGER_PRINCIPAL, - installed_wasm_hash: read_ledger_wasm_hash(), + ledger: Some(LedgerCanister::new(ManagedCanisterStatus::Created { + canister_id: LEDGER_PRINCIPAL })), index: None, archives: vec![], @@ -269,6 +265,36 @@ async fn should_not_retry_successful_operation_after_failing_one() { .times(1) .return_const(Err(expected_error.clone())); + let task = TaskExecution { + task_type: Task::InstallLedgerSuite(usdc_install_args()), + execute_at_ns: 0, + }; + assert_eq!( + task.execute(&runtime).await, + Err(TaskError::InstallCodeError(expected_error)) + ); + assert_eq!( + read_state(|s| s.managed_canisters(&usdc_token_id()).cloned()), + Some(Canisters { + ledger: Some(LedgerCanister::new(ManagedCanisterStatus::Created { + canister_id: LEDGER_PRINCIPAL + })), + index: Some(IndexCanister::new(ManagedCanisterStatus::Created { + canister_id: INDEX_PRINCIPAL + })), + archives: vec![], + metadata: usdc_metadata(), + }) + ); + + runtime.checkpoint(); + runtime.expect_id().return_const(ORCHESTRATOR_PRINCIPAL); + let expected_error = CallError { + method: "install_code".to_string(), + reason: Reason::OutOfCycles, + }; + expect_install_code_returning(&mut runtime, vec![Ok(()), Err(expected_error.clone())]); + assert_eq!( task.execute(&runtime).await, Err(TaskError::InstallCodeError(expected_error)) @@ -325,7 +351,7 @@ async fn should_discard_add_erc20_task_when_ledger_wasm_not_found() { expect_create_canister_returning( &mut runtime, vec![ORCHESTRATOR_PRINCIPAL], - vec![Ok(LEDGER_PRINCIPAL)], + vec![Ok(LEDGER_PRINCIPAL), Ok(INDEX_PRINCIPAL)], ); assert_eq!( @@ -340,7 +366,9 @@ async fn should_discard_add_erc20_task_when_ledger_wasm_not_found() { ledger: Some(LedgerCanister::new(ManagedCanisterStatus::Created { canister_id: LEDGER_PRINCIPAL })), - index: None, + index: Some(IndexCanister::new(ManagedCanisterStatus::Created { + canister_id: INDEX_PRINCIPAL + })), archives: vec![], metadata: usdc_metadata(), }) @@ -1488,6 +1516,25 @@ fn expect_create_canister_returning( }); } +fn expect_install_code_returning( + runtime: &mut MockCanisterRuntime, + results: Vec>, +) { + assert!(!results.is_empty(), "must return at least one result"); + let mut install_code_call_counter = 0_usize; + runtime + .expect_install_code() + .times(results.len()) + .returning(move |_canister_id, _wasm, _args| { + if install_code_call_counter >= results.len() { + panic!("install_code called too many times!"); + } + let result = results[install_code_call_counter].clone(); + install_code_call_counter += 1; + result + }); +} + fn expect_call_canister_add_ckerc20_token( runtime: &mut MockCanisterRuntime, expected_canister_id: Principal, diff --git a/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs b/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs index 74c8837363cc..f57add7d5dd4 100644 --- a/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs +++ b/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs @@ -76,6 +76,10 @@ fn should_spawn_ledger_with_correct_init_args() { "icrc1:max_memo_length".to_string(), LedgerMetadataValue::from(80_u64), ), + ( + "icrc106:index_principal".to_string(), + LedgerMetadataValue::from("ryjl3-tyaaa-aaaaa-aaaba-cai"), + ), ]); } From 3ea51bc9a59f97eef9e4fb612241726270074643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Thu, 17 Apr 2025 17:13:11 +0200 Subject: [PATCH 16/35] Address review comments --- rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs | 6 +++--- rs/ethereum/ledger-suite-orchestrator/tests/tests.rs | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs index 08c27fd9df28..400d4e9763e5 100644 --- a/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs +++ b/rs/ethereum/ledger-suite-orchestrator/src/scheduler/mod.rs @@ -851,7 +851,7 @@ async fn install_ledger_suite( runtime.id().into(), more_controllers, cycles_for_archive_creation, - Some(index_principal), + index_principal, )), runtime, ) @@ -899,7 +899,7 @@ fn icrc1_ledger_init_arg( archive_controller_id: PrincipalId, archive_more_controller_ids: Vec, cycles_for_archive_creation: Nat, - index_principal: Option, + index_principal: Principal, ) -> LedgerInitArgs { use ic_icrc1_ledger::FeatureFlags as LedgerFeatureFlags; use icrc_ledger_types::icrc::generic_metadata_value::MetadataValue as LedgerMetadataValue; @@ -934,7 +934,7 @@ fn icrc1_ledger_init_arg( ), max_memo_length: Some(MAX_MEMO_LENGTH), feature_flags: Some(ICRC2_FEATURE), - index_principal, + index_principal: Some(index_principal), } } diff --git a/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs b/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs index f57add7d5dd4..6a8029f85071 100644 --- a/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs +++ b/rs/ethereum/ledger-suite-orchestrator/tests/tests.rs @@ -36,12 +36,15 @@ fn should_spawn_ledger_with_correct_init_args() { }; let orchestrator = LedgerSuiteOrchestrator::default(); - orchestrator + let managed_canisters_assert = orchestrator .add_erc20_token(AddErc20Arg { contract: usdc_erc20_contract(), ledger_init_arg: realistic_usdc_ledger_init_arg, }) - .expect_new_ledger_and_index_canisters() + .expect_new_ledger_and_index_canisters(); + let index_id = managed_canisters_assert.canister_ids.index.unwrap(); + assert_eq!(index_id, "ryjl3-tyaaa-aaaaa-aaaba-cai".parse().unwrap()); + managed_canisters_assert .assert_ledger_icrc1_fee(2_000_000_000_000_u64) .assert_ledger_icrc1_decimals(6_u8) .assert_ledger_icrc1_name("USD Coin") From 5f5fcd57932919939b23d093ffa68f1df27fd0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 16 May 2025 10:59:32 +0200 Subject: [PATCH 17/35] Add serde_default to new index_principal field in Ledger struct --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 6ad80df364e5..6ebd637323ea 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -601,6 +601,7 @@ pub struct Ledger { #[serde(default)] pub ledger_version: u64, + // #[serde(default)] index_principal: Option, } From f78f6fd52f94c3d0389ffadc450a3aa2f00fd619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 16 May 2025 11:04:36 +0200 Subject: [PATCH 18/35] Beautify code --- rs/ledger_suite/icrc1/ledger/src/main.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 6bf7e5036aa0..787b1f9c4633 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -1081,12 +1081,9 @@ fn icrc10_supported_standards() -> Vec { #[query] #[candid_method(query)] fn icrc106_get_index_principal() -> Result { - Access::with_ledger(|ledger| { - if let Some(index_principal) = ledger.index_principal() { - Ok(index_principal) - } else { - Err(Icrc106Error::IndexPrincipalNotSet) - } + Access::with_ledger(|ledger| match ledger.index_principal() { + None => Err(Icrc106Error::IndexPrincipalNotSet), + Some(index_principal) => Ok(index_principal), }) } From b3ec415bea61659c208e4a85a4887b25d729a2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 16 May 2025 11:04:57 +0200 Subject: [PATCH 19/35] Clean up and improve tests --- rs/ledger_suite/icrc1/ledger/tests/tests.rs | 13 +- .../tests/sm-tests/src/icrc_106.rs | 169 ++++++++++++------ rs/ledger_suite/tests/sm-tests/src/lib.rs | 13 -- 3 files changed, 129 insertions(+), 66 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/tests/tests.rs b/rs/ledger_suite/icrc1/ledger/tests/tests.rs index 98bfdc9edb61..97adf6407d20 100644 --- a/rs/ledger_suite/icrc1/ledger/tests/tests.rs +++ b/rs/ledger_suite/icrc1/ledger/tests/tests.rs @@ -549,7 +549,7 @@ fn encode_icrc106_upgrade_args(index_principal: Option) -> LedgerArgu #[test] fn test_icrc106_unsupported_if_index_not_set() { - ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_unsupported_if_index_not_set( + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_supported_even_if_index_not_set( ledger_wasm(), encode_init_args, encode_icrc106_upgrade_args, @@ -573,6 +573,17 @@ fn test_icrc106_set_index_in_upgrade() { ); } +#[test] +fn test_upgrade_from_mainnet_ledger_version() { + ic_ledger_suite_state_machine_tests::icrc_106::test_upgrade_downgrade_with_mainnet_ledger( + ledger_mainnet_wasm(), + ledger_wasm(), + encode_init_args, + encode_upgrade_args, + encode_icrc106_upgrade_args, + ); +} + // #[test] // fn test_icrc1_test_suite() { // ic_ledger_suite_state_machine_tests::test_icrc1_test_suite(ledger_wasm(), encode_init_args); diff --git a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs index f3da22908e57..9f4bbd267d42 100644 --- a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs +++ b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs @@ -1,6 +1,6 @@ use super::*; -pub fn test_icrc106_unsupported_if_index_not_set( +pub fn test_icrc106_supported_even_if_index_not_set( ledger_wasm: Vec, encode_ledger_init_args: fn(InitArgs) -> T, encode_upgrade_args: fn(Option) -> U, @@ -8,18 +8,6 @@ pub fn test_icrc106_unsupported_if_index_not_set( T: CandidType, U: CandidType, { - fn assert_index_not_set(env: &StateMachine, ledger_canister_id: CanisterId) { - assert_icrc106_supported(env, ledger_canister_id); - assert_eq!( - Err(Icrc106Error::IndexPrincipalNotSet), - icrc106_get_index_principal(env, ledger_canister_id) - ); - assert_eq!( - None, - metadata(env, ledger_canister_id).get("icrc106:index_principal") - ); - } - let env = StateMachine::new(); let ledger_canister_id = env.create_canister(None); let ledger_init_args = encode_ledger_init_args(init_args(vec![])); @@ -30,7 +18,7 @@ pub fn test_icrc106_unsupported_if_index_not_set( ) .expect("should successfully install ledger canister"); - assert_index_not_set(&env, ledger_canister_id); + assert_index_not_set(&env, ledger_canister_id, true); let args = encode_upgrade_args(None); let encoded_upgrade_args = Encode!(&args).unwrap(); @@ -41,7 +29,7 @@ pub fn test_icrc106_unsupported_if_index_not_set( ) .expect("should successfully upgrade ledger canister"); - assert_index_not_set(&env, ledger_canister_id); + assert_index_not_set(&env, ledger_canister_id, true); } pub fn test_icrc106_set_index_in_install( @@ -65,17 +53,7 @@ pub fn test_icrc106_set_index_in_install( ) .expect("should successfully install ledger canister"); - assert_icrc106_supported(&env, ledger_canister_id); - assert_eq!( - Ok(index_principal), - icrc106_get_index_principal(&env, ledger_canister_id) - ); - assert_eq!( - &Value::Text(index_principal.to_text()), - metadata(&env, ledger_canister_id) - .get("icrc106:index_principal") - .expect("should have index principal metadata") - ); + assert_index_set(&env, ledger_canister_id, index_principal); } pub fn test_icrc106_set_index_in_upgrade( @@ -86,31 +64,8 @@ pub fn test_icrc106_set_index_in_upgrade( T: CandidType, U: CandidType, { - fn assert_index_set( - env: &StateMachine, - ledger_canister_id: CanisterId, - index_principal: Principal, - ) { - assert_icrc106_supported(env, ledger_canister_id); - assert_eq!( - Ok(index_principal), - icrc106_get_index_principal(env, ledger_canister_id) - ); - assert_eq!( - &Value::Text(index_principal.to_text()), - metadata(env, ledger_canister_id) - .get("icrc106:index_principal") - .expect("should have index principal metadata") - ); - } - let (env, canister_id) = setup(ledger_wasm.clone(), encode_init_args, vec![]); - assert_icrc106_supported(&env, canister_id); - assert_eq!( - Err(Icrc106Error::IndexPrincipalNotSet), - icrc106_get_index_principal(&env, canister_id) - ); - assert!(!metadata(&env, canister_id).contains_key("icrc106:index_principal")); + assert_index_not_set(&env, canister_id, true); let index_principal = PrincipalId::new_user_test_id(1).0; let args = encode_upgrade_args(Some(index_principal)); @@ -128,7 +83,101 @@ pub fn test_icrc106_set_index_in_upgrade( assert_index_set(&env, canister_id, index_principal); } -fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { +pub fn test_upgrade_downgrade_with_mainnet_ledger( + mainnet_ledger_wasm: Vec, + ledger_wasm: Vec, + encode_init_args: fn(InitArgs) -> T, + encode_empty_upgrade_args: fn() -> U, + encode_upgrade_args: fn(Option) -> U, +) where + T: CandidType, + U: CandidType, +{ + // Install the mainnet ledger canister that does not support ICRC-106 + let (env, canister_id) = setup(mainnet_ledger_wasm.clone(), encode_init_args, vec![]); + assert_index_not_set(&env, canister_id, false); + + // Upgrade to a ledger version that supports ICRC-106, but does not set the index principal + let encoded_empty_upgrade_args = Encode!(&encode_empty_upgrade_args()).unwrap(); + env.upgrade_canister( + canister_id, + ledger_wasm.clone(), + encoded_empty_upgrade_args.clone(), + ) + .expect("should successfully upgrade ledger canister"); + assert_index_not_set(&env, canister_id, true); + + // Self-upgrade to a ledger version and set the index principal + let index_principal = PrincipalId::new_user_test_id(1).0; + let args = encode_upgrade_args(Some(index_principal)); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm.clone(), encoded_upgrade_args) + .expect("should successfully upgrade ledger canister"); + assert_index_set(&env, canister_id, index_principal); + + // Self-upgrade the ledger with empty upgrade args. The index principal should stay set. + let encoded_empty_upgrade_args = Encode!(&encode_empty_upgrade_args()).unwrap(); + env.upgrade_canister( + canister_id, + ledger_wasm.clone(), + encoded_empty_upgrade_args.clone(), + ) + .expect("should successfully self-upgrade ledger canister"); + assert_index_set(&env, canister_id, index_principal); + + // Downgrade the ledger to the mainnet version that does not support ICRC-106 + env.upgrade_canister(canister_id, mainnet_ledger_wasm, encoded_empty_upgrade_args) + .expect("should successfully downgrade ledger canister"); + assert_index_not_set(&env, canister_id, false); + + // Upgrade to a ledger version that supports ICRC-106, but do not set the index principal + let encoded_empty_upgrade_args = Encode!(&encode_empty_upgrade_args()).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm, encoded_empty_upgrade_args) + .expect("should successfully upgrade ledger canister"); + assert_index_not_set(&env, canister_id, true); +} + +fn assert_index_not_set( + env: &StateMachine, + ledger_canister_id: CanisterId, + expect_icrc106_supported: bool, +) { + check_icrc106_support(env, ledger_canister_id, expect_icrc106_supported); + if expect_icrc106_supported { + assert_eq!( + Err(Icrc106Error::IndexPrincipalNotSet), + icrc106_get_index_principal(env, ledger_canister_id) + ); + } + assert_eq!( + None, + metadata(env, ledger_canister_id).get("icrc106:index_principal") + ); +} + +fn assert_index_set( + env: &StateMachine, + ledger_canister_id: CanisterId, + index_principal: Principal, +) { + check_icrc106_support(env, ledger_canister_id, true); + assert_eq!( + Ok(index_principal), + icrc106_get_index_principal(env, ledger_canister_id) + ); + assert_eq!( + &Value::Text(index_principal.to_text()), + metadata(env, ledger_canister_id) + .get("icrc106:index_principal") + .expect("should have index principal metadata") + ); +} + +fn check_icrc106_support( + env: &StateMachine, + canister_id: CanisterId, + expect_icrc106_supported: bool, +) { let mut found = false; for standard in supported_standards(env, canister_id) { if standard.name == "ICRC-106" { @@ -136,5 +185,21 @@ fn assert_icrc106_supported(env: &StateMachine, canister_id: CanisterId) { break; } } - assert!(found, "ICRC-106 should be supported"); + assert_eq!( + found, expect_icrc106_supported, + "ICRC-106 should be supported" + ); +} + +fn icrc106_get_index_principal( + env: &StateMachine, + ledger: CanisterId, +) -> Result { + Decode!( + &env.query(ledger, "icrc106_get_index_principal", Encode!().unwrap()) + .expect("failed to query icrc106_get_index_principal") + .bytes(), + Result + ) + .expect("failed to decode icrc106_get_index_principal response") } diff --git a/rs/ledger_suite/tests/sm-tests/src/lib.rs b/rs/ledger_suite/tests/sm-tests/src/lib.rs index 3a5d1de76160..1b156d55b923 100644 --- a/rs/ledger_suite/tests/sm-tests/src/lib.rs +++ b/rs/ledger_suite/tests/sm-tests/src/lib.rs @@ -290,19 +290,6 @@ fn icrc21_consent_message( .expect("failed to decode icrc21_canister_call_consent_message response") } -fn icrc106_get_index_principal( - env: &StateMachine, - ledger: CanisterId, -) -> Result { - Decode!( - &env.query(ledger, "icrc106_get_index_principal", Encode!().unwrap()) - .expect("failed to query icrc106_get_index_principal") - .bytes(), - Result - ) - .expect("failed to decode icrc106_get_index_principal response") -} - pub fn get_all_ledger_and_archive_blocks( state_machine: &StateMachine, ledger_id: CanisterId, From a981f60acac0b238f5d0acf1fa6d5b1f3ad264de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 12:00:50 +0200 Subject: [PATCH 20/35] Uncomment annotation --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index 23fe84c12b83..f24f1554fe99 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -609,7 +609,7 @@ pub struct Ledger { #[serde(default)] pub ledger_version: u64, - // #[serde(default)] + #[serde(default)] index_principal: Option, } From 42ff066ec18c7fc0e9bbbb8b31004c583a53b55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 13:57:57 +0200 Subject: [PATCH 21/35] Set hardcoded index principal for chain fusion and SNS ledger suites --- rs/ledger_suite/icrc1/ledger/src/lib.rs | 4 + rs/ledger_suite/icrc1/ledger/src/main.rs | 291 ++++++++++++++++++ rs/ledger_suite/icrc1/ledger/tests/tests.rs | 9 + .../tests/golden_state_upgrade_downgrade.rs | 36 ++- .../tests/sm-tests/src/icrc_106.rs | 47 +++ 5 files changed, 386 insertions(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/lib.rs b/rs/ledger_suite/icrc1/ledger/src/lib.rs index f24f1554fe99..4b11b6753c59 100644 --- a/rs/ledger_suite/icrc1/ledger/src/lib.rs +++ b/rs/ledger_suite/icrc1/ledger/src/lib.rs @@ -784,6 +784,10 @@ impl Ledger { pub fn copy_token_pool(&mut self) { self.stable_balances.token_pool = self.balances.token_pool; } + + pub fn set_index_principal(&mut self, index_principal: Principal) { + self.index_principal = Some(index_principal); + } } impl LedgerContext for Ledger { diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 1891082ffc08..3e0ac75d2106 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -260,6 +260,8 @@ fn post_upgrade_internal(args: Option) { initialize_total_volume(); + set_index_principal(); + if upgrade_from_version < 3 { set_ledger_state(LedgerState::Migrating(LedgerField::Blocks)); log_message(format!("Upgrading from version {upgrade_from_version} which does not store blocks in stable structures, clearing stable blocks data.").as_str()); @@ -302,6 +304,295 @@ fn initialize_total_volume() { } } +struct LedgerSuite { + pub name: &'static str, + pub ledger: &'static str, + pub index: &'static str, +} + +const LEDGER_SUITES: &[LedgerSuite; 49] = &[ + // Chain fusion ledger suites + LedgerSuite { + name: "ckBTC", + ledger: "mxzaz-hqaaa-aaaar-qaada-cai", + index: "n5wcd-faaaa-aaaar-qaaea-cai", + }, + LedgerSuite { + name: "ckETH", + ledger: "ss2fx-dyaaa-aaaar-qacoq-cai", + index: "s3zol-vqaaa-aaaar-qacpa-cai", + }, + LedgerSuite { + name: "ckEURC", + ledger: "pe5t5-diaaa-aaaar-qahwa-cai", + index: "pd4vj-oqaaa-aaaar-qahwq-cai", + }, + LedgerSuite { + name: "ckUNI", + ledger: "ilzky-ayaaa-aaaar-qahha-cai", + index: "imymm-naaaa-aaaar-qahhq-cai", + }, + LedgerSuite { + name: "ckWBTC", + ledger: "bptq2-faaaa-aaaar-qagxq-cai", + index: "dso6s-wiaaa-aaaar-qagya-cai", + }, + LedgerSuite { + name: "ckLINK", + ledger: "g4tto-rqaaa-aaaar-qageq-cai", + index: "gvqys-hyaaa-aaaar-qagfa-cai", + }, + LedgerSuite { + name: "ckXAUT", + ledger: "nza5v-qaaaa-aaaar-qahzq-cai", + index: "nmhmy-riaaa-aaaar-qah2a-cai", + }, + LedgerSuite { + name: "ckPEPE", + ledger: "etik7-oiaaa-aaaar-qagia-cai", + index: "eujml-dqaaa-aaaar-qagiq-cai", + }, + LedgerSuite { + name: "ckWSTETH", + ledger: "j2tuh-yqaaa-aaaar-qahcq-cai", + index: "jtq73-oyaaa-aaaar-qahda-cai", + }, + LedgerSuite { + name: "ckSHIB", + ledger: "fxffn-xiaaa-aaaar-qagoa-cai", + index: "fqedz-2qaaa-aaaar-qagoq-cai", + }, + LedgerSuite { + name: "ckUSDC", + ledger: "xevnm-gaaaa-aaaar-qafnq-cai", + index: "xrs4b-hiaaa-aaaar-qafoa-cai", + }, + LedgerSuite { + name: "ckUSDT", + ledger: "cngnf-vqaaa-aaaar-qag4q-cai", + index: "cefgz-dyaaa-aaaar-qag5a-cai", + }, + LedgerSuite { + name: "ckOCT", + ledger: "ebo5g-cyaaa-aaaar-qagla-cai", + index: "egp3s-paaaa-aaaar-qaglq-cai", + }, + // SNSs + LedgerSuite { + name: "ALICE", + ledger: "oj6if-riaaa-aaaaq-aaeha-cai", + index: "mtcaz-pyaaa-aaaaq-aaeia-cai", + }, + LedgerSuite { + name: "BOOM-DAO", + ledger: "vtrom-gqaaa-aaaaq-aabia-cai", + index: "v5tde-5aaaa-aaaaq-aabja-cai", + }, + LedgerSuite { + name: "CATALYZE", + ledger: "uf2wh-taaaa-aaaaq-aabna-cai", + index: "ux4b6-7qaaa-aaaaq-aaboa-cai", + }, + LedgerSuite { + name: "CECIL-THE-LION-DAO", + ledger: "jg2ra-syaaa-aaaaq-aaewa-cai", + index: "jiy4i-jiaaa-aaaaq-aaexa-cai", + }, + LedgerSuite { + name: "DECIDEAI-DAO", + ledger: "xsi2v-cyaaa-aaaaq-aabfq-cai", + index: "xaonm-oiaaa-aaaaq-aabgq-cai", + }, + LedgerSuite { + name: "DOLR-AI", + ledger: "6rdgd-kyaaa-aaaaq-aaavq-cai", + index: "6dfr2-giaaa-aaaaq-aaawq-cai", + }, + LedgerSuite { + name: "DRAGGINZ", + ledger: "zfcdd-tqaaa-aaaaq-aaaga-cai", + index: "zlaol-iaaaa-aaaaq-aaaha-cai", + }, + LedgerSuite { + name: "ELNA-AI", + ledger: "gemj7-oyaaa-aaaaq-aacnq-cai", + index: "gwk6g-ciaaa-aaaaq-aacoq-cai", + }, + LedgerSuite { + name: "ESTATEDAO", + ledger: "bliq2-niaaa-aaaaq-aac4q-cai", + index: "bfk5s-wyaaa-aaaaq-aac5q-cai", + }, + LedgerSuite { + name: "FOMOWELL", + ledger: "o4zzi-qaaaa-aaaaq-aaeeq-cai", + index: "os3ua-lqaaa-aaaaq-aaefq-cai", + }, + LedgerSuite { + name: "FUELEV", + ledger: "nfjys-2iaaa-aaaaq-aaena-cai", + index: "nxppl-wyaaa-aaaaq-aaeoa-cai", + }, + LedgerSuite { + name: "GOLD-DAO", + ledger: "tyyy3-4aaaa-aaaaq-aab7a-cai", + index: "efv5g-kqaaa-aaaaq-aacaa-cai", + }, + LedgerSuite { + name: "IC-EXPLORER", + ledger: "ifwyg-gaaaa-aaaaq-aaeqq-cai", + index: "iluvo-5qaaa-aaaaq-aaerq-cai", + }, + LedgerSuite { + name: "ICFC", + ledger: "ddsp7-7iaaa-aaaaq-aacqq-cai", + index: "dnqcx-eyaaa-aaaaq-aacrq-cai", + }, + LedgerSuite { + name: "ICLIGHTHOUSE-DAO", + ledger: "hhaaz-2aaaa-aaaaq-aacla-cai", + index: "gnpcd-yqaaa-aaaaq-aacma-cai", + }, + LedgerSuite { + name: "ICPANDA", + ledger: "druyg-tyaaa-aaaaq-aactq-cai", + index: "c3324-riaaa-aaaaq-aacuq-cai", + }, + LedgerSuite { + name: "ICPEX", + ledger: "lvfsa-2aaaa-aaaaq-aaeyq-cai", + index: "l3h7i-bqaaa-aaaaq-aaezq-cai", + }, + LedgerSuite { + name: "ICPSWAP", + ledger: "ca6gz-lqaaa-aaaaq-aacwa-cai", + index: "co4lr-qaaaa-aaaaq-aacxa-cai", + }, + LedgerSuite { + name: "ICVC", + ledger: "m6xut-mqaaa-aaaaq-aadua-cai", + index: "mqvz3-xaaaa-aaaaq-aadva-cai", + }, + LedgerSuite { + name: "KINIC", + ledger: "73mez-iiaaa-aaaaq-aaasq-cai", + index: "7vojr-tyaaa-aaaaq-aaatq-cai", + }, + LedgerSuite { + name: "KONGSWAP", + ledger: "o7oak-iyaaa-aaaaq-aadzq-cai", + index: "onixt-eiaaa-aaaaq-aad2q-cai", + }, + LedgerSuite { + name: "MIMIC", + ledger: "4c4fd-caaaa-aaaaq-aaa3a-cai", + index: "5ithz-aqaaa-aaaaq-aaa4a-cai", + }, + LedgerSuite { + name: "MOTOKO", + ledger: "k45jy-aiaaa-aaaaq-aadcq-cai", + index: "ks7eq-3yaaa-aaaaq-aaddq-cai", + }, + LedgerSuite { + name: "NEUTRINITE", + ledger: "f54if-eqaaa-aaaaq-aacea-cai", + index: "ft6fn-7aaaa-aaaaq-aacfa-cai", + }, + LedgerSuite { + name: "NFID-WALLET", + ledger: "mih44-vaaaa-aaaaq-aaekq-cai", + index: "mgfru-oqaaa-aaaaq-aaelq-cai", + }, + LedgerSuite { + name: "NUANCE", + ledger: "rxdbk-dyaaa-aaaaq-aabtq-cai", + index: "q5mdq-biaaa-aaaaq-aabuq-cai", + }, + LedgerSuite { + name: "OPENCHAT", + ledger: "2ouva-viaaa-aaaaq-aaamq-cai", + index: "2awyi-oyaaa-aaaaq-aaanq-cai", + }, + LedgerSuite { + name: "ORIGYN", + ledger: "lkwrt-vyaaa-aaaaq-aadhq-cai", + index: "jqkzp-liaaa-aaaaq-aadiq-cai", + }, + LedgerSuite { + name: "PERSONAL-DAO", + ledger: "ixqp7-kqaaa-aaaaq-aaetq-cai", + index: "j57nf-iaaaa-aaaaq-aaeuq-cai", + }, + LedgerSuite { + name: "POKEDBOTS", + ledger: "np5km-uyaaa-aaaaq-aadrq-cai", + index: "n535v-yiaaa-aaaaq-aadsq-cai", + }, + LedgerSuite { + name: "SNEED", + ledger: "hvgxa-wqaaa-aaaaq-aacia-cai", + index: "h3e2i-naaaa-aaaaq-aacja-cai", + }, + LedgerSuite { + name: "SONIC", + ledger: "qbizb-wiaaa-aaaaq-aabwq-cai", + index: "qpkuj-nyaaa-aaaaq-aabxq-cai", + }, + LedgerSuite { + name: "SWAMPIES", + ledger: "lrtnw-paaaa-aaaaq-aadfa-cai", + index: "ldv2p-dqaaa-aaaaq-aadga-cai", + }, + LedgerSuite { + name: "TRAX", + ledger: "emww2-4yaaa-aaaaq-aacbq-cai", + index: "e6qbd-qiaaa-aaaaq-aaccq-cai", + }, + LedgerSuite { + name: "WATERNEURON", + ledger: "jcmow-hyaaa-aaaaq-aadlq-cai", + index: "iidmm-fiaaa-aaaaq-aadmq-cai", + }, + LedgerSuite { + name: "YUKU-AI", + ledger: "atbfz-diaaa-aaaaq-aacyq-cai", + index: "a5dir-yyaaa-aaaaq-aaczq-cai", + }, +]; + +/// Set the principal of the index canister corresponding to this ledger canister. +/// This will only set the index principal if: +/// - The index principal is not already set. +/// - The ledger principal of the current canister is found in the list of ledgers. +fn set_index_principal() { + let index_principal = Access::with_ledger(|ledger| ledger.index_principal()); + if index_principal.is_none() { + let ledger_canister_id = ic_cdk::api::id().to_string(); + for suite in LEDGER_SUITES { + if ledger_canister_id == suite.ledger { + Access::with_ledger_mut(|ledger| { + let index_principal = Principal::from_text(suite.index).unwrap_or_else(|err| { + ic_cdk::trap(&format!( + "unable to parse index principal for {} from {}: {}", + suite.name, suite.index, err + )) + }); + ledger.set_index_principal(index_principal); + log_message(&format!( + "Set index principal of ledger canister {} for {} to {}", + suite.ledger, suite.name, suite.index + )); + }); + return; + } + } + log_message(&format!( + "Not setting index principal of ledger canister {}", + ledger_canister_id + )); + } +} + fn migrate_next_part(instruction_limit: u64) { let instructions_migration_start = instruction_counter(); STABLE_UPGRADE_MIGRATION_STEPS.with(|n| *n.borrow_mut() += 1); diff --git a/rs/ledger_suite/icrc1/ledger/tests/tests.rs b/rs/ledger_suite/icrc1/ledger/tests/tests.rs index c92089472538..1fb876c5502f 100644 --- a/rs/ledger_suite/icrc1/ledger/tests/tests.rs +++ b/rs/ledger_suite/icrc1/ledger/tests/tests.rs @@ -605,6 +605,15 @@ fn test_icrc106_set_index_in_upgrade() { ); } +#[test] +fn test_icrc106_set_hardcoded_index_in_upgrade() { + ic_ledger_suite_state_machine_tests::icrc_106::test_icrc106_set_hardcoded_index_in_upgrade( + ledger_wasm(), + encode_init_args, + encode_icrc106_upgrade_args, + ); +} + #[test] fn test_upgrade_from_mainnet_ledger_version() { ic_ledger_suite_state_machine_tests::icrc_106::test_upgrade_downgrade_with_mainnet_ledger( diff --git a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs index c2155010c639..18a4e611da6d 100644 --- a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs +++ b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs @@ -1,6 +1,6 @@ use crate::common::{index_ng_wasm, ledger_wasm, load_wasm_using_env_var}; use crate::index::verify_ledger_archive_and_index_block_parity; -use candid::{Encode, Nat, Principal}; +use candid::{Decode, Encode, Nat, Principal}; use canister_test::Wasm; use ic_base_types::{CanisterId, PrincipalId}; use ic_icrc1::Block; @@ -16,6 +16,7 @@ use ic_ledger_suite_state_machine_tests::{ use ic_nns_test_utils_golden_nns_state::new_state_machine_with_golden_fiduciary_state_or_panic; use ic_state_machine_tests::{StateMachine, UserError}; use icrc_ledger_types::icrc1::account::Account; +use icrc_ledger_types::icrc106::errors::Icrc106Error; use lazy_static::lazy_static; use std::str::FromStr; @@ -211,6 +212,8 @@ impl LedgerSuiteConfig { previous_ledger_state, )); } + // Verify that the index principal was set in the ledger + self.check_index_principal(state_machine, ledger_canister_id, index_canister_id); // Downgrade back to the mainnet canister versions self.downgrade_to_mainnet(state_machine); if self.extended_testing { @@ -224,6 +227,37 @@ impl LedgerSuiteConfig { } } + fn check_index_principal( + &self, + env: &StateMachine, + ledger_canister_id: CanisterId, + index_canister_id: CanisterId, + ) { + match Decode!( + &env.query(ledger_canister_id, "icrc106_get_index_principal", Encode!().unwrap()) + .expect("failed to query icrc106_get_index_principal") + .bytes(), + Result + ) + .expect("failed to decode icrc106_get_index_principal response") + { + Ok(index_principal) => { + assert_eq!( + index_principal, + index_canister_id.get().0, + "Index principal does not match index canister id" + ) + } + Err(err) => { + panic!( + "Failed to get index principal for ledger {}: {:?}", + ledger_canister_id.to_string(), + err + ); + } + } + } + fn print_ledger_metrics(&self, state_machine: &StateMachine) { let ledger_id = CanisterId::unchecked_from_principal(PrincipalId::from_str(self.ledger_id).unwrap()); diff --git a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs index 9f4bbd267d42..8fb021a8c689 100644 --- a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs +++ b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs @@ -1,4 +1,6 @@ use super::*; +use ic_state_machine_tests::StateMachineBuilder; +use std::str::FromStr; pub fn test_icrc106_supported_even_if_index_not_set( ledger_wasm: Vec, @@ -83,6 +85,51 @@ pub fn test_icrc106_set_index_in_upgrade( assert_index_set(&env, canister_id, index_principal); } +pub fn test_icrc106_set_hardcoded_index_in_upgrade( + ledger_wasm: Vec, + encode_init_args: fn(InitArgs) -> T, + encode_upgrade_args: fn(Option) -> U, +) where + T: CandidType, + U: CandidType, +{ + let env = StateMachineBuilder::new() + .with_extra_canister_range(std::ops::RangeInclusive::::new( + CanisterId::from_u64(0x2300000), + CanisterId::from_u64(0x23FFFFE), + )) + .build(); + let ck_eth_ledger_principal_id = PrincipalId::from_str("ss2fx-dyaaa-aaaar-qacoq-cai") + .expect("should parse canister ID from string"); + let canister_id = + env.create_canister_with_cycles(Some(ck_eth_ledger_principal_id), Cycles::zero(), None); + let ledger_init_args = encode_init_args(init_args(vec![])); + env.install_existing_canister( + canister_id, + ledger_wasm.clone(), + Encode!(&ledger_init_args).unwrap(), + ) + .expect("should successfully install ledger canister"); + + assert_index_not_set(&env, canister_id, true); + + let args = encode_upgrade_args(None); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm.clone(), encoded_upgrade_args) + .expect("should successfully upgrade ledger canister"); + // The index should now be set + let ck_eth_index_principal_id = Principal::from_str("s3zol-vqaaa-aaaar-qacpa-cai") + .expect("should parse canister ID from string"); + assert_index_set(&env, canister_id, ck_eth_index_principal_id); + + let args = encode_upgrade_args(None); + let encoded_upgrade_args = Encode!(&args).unwrap(); + env.upgrade_canister(canister_id, ledger_wasm, encoded_upgrade_args) + .expect("should successfully upgrade ledger canister"); + // Passing `None` should not change the previously set index + assert_index_set(&env, canister_id, ck_eth_index_principal_id); +} + pub fn test_upgrade_downgrade_with_mainnet_ledger( mainnet_ledger_wasm: Vec, ledger_wasm: Vec, From d5e8ad289cff166475eaa31521aeb6a08a1f7ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 15:07:41 +0200 Subject: [PATCH 22/35] Add ck test tokens --- rs/ledger_suite/icrc1/ledger/src/main.rs | 28 +++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 3e0ac75d2106..855557550f44 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -310,7 +310,7 @@ struct LedgerSuite { pub index: &'static str, } -const LEDGER_SUITES: &[LedgerSuite; 49] = &[ +const LEDGER_SUITES: &[LedgerSuite; 54] = &[ // Chain fusion ledger suites LedgerSuite { name: "ckBTC", @@ -377,6 +377,32 @@ const LEDGER_SUITES: &[LedgerSuite; 49] = &[ ledger: "ebo5g-cyaaa-aaaar-qagla-cai", index: "egp3s-paaaa-aaaar-qaglq-cai", }, + // Chain fusion test tokens + LedgerSuite { + name: "ckTestBTC", + ledger: "mc6ru-gyaaa-aaaar-qaaaq-cai", + index: "mm444-5iaaa-aaaar-qaabq-cai", + }, + LedgerSuite { + name: "ckSepoliaETH", + ledger: "apia6-jaaaa-aaaar-qabma-cai", + index: "sh5u2-cqaaa-aaaar-qacna-cai", + }, + LedgerSuite { + name: "ckSepoliaUSDC", + ledger: "yfumr-cyaaa-aaaar-qaela-cai", + index: "ycvkf-paaaa-aaaar-qaelq-cai", + }, + LedgerSuite { + name: "ckSepoliaLINK", + ledger: "r52mc-qaaaa-aaaar-qafzq-cai", + index: "ri55p-riaaa-aaaar-qaf2a-cai", + }, + LedgerSuite { + name: "ckSepoliaPEPE", + ledger: "hw4ru-taaaa-aaaar-qagdq-cai", + index: "g3sv2-4iaaa-aaaar-qagea-cai", + }, // SNSs LedgerSuite { name: "ALICE", From 4108e28d0f01573455443b21cbe5041e5dc7547b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 15:11:11 +0200 Subject: [PATCH 23/35] Clippy --- rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs index 18a4e611da6d..8a16897e79d0 100644 --- a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs +++ b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs @@ -251,8 +251,7 @@ impl LedgerSuiteConfig { Err(err) => { panic!( "Failed to get index principal for ledger {}: {:?}", - ledger_canister_id.to_string(), - err + ledger_canister_id, err ); } } From c2c58e9c0dac2076ae81d2ecfd04f107b9406a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 15:48:25 +0200 Subject: [PATCH 24/35] Update SNSs in golden state test --- rs/ledger_suite/icrc1/ledger/src/main.rs | 7 +- .../tests/golden_state_upgrade_downgrade.rs | 70 +++++++++++++------ 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 855557550f44..a1020911342a 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -310,7 +310,7 @@ struct LedgerSuite { pub index: &'static str, } -const LEDGER_SUITES: &[LedgerSuite; 54] = &[ +const LEDGER_SUITES: &[LedgerSuite; 55] = &[ // Chain fusion ledger suites LedgerSuite { name: "ckBTC", @@ -554,6 +554,11 @@ const LEDGER_SUITES: &[LedgerSuite; 54] = &[ ledger: "np5km-uyaaa-aaaaq-aadrq-cai", index: "n535v-yiaaa-aaaaq-aadsq-cai", }, + LedgerSuite { + name: "SEERS", + ledger: "rffwt-piaaa-aaaaq-aabqq-cai", + index: "rlh33-uyaaa-aaaaq-aabrq-cai", + }, LedgerSuite { name: "SNEED", ledger: "hvgxa-wqaaa-aaaaq-aacia-cai", diff --git a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs index 8a16897e79d0..ab77de9b64a1 100644 --- a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs +++ b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs @@ -724,20 +724,20 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "ux4b6-7qaaa-aaaaq-aaboa-cai", "Catalyze", ); + const CECIL_THE_LION_DAO_LEDGER_SUITE: (&str, &str, &str) = ( + "jg2ra-syaaa-aaaaq-aaewa-cai", + "jiy4i-jiaaa-aaaaq-aaexa-cai", + "Cecil The Lion DAO", + ); const DECIDEAI_LEDGER_SUITE: (&str, &str, &str) = ( "xsi2v-cyaaa-aaaaq-aabfq-cai", "xaonm-oiaaa-aaaaq-aabgq-cai", "DecideAI", ); - const DOGMI_LEDGER_SUITE: (&str, &str, &str) = ( - "np5km-uyaaa-aaaaq-aadrq-cai", - "n535v-yiaaa-aaaaq-aadsq-cai", - "DOGMI", - ); const DOLR_AI_LEDGER_SUITE: (&str, &str, &str) = ( "6rdgd-kyaaa-aaaaq-aaavq-cai", "6dfr2-giaaa-aaaaq-aaawq-cai", - "YRAL", + "DOLR", ); const DRAGGINZ_LEDGER_SUITE: (&str, &str, &str) = ( "zfcdd-tqaaa-aaaaq-aaaga-cai", @@ -769,10 +769,15 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "efv5g-kqaaa-aaaaq-aacaa-cai", "GoldDAO", ); - const ICGHOST_LEDGER_SUITE: (&str, &str, &str) = ( - "4c4fd-caaaa-aaaaq-aaa3a-cai", - "5ithz-aqaaa-aaaaq-aaa4a-cai", - "ICGhost", + const IC_EXPLORER_LEDGER_SUITE: (&str, &str, &str) = ( + "ifwyg-gaaaa-aaaaq-aaeqq-cai", + "iluvo-5qaaa-aaaaq-aaerq-cai", + "IC Explorer", + ); + const ICFC_LEDGER_SUITE: (&str, &str, &str) = ( + "ddsp7-7iaaa-aaaaq-aacqq-cai", + "dnqcx-eyaaa-aaaaq-aacrq-cai", + "ICFC", ); const ICLIGHTHOUSE_LEDGER_SUITE: (&str, &str, &str) = ( "hhaaz-2aaaa-aaaaq-aacla-cai", @@ -784,10 +789,10 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "c3324-riaaa-aaaaq-aacuq-cai", "ICPanda DAO", ); - const ICPCC_LEDGER_SUITE: (&str, &str, &str) = ( - "lrtnw-paaaa-aaaaq-aadfa-cai", - "ldv2p-dqaaa-aaaaq-aadga-cai", - "ICPCC DAO LLC", + const ICPEX_LEDGER_SUITE: (&str, &str, &str) = ( + "lvfsa-2aaaa-aaaaq-aaeyq-cai", + "l3h7i-bqaaa-aaaaq-aaezq-cai", + "ICPEX", ); const ICPSWAP_LEDGER_SUITE: (&str, &str, &str) = ( "ca6gz-lqaaa-aaaaq-aacwa-cai", @@ -809,6 +814,11 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "onixt-eiaaa-aaaaq-aad2q-cai", "KongSwap", ); + const MIMIC_LEDGER_SUITE: (&str, &str, &str) = ( + "4c4fd-caaaa-aaaaq-aaa3a-cai", + "5ithz-aqaaa-aaaaq-aaa4a-cai", + "Mimic", + ); const MOTOKO_LEDGER_SUITE: (&str, &str, &str) = ( "k45jy-aiaaa-aaaaq-aadcq-cai", "ks7eq-3yaaa-aaaaq-aaddq-cai", @@ -834,16 +844,21 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "2awyi-oyaaa-aaaaq-aaanq-cai", "OpenChat", ); - const OPENFPL_LEDGER_SUITE: (&str, &str, &str) = ( - "ddsp7-7iaaa-aaaaq-aacqq-cai", - "dnqcx-eyaaa-aaaaq-aacrq-cai", - "OpenFPL", - ); const ORIGYN_LEDGER_SUITE: (&str, &str, &str) = ( "lkwrt-vyaaa-aaaaq-aadhq-cai", "jqkzp-liaaa-aaaaq-aadiq-cai", "Origyn", ); + const PERSONAL_DAO_LEDGER_SUITE: (&str, &str, &str) = ( + "ixqp7-kqaaa-aaaaq-aaetq-cai", + "j57nf-iaaaa-aaaaq-aaeuq-cai", + "Personal DAO", + ); + const POKEDBOTS_LEDGER_SUITE: (&str, &str, &str) = ( + "np5km-uyaaa-aaaaq-aadrq-cai", + "n535v-yiaaa-aaaaq-aadsq-cai", + "PokedBots", + ); const SEERS_LEDGER_SUITE: (&str, &str, &str) = ( "rffwt-piaaa-aaaaq-aabqq-cai", "rlh33-uyaaa-aaaaq-aabrq-cai", @@ -859,6 +874,11 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "qpkuj-nyaaa-aaaaq-aabxq-cai", "Sonic", ); + const SWAMPIES_LEDGER_SUITE: (&str, &str, &str) = ( + "lrtnw-paaaa-aaaaq-aadfa-cai", + "ldv2p-dqaaa-aaaaq-aadga-cai", + "Swampies", + ); const TRAX_LEDGER_SUITE: (&str, &str, &str) = ( "emww2-4yaaa-aaaaq-aacbq-cai", "e6qbd-qiaaa-aaaaq-aaccq-cai", @@ -886,8 +906,8 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { ALICE_LEDGER_SUITE, BOOMDAO_LEDGER_SUITE, CATALYZE_LEDGER_SUITE, + CECIL_THE_LION_DAO_LEDGER_SUITE, DECIDEAI_LEDGER_SUITE, - DOGMI_LEDGER_SUITE, DOLR_AI_LEDGER_SUITE, DRAGGINZ_LEDGER_SUITE, ELNAAI_LEDGER_SUITE, @@ -895,23 +915,27 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { FOMOWELL_LEDGER_SUITE, // FUEL_EV_LEDGER_SUITE, // Skipping FuelEV for now, as the index canister was uninstalled GOLDDAO_LEDGER_SUITE, - ICGHOST_LEDGER_SUITE, + IC_EXPLORER_LEDGER_SUITE, + ICFC_LEDGER_SUITE, ICLIGHTHOUSE_LEDGER_SUITE, ICPANDA_LEDGER_SUITE, - ICPCC_LEDGER_SUITE, + ICPEX_LEDGER_SUITE, ICPSWAP_LEDGER_SUITE, ICVC_LEDGER_SUITE, KINIC_LEDGER_SUITE, KONG_SWAP_LEDGER_SUITE, + MIMIC_LEDGER_SUITE, MOTOKO_LEDGER_SUITE, NEUTRINITE_LEDGER_SUITE, NFID_WALLET_LEDGER_SUITE, NUANCE_LEDGER_SUITE, - OPENFPL_LEDGER_SUITE, ORIGYN_LEDGER_SUITE, + PERSONAL_DAO_LEDGER_SUITE, + POKEDBOTS_LEDGER_SUITE, SEERS_LEDGER_SUITE, SNEED_LEDGER_SUITE, SONIC_LEDGER_SUITE, + SWAMPIES_LEDGER_SUITE, TRAX_LEDGER_SUITE, WATERNEURON_LEDGER_SUITE, YUKU_LEDGER_SUITE, From ede3216db6415125c8d452618351407fb0782767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 16:19:51 +0200 Subject: [PATCH 25/35] Bump size limit of ic-icrc1-ledger.wasm.gz --- publish/canisters/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publish/canisters/BUILD.bazel b/publish/canisters/BUILD.bazel index 767d97231642..c94d8fea81bd 100644 --- a/publish/canisters/BUILD.bazel +++ b/publish/canisters/BUILD.bazel @@ -68,7 +68,7 @@ CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { # The compressed version of these two canisters should be ~600kb, # we are setting the check to 7 to leave some space for growth # but enough to get an alert in case of a spike in size. - "ic-icrc1-ledger.wasm.gz": 7, + "ic-icrc1-ledger.wasm.gz": 8, # The size is currently at 704585 bytes. "ic-icrc1-ledger-u256.wasm.gz": 8, # Size when constraint addded: 841_234 bytes From c5f4fb44a790d6d333be0633c432173a7669b10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Wed, 21 May 2025 18:36:43 +0200 Subject: [PATCH 26/35] Empty commit to trigger tests From 3d0f8b1ef10072bf8b0c4370977334d018a3e849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 23 May 2025 13:23:29 +0200 Subject: [PATCH 27/35] Update comment --- publish/canisters/BUILD.bazel | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/publish/canisters/BUILD.bazel b/publish/canisters/BUILD.bazel index c94d8fea81bd..b60e3d3e8287 100644 --- a/publish/canisters/BUILD.bazel +++ b/publish/canisters/BUILD.bazel @@ -65,11 +65,12 @@ DEFAULT_CANISTERS_MAX_SIZE_E5_BYTES = 21 CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { # -- FI team -- - # The compressed version of these two canisters should be ~600kb, - # we are setting the check to 7 to leave some space for growth + # The compressed version of these two canisters should be ~700kb, + # we are setting the check to 8 to leave some space for growth # but enough to get an alert in case of a spike in size. + # The size is currently at 703015 bytes. "ic-icrc1-ledger.wasm.gz": 8, - # The size is currently at 704585 bytes. + # The size is currently at 717862 bytes. "ic-icrc1-ledger-u256.wasm.gz": 8, # Size when constraint addded: 841_234 bytes "ledger-canister.wasm.gz": 9, From 02336363e1db94960b8933fc91e0e32242a13add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Tue, 27 May 2025 09:47:41 +0200 Subject: [PATCH 28/35] Add recently launched TACO DAO SNS and split ledger suites into separate lists for u64 and u256 --- rs/ledger_suite/icrc1/ledger/src/main.rs | 174 ++++++++++-------- .../tests/golden_state_upgrade_downgrade.rs | 6 + .../tests/sm-tests/src/icrc_106.rs | 28 ++- 3 files changed, 121 insertions(+), 87 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index a1020911342a..4f38c996e1dc 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -310,99 +310,20 @@ struct LedgerSuite { pub index: &'static str, } -const LEDGER_SUITES: &[LedgerSuite; 55] = &[ +#[cfg(not(feature = "u256-tokens"))] +const LEDGER_SUITES: &[LedgerSuite; 40] = &[ // Chain fusion ledger suites LedgerSuite { name: "ckBTC", ledger: "mxzaz-hqaaa-aaaar-qaada-cai", index: "n5wcd-faaaa-aaaar-qaaea-cai", }, - LedgerSuite { - name: "ckETH", - ledger: "ss2fx-dyaaa-aaaar-qacoq-cai", - index: "s3zol-vqaaa-aaaar-qacpa-cai", - }, - LedgerSuite { - name: "ckEURC", - ledger: "pe5t5-diaaa-aaaar-qahwa-cai", - index: "pd4vj-oqaaa-aaaar-qahwq-cai", - }, - LedgerSuite { - name: "ckUNI", - ledger: "ilzky-ayaaa-aaaar-qahha-cai", - index: "imymm-naaaa-aaaar-qahhq-cai", - }, - LedgerSuite { - name: "ckWBTC", - ledger: "bptq2-faaaa-aaaar-qagxq-cai", - index: "dso6s-wiaaa-aaaar-qagya-cai", - }, - LedgerSuite { - name: "ckLINK", - ledger: "g4tto-rqaaa-aaaar-qageq-cai", - index: "gvqys-hyaaa-aaaar-qagfa-cai", - }, - LedgerSuite { - name: "ckXAUT", - ledger: "nza5v-qaaaa-aaaar-qahzq-cai", - index: "nmhmy-riaaa-aaaar-qah2a-cai", - }, - LedgerSuite { - name: "ckPEPE", - ledger: "etik7-oiaaa-aaaar-qagia-cai", - index: "eujml-dqaaa-aaaar-qagiq-cai", - }, - LedgerSuite { - name: "ckWSTETH", - ledger: "j2tuh-yqaaa-aaaar-qahcq-cai", - index: "jtq73-oyaaa-aaaar-qahda-cai", - }, - LedgerSuite { - name: "ckSHIB", - ledger: "fxffn-xiaaa-aaaar-qagoa-cai", - index: "fqedz-2qaaa-aaaar-qagoq-cai", - }, - LedgerSuite { - name: "ckUSDC", - ledger: "xevnm-gaaaa-aaaar-qafnq-cai", - index: "xrs4b-hiaaa-aaaar-qafoa-cai", - }, - LedgerSuite { - name: "ckUSDT", - ledger: "cngnf-vqaaa-aaaar-qag4q-cai", - index: "cefgz-dyaaa-aaaar-qag5a-cai", - }, - LedgerSuite { - name: "ckOCT", - ledger: "ebo5g-cyaaa-aaaar-qagla-cai", - index: "egp3s-paaaa-aaaar-qaglq-cai", - }, // Chain fusion test tokens LedgerSuite { name: "ckTestBTC", ledger: "mc6ru-gyaaa-aaaar-qaaaq-cai", index: "mm444-5iaaa-aaaar-qaabq-cai", }, - LedgerSuite { - name: "ckSepoliaETH", - ledger: "apia6-jaaaa-aaaar-qabma-cai", - index: "sh5u2-cqaaa-aaaar-qacna-cai", - }, - LedgerSuite { - name: "ckSepoliaUSDC", - ledger: "yfumr-cyaaa-aaaar-qaela-cai", - index: "ycvkf-paaaa-aaaar-qaelq-cai", - }, - LedgerSuite { - name: "ckSepoliaLINK", - ledger: "r52mc-qaaaa-aaaar-qafzq-cai", - index: "ri55p-riaaa-aaaar-qaf2a-cai", - }, - LedgerSuite { - name: "ckSepoliaPEPE", - ledger: "hw4ru-taaaa-aaaar-qagdq-cai", - index: "g3sv2-4iaaa-aaaar-qagea-cai", - }, // SNSs LedgerSuite { name: "ALICE", @@ -574,6 +495,11 @@ const LEDGER_SUITES: &[LedgerSuite; 55] = &[ ledger: "lrtnw-paaaa-aaaaq-aadfa-cai", index: "ldv2p-dqaaa-aaaaq-aadga-cai", }, + LedgerSuite { + name: "TACO-DAO", + ledger: "kknbx-zyaaa-aaaaq-aae4a-cai", + index: "kepm7-ciaaa-aaaaq-aae5a-cai", + }, LedgerSuite { name: "TRAX", ledger: "emww2-4yaaa-aaaaq-aacbq-cai", @@ -591,6 +517,92 @@ const LEDGER_SUITES: &[LedgerSuite; 55] = &[ }, ]; +#[cfg(feature = "u256-tokens")] +const LEDGER_SUITES: &[LedgerSuite; 16] = &[ + // Chain fusion ledger suites + LedgerSuite { + name: "ckETH", + ledger: "ss2fx-dyaaa-aaaar-qacoq-cai", + index: "s3zol-vqaaa-aaaar-qacpa-cai", + }, + LedgerSuite { + name: "ckEURC", + ledger: "pe5t5-diaaa-aaaar-qahwa-cai", + index: "pd4vj-oqaaa-aaaar-qahwq-cai", + }, + LedgerSuite { + name: "ckUNI", + ledger: "ilzky-ayaaa-aaaar-qahha-cai", + index: "imymm-naaaa-aaaar-qahhq-cai", + }, + LedgerSuite { + name: "ckWBTC", + ledger: "bptq2-faaaa-aaaar-qagxq-cai", + index: "dso6s-wiaaa-aaaar-qagya-cai", + }, + LedgerSuite { + name: "ckLINK", + ledger: "g4tto-rqaaa-aaaar-qageq-cai", + index: "gvqys-hyaaa-aaaar-qagfa-cai", + }, + LedgerSuite { + name: "ckXAUT", + ledger: "nza5v-qaaaa-aaaar-qahzq-cai", + index: "nmhmy-riaaa-aaaar-qah2a-cai", + }, + LedgerSuite { + name: "ckPEPE", + ledger: "etik7-oiaaa-aaaar-qagia-cai", + index: "eujml-dqaaa-aaaar-qagiq-cai", + }, + LedgerSuite { + name: "ckWSTETH", + ledger: "j2tuh-yqaaa-aaaar-qahcq-cai", + index: "jtq73-oyaaa-aaaar-qahda-cai", + }, + LedgerSuite { + name: "ckSHIB", + ledger: "fxffn-xiaaa-aaaar-qagoa-cai", + index: "fqedz-2qaaa-aaaar-qagoq-cai", + }, + LedgerSuite { + name: "ckUSDC", + ledger: "xevnm-gaaaa-aaaar-qafnq-cai", + index: "xrs4b-hiaaa-aaaar-qafoa-cai", + }, + LedgerSuite { + name: "ckUSDT", + ledger: "cngnf-vqaaa-aaaar-qag4q-cai", + index: "cefgz-dyaaa-aaaar-qag5a-cai", + }, + LedgerSuite { + name: "ckOCT", + ledger: "ebo5g-cyaaa-aaaar-qagla-cai", + index: "egp3s-paaaa-aaaar-qaglq-cai", + }, + // Chain fusion test tokens + LedgerSuite { + name: "ckSepoliaETH", + ledger: "apia6-jaaaa-aaaar-qabma-cai", + index: "sh5u2-cqaaa-aaaar-qacna-cai", + }, + LedgerSuite { + name: "ckSepoliaUSDC", + ledger: "yfumr-cyaaa-aaaar-qaela-cai", + index: "ycvkf-paaaa-aaaar-qaelq-cai", + }, + LedgerSuite { + name: "ckSepoliaLINK", + ledger: "r52mc-qaaaa-aaaar-qafzq-cai", + index: "ri55p-riaaa-aaaar-qaf2a-cai", + }, + LedgerSuite { + name: "ckSepoliaPEPE", + ledger: "hw4ru-taaaa-aaaar-qagdq-cai", + index: "g3sv2-4iaaa-aaaar-qagea-cai", + }, +]; + /// Set the principal of the index canister corresponding to this ledger canister. /// This will only set the index principal if: /// - The index principal is not already set. diff --git a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs index ab77de9b64a1..0997cc97856b 100644 --- a/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs +++ b/rs/ledger_suite/icrc1/tests/golden_state_upgrade_downgrade.rs @@ -879,6 +879,11 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { "ldv2p-dqaaa-aaaaq-aadga-cai", "Swampies", ); + const TACO_LEDGER_SUITE: (&str, &str, &str) = ( + "kknbx-zyaaa-aaaaq-aae4a-cai", + "kepm7-ciaaa-aaaaq-aae5a-cai", + "TACO DAO", + ); const TRAX_LEDGER_SUITE: (&str, &str, &str) = ( "emww2-4yaaa-aaaaq-aacbq-cai", "e6qbd-qiaaa-aaaaq-aaccq-cai", @@ -936,6 +941,7 @@ fn should_upgrade_icrc_sns_canisters_with_golden_state() { SNEED_LEDGER_SUITE, SONIC_LEDGER_SUITE, SWAMPIES_LEDGER_SUITE, + TACO_LEDGER_SUITE, TRAX_LEDGER_SUITE, WATERNEURON_LEDGER_SUITE, YUKU_LEDGER_SUITE, diff --git a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs index 8fb021a8c689..08b34ed0aa89 100644 --- a/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs +++ b/rs/ledger_suite/tests/sm-tests/src/icrc_106.rs @@ -99,10 +99,18 @@ pub fn test_icrc106_set_hardcoded_index_in_upgrade( CanisterId::from_u64(0x23FFFFE), )) .build(); - let ck_eth_ledger_principal_id = PrincipalId::from_str("ss2fx-dyaaa-aaaar-qacoq-cai") + + #[cfg(not(feature = "u256-tokens"))] + // For u64 tokens, use the ckBTC ledger canister ID + let ledger_principal_id = PrincipalId::from_str("mxzaz-hqaaa-aaaar-qaada-cai") + .expect("should parse canister ID from string"); + #[cfg(feature = "u256-tokens")] + // For u256 tokens, use the ckETH ledger canister ID + let ledger_principal_id = PrincipalId::from_str("ss2fx-dyaaa-aaaar-qacoq-cai") .expect("should parse canister ID from string"); + let canister_id = - env.create_canister_with_cycles(Some(ck_eth_ledger_principal_id), Cycles::zero(), None); + env.create_canister_with_cycles(Some(ledger_principal_id), Cycles::zero(), None); let ledger_init_args = encode_init_args(init_args(vec![])); env.install_existing_canister( canister_id, @@ -117,17 +125,25 @@ pub fn test_icrc106_set_hardcoded_index_in_upgrade( let encoded_upgrade_args = Encode!(&args).unwrap(); env.upgrade_canister(canister_id, ledger_wasm.clone(), encoded_upgrade_args) .expect("should successfully upgrade ledger canister"); - // The index should now be set - let ck_eth_index_principal_id = Principal::from_str("s3zol-vqaaa-aaaar-qacpa-cai") + + #[cfg(not(feature = "u256-tokens"))] + // For u64 tokens, use the ckBTC index canister ID + let index_principal_id = Principal::from_str("n5wcd-faaaa-aaaar-qaaea-cai") + .expect("should parse canister ID from string"); + #[cfg(feature = "u256-tokens")] + // For u64 tokens, use the ckETH index canister ID + let index_principal_id = Principal::from_str("s3zol-vqaaa-aaaar-qacpa-cai") .expect("should parse canister ID from string"); - assert_index_set(&env, canister_id, ck_eth_index_principal_id); + + // The index should now be set + assert_index_set(&env, canister_id, index_principal_id); let args = encode_upgrade_args(None); let encoded_upgrade_args = Encode!(&args).unwrap(); env.upgrade_canister(canister_id, ledger_wasm, encoded_upgrade_args) .expect("should successfully upgrade ledger canister"); // Passing `None` should not change the previously set index - assert_index_set(&env, canister_id, ck_eth_index_principal_id); + assert_index_set(&env, canister_id, index_principal_id); } pub fn test_upgrade_downgrade_with_mainnet_ledger( From 90a5556b48c41e255d6082e793ca9e3f45bde01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Tue, 27 May 2025 09:51:24 +0200 Subject: [PATCH 29/35] Rename index principal setting function and adapt rustdoc --- rs/ledger_suite/icrc1/ledger/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 4f38c996e1dc..d650d938859e 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -260,7 +260,7 @@ fn post_upgrade_internal(args: Option) { initialize_total_volume(); - set_index_principal(); + ensure_index_principal(); if upgrade_from_version < 3 { set_ledger_state(LedgerState::Migrating(LedgerField::Blocks)); @@ -603,11 +603,11 @@ const LEDGER_SUITES: &[LedgerSuite; 16] = &[ }, ]; -/// Set the principal of the index canister corresponding to this ledger canister. +/// Ensure the principal of the index canister corresponding to this ledger canister is set. /// This will only set the index principal if: -/// - The index principal is not already set. +/// - The index principal is not already set, and; /// - The ledger principal of the current canister is found in the list of ledgers. -fn set_index_principal() { +fn ensure_index_principal() { let index_principal = Access::with_ledger(|ledger| ledger.index_principal()); if index_principal.is_none() { let ledger_canister_id = ic_cdk::api::id().to_string(); From 8fd2147b2909c8f6104328cfb0b7014b758b58c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Tue, 27 May 2025 10:43:59 +0200 Subject: [PATCH 30/35] Only log an error rather than trapping in case setting the index principal fails --- rs/ledger_suite/icrc1/ledger/src/main.rs | 26 ++++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index d650d938859e..201086321da7 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -614,17 +614,21 @@ fn ensure_index_principal() { for suite in LEDGER_SUITES { if ledger_canister_id == suite.ledger { Access::with_ledger_mut(|ledger| { - let index_principal = Principal::from_text(suite.index).unwrap_or_else(|err| { - ic_cdk::trap(&format!( - "unable to parse index principal for {} from {}: {}", - suite.name, suite.index, err - )) - }); - ledger.set_index_principal(index_principal); - log_message(&format!( - "Set index principal of ledger canister {} for {} to {}", - suite.ledger, suite.name, suite.index - )); + match Principal::from_text(suite.index) { + Ok(index_principal) => { + ledger.set_index_principal(index_principal); + log_message(&format!( + "Set index principal of ledger canister {} for {} to {}", + suite.ledger, suite.name, suite.index + )); + } + Err(err) => { + log_message(&format!( + "unable to parse index principal for {} from {}: {}", + suite.name, suite.index, err + )); + } + }; }); return; } From d796ce91fd870552585448434f8ca54bad5b83a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Tue, 27 May 2025 14:18:52 +0200 Subject: [PATCH 31/35] Add cleanup TODO --- rs/ledger_suite/icrc1/ledger/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index 201086321da7..d6c76b2fd8e9 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -260,6 +260,7 @@ fn post_upgrade_internal(args: Option) { initialize_total_volume(); + // TODO(FI-1747): Remove once this has been rolled out to the SNS and chain fusion ledgers. ensure_index_principal(); if upgrade_from_version < 3 { From 58460e921482a31abb22ccaf1b46b9afa20d6e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 6 Jun 2025 06:20:02 +0200 Subject: [PATCH 32/35] Added SNS governance unreleased_changelog.md entry --- rs/sns/governance/unreleased_changelog.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rs/sns/governance/unreleased_changelog.md b/rs/sns/governance/unreleased_changelog.md index 94126a0ff421..805c60d55680 100644 --- a/rs/sns/governance/unreleased_changelog.md +++ b/rs/sns/governance/unreleased_changelog.md @@ -4,11 +4,16 @@ In general, upcoming/unreleased behavior changes are described here. For details on the process that this file is part of, see `rs/nervous_system/changelog_process.md`. - # Next Upgrade Proposal ## Added +### Set the principal of the index canister when installing the ledger ([ICRC-106](https://github.com/dfinity/ICRC-1/pull/196/files/7f9b4739d9b3ec2cf549bf468e3a1731c31eecbf)) + +When installing the ledger canister for a new SNS, the index canister's principal is now set in the ledger. +This allows a ledger client to query the ledger using the `icrc106_get_index_principal` endpoint to figure out where the +ledger index canister is running. + ## Changed ## Deprecated From 413b9c6f2af19bcef49c6379a34bb0befbc97d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 6 Jun 2025 08:47:12 +0200 Subject: [PATCH 33/35] Bump ICRC ledger size limit --- publish/canisters/BUILD.bazel | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/publish/canisters/BUILD.bazel b/publish/canisters/BUILD.bazel index 767d97231642..e1bf0313e417 100644 --- a/publish/canisters/BUILD.bazel +++ b/publish/canisters/BUILD.bazel @@ -65,10 +65,11 @@ DEFAULT_CANISTERS_MAX_SIZE_E5_BYTES = 21 CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { # -- FI team -- - # The compressed version of these two canisters should be ~600kb, - # we are setting the check to 7 to leave some space for growth + # The compressed version of these two canisters should be ~700kb, + # we are setting the check to 8 to leave some space for growth # but enough to get an alert in case of a spike in size. - "ic-icrc1-ledger.wasm.gz": 7, + # The size is currently at 701737 bytes. + "ic-icrc1-ledger.wasm.gz": 8, # The size is currently at 704585 bytes. "ic-icrc1-ledger-u256.wasm.gz": 8, # Size when constraint addded: 841_234 bytes From af7887c2da0a7c777903e1665606fe778b1c550b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 6 Jun 2025 11:06:57 +0200 Subject: [PATCH 34/35] Avoid String to Principal conversions but add unit tests for better human readability --- rs/ledger_suite/icrc1/ledger/BUILD.bazel | 41 +- rs/ledger_suite/icrc1/ledger/src/main.rs | 585 ++++++++++++++++++----- 2 files changed, 485 insertions(+), 141 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/BUILD.bazel b/rs/ledger_suite/icrc1/ledger/BUILD.bazel index 3c7a7ce9e676..a85de68d6450 100644 --- a/rs/ledger_suite/icrc1/ledger/BUILD.bazel +++ b/rs/ledger_suite/icrc1/ledger/BUILD.bazel @@ -235,17 +235,36 @@ package(default_visibility = ["//visibility:public"]) ] ] -rust_test( - name = "ledger_canister_test", - crate = ":_wasm_ledger_canister", - data = [ - ":ledger.did", - ], - env = { - "CARGO_MANIFEST_DIR": "rs/ledger_suite/icrc1/ledger", - }, - deps = ["@crate_index//:candid_parser"], -) +[ + rust_test( + name = "ledger_canister_test" + name_suffix, + crate = ":_wasm_ledger_canister" + name_suffix, + crate_features = features, + data = [ + ":ledger.did", + ], + env = { + "CARGO_MANIFEST_DIR": "rs/ledger_suite/icrc1/ledger", + }, + deps = ["@crate_index//:candid_parser"] + extra_deps, + ) + for (name_suffix, features, extra_deps) in [ + ( + "", + [], + [ + "//rs/ledger_suite/icrc1/tokens_u64", + ], + ), + ( + "_u256", + ["u256-tokens"], + [ + "//rs/ledger_suite/icrc1/tokens_u256", + ], + ), + ] +] [ rust_ic_test( diff --git a/rs/ledger_suite/icrc1/ledger/src/main.rs b/rs/ledger_suite/icrc1/ledger/src/main.rs index d6c76b2fd8e9..1f993151375a 100644 --- a/rs/ledger_suite/icrc1/ledger/src/main.rs +++ b/rs/ledger_suite/icrc1/ledger/src/main.rs @@ -307,8 +307,8 @@ fn initialize_total_volume() { struct LedgerSuite { pub name: &'static str, - pub ledger: &'static str, - pub index: &'static str, + pub ledger: Principal, + pub index: Principal, } #[cfg(not(feature = "u256-tokens"))] @@ -316,205 +316,205 @@ const LEDGER_SUITES: &[LedgerSuite; 40] = &[ // Chain fusion ledger suites LedgerSuite { name: "ckBTC", - ledger: "mxzaz-hqaaa-aaaar-qaada-cai", - index: "n5wcd-faaaa-aaaar-qaaea-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 6, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 8, 1, 1]), }, // Chain fusion test tokens LedgerSuite { name: "ckTestBTC", - ledger: "mc6ru-gyaaa-aaaar-qaaaq-cai", - index: "mm444-5iaaa-aaaar-qaabq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 1, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 3, 1, 1]), }, // SNSs LedgerSuite { name: "ALICE", - ledger: "oj6if-riaaa-aaaaq-aaeha-cai", - index: "mtcaz-pyaaa-aaaaq-aaeia-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 14, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 16, 1, 1]), }, LedgerSuite { name: "BOOM-DAO", - ledger: "vtrom-gqaaa-aaaaq-aabia-cai", - index: "v5tde-5aaaa-aaaaq-aabja-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 80, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 82, 1, 1]), }, LedgerSuite { name: "CATALYZE", - ledger: "uf2wh-taaaa-aaaaq-aabna-cai", - index: "ux4b6-7qaaa-aaaaq-aaboa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 90, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 92, 1, 1]), }, LedgerSuite { name: "CECIL-THE-LION-DAO", - ledger: "jg2ra-syaaa-aaaaq-aaewa-cai", - index: "jiy4i-jiaaa-aaaaq-aaexa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 44, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 46, 1, 1]), }, LedgerSuite { name: "DECIDEAI-DAO", - ledger: "xsi2v-cyaaa-aaaaq-aabfq-cai", - index: "xaonm-oiaaa-aaaaq-aabgq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 75, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 77, 1, 1]), }, LedgerSuite { name: "DOLR-AI", - ledger: "6rdgd-kyaaa-aaaaq-aaavq-cai", - index: "6dfr2-giaaa-aaaaq-aaawq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 43, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 45, 1, 1]), }, LedgerSuite { name: "DRAGGINZ", - ledger: "zfcdd-tqaaa-aaaaq-aaaga-cai", - index: "zlaol-iaaaa-aaaaq-aaaha-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 12, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 14, 1, 1]), }, LedgerSuite { name: "ELNA-AI", - ledger: "gemj7-oyaaa-aaaaq-aacnq-cai", - index: "gwk6g-ciaaa-aaaaq-aacoq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 155, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 157, 1, 1]), }, LedgerSuite { name: "ESTATEDAO", - ledger: "bliq2-niaaa-aaaaq-aac4q-cai", - index: "bfk5s-wyaaa-aaaaq-aac5q-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 185, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 187, 1, 1]), }, LedgerSuite { name: "FOMOWELL", - ledger: "o4zzi-qaaaa-aaaaq-aaeeq-cai", - index: "os3ua-lqaaa-aaaaq-aaefq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 9, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 11, 1, 1]), }, LedgerSuite { name: "FUELEV", - ledger: "nfjys-2iaaa-aaaaq-aaena-cai", - index: "nxppl-wyaaa-aaaaq-aaeoa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 26, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 28, 1, 1]), }, LedgerSuite { name: "GOLD-DAO", - ledger: "tyyy3-4aaaa-aaaaq-aab7a-cai", - index: "efv5g-kqaaa-aaaaq-aacaa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 126, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 128, 1, 1]), }, LedgerSuite { name: "IC-EXPLORER", - ledger: "ifwyg-gaaaa-aaaaq-aaeqq-cai", - index: "iluvo-5qaaa-aaaaq-aaerq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 33, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 35, 1, 1]), }, LedgerSuite { name: "ICFC", - ledger: "ddsp7-7iaaa-aaaaq-aacqq-cai", - index: "dnqcx-eyaaa-aaaaq-aacrq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 161, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 163, 1, 1]), }, LedgerSuite { name: "ICLIGHTHOUSE-DAO", - ledger: "hhaaz-2aaaa-aaaaq-aacla-cai", - index: "gnpcd-yqaaa-aaaaq-aacma-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 150, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 152, 1, 1]), }, LedgerSuite { name: "ICPANDA", - ledger: "druyg-tyaaa-aaaaq-aactq-cai", - index: "c3324-riaaa-aaaaq-aacuq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 167, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 169, 1, 1]), }, LedgerSuite { name: "ICPEX", - ledger: "lvfsa-2aaaa-aaaaq-aaeyq-cai", - index: "l3h7i-bqaaa-aaaaq-aaezq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 49, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 51, 1, 1]), }, LedgerSuite { name: "ICPSWAP", - ledger: "ca6gz-lqaaa-aaaaq-aacwa-cai", - index: "co4lr-qaaaa-aaaaq-aacxa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 172, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 174, 1, 1]), }, LedgerSuite { name: "ICVC", - ledger: "m6xut-mqaaa-aaaaq-aadua-cai", - index: "mqvz3-xaaaa-aaaaq-aadva-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 232, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 234, 1, 1]), }, LedgerSuite { name: "KINIC", - ledger: "73mez-iiaaa-aaaaq-aaasq-cai", - index: "7vojr-tyaaa-aaaaq-aaatq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 37, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 39, 1, 1]), }, LedgerSuite { name: "KONGSWAP", - ledger: "o7oak-iyaaa-aaaaq-aadzq-cai", - index: "onixt-eiaaa-aaaaq-aad2q-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 243, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 245, 1, 1]), }, LedgerSuite { name: "MIMIC", - ledger: "4c4fd-caaaa-aaaaq-aaa3a-cai", - index: "5ithz-aqaaa-aaaaq-aaa4a-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 54, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 56, 1, 1]), }, LedgerSuite { name: "MOTOKO", - ledger: "k45jy-aiaaa-aaaaq-aadcq-cai", - index: "ks7eq-3yaaa-aaaaq-aaddq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 197, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 199, 1, 1]), }, LedgerSuite { name: "NEUTRINITE", - ledger: "f54if-eqaaa-aaaaq-aacea-cai", - index: "ft6fn-7aaaa-aaaaq-aacfa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 136, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 138, 1, 1]), }, LedgerSuite { name: "NFID-WALLET", - ledger: "mih44-vaaaa-aaaaq-aaekq-cai", - index: "mgfru-oqaaa-aaaaq-aaelq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 21, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 23, 1, 1]), }, LedgerSuite { name: "NUANCE", - ledger: "rxdbk-dyaaa-aaaaq-aabtq-cai", - index: "q5mdq-biaaa-aaaaq-aabuq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 103, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 105, 1, 1]), }, LedgerSuite { name: "OPENCHAT", - ledger: "2ouva-viaaa-aaaaq-aaamq-cai", - index: "2awyi-oyaaa-aaaaq-aaanq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 25, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 27, 1, 1]), }, LedgerSuite { name: "ORIGYN", - ledger: "lkwrt-vyaaa-aaaaq-aadhq-cai", - index: "jqkzp-liaaa-aaaaq-aadiq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 207, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 209, 1, 1]), }, LedgerSuite { name: "PERSONAL-DAO", - ledger: "ixqp7-kqaaa-aaaaq-aaetq-cai", - index: "j57nf-iaaaa-aaaaq-aaeuq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 39, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 41, 1, 1]), }, LedgerSuite { name: "POKEDBOTS", - ledger: "np5km-uyaaa-aaaaq-aadrq-cai", - index: "n535v-yiaaa-aaaaq-aadsq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 227, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 229, 1, 1]), }, LedgerSuite { name: "SEERS", - ledger: "rffwt-piaaa-aaaaq-aabqq-cai", - index: "rlh33-uyaaa-aaaaq-aabrq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 97, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 99, 1, 1]), }, LedgerSuite { name: "SNEED", - ledger: "hvgxa-wqaaa-aaaaq-aacia-cai", - index: "h3e2i-naaaa-aaaaq-aacja-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 144, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 146, 1, 1]), }, LedgerSuite { name: "SONIC", - ledger: "qbizb-wiaaa-aaaaq-aabwq-cai", - index: "qpkuj-nyaaa-aaaaq-aabxq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 109, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 111, 1, 1]), }, LedgerSuite { name: "SWAMPIES", - ledger: "lrtnw-paaaa-aaaaq-aadfa-cai", - index: "ldv2p-dqaaa-aaaaq-aadga-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 202, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 204, 1, 1]), }, LedgerSuite { name: "TACO-DAO", - ledger: "kknbx-zyaaa-aaaaq-aae4a-cai", - index: "kepm7-ciaaa-aaaaq-aae5a-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 56, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 1, 58, 1, 1]), }, LedgerSuite { name: "TRAX", - ledger: "emww2-4yaaa-aaaaq-aacbq-cai", - index: "e6qbd-qiaaa-aaaaq-aaccq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 131, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 133, 1, 1]), }, LedgerSuite { name: "WATERNEURON", - ledger: "jcmow-hyaaa-aaaaq-aadlq-cai", - index: "iidmm-fiaaa-aaaaq-aadmq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 215, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 217, 1, 1]), }, LedgerSuite { name: "YUKU-AI", - ledger: "atbfz-diaaa-aaaaq-aacyq-cai", - index: "a5dir-yyaaa-aaaaq-aaczq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 177, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 0, 0, 179, 1, 1]), }, ]; @@ -523,84 +523,84 @@ const LEDGER_SUITES: &[LedgerSuite; 16] = &[ // Chain fusion ledger suites LedgerSuite { name: "ckETH", - ledger: "ss2fx-dyaaa-aaaar-qacoq-cai", - index: "s3zol-vqaaa-aaaar-qacpa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 157, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 158, 1, 1]), }, LedgerSuite { name: "ckEURC", - ledger: "pe5t5-diaaa-aaaar-qahwa-cai", - index: "pd4vj-oqaaa-aaaar-qahwq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 236, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 237, 1, 1]), }, LedgerSuite { name: "ckUNI", - ledger: "ilzky-ayaaa-aaaar-qahha-cai", - index: "imymm-naaaa-aaaar-qahhq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 206, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 207, 1, 1]), }, LedgerSuite { name: "ckWBTC", - ledger: "bptq2-faaaa-aaaar-qagxq-cai", - index: "dso6s-wiaaa-aaaar-qagya-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 175, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 176, 1, 1]), }, LedgerSuite { name: "ckLINK", - ledger: "g4tto-rqaaa-aaaar-qageq-cai", - index: "gvqys-hyaaa-aaaar-qagfa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 137, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 138, 1, 1]), }, LedgerSuite { name: "ckXAUT", - ledger: "nza5v-qaaaa-aaaar-qahzq-cai", - index: "nmhmy-riaaa-aaaar-qah2a-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 243, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 244, 1, 1]), }, LedgerSuite { name: "ckPEPE", - ledger: "etik7-oiaaa-aaaar-qagia-cai", - index: "eujml-dqaaa-aaaar-qagiq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 144, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 145, 1, 1]), }, LedgerSuite { name: "ckWSTETH", - ledger: "j2tuh-yqaaa-aaaar-qahcq-cai", - index: "jtq73-oyaaa-aaaar-qahda-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 197, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 198, 1, 1]), }, LedgerSuite { name: "ckSHIB", - ledger: "fxffn-xiaaa-aaaar-qagoa-cai", - index: "fqedz-2qaaa-aaaar-qagoq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 156, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 157, 1, 1]), }, LedgerSuite { name: "ckUSDC", - ledger: "xevnm-gaaaa-aaaar-qafnq-cai", - index: "xrs4b-hiaaa-aaaar-qafoa-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 91, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 92, 1, 1]), }, LedgerSuite { name: "ckUSDT", - ledger: "cngnf-vqaaa-aaaar-qag4q-cai", - index: "cefgz-dyaaa-aaaar-qag5a-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 185, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 186, 1, 1]), }, LedgerSuite { name: "ckOCT", - ledger: "ebo5g-cyaaa-aaaar-qagla-cai", - index: "egp3s-paaaa-aaaar-qaglq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 150, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 151, 1, 1]), }, // Chain fusion test tokens LedgerSuite { name: "ckSepoliaETH", - ledger: "apia6-jaaaa-aaaar-qabma-cai", - index: "sh5u2-cqaaa-aaaar-qacna-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 88, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 154, 1, 1]), }, LedgerSuite { name: "ckSepoliaUSDC", - ledger: "yfumr-cyaaa-aaaar-qaela-cai", - index: "ycvkf-paaaa-aaaar-qaelq-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 22, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 23, 1, 1]), }, LedgerSuite { name: "ckSepoliaLINK", - ledger: "r52mc-qaaaa-aaaar-qafzq-cai", - index: "ri55p-riaaa-aaaar-qaf2a-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 115, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 116, 1, 1]), }, LedgerSuite { name: "ckSepoliaPEPE", - ledger: "hw4ru-taaaa-aaaar-qagdq-cai", - index: "g3sv2-4iaaa-aaaar-qagea-cai", + ledger: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 135, 1, 1]), + index: Principal::from_slice(&[0, 0, 0, 0, 2, 48, 1, 136, 1, 1]), }, ]; @@ -611,25 +611,15 @@ const LEDGER_SUITES: &[LedgerSuite; 16] = &[ fn ensure_index_principal() { let index_principal = Access::with_ledger(|ledger| ledger.index_principal()); if index_principal.is_none() { - let ledger_canister_id = ic_cdk::api::id().to_string(); + let ledger_canister_id = ic_cdk::api::id(); for suite in LEDGER_SUITES { if ledger_canister_id == suite.ledger { Access::with_ledger_mut(|ledger| { - match Principal::from_text(suite.index) { - Ok(index_principal) => { - ledger.set_index_principal(index_principal); - log_message(&format!( - "Set index principal of ledger canister {} for {} to {}", - suite.ledger, suite.name, suite.index - )); - } - Err(err) => { - log_message(&format!( - "unable to parse index principal for {} from {}: {}", - suite.name, suite.index, err - )); - } - }; + ledger.set_index_principal(suite.index); + log_message(&format!( + "Set index principal of ledger canister {} for {} to {}", + suite.ledger, suite.name, suite.index + )); }); return; } @@ -1508,3 +1498,338 @@ fn check_candid_interface() { ) }); } + +#[cfg(feature = "u256-tokens")] +#[test] +fn test_principals_u256() { + const LEDGER_SUITES_STRINGS: &[LedgerSuiteStrings; 16] = &[ + // Chain fusion ledger suites + LedgerSuiteStrings { + name: "ckETH", + ledger: "ss2fx-dyaaa-aaaar-qacoq-cai", + index: "s3zol-vqaaa-aaaar-qacpa-cai", + }, + LedgerSuiteStrings { + name: "ckEURC", + ledger: "pe5t5-diaaa-aaaar-qahwa-cai", + index: "pd4vj-oqaaa-aaaar-qahwq-cai", + }, + LedgerSuiteStrings { + name: "ckUNI", + ledger: "ilzky-ayaaa-aaaar-qahha-cai", + index: "imymm-naaaa-aaaar-qahhq-cai", + }, + LedgerSuiteStrings { + name: "ckWBTC", + ledger: "bptq2-faaaa-aaaar-qagxq-cai", + index: "dso6s-wiaaa-aaaar-qagya-cai", + }, + LedgerSuiteStrings { + name: "ckLINK", + ledger: "g4tto-rqaaa-aaaar-qageq-cai", + index: "gvqys-hyaaa-aaaar-qagfa-cai", + }, + LedgerSuiteStrings { + name: "ckXAUT", + ledger: "nza5v-qaaaa-aaaar-qahzq-cai", + index: "nmhmy-riaaa-aaaar-qah2a-cai", + }, + LedgerSuiteStrings { + name: "ckPEPE", + ledger: "etik7-oiaaa-aaaar-qagia-cai", + index: "eujml-dqaaa-aaaar-qagiq-cai", + }, + LedgerSuiteStrings { + name: "ckWSTETH", + ledger: "j2tuh-yqaaa-aaaar-qahcq-cai", + index: "jtq73-oyaaa-aaaar-qahda-cai", + }, + LedgerSuiteStrings { + name: "ckSHIB", + ledger: "fxffn-xiaaa-aaaar-qagoa-cai", + index: "fqedz-2qaaa-aaaar-qagoq-cai", + }, + LedgerSuiteStrings { + name: "ckUSDC", + ledger: "xevnm-gaaaa-aaaar-qafnq-cai", + index: "xrs4b-hiaaa-aaaar-qafoa-cai", + }, + LedgerSuiteStrings { + name: "ckUSDT", + ledger: "cngnf-vqaaa-aaaar-qag4q-cai", + index: "cefgz-dyaaa-aaaar-qag5a-cai", + }, + LedgerSuiteStrings { + name: "ckOCT", + ledger: "ebo5g-cyaaa-aaaar-qagla-cai", + index: "egp3s-paaaa-aaaar-qaglq-cai", + }, + // Chain fusion test tokens + LedgerSuiteStrings { + name: "ckSepoliaETH", + ledger: "apia6-jaaaa-aaaar-qabma-cai", + index: "sh5u2-cqaaa-aaaar-qacna-cai", + }, + LedgerSuiteStrings { + name: "ckSepoliaUSDC", + ledger: "yfumr-cyaaa-aaaar-qaela-cai", + index: "ycvkf-paaaa-aaaar-qaelq-cai", + }, + LedgerSuiteStrings { + name: "ckSepoliaLINK", + ledger: "r52mc-qaaaa-aaaar-qafzq-cai", + index: "ri55p-riaaa-aaaar-qaf2a-cai", + }, + LedgerSuiteStrings { + name: "ckSepoliaPEPE", + ledger: "hw4ru-taaaa-aaaar-qagdq-cai", + index: "g3sv2-4iaaa-aaaar-qagea-cai", + }, + ]; + assert_ledger_suite_principals(LEDGER_SUITES_STRINGS, LEDGER_SUITES); +} + +#[cfg(not(feature = "u256-tokens"))] +#[test] +fn test_principals_u64() { + const LEDGER_SUITES_STRINGS: &[LedgerSuiteStrings; 40] = &[ + // Chain fusion ledger suites + LedgerSuiteStrings { + name: "ckBTC", + ledger: "mxzaz-hqaaa-aaaar-qaada-cai", + index: "n5wcd-faaaa-aaaar-qaaea-cai", + }, + // Chain fusion test tokens + LedgerSuiteStrings { + name: "ckTestBTC", + ledger: "mc6ru-gyaaa-aaaar-qaaaq-cai", + index: "mm444-5iaaa-aaaar-qaabq-cai", + }, + // SNSs + LedgerSuiteStrings { + name: "ALICE", + ledger: "oj6if-riaaa-aaaaq-aaeha-cai", + index: "mtcaz-pyaaa-aaaaq-aaeia-cai", + }, + LedgerSuiteStrings { + name: "BOOM-DAO", + ledger: "vtrom-gqaaa-aaaaq-aabia-cai", + index: "v5tde-5aaaa-aaaaq-aabja-cai", + }, + LedgerSuiteStrings { + name: "CATALYZE", + ledger: "uf2wh-taaaa-aaaaq-aabna-cai", + index: "ux4b6-7qaaa-aaaaq-aaboa-cai", + }, + LedgerSuiteStrings { + name: "CECIL-THE-LION-DAO", + ledger: "jg2ra-syaaa-aaaaq-aaewa-cai", + index: "jiy4i-jiaaa-aaaaq-aaexa-cai", + }, + LedgerSuiteStrings { + name: "DECIDEAI-DAO", + ledger: "xsi2v-cyaaa-aaaaq-aabfq-cai", + index: "xaonm-oiaaa-aaaaq-aabgq-cai", + }, + LedgerSuiteStrings { + name: "DOLR-AI", + ledger: "6rdgd-kyaaa-aaaaq-aaavq-cai", + index: "6dfr2-giaaa-aaaaq-aaawq-cai", + }, + LedgerSuiteStrings { + name: "DRAGGINZ", + ledger: "zfcdd-tqaaa-aaaaq-aaaga-cai", + index: "zlaol-iaaaa-aaaaq-aaaha-cai", + }, + LedgerSuiteStrings { + name: "ELNA-AI", + ledger: "gemj7-oyaaa-aaaaq-aacnq-cai", + index: "gwk6g-ciaaa-aaaaq-aacoq-cai", + }, + LedgerSuiteStrings { + name: "ESTATEDAO", + ledger: "bliq2-niaaa-aaaaq-aac4q-cai", + index: "bfk5s-wyaaa-aaaaq-aac5q-cai", + }, + LedgerSuiteStrings { + name: "FOMOWELL", + ledger: "o4zzi-qaaaa-aaaaq-aaeeq-cai", + index: "os3ua-lqaaa-aaaaq-aaefq-cai", + }, + LedgerSuiteStrings { + name: "FUELEV", + ledger: "nfjys-2iaaa-aaaaq-aaena-cai", + index: "nxppl-wyaaa-aaaaq-aaeoa-cai", + }, + LedgerSuiteStrings { + name: "GOLD-DAO", + ledger: "tyyy3-4aaaa-aaaaq-aab7a-cai", + index: "efv5g-kqaaa-aaaaq-aacaa-cai", + }, + LedgerSuiteStrings { + name: "IC-EXPLORER", + ledger: "ifwyg-gaaaa-aaaaq-aaeqq-cai", + index: "iluvo-5qaaa-aaaaq-aaerq-cai", + }, + LedgerSuiteStrings { + name: "ICFC", + ledger: "ddsp7-7iaaa-aaaaq-aacqq-cai", + index: "dnqcx-eyaaa-aaaaq-aacrq-cai", + }, + LedgerSuiteStrings { + name: "ICLIGHTHOUSE-DAO", + ledger: "hhaaz-2aaaa-aaaaq-aacla-cai", + index: "gnpcd-yqaaa-aaaaq-aacma-cai", + }, + LedgerSuiteStrings { + name: "ICPANDA", + ledger: "druyg-tyaaa-aaaaq-aactq-cai", + index: "c3324-riaaa-aaaaq-aacuq-cai", + }, + LedgerSuiteStrings { + name: "ICPEX", + ledger: "lvfsa-2aaaa-aaaaq-aaeyq-cai", + index: "l3h7i-bqaaa-aaaaq-aaezq-cai", + }, + LedgerSuiteStrings { + name: "ICPSWAP", + ledger: "ca6gz-lqaaa-aaaaq-aacwa-cai", + index: "co4lr-qaaaa-aaaaq-aacxa-cai", + }, + LedgerSuiteStrings { + name: "ICVC", + ledger: "m6xut-mqaaa-aaaaq-aadua-cai", + index: "mqvz3-xaaaa-aaaaq-aadva-cai", + }, + LedgerSuiteStrings { + name: "KINIC", + ledger: "73mez-iiaaa-aaaaq-aaasq-cai", + index: "7vojr-tyaaa-aaaaq-aaatq-cai", + }, + LedgerSuiteStrings { + name: "KONGSWAP", + ledger: "o7oak-iyaaa-aaaaq-aadzq-cai", + index: "onixt-eiaaa-aaaaq-aad2q-cai", + }, + LedgerSuiteStrings { + name: "MIMIC", + ledger: "4c4fd-caaaa-aaaaq-aaa3a-cai", + index: "5ithz-aqaaa-aaaaq-aaa4a-cai", + }, + LedgerSuiteStrings { + name: "MOTOKO", + ledger: "k45jy-aiaaa-aaaaq-aadcq-cai", + index: "ks7eq-3yaaa-aaaaq-aaddq-cai", + }, + LedgerSuiteStrings { + name: "NEUTRINITE", + ledger: "f54if-eqaaa-aaaaq-aacea-cai", + index: "ft6fn-7aaaa-aaaaq-aacfa-cai", + }, + LedgerSuiteStrings { + name: "NFID-WALLET", + ledger: "mih44-vaaaa-aaaaq-aaekq-cai", + index: "mgfru-oqaaa-aaaaq-aaelq-cai", + }, + LedgerSuiteStrings { + name: "NUANCE", + ledger: "rxdbk-dyaaa-aaaaq-aabtq-cai", + index: "q5mdq-biaaa-aaaaq-aabuq-cai", + }, + LedgerSuiteStrings { + name: "OPENCHAT", + ledger: "2ouva-viaaa-aaaaq-aaamq-cai", + index: "2awyi-oyaaa-aaaaq-aaanq-cai", + }, + LedgerSuiteStrings { + name: "ORIGYN", + ledger: "lkwrt-vyaaa-aaaaq-aadhq-cai", + index: "jqkzp-liaaa-aaaaq-aadiq-cai", + }, + LedgerSuiteStrings { + name: "PERSONAL-DAO", + ledger: "ixqp7-kqaaa-aaaaq-aaetq-cai", + index: "j57nf-iaaaa-aaaaq-aaeuq-cai", + }, + LedgerSuiteStrings { + name: "POKEDBOTS", + ledger: "np5km-uyaaa-aaaaq-aadrq-cai", + index: "n535v-yiaaa-aaaaq-aadsq-cai", + }, + LedgerSuiteStrings { + name: "SEERS", + ledger: "rffwt-piaaa-aaaaq-aabqq-cai", + index: "rlh33-uyaaa-aaaaq-aabrq-cai", + }, + LedgerSuiteStrings { + name: "SNEED", + ledger: "hvgxa-wqaaa-aaaaq-aacia-cai", + index: "h3e2i-naaaa-aaaaq-aacja-cai", + }, + LedgerSuiteStrings { + name: "SONIC", + ledger: "qbizb-wiaaa-aaaaq-aabwq-cai", + index: "qpkuj-nyaaa-aaaaq-aabxq-cai", + }, + LedgerSuiteStrings { + name: "SWAMPIES", + ledger: "lrtnw-paaaa-aaaaq-aadfa-cai", + index: "ldv2p-dqaaa-aaaaq-aadga-cai", + }, + LedgerSuiteStrings { + name: "TACO-DAO", + ledger: "kknbx-zyaaa-aaaaq-aae4a-cai", + index: "kepm7-ciaaa-aaaaq-aae5a-cai", + }, + LedgerSuiteStrings { + name: "TRAX", + ledger: "emww2-4yaaa-aaaaq-aacbq-cai", + index: "e6qbd-qiaaa-aaaaq-aaccq-cai", + }, + LedgerSuiteStrings { + name: "WATERNEURON", + ledger: "jcmow-hyaaa-aaaaq-aadlq-cai", + index: "iidmm-fiaaa-aaaaq-aadmq-cai", + }, + LedgerSuiteStrings { + name: "YUKU-AI", + ledger: "atbfz-diaaa-aaaaq-aacyq-cai", + index: "a5dir-yyaaa-aaaaq-aaczq-cai", + }, + ]; + + assert_ledger_suite_principals(LEDGER_SUITES_STRINGS, LEDGER_SUITES); +} + +#[cfg(test)] +struct LedgerSuiteStrings { + pub name: &'static str, + pub ledger: &'static str, + pub index: &'static str, +} + +#[cfg(test)] +fn assert_ledger_suite_principals( + ledger_suite_strings: &[LedgerSuiteStrings], + ledger_suite_principals: &[LedgerSuite], +) { + assert_eq!(ledger_suite_strings.len(), ledger_suite_principals.len()); + let mut found = 0; + for suite in ledger_suite_strings { + for principal_suite in ledger_suite_principals { + if suite.name == principal_suite.name { + assert_eq!( + Principal::from_text(suite.ledger).unwrap(), + principal_suite.ledger + ); + assert_eq!( + Principal::from_text(suite.index).unwrap(), + principal_suite.index + ); + found += 1; + break; + } + } + } + assert_eq!(found, ledger_suite_principals.len()); +} From 92aec40a93e002496c929c9a27b7ae4d92d975af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Bj=C3=B6rkqvist?= Date: Fri, 6 Jun 2025 14:08:14 +0200 Subject: [PATCH 35/35] Buildifier --- rs/ledger_suite/icrc1/ledger/BUILD.bazel | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/rs/ledger_suite/icrc1/ledger/BUILD.bazel b/rs/ledger_suite/icrc1/ledger/BUILD.bazel index a85de68d6450..e332a5585ca9 100644 --- a/rs/ledger_suite/icrc1/ledger/BUILD.bazel +++ b/rs/ledger_suite/icrc1/ledger/BUILD.bazel @@ -249,20 +249,20 @@ package(default_visibility = ["//visibility:public"]) deps = ["@crate_index//:candid_parser"] + extra_deps, ) for (name_suffix, features, extra_deps) in [ - ( - "", - [], - [ - "//rs/ledger_suite/icrc1/tokens_u64", - ], - ), - ( - "_u256", - ["u256-tokens"], - [ - "//rs/ledger_suite/icrc1/tokens_u256", - ], - ), + ( + "", + [], + [ + "//rs/ledger_suite/icrc1/tokens_u64", + ], + ), + ( + "_u256", + ["u256-tokens"], + [ + "//rs/ledger_suite/icrc1/tokens_u256", + ], + ), ] ]