/home/runner/work/creditcoin/creditcoin/pallets/creditcoin/src/migrations/v5.rs
Line | Count | Source (jump to first uncovered line) |
1 | | // task storage moved from UnverifiedTransfers + UnverifiedCollectedCoins to PendingTasks |
2 | | use crate::{ |
3 | | types::{ExternalAddress, ExternalTxId}, |
4 | | CollectedCoinsId, Config, TransferId, |
5 | | }; |
6 | | use codec::{Decode, Encode}; |
7 | | |
8 | | use frame_support::{generate_storage_alias, migration, pallet_prelude::*, Identity}; |
9 | | |
10 | | pub use super::v4::Transfer; |
11 | | pub use super::v4::*; |
12 | | |
13 | 3 | #[derive(Encode, Decode)] |
14 | 1 | #[cfg_attr(test, derive(Eq, PartialEq, Debug0 ))] |
15 | | pub struct UnverifiedCollectedCoinsStruct { |
16 | | pub to: ExternalAddress, |
17 | | pub tx_id: ExternalTxId, |
18 | | } |
19 | | |
20 | 2 | #[derive(Encode, Decode)] |
21 | 1 | #[cfg_attr(test, derive(Eq, PartialEq, Debug0 ))] |
22 | | pub struct UnverifiedTransfer<AccountId, BlockNum, Hash, Moment> { |
23 | | pub transfer: Transfer<AccountId, BlockNum, Hash, Moment>, |
24 | | pub from_external: ExternalAddress, |
25 | | pub to_external: ExternalAddress, |
26 | | pub deadline: BlockNum, |
27 | | } |
28 | | |
29 | 3 | #[derive(Encode, Decode)] |
30 | 2 | #[cfg_attr(test, derive(Eq, PartialEq, D0 ebug0 ))] |
31 | | pub enum Task<AccountId, BlockNum, Hash, Moment> { |
32 | | VerifyTransfer(UnverifiedTransfer<AccountId, BlockNum, Hash, Moment>), |
33 | | CollectCoins(UnverifiedCollectedCoinsStruct), |
34 | | } |
35 | | |
36 | | impl<AccountId, BlockNum, Hash, Moment> From<UnverifiedTransfer<AccountId, BlockNum, Hash, Moment>> |
37 | | for Task<AccountId, BlockNum, Hash, Moment> |
38 | | { |
39 | 1 | fn from(transfer: UnverifiedTransfer<AccountId, BlockNum, Hash, Moment>) -> Self { |
40 | 1 | Task::VerifyTransfer(transfer) |
41 | 1 | } |
42 | | } |
43 | | |
44 | | impl<AccountId, BlockNum, Hash, Moment> From<UnverifiedCollectedCoinsStruct> |
45 | | for Task<AccountId, BlockNum, Hash, Moment> |
46 | | { |
47 | 2 | fn from(coins: UnverifiedCollectedCoinsStruct) -> Self { |
48 | 2 | Task::CollectCoins(coins) |
49 | 2 | } |
50 | | } |
51 | | |
52 | 4 | #[derive(Encode, D0 ecode)] |
53 | 0 | #[cfg_attr(test, derive(Eq, PartialEq, Debug))] |
54 | | pub enum TaskId<Hash> { |
55 | | VerifyTransfer(TransferId<Hash>), |
56 | | CollectCoins(CollectedCoinsId<Hash>), |
57 | | } |
58 | | |
59 | | impl<Hash> From<TransferId<Hash>> for TaskId<Hash> { |
60 | 1 | fn from(id: TransferId<Hash>) -> Self { |
61 | 1 | TaskId::VerifyTransfer(id) |
62 | 1 | } |
63 | | } |
64 | | |
65 | | impl<Hash> From<CollectedCoinsId<Hash>> for TaskId<Hash> { |
66 | 1 | fn from(id: CollectedCoinsId<Hash>) -> Self { |
67 | 1 | TaskId::CollectCoins(id) |
68 | 1 | } |
69 | | } |
70 | | |
71 | | generate_storage_alias!( |
72 | | Creditcoin, |
73 | | UnverifiedTransfers<T: Config> => DoubleMap< |
74 | | (Identity, T::BlockNumber), |
75 | | (Identity, TransferId<T::Hash>), |
76 | | UnverifiedTransfer<T::AccountId, T::BlockNumber, T::Hash, T::Moment> |
77 | | > |
78 | | ); |
79 | | |
80 | | generate_storage_alias!( |
81 | | Creditcoin, |
82 | | UnverifiedCollectedCoins<T: Config> => DoubleMap< |
83 | | (Identity, T::BlockNumber), |
84 | | (Identity, CollectedCoinsId<T::Hash>), |
85 | | UnverifiedCollectedCoinsStruct |
86 | | > |
87 | | ); |
88 | | |
89 | | generate_storage_alias!( |
90 | | Creditcoin, |
91 | | PendingTasks<T: Config> => DoubleMap< |
92 | | (Identity, T::BlockNumber), |
93 | | (Identity, TaskId<T::Hash>), |
94 | | Task<T::AccountId, T::BlockNumber, T::Hash, T::Moment> |
95 | | > |
96 | | ); |
97 | | |
98 | | /* |
99 | | #[pallet::storage] |
100 | | #[pallet::getter(fn pending_tasks)] |
101 | | pub type PendingTasks<T: Config> = StorageDoubleMap< |
102 | | _, |
103 | | Identity, |
104 | | T::BlockNumber, |
105 | | Identity, |
106 | | TaskId<T::Hash>, |
107 | | Task<T::AccountId, T::BlockNumber, T::Hash, T::Moment>, |
108 | | >; */ |
109 | | |
110 | 2 | pub(crate) fn migrate<T: Config>() -> Weight { |
111 | 2 | let mut weight: Weight = 0; |
112 | 2 | let weight_each = T::DbWeight::get().reads_writes(1, 1); |
113 | | |
114 | 3 | for (deadline, id, transfer1 ) in UnverifiedTransfers::<T>::iter() { |
115 | 1 | weight = weight.saturating_add(weight_each); |
116 | 1 | |
117 | 1 | PendingTasks::<T>::insert(deadline, TaskId::from(id), Task::from(transfer)); |
118 | 1 | } |
119 | | |
120 | 3 | for (deadline, id, collect_coins1 ) in UnverifiedCollectedCoins::<T>::iter() { |
121 | 1 | weight = weight.saturating_add(weight_each); |
122 | 1 | |
123 | 1 | PendingTasks::<T>::insert(deadline, TaskId::from(id), Task::from(collect_coins)); |
124 | 1 | } |
125 | | |
126 | 2 | let module = crate::Pallet::<T>::name().as_bytes(); |
127 | 2 | migration::remove_storage_prefix(module, b"UnverifiedTransfers", b""); |
128 | 2 | migration::remove_storage_prefix(module, b"UnverifiedCollectedCoins", b""); |
129 | 2 | |
130 | 2 | weight |
131 | 2 | } |
132 | | |
133 | | #[cfg(test)] |
134 | | mod tests { |
135 | | use core::{convert::TryInto, ops::Not}; |
136 | | |
137 | | use ethereum_types::H256; |
138 | | |
139 | | use sp_runtime::traits::Hash; |
140 | | |
141 | | use crate::{ |
142 | | mock::{ExtBuilder, Test}, |
143 | | tests::TestInfo, |
144 | | ExternalTxId, TransferId, |
145 | | }; |
146 | | |
147 | | use super::{ |
148 | | Blockchain, OrderId, PendingTasks, Task, TaskId, Transfer, TransferKind, |
149 | | UnverifiedCollectedCoins, UnverifiedCollectedCoinsStruct, UnverifiedTransfer, |
150 | | UnverifiedTransfers, |
151 | | }; |
152 | | |
153 | 1 | #[test] |
154 | 1 | fn unverified_transfer_migrates() { |
155 | 1 | ExtBuilder::default().build_and_execute(|| { |
156 | 1 | let test_info = TestInfo::new_defaults(); |
157 | 1 | let eth = Blockchain::Ethereum; |
158 | 1 | let deadline = 11; |
159 | 1 | let tx_id: ExternalTxId = b"fafafafafafafa".to_vec().try_into().unwrap(); |
160 | 1 | let transfer = UnverifiedTransfer { |
161 | 1 | transfer: Transfer { |
162 | 1 | blockchain: eth.clone(), |
163 | 1 | kind: TransferKind::Native, |
164 | 1 | from: crate::AddressId::make(H256::random()), |
165 | 1 | to: crate::AddressId::make(H256::random()), |
166 | 1 | order_id: OrderId::Deal(crate::DealOrderId::dummy()), |
167 | 1 | amount: 1.into(), |
168 | 1 | tx_id: tx_id.clone(), |
169 | 1 | block: 1, |
170 | 1 | is_processed: false, |
171 | 1 | account_id: test_info.lender.account_id, |
172 | 1 | timestamp: None, |
173 | 1 | }, |
174 | 1 | from_external: b"baba".to_vec().try_into().unwrap(), |
175 | 1 | to_external: b"abab".to_vec().try_into().unwrap(), |
176 | 1 | deadline: 11, |
177 | 1 | }; |
178 | 1 | let transfer_id = TransferId::from_old_blockchain::<Test>(ð, &tx_id); |
179 | 1 | |
180 | 1 | UnverifiedTransfers::<Test>::insert(deadline, &transfer_id, &transfer); |
181 | 1 | assert!(UnverifiedTransfers::<Test>::contains_key(deadline, &transfer_id)); |
182 | | |
183 | 1 | super::migrate::<Test>(); |
184 | 1 | |
185 | 1 | assert_eq!( |
186 | 1 | PendingTasks::<Test>::get(deadline, TaskId::VerifyTransfer(transfer_id.clone())), |
187 | 1 | Some(Task::VerifyTransfer(transfer)) |
188 | 1 | ); |
189 | | |
190 | 1 | assert!(UnverifiedTransfers::<Test>::contains_key(deadline, transfer_id).not()); |
191 | 1 | }); |
192 | 1 | } |
193 | | |
194 | 1 | #[test] |
195 | 1 | fn unverified_collected_coins_migrates() { |
196 | 1 | ExtBuilder::default().build_and_execute(|| { |
197 | 1 | let deadline = 11; |
198 | 1 | let tx_id: ExternalTxId = b"fafafafafafafa".to_vec().try_into().unwrap(); |
199 | 1 | let collect_coins = UnverifiedCollectedCoinsStruct { |
200 | 1 | to: b"baba".to_vec().try_into().unwrap(), |
201 | 1 | tx_id: tx_id.clone(), |
202 | 1 | }; |
203 | 1 | |
204 | 1 | let collect_coins_id = crate::CollectedCoinsId::make( |
205 | 1 | <Test as frame_system::Config>::Hashing::hash(&tx_id), |
206 | 1 | ); |
207 | 1 | |
208 | 1 | UnverifiedCollectedCoins::<Test>::insert(deadline, &collect_coins_id, &collect_coins); |
209 | 1 | |
210 | 1 | assert!(UnverifiedCollectedCoins::<Test>::contains_key(deadline, &collect_coins_id)); |
211 | | |
212 | 1 | super::migrate::<Test>(); |
213 | 1 | |
214 | 1 | assert_eq!( |
215 | 1 | PendingTasks::<Test>::get(deadline, TaskId::CollectCoins(collect_coins_id.clone())), |
216 | 1 | Some(Task::CollectCoins(collect_coins)) |
217 | 1 | ); |
218 | | |
219 | 1 | assert!( |
220 | 1 | UnverifiedCollectedCoins::<Test>::contains_key(deadline, collect_coins_id).not() |
221 | 1 | ); |
222 | 1 | }); |
223 | 1 | } |
224 | | } |