/home/runner/work/creditcoin/creditcoin/pallets/creditcoin/src/migrations/v3.rs
Line | Count | Source (jump to first uncovered line) |
1 | | // `interest_type` added to `LoanTerms` |
2 | | |
3 | | use super::v2; |
4 | | use codec::{Decode, Encode}; |
5 | | use frame_support::dispatch::Weight; |
6 | | use frame_support::{generate_storage_alias, traits::Get, Identity, Twox64Concat}; |
7 | | |
8 | | use crate::{AddressId, Config, Duration, ExternalAmount, OfferId, TransferId}; |
9 | | |
10 | | pub use v2::AskOrder as OldAskOrder; |
11 | | pub use v2::AskTerms as OldAskTerms; |
12 | | pub use v2::BidOrder as OldBidOrder; |
13 | | pub use v2::BidTerms as OldBidTerms; |
14 | | pub use v2::Blockchain; |
15 | | pub use v2::DealOrder as OldDealOrder; |
16 | | pub use v2::InterestRate as OldInterestRate; |
17 | | pub use v2::LoanTerms as OldLoanTerms; |
18 | | pub use v2::{OrderId, Transfer, TransferKind}; |
19 | | |
20 | | use crate::InterestRate; |
21 | | |
22 | 11 | #[derive(Encode, Decode)] |
23 | 3 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
24 | | pub struct LoanTerms { |
25 | | pub amount: ExternalAmount, |
26 | | pub interest_rate: InterestRate, |
27 | | pub term_length: Duration, |
28 | | } |
29 | | |
30 | 3 | #[derive(Encode, Decode)] |
31 | 1 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
32 | 3 | pub struct AskTerms(pub(super) LoanTerms); |
33 | 3 | #[derive(Encode, Decode)] |
34 | 1 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
35 | 3 | pub struct BidTerms(pub(super) LoanTerms); |
36 | | |
37 | 6 | #[derive(Encode3 , Decode)] |
38 | 1 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
39 | | pub struct AskOrder<AccountId, BlockNum, Hash> { |
40 | | pub blockchain: Blockchain, |
41 | | pub lender_address_id: AddressId<Hash>, |
42 | | pub terms: AskTerms, |
43 | | pub expiration_block: BlockNum, |
44 | | pub block: BlockNum, |
45 | | pub lender: AccountId, |
46 | | } |
47 | | |
48 | 6 | #[derive(Encode3 , Decode)] |
49 | 1 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
50 | | pub struct BidOrder<AccountId, BlockNum, Hash> { |
51 | | pub blockchain: Blockchain, |
52 | | pub borrower_address_id: AddressId<Hash>, |
53 | | pub terms: BidTerms, |
54 | | pub expiration_block: BlockNum, |
55 | | pub block: BlockNum, |
56 | | pub borrower: AccountId, |
57 | | } |
58 | | |
59 | 5 | #[derive(Encode, Decode)] |
60 | 1 | #[cfg_attr(test, derive(Debug0 , PartialEq, Eq))] |
61 | | pub struct DealOrder<AccountId, BlockNum, Hash, Moment> { |
62 | | pub blockchain: Blockchain, |
63 | | pub offer_id: OfferId<BlockNum, Hash>, |
64 | | pub lender_address_id: AddressId<Hash>, |
65 | | pub borrower_address_id: AddressId<Hash>, |
66 | | pub terms: LoanTerms, |
67 | | pub expiration_block: BlockNum, |
68 | | pub timestamp: Moment, |
69 | | pub block: Option<BlockNum>, |
70 | | pub funding_transfer_id: Option<TransferId<Hash>>, |
71 | | pub repayment_transfer_id: Option<TransferId<Hash>>, |
72 | | pub lock: Option<AccountId>, |
73 | | pub borrower: AccountId, |
74 | | } |
75 | | |
76 | | impl From<OldInterestRate> for InterestRate { |
77 | 3 | fn from(old: OldInterestRate) -> Self { |
78 | 3 | Self { |
79 | 3 | decimals: old.decimals, |
80 | 3 | rate_per_period: old.rate_per_period, |
81 | 3 | period: old.period, |
82 | 3 | interest_type: crate::InterestType::Simple, |
83 | 3 | } |
84 | 3 | } |
85 | | } |
86 | | |
87 | | impl From<OldLoanTerms> for LoanTerms { |
88 | 3 | fn from(old: OldLoanTerms) -> Self { |
89 | 3 | Self { |
90 | 3 | amount: old.amount, |
91 | 3 | interest_rate: InterestRate::from(old.interest_rate), |
92 | 3 | term_length: old.term_length, |
93 | 3 | } |
94 | 3 | } |
95 | | } |
96 | | |
97 | | impl From<LoanTerms> for AskTerms { |
98 | 1 | fn from(terms: LoanTerms) -> Self { |
99 | 1 | Self(terms) |
100 | 1 | } |
101 | | } |
102 | | |
103 | | impl From<LoanTerms> for BidTerms { |
104 | 1 | fn from(terms: LoanTerms) -> Self { |
105 | 1 | Self(terms) |
106 | 1 | } |
107 | | } |
108 | | |
109 | | impl From<OldAskTerms> for AskTerms { |
110 | 1 | fn from(old: OldAskTerms) -> Self { |
111 | 1 | AskTerms(LoanTerms::from(old.0)) |
112 | 1 | } |
113 | | } |
114 | | |
115 | | impl From<OldBidTerms> for BidTerms { |
116 | 1 | fn from(old: OldBidTerms) -> Self { |
117 | 1 | BidTerms(LoanTerms::from(old.0)) |
118 | 1 | } |
119 | | } |
120 | | |
121 | | generate_storage_alias!( |
122 | | Creditcoin, |
123 | | DealOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), DealOrder<T::AccountId, T::BlockNumber, T::Hash, T::Moment>> |
124 | | ); |
125 | | |
126 | | generate_storage_alias!( |
127 | | Creditcoin, |
128 | | AskOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), AskOrder<T::AccountId, T::BlockNumber, T::Hash>> |
129 | | ); |
130 | | |
131 | | generate_storage_alias!( |
132 | | Creditcoin, |
133 | | BidOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), BidOrder<T::AccountId, T::BlockNumber, T::Hash>> |
134 | | ); |
135 | | |
136 | 3 | pub(crate) fn migrate<T: Config>() -> Weight { |
137 | 3 | let mut weight: Weight = 0; |
138 | 3 | let weight_each = T::DbWeight::get().reads_writes(1, 1); |
139 | 3 | |
140 | 3 | DealOrders::<T>::translate::<OldDealOrder<T::AccountId, T::BlockNumber, T::Hash, T::Moment>, _>( |
141 | 3 | |_exp, _hash, old_deal| { |
142 | 1 | weight = weight.saturating_add(weight_each); |
143 | 1 | Some(DealOrder { |
144 | 1 | blockchain: old_deal.blockchain, |
145 | 1 | offer_id: old_deal.offer_id, |
146 | 1 | lender_address_id: old_deal.lender_address_id, |
147 | 1 | borrower_address_id: old_deal.borrower_address_id, |
148 | 1 | terms: LoanTerms::from(old_deal.terms), |
149 | 1 | expiration_block: old_deal.expiration_block, |
150 | 1 | timestamp: old_deal.timestamp, |
151 | 1 | block: old_deal.block, |
152 | 1 | funding_transfer_id: old_deal.funding_transfer_id, |
153 | 1 | repayment_transfer_id: old_deal.repayment_transfer_id, |
154 | 1 | lock: old_deal.lock, |
155 | 1 | borrower: old_deal.borrower, |
156 | 1 | }) |
157 | 3 | }, |
158 | 3 | ); |
159 | 3 | |
160 | 3 | AskOrders::<T>::translate::<OldAskOrder<T::AccountId, T::BlockNumber, T::Hash>, _>( |
161 | 3 | |_exp, _hash, old_ask| { |
162 | 1 | weight = weight.saturating_add(weight_each); |
163 | 1 | Some(AskOrder { |
164 | 1 | blockchain: old_ask.blockchain, |
165 | 1 | lender_address_id: old_ask.lender_address_id, |
166 | 1 | terms: AskTerms::from(old_ask.terms), |
167 | 1 | expiration_block: old_ask.expiration_block, |
168 | 1 | block: old_ask.block, |
169 | 1 | lender: old_ask.lender, |
170 | 1 | }) |
171 | 3 | }, |
172 | 3 | ); |
173 | 3 | |
174 | 3 | BidOrders::<T>::translate::<OldBidOrder<T::AccountId, T::BlockNumber, T::Hash>, _>( |
175 | 3 | |_exp, _hash, old_bid| { |
176 | 1 | weight = weight.saturating_add(weight_each); |
177 | 1 | Some(BidOrder { |
178 | 1 | blockchain: old_bid.blockchain, |
179 | 1 | borrower_address_id: old_bid.borrower_address_id, |
180 | 1 | terms: BidTerms::from(old_bid.terms), |
181 | 1 | expiration_block: old_bid.expiration_block, |
182 | 1 | block: old_bid.block, |
183 | 1 | borrower: old_bid.borrower, |
184 | 1 | }) |
185 | 3 | }, |
186 | 3 | ); |
187 | 3 | |
188 | 3 | weight |
189 | 3 | } |
190 | | |
191 | | #[cfg(test)] |
192 | | mod tests { |
193 | | use core::convert::TryFrom; |
194 | | |
195 | | use crate::{ |
196 | | mock::{ExtBuilder, Test}, |
197 | | tests::TestInfo, |
198 | | AskOrderId, BidOrderId, DealOrderId, DoubleMapExt, Duration, InterestRate, OfferId, |
199 | | }; |
200 | | |
201 | | use super::{ |
202 | | generate_storage_alias, AskOrder, AskTerms, BidOrder, BidTerms, Blockchain, Config, |
203 | | DealOrder, Identity, LoanTerms, OldAskOrder, OldAskTerms, OldBidOrder, OldBidTerms, |
204 | | OldDealOrder, OldInterestRate, OldLoanTerms, Twox64Concat, |
205 | | }; |
206 | | |
207 | | generate_storage_alias!( |
208 | | Creditcoin, |
209 | | DealOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), OldDealOrder<T::AccountId, T::BlockNumber, T::Hash, T::Moment>> |
210 | | ); |
211 | | |
212 | | type OldDealOrders = DealOrders<Test>; |
213 | | |
214 | | generate_storage_alias!( |
215 | | Creditcoin, |
216 | | AskOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), OldAskOrder<T::AccountId, T::BlockNumber, T::Hash>> |
217 | | ); |
218 | | |
219 | | type OldAskOrders = AskOrders<Test>; |
220 | | |
221 | | generate_storage_alias!( |
222 | | Creditcoin, |
223 | | BidOrders<T: Config> => DoubleMap<(Twox64Concat, T::BlockNumber), (Identity, T::Hash), OldBidOrder<T::AccountId, T::BlockNumber, T::Hash>> |
224 | | ); |
225 | | |
226 | | type OldBidOrders = BidOrders<Test>; |
227 | | |
228 | 1 | #[test] |
229 | 1 | fn ask_order_migrates() { |
230 | 1 | ExtBuilder::default().build_and_execute(|| { |
231 | 1 | let ask_order_id = AskOrderId::new::<Test>(100, "asdf".as_bytes()); |
232 | 1 | let test_info = TestInfo::new_defaults(); |
233 | 1 | |
234 | 1 | let old_ask_order = OldAskOrder { |
235 | 1 | blockchain: Blockchain::Ethereum, |
236 | 1 | lender_address_id: test_info.lender.address_id, |
237 | 1 | terms: OldAskTerms(OldLoanTerms { |
238 | 1 | amount: 100u64.into(), |
239 | 1 | interest_rate: OldInterestRate { |
240 | 1 | rate_per_period: 100, |
241 | 1 | decimals: 4, |
242 | 1 | period: Duration::from_millis(1000), |
243 | 1 | }, |
244 | 1 | term_length: Duration::from_millis(2000), |
245 | 1 | }), |
246 | 1 | expiration_block: 100, |
247 | 1 | block: 1, |
248 | 1 | lender: test_info.lender.account_id, |
249 | 1 | }; |
250 | 1 | |
251 | 1 | OldAskOrders::insert_id(&ask_order_id, &old_ask_order); |
252 | 1 | |
253 | 1 | super::migrate::<Test>(); |
254 | 1 | |
255 | 1 | let ask_order = super::AskOrders::<Test>::try_get_id(&ask_order_id).unwrap(); |
256 | 1 | |
257 | 1 | assert_eq!( |
258 | 1 | ask_order, |
259 | 1 | AskOrder { |
260 | 1 | blockchain: old_ask_order.blockchain, |
261 | 1 | lender_address_id: old_ask_order.lender_address_id, |
262 | 1 | terms: AskTerms::try_from(LoanTerms { |
263 | 1 | amount: old_ask_order.terms.0.amount, |
264 | 1 | interest_rate: InterestRate { |
265 | 1 | rate_per_period: old_ask_order.terms.0.interest_rate.rate_per_period, |
266 | 1 | decimals: old_ask_order.terms.0.interest_rate.decimals, |
267 | 1 | period: old_ask_order.terms.0.interest_rate.period, |
268 | 1 | interest_type: crate::InterestType::Simple, |
269 | 1 | }, |
270 | 1 | term_length: old_ask_order.terms.0.term_length, |
271 | 1 | }) |
272 | 1 | .unwrap(), |
273 | 1 | expiration_block: old_ask_order.expiration_block, |
274 | 1 | block: old_ask_order.block, |
275 | 1 | lender: old_ask_order.lender, |
276 | 1 | } |
277 | 1 | ); |
278 | 1 | }); |
279 | 1 | } |
280 | | |
281 | 1 | #[test] |
282 | 1 | fn bid_order_migrates() { |
283 | 1 | ExtBuilder::default().build_and_execute(|| { |
284 | 1 | let bid_order_id = BidOrderId::new::<Test>(100, "asdf".as_bytes()); |
285 | 1 | let test_info = TestInfo::new_defaults(); |
286 | 1 | |
287 | 1 | let old_bid_order = OldBidOrder { |
288 | 1 | blockchain: Blockchain::Ethereum, |
289 | 1 | borrower_address_id: test_info.borrower.address_id, |
290 | 1 | terms: OldBidTerms(OldLoanTerms { |
291 | 1 | amount: 100u64.into(), |
292 | 1 | interest_rate: OldInterestRate { |
293 | 1 | rate_per_period: 100, |
294 | 1 | decimals: 4, |
295 | 1 | period: Duration::from_millis(1000), |
296 | 1 | }, |
297 | 1 | term_length: Duration::from_millis(2000), |
298 | 1 | }), |
299 | 1 | expiration_block: 100, |
300 | 1 | block: 1, |
301 | 1 | borrower: test_info.borrower.account_id, |
302 | 1 | }; |
303 | 1 | |
304 | 1 | OldBidOrders::insert_id(&bid_order_id, &old_bid_order); |
305 | 1 | |
306 | 1 | super::migrate::<Test>(); |
307 | 1 | |
308 | 1 | let bid_order = super::BidOrders::<Test>::try_get_id(&bid_order_id).unwrap(); |
309 | 1 | |
310 | 1 | assert_eq!( |
311 | 1 | bid_order, |
312 | 1 | BidOrder { |
313 | 1 | blockchain: old_bid_order.blockchain, |
314 | 1 | borrower_address_id: old_bid_order.borrower_address_id, |
315 | 1 | terms: BidTerms::try_from(LoanTerms { |
316 | 1 | amount: old_bid_order.terms.0.amount, |
317 | 1 | interest_rate: InterestRate { |
318 | 1 | rate_per_period: old_bid_order.terms.0.interest_rate.rate_per_period, |
319 | 1 | decimals: old_bid_order.terms.0.interest_rate.decimals, |
320 | 1 | period: old_bid_order.terms.0.interest_rate.period, |
321 | 1 | interest_type: crate::InterestType::Simple, |
322 | 1 | }, |
323 | 1 | term_length: old_bid_order.terms.0.term_length, |
324 | 1 | }) |
325 | 1 | .unwrap(), |
326 | 1 | expiration_block: old_bid_order.expiration_block, |
327 | 1 | block: old_bid_order.block, |
328 | 1 | borrower: old_bid_order.borrower, |
329 | 1 | } |
330 | 1 | ); |
331 | 1 | }); |
332 | 1 | } |
333 | | |
334 | 1 | #[test] |
335 | 1 | fn deal_order_migrates() { |
336 | 1 | ExtBuilder::default().build_and_execute(|| { |
337 | 1 | let test_info = TestInfo::new_defaults(); |
338 | 1 | |
339 | 1 | let deal_id = DealOrderId::with_expiration_hash::<Test>(100, [0u8; 32].into()); |
340 | 1 | let offer_id = OfferId::with_expiration_hash::<Test>(100, [1u8; 32].into()); |
341 | 1 | |
342 | 1 | let old_deal = OldDealOrder { |
343 | 1 | blockchain: Blockchain::Ethereum, |
344 | 1 | offer_id, |
345 | 1 | lender_address_id: test_info.lender.address_id, |
346 | 1 | borrower_address_id: test_info.borrower.address_id, |
347 | 1 | terms: OldLoanTerms { |
348 | 1 | amount: 100u64.into(), |
349 | 1 | interest_rate: OldInterestRate { |
350 | 1 | rate_per_period: 100, |
351 | 1 | decimals: 4, |
352 | 1 | period: Duration::from_millis(2000), |
353 | 1 | }, |
354 | 1 | term_length: Duration::from_millis(10000), |
355 | 1 | }, |
356 | 1 | expiration_block: 100, |
357 | 1 | timestamp: 0, |
358 | 1 | funding_transfer_id: None, |
359 | 1 | repayment_transfer_id: None, |
360 | 1 | lock: None, |
361 | 1 | block: None, |
362 | 1 | borrower: test_info.borrower.account_id, |
363 | 1 | }; |
364 | 1 | |
365 | 1 | OldDealOrders::insert_id(&deal_id, &old_deal); |
366 | 1 | |
367 | 1 | super::migrate::<Test>(); |
368 | 1 | |
369 | 1 | let deal = super::DealOrders::<Test>::try_get_id(&deal_id).unwrap(); |
370 | 1 | |
371 | 1 | assert_eq!( |
372 | 1 | deal, |
373 | 1 | DealOrder { |
374 | 1 | blockchain: old_deal.blockchain, |
375 | 1 | offer_id: old_deal.offer_id, |
376 | 1 | lender_address_id: old_deal.lender_address_id, |
377 | 1 | borrower_address_id: old_deal.borrower_address_id, |
378 | 1 | terms: LoanTerms { |
379 | 1 | amount: old_deal.terms.amount, |
380 | 1 | interest_rate: InterestRate { |
381 | 1 | rate_per_period: old_deal.terms.interest_rate.rate_per_period, |
382 | 1 | decimals: old_deal.terms.interest_rate.decimals, |
383 | 1 | period: old_deal.terms.interest_rate.period, |
384 | 1 | interest_type: crate::InterestType::Simple |
385 | 1 | }, |
386 | 1 | term_length: old_deal.terms.term_length, |
387 | 1 | }, |
388 | 1 | expiration_block: old_deal.expiration_block, |
389 | 1 | timestamp: old_deal.timestamp, |
390 | 1 | funding_transfer_id: old_deal.funding_transfer_id, |
391 | 1 | repayment_transfer_id: old_deal.repayment_transfer_id, |
392 | 1 | lock: old_deal.lock, |
393 | 1 | borrower: old_deal.borrower, |
394 | 1 | block: old_deal.block, |
395 | 1 | } |
396 | 1 | ); |
397 | 1 | }); |
398 | 1 | } |
399 | | } |