1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#![cfg_attr(not(feature = "std"), no_std)]
use sp_std::prelude::*;
use sp_core::{H160, U256};
use frame_system::{self as system, ensure_signed};
use frame_support::{
decl_error, decl_event, decl_module, decl_storage,
dispatch::DispatchResult,
};
use artemis_core::{Application, BridgedAssetId};
use artemis_asset as asset;
mod payload;
use payload::Payload;
#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;
pub trait Trait: system::Trait + asset::Trait {
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
}
decl_storage! {
trait Store for Module<T: Trait> as Erc20Module {}
}
decl_event!(
pub enum Event<T>
where
AccountId = <T as system::Trait>::AccountId,
{
Transfer(BridgedAssetId, AccountId, H160, U256),
}
);
decl_error! {
pub enum Error for Module<T: Trait> {
InvalidAssetId,
InvalidPayload,
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
type Error = Error<T>;
fn deposit_event() = default;
#[weight = 0]
pub fn burn(origin, asset_id: BridgedAssetId, recipient: H160, amount: U256) -> DispatchResult {
let who = ensure_signed(origin)?;
if asset_id == H160::zero() {
return Err(Error::<T>::InvalidAssetId.into())
}
<asset::Module<T>>::do_burn(asset_id, &who, amount)?;
Self::deposit_event(RawEvent::Transfer(asset_id, who.clone(), recipient, amount));
Ok(())
}
}
}
impl<T: Trait> Module<T> {
fn handle_event(payload: Payload<T::AccountId>) -> DispatchResult {
if payload.token_addr.is_zero() {
return Err(Error::<T>::InvalidAssetId.into())
}
<asset::Module<T>>::do_mint(payload.token_addr, &payload.recipient_addr, payload.amount)?;
Ok(())
}
}
impl<T: Trait> Application for Module<T> {
fn handle(payload: Vec<u8>) -> DispatchResult {
let payload_decoded = Payload::decode(payload)
.map_err(|_| Error::<T>::InvalidPayload)?;
Self::handle_event(payload_decoded)
}
}