@@ -145,8 +145,15 @@ pub mod pallet {
145
145
146
146
// TODO:
147
147
// - Create a new AssetMetadata instance based on the call arguments.
148
+ let metadata = AssetMetadata :: new ( name. clone ( ) , symbol. clone ( ) ) ;
148
149
// - Insert this metadata in the Metadata storage, under the asset_id key.
150
+ Metadata :: < T > :: insert ( asset_id, metadata) ;
149
151
// - Deposit a `MetadataSet` event.
152
+ Self :: deposit_event ( Event :: < T > :: MetadataSet {
153
+ asset_id,
154
+ name,
155
+ symbol,
156
+ } ) ;
150
157
151
158
Ok ( ( ) )
152
159
}
@@ -160,15 +167,19 @@ pub mod pallet {
160
167
) -> DispatchResult {
161
168
// TODO:
162
169
// - Ensure the extrinsic origin is a signed transaction.
170
+ let origin = ensure_signed ( origin) ?;
163
171
// - Ensure the caller is the asset owner.
172
+ Self :: ensure_is_owner ( asset_id, origin) ?;
164
173
165
174
let mut minted_amount = 0 ;
175
+ let mut total_supply = 0 ;
166
176
167
177
Asset :: < T > :: try_mutate ( asset_id, |maybe_details| -> DispatchResult {
168
178
let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T > :: UnknownAssetId ) ?;
169
179
170
180
let old_supply = details. supply ;
171
181
details. supply = details. supply . saturating_add ( amount) ;
182
+ total_supply = details. supply ;
172
183
minted_amount = details. supply - old_supply;
173
184
174
185
Ok ( ( ) )
@@ -179,6 +190,11 @@ pub mod pallet {
179
190
} ) ;
180
191
181
192
// TODO: Deposit a `Minted` event.
193
+ Self :: deposit_event ( Event :: < T > :: Minted {
194
+ asset_id,
195
+ owner : to,
196
+ total_supply,
197
+ } ) ;
182
198
183
199
Ok ( ( ) )
184
200
}
@@ -187,9 +203,34 @@ pub mod pallet {
187
203
pub fn burn ( origin : OriginFor < T > , asset_id : AssetId , amount : u128 ) -> DispatchResult {
188
204
// TODO:
189
205
// - Ensure the extrinsic origin is a signed transaction.
206
+ let origin = ensure_signed ( origin) ?;
190
207
// - Mutate the total supply.
191
- // - Mutate the account balance.
208
+ let mut total_supply = 0 ;
209
+
210
+ Asset :: < T > :: try_mutate ( asset_id, |maybe_details| -> DispatchResult {
211
+ let details = maybe_details. as_mut ( ) . ok_or ( Error :: < T > :: UnknownAssetId ) ?;
212
+
213
+ let mut burned_amount = 0 ;
214
+
215
+ // - Mutate the account balance.
216
+ Account :: < T > :: mutate ( asset_id, origin. clone ( ) , |balance| {
217
+ let old_balance = * balance;
218
+ * balance = balance. saturating_sub ( amount) ;
219
+ burned_amount = old_balance - * balance;
220
+ } ) ;
221
+
222
+ details. supply -= burned_amount;
223
+ total_supply = details. supply ;
224
+
225
+ Ok ( ( ) )
226
+ } ) ?;
227
+
192
228
// - Emit a `Burned` event.
229
+ Self :: deposit_event ( Event :: < T > :: Burned {
230
+ asset_id,
231
+ owner : origin,
232
+ total_supply,
233
+ } ) ;
193
234
194
235
Ok ( ( ) )
195
236
}
@@ -203,8 +244,27 @@ pub mod pallet {
203
244
) -> DispatchResult {
204
245
// TODO:
205
246
// - Ensure the extrinsic origin is a signed transaction.
247
+ let origin = ensure_signed ( origin) ?;
248
+ ensure ! ( Self :: asset( asset_id) . is_some( ) , Error :: <T >:: UnknownAssetId ) ;
206
249
// - Mutate both account balances.
250
+ let mut transfered_amount = 0 ;
251
+
252
+ Account :: < T > :: mutate ( asset_id, origin. clone ( ) , |balance| {
253
+ let old_balance = * balance;
254
+ * balance = balance. saturating_sub ( amount) ;
255
+ transfered_amount = old_balance - * balance;
256
+ } ) ;
257
+
258
+ Account :: < T > :: mutate ( asset_id, to. clone ( ) , |balance| {
259
+ * balance = balance. saturating_add ( transfered_amount) ;
260
+ } ) ;
207
261
// - Emit a `Transferred` event.
262
+ Self :: deposit_event ( Event :: < T > :: Transferred {
263
+ asset_id,
264
+ from : origin,
265
+ to,
266
+ amount,
267
+ } ) ;
208
268
209
269
Ok ( ( ) )
210
270
}
0 commit comments