diff --git a/crates/bin/pcli/tests/proof.rs b/crates/bin/pcli/tests/proof.rs index b4d293c2b8..59c91c574f 100644 --- a/crates/bin/pcli/tests/proof.rs +++ b/crates/bin/pcli/tests/proof.rs @@ -41,7 +41,10 @@ fn spend_proof_parameters_vs_current_spend_circuit() { let value_to_send = Value { amount: 1u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut OsRng, &sender, value_to_send); @@ -92,7 +95,10 @@ fn delegator_vote_proof_parameters_vs_current_delegator_vote_circuit() { let value_to_send = Value { amount: 2u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut OsRng, &sender, value_to_send); @@ -306,7 +312,10 @@ fn output_proof_parameters_vs_current_output_circuit() { let value_to_send = Value { amount: 1u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let v_blinding = Fr::rand(&mut OsRng); @@ -344,7 +353,10 @@ fn nullifier_derivation_parameters_vs_current_nullifier_derivation_circuit() { let value_to_send = Value { amount: 1u128.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); diff --git a/crates/core/component/dex/src/batch_swap_output_data.rs b/crates/core/component/dex/src/batch_swap_output_data.rs index 31126eb8bc..cf0064edd7 100644 --- a/crates/core/component/dex/src/batch_swap_output_data.rs +++ b/crates/core/component/dex/src/batch_swap_output_data.rs @@ -372,8 +372,14 @@ mod tests { impl ParameterSetup for ProRataOutputCircuit { fn generate_test_parameters() -> (ProvingKey, VerifyingKey) { let trading_pair = TradingPair { - asset_1: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), - asset_2: asset::REGISTRY.parse_denom("nala").unwrap().id(), + asset_1: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + asset_2: asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .id(), }; let circuit = ProRataOutputCircuit { delta_1_i: Amount::from(1u32), diff --git a/crates/core/component/dex/src/lp/nft.rs b/crates/core/component/dex/src/lp/nft.rs index 782c757c78..1a7e44b71d 100644 --- a/crates/core/component/dex/src/lp/nft.rs +++ b/crates/core/component/dex/src/lp/nft.rs @@ -161,8 +161,8 @@ mod tests { fn lpnft_denom_parsing_roundtrip() { let pair = DirectedTradingPair { start: penumbra_crypto::STAKING_TOKEN_ASSET_ID.clone(), - end: penumbra_crypto::asset::REGISTRY - .parse_denom("cube") + end: asset::Cache::with_known_assets() + .get_unit("cube") .unwrap() .id(), }; diff --git a/crates/core/component/dex/src/swap/plaintext.rs b/crates/core/component/dex/src/swap/plaintext.rs index 05fa843f63..fc7ad89fbc 100644 --- a/crates/core/component/dex/src/swap/plaintext.rs +++ b/crates/core/component/dex/src/swap/plaintext.rs @@ -429,8 +429,14 @@ mod tests { let ovk = fvk.outgoing(); let (dest, _dtk_d) = ivk.payment_address(0u32.into()); let trading_pair = TradingPair::new( - asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), - asset::REGISTRY.parse_denom("nala").unwrap().id(), + asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .id(), ); let swap = SwapPlaintext::new( @@ -440,7 +446,10 @@ mod tests { 1u64.into(), Fee(Value { amount: 3u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }), dest, ); diff --git a/crates/core/component/dex/src/swap/proof.rs b/crates/core/component/dex/src/swap/proof.rs index eb03e538eb..d9cee20fb3 100644 --- a/crates/core/component/dex/src/swap/proof.rs +++ b/crates/core/component/dex/src/swap/proof.rs @@ -119,7 +119,10 @@ impl ParameterSetup for SwapCircuit { delta_2_i: 1u64.into(), claim_fee: Fee(Value { amount: 3u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }), claim_address: address, rseed: Rseed([1u8; 32]), diff --git a/crates/core/component/dex/src/swap_claim/proof.rs b/crates/core/component/dex/src/swap_claim/proof.rs index 8149bda9d4..85c7db4dfe 100644 --- a/crates/core/component/dex/src/swap_claim/proof.rs +++ b/crates/core/component/dex/src/swap_claim/proof.rs @@ -202,8 +202,14 @@ impl ConstraintSynthesizer for SwapClaimCircuit { impl ParameterSetup for SwapClaimCircuit { fn generate_test_parameters() -> (ProvingKey, VerifyingKey) { let trading_pair = TradingPair { - asset_1: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), - asset_2: asset::REGISTRY.parse_denom("nala").unwrap().id(), + asset_1: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + asset_2: asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .id(), }; let seed_phrase = SeedPhrase::from_randomness([b'f'; 32]); @@ -221,7 +227,10 @@ impl ParameterSetup for SwapClaimCircuit { delta_2_i, claim_fee: Fee(Value { amount: 3u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }), claim_address: address, rseed: Rseed([1u8; 32]), diff --git a/crates/core/crypto/src/asset.rs b/crates/core/crypto/src/asset.rs index a21b7d6f6e..33d70a67b4 100644 --- a/crates/core/crypto/src/asset.rs +++ b/crates/core/crypto/src/asset.rs @@ -81,7 +81,10 @@ mod tests { #[test] fn test_registry_native_token() { // We should be able to use `parse_base` with the valid base denomination. - let base_denom = REGISTRY.parse_denom("upenumbra").unwrap(); + let base_denom = crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base(); assert_eq!(format!("{base_denom}"), "upenumbra".to_string()); // If we try to use `parse_base` with a display denomination, we should get `None`. @@ -141,7 +144,10 @@ mod tests { #[test] fn best_unit_for() { - let base_denom = REGISTRY.parse_denom("upenumbra").unwrap(); + let base_denom = crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base(); assert_eq!( base_denom.best_unit_for(0u64.into()).to_string(), @@ -194,11 +200,12 @@ mod tests { } #[test] - fn test_registry_fallthrough() { - // We should be able to use `parse_base` with a base denomination for assets - // not included in the hardcoded registry. - let base_denom = REGISTRY.parse_denom("cube").unwrap(); - assert_eq!(format!("{base_denom}"), "cube".to_string()); + fn test_get_unit() { + let unit = crate::asset::Cache::with_known_assets() + .get_unit("cube") + .unwrap(); + + assert_eq!(format!("{unit}"), "cube".to_string()); } proptest! { diff --git a/crates/core/crypto/src/asset/cache.rs b/crates/core/crypto/src/asset/cache.rs index ef9ea46009..4e8a048b92 100644 --- a/crates/core/crypto/src/asset/cache.rs +++ b/crates/core/crypto/src/asset/cache.rs @@ -17,11 +17,11 @@ pub struct Cache { } impl Cache { - fn _get_by_id(&self, id: Id) -> Option { + pub fn get_by_id(&self, id: Id) -> Option { self.cache.get(&id).cloned() } - fn _get_unit(&self, raw_denom: &str) -> Option { + pub fn get_unit(&self, raw_denom: &str) -> Option { self.units.get(raw_denom).cloned() } @@ -159,6 +159,30 @@ impl Cache { }], )), }, + DenomMetadata { + inner: Arc::new(denom_metadata::Inner::new( + "ucube".to_string(), + vec![denom_metadata::BareDenomUnit { + exponent: 1, + denom: "cube".to_string(), + }], + )), + }, + DenomMetadata { + inner: Arc::new(denom_metadata::Inner::new( + "unala".to_string(), + vec![ + denom_metadata::BareDenomUnit { + exponent: 6, + denom: "nala".to_string(), + }, + denom_metadata::BareDenomUnit { + exponent: 3, + denom: "mnala".to_string(), + }, + ], + )), + }, ]; cache.extend(known_assets); @@ -229,7 +253,7 @@ impl Extend for Cache { self.cache.insert(id, denom.clone()); for unit in denom.units() { - self.units.insert(unit.base().base_denom().denom, unit); + self.units.insert(unit.to_string(), unit); } } } diff --git a/crates/core/crypto/src/asset/denom_metadata.rs b/crates/core/crypto/src/asset/denom_metadata.rs index da60f15d8f..8cc59ca247 100644 --- a/crates/core/crypto/src/asset/denom_metadata.rs +++ b/crates/core/crypto/src/asset/denom_metadata.rs @@ -223,11 +223,15 @@ impl Inner { .as_bytes(), )); + // Perform validity check for each unit. + for unit in &units { assert_ne!(unit.exponent, 0); assert_ne!(&unit.denom, &base_denom); } + // Add the base denom as a unit. + units.push(BareDenomUnit { exponent: 0, denom: base_denom.clone(), diff --git a/crates/core/crypto/src/balance.rs b/crates/core/crypto/src/balance.rs index d696904662..fd946ac38a 100644 --- a/crates/core/crypto/src/balance.rs +++ b/crates/core/crypto/src/balance.rs @@ -488,12 +488,20 @@ mod test { } // Two sample denom/asset id pairs, for testing - static DENOM_1: Lazy = - Lazy::new(|| asset::REGISTRY.parse_denom("a").unwrap()); + static DENOM_1: Lazy = Lazy::new(|| { + crate::asset::Cache::with_known_assets() + .get_unit("cube") + .unwrap() + .base() + }); static ASSET_ID_1: Lazy = Lazy::new(|| DENOM_1.id()); - static DENOM_2: Lazy = - Lazy::new(|| asset::REGISTRY.parse_denom("b").unwrap()); + static DENOM_2: Lazy = Lazy::new(|| { + crate::asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .base() + }); static ASSET_ID_2: Lazy = Lazy::new(|| DENOM_2.id()); fn gen_expression() -> impl proptest::strategy::Strategy { diff --git a/crates/core/crypto/src/lib.rs b/crates/core/crypto/src/lib.rs index d0722efa35..53769dcaab 100644 --- a/crates/core/crypto/src/lib.rs +++ b/crates/core/crypto/src/lib.rs @@ -53,6 +53,10 @@ fn fmt_hex>(data: T, f: &mut std::fmt::Formatter) -> std::fmt::Re use once_cell::sync::Lazy; -pub static STAKING_TOKEN_DENOM: Lazy = - Lazy::new(|| asset::REGISTRY.parse_denom("upenumbra").unwrap()); +pub static STAKING_TOKEN_DENOM: Lazy = Lazy::new(|| { + crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base() +}); pub static STAKING_TOKEN_ASSET_ID: Lazy = Lazy::new(|| STAKING_TOKEN_DENOM.id()); diff --git a/crates/core/crypto/src/memo.rs b/crates/core/crypto/src/memo.rs index 3e459f9de7..f43f38b317 100644 --- a/crates/core/crypto/src/memo.rs +++ b/crates/core/crypto/src/memo.rs @@ -292,7 +292,10 @@ mod tests { let value = Value { amount: 10u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut rng, &dest, value); diff --git a/crates/core/crypto/src/note.rs b/crates/core/crypto/src/note.rs index 029cf34ed1..fd69cc3551 100644 --- a/crates/core/crypto/src/note.rs +++ b/crates/core/crypto/src/note.rs @@ -541,7 +541,10 @@ mod tests { let value = Value { amount: 10u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut rng, &dest, value); @@ -574,7 +577,10 @@ mod tests { let value = Value { amount: 10u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut rng, &dest, value); @@ -605,7 +611,10 @@ mod tests { let value = Value { amount: 10u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }; let note = Note::generate(&mut rng, &dest, value); diff --git a/crates/core/crypto/src/proofs/groth16.rs b/crates/core/crypto/src/proofs/groth16.rs index adc843811d..dcb113a86f 100644 --- a/crates/core/crypto/src/proofs/groth16.rs +++ b/crates/core/crypto/src/proofs/groth16.rs @@ -109,7 +109,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -153,7 +153,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -220,7 +220,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &dest, value_to_send); @@ -260,7 +260,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &dest, value_to_send); @@ -306,7 +306,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &dest, value_to_send); @@ -347,7 +347,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -409,7 +409,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -467,7 +467,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &wrong_sender, value_to_send); @@ -523,7 +523,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -579,7 +579,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -634,7 +634,7 @@ mod tests { let value_to_send = Value { amount: value_amount.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); @@ -692,7 +692,7 @@ mod tests { let value_to_send = Value { amount: 0u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), }; let note = Note::generate(&mut rng, &sender, value_to_send); diff --git a/crates/core/crypto/src/value.rs b/crates/core/crypto/src/value.rs index c9f32b3c9b..266f3cbb14 100644 --- a/crates/core/crypto/src/value.rs +++ b/crates/core/crypto/src/value.rs @@ -341,10 +341,14 @@ mod tests { fn sum_balance_commitments() { use ark_ff::Field; - let pen_denom = asset::REGISTRY.parse_denom("upenumbra").unwrap(); - let atom_denom = asset::REGISTRY - .parse_denom("HubPort/HubChannel/uatom") - .unwrap(); + let pen_denom = crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base(); + let atom_denom = crate::asset::Cache::with_known_assets() + .get_unit("utest_atom") + .unwrap() + .base(); let pen_id = asset::Id::from(pen_denom); let atom_id = asset::Id::from(atom_denom); @@ -416,8 +420,14 @@ mod tests { #[test] fn value_parsing_happy() { - let upenumbra_base_denom = asset::REGISTRY.parse_denom("upenumbra").unwrap(); - let nala_base_denom = asset::REGISTRY.parse_denom("nala").unwrap(); + let upenumbra_base_denom = crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base(); + let nala_base_denom = crate::asset::Cache::with_known_assets() + .get_unit("unala") + .unwrap() + .base(); let cache = [upenumbra_base_denom.clone(), nala_base_denom.clone()] .into_iter() .collect::(); @@ -433,7 +443,7 @@ mod tests { assert_eq!(v2.asset_id, upenumbra_base_denom.id()); assert_eq!(v2, v2.format(&cache).parse().unwrap()); - let v1: Value = "1nala".parse().unwrap(); + let v1: Value = "1unala".parse().unwrap(); assert_eq!(v1.amount, 1u64.into()); assert_eq!(v1.asset_id, nala_base_denom.id()); assert_eq!(v1, v1.format(&cache).parse().unwrap()); @@ -447,10 +457,11 @@ mod tests { #[test] fn format_picks_best_unit() { - let upenumbra_base_denom = asset::REGISTRY.parse_denom("upenumbra").unwrap(); - let cache = [upenumbra_base_denom.clone()] - .into_iter() - .collect::(); + let upenumbra_base_denom = crate::asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .base(); + let cache = [upenumbra_base_denom].into_iter().collect::(); let v1: Value = "999upenumbra".parse().unwrap(); let v2: Value = "1000upenumbra".parse().unwrap(); diff --git a/crates/core/transaction/src/effect_hash.rs b/crates/core/transaction/src/effect_hash.rs index 295eca1b7b..b9c64b491a 100644 --- a/crates/core/transaction/src/effect_hash.rs +++ b/crates/core/transaction/src/effect_hash.rs @@ -701,8 +701,14 @@ mod tests { sct.insert(tct::Witness::Keep, note1.commit()).unwrap(); let trading_pair = TradingPair::new( - asset::REGISTRY.parse_denom("nala").unwrap().id(), - asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .id(), + asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), ); let swap_plaintext = SwapPlaintext::new( @@ -712,7 +718,10 @@ mod tests { 1u64.into(), Fee(Value { amount: 3u64.into(), - asset_id: asset::REGISTRY.parse_denom("upenumbra").unwrap().id(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), }), addr, );