Coverage Report

Created: 2022-11-10 19:56

/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
ebu
g0
))]
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>(&eth, &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
}