Skip to content

Commit 31c6db7

Browse files
authored
Asset registry genesis (#803)
* asset registry genesis * fmt * clone instead of copy
1 parent b014a8c commit 31c6db7

File tree

3 files changed

+93
-8
lines changed

3 files changed

+93
-8
lines changed

asset-registry/src/lib.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub mod module {
4040
type CustomMetadata: Parameter + Member + TypeInfo;
4141

4242
/// The type used as a unique asset id,
43-
type AssetId: Parameter + Member + Default + TypeInfo;
43+
type AssetId: Parameter + Member + Default + TypeInfo + MaybeSerializeDeserialize;
4444

4545
/// Checks that an origin has the authority to register/update an asset
4646
type AuthorityOrigin: EnsureOriginWithArg<Self::Origin, Option<Self::AssetId>>;
@@ -103,21 +103,31 @@ pub mod module {
103103

104104
#[pallet::genesis_config]
105105
pub struct GenesisConfig<T: Config> {
106-
_phantom: PhantomData<T>,
106+
pub assets: Vec<(T::AssetId, Vec<u8>)>,
107+
pub last_asset_id: T::AssetId,
107108
}
108109

109110
#[cfg(feature = "std")]
110111
impl<T: Config> Default for GenesisConfig<T> {
111112
fn default() -> Self {
112113
Self {
113-
_phantom: Default::default(),
114+
assets: vec![],
115+
last_asset_id: Default::default(),
114116
}
115117
}
116118
}
117119

118120
#[pallet::genesis_build]
119121
impl<T: Config> GenesisBuild<T> for GenesisConfig<T> {
120-
fn build(&self) {}
122+
fn build(&self) {
123+
self.assets.iter().for_each(|(asset_id, metadata_encoded)| {
124+
let metadata = AssetMetadata::decode(&mut &metadata_encoded[..]).expect("Error decoding AssetMetadata");
125+
Pallet::<T>::do_register_asset_without_asset_processor(metadata, asset_id.clone())
126+
.expect("Error registering Asset");
127+
});
128+
129+
LastAssetId::<T>::set(self.last_asset_id.clone());
130+
}
121131
}
122132

123133
#[pallet::pallet]

asset-registry/src/mock/mod.rs

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ decl_test_parachain! {
109109
Runtime = para::Runtime,
110110
XcmpMessageHandler = para::XcmpQueue,
111111
DmpMessageHandler = para::DmpQueue,
112-
new_ext = para_ext(1),
112+
new_ext = para_ext(1, None),
113113
}
114114
}
115115

@@ -118,7 +118,7 @@ decl_test_parachain! {
118118
Runtime = para::Runtime,
119119
XcmpMessageHandler = para::XcmpQueue,
120120
DmpMessageHandler = para::DmpQueue,
121-
new_ext = para_ext(2),
121+
new_ext = para_ext(2, None),
122122
}
123123
}
124124

@@ -127,7 +127,41 @@ decl_test_parachain! {
127127
Runtime = para::Runtime,
128128
XcmpMessageHandler = para::XcmpQueue,
129129
DmpMessageHandler = para::DmpQueue,
130-
new_ext = para_ext(3),
130+
new_ext = para_ext(3, None),
131+
}
132+
}
133+
134+
decl_test_parachain! {
135+
pub struct ParaG {
136+
Runtime = para::Runtime,
137+
XcmpMessageHandler = para::XcmpQueue,
138+
DmpMessageHandler = para::DmpQueue,
139+
new_ext = para_ext(4, Some((
140+
vec![(
141+
4,
142+
AssetMetadata::<Balance, para::CustomMetadata>::encode(&AssetMetadata {
143+
decimals: 12,
144+
name: "para G native token".as_bytes().to_vec(),
145+
symbol: "paraG".as_bytes().to_vec(),
146+
existential_deposit: 0,
147+
location: None,
148+
additional: para::CustomMetadata {
149+
fee_per_second: 1_000_000_000_000,
150+
},
151+
})),
152+
(
153+
5,
154+
AssetMetadata::<Balance, para::CustomMetadata>::encode(&AssetMetadata {
155+
decimals: 12,
156+
name: "para G foreign token".as_bytes().to_vec(),
157+
symbol: "paraF".as_bytes().to_vec(),
158+
existential_deposit: 0,
159+
location: None,
160+
additional: para::CustomMetadata {
161+
fee_per_second: 1_000_000_000_000,
162+
},
163+
}))], 5
164+
))),
131165
}
132166
}
133167

@@ -146,14 +180,15 @@ decl_test_network! {
146180
(1, ParaA),
147181
(2, ParaB),
148182
(3, ParaC),
183+
(4, ParaG),
149184
],
150185
}
151186
}
152187

153188
pub type ParaTokens = orml_tokens::Pallet<para::Runtime>;
154189
pub type ParaXTokens = orml_xtokens::Pallet<para::Runtime>;
155190

156-
pub fn para_ext(para_id: u32) -> TestExternalities {
191+
pub fn para_ext(para_id: u32, asset_data: Option<(Vec<(u32, Vec<u8>)>, u32)>) -> TestExternalities {
157192
use para::{Runtime, System};
158193

159194
let mut t = frame_system::GenesisConfig::default()
@@ -172,6 +207,15 @@ pub fn para_ext(para_id: u32) -> TestExternalities {
172207
.assimilate_storage(&mut t)
173208
.unwrap();
174209

210+
if let Some((assets, last_asset_id)) = asset_data {
211+
GenesisConfig::<Runtime> {
212+
assets: assets,
213+
last_asset_id: last_asset_id,
214+
}
215+
.assimilate_storage(&mut t)
216+
.unwrap();
217+
}
218+
175219
let mut ext = TestExternalities::new(t);
176220
ext.execute_with(|| System::set_block_number(1));
177221
ext

asset-registry/src/tests.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,37 @@ fn dummy_metadata() -> AssetMetadata<<para::Runtime as orml_asset_registry::Conf
5353
}
5454
}
5555

56+
#[test]
57+
fn genesis_issuance_should_work() {
58+
TestNet::reset();
59+
60+
ParaG::execute_with(|| {
61+
let metadata1 = AssetMetadata {
62+
decimals: 12,
63+
name: "para G native token".as_bytes().to_vec(),
64+
symbol: "paraG".as_bytes().to_vec(),
65+
existential_deposit: 0,
66+
location: None,
67+
additional: CustomMetadata {
68+
fee_per_second: 1_000_000_000_000,
69+
},
70+
};
71+
let metadata2 = AssetMetadata {
72+
decimals: 12,
73+
name: "para G foreign token".as_bytes().to_vec(),
74+
symbol: "paraF".as_bytes().to_vec(),
75+
existential_deposit: 0,
76+
location: None,
77+
additional: CustomMetadata {
78+
fee_per_second: 1_000_000_000_000,
79+
},
80+
};
81+
assert_eq!(AssetRegistry::metadata(4).unwrap(), metadata1);
82+
assert_eq!(AssetRegistry::metadata(5).unwrap(), metadata2);
83+
assert_eq!(LastAssetId::<para::Runtime>::get(), 5);
84+
});
85+
}
86+
5687
#[test]
5788
/// test that the asset registry can be used in xcm transfers
5889
fn send_self_parachain_asset_to_sibling() {

0 commit comments

Comments
 (0)