1
1
use cosmwasm_std:: {
2
- entry_point, BankMsg , DepsMut , Env , MessageInfo , Order , Response , StdError , StdResult , Storage ,
2
+ entry_point, BankMsg , Coin , DepsMut , Env , MessageInfo , Order , Response , StdError , StdResult ,
3
+ Storage ,
3
4
} ;
5
+ use std:: collections:: BTreeSet ;
4
6
5
7
use crate :: msg:: { ExecuteMsg , InstantiateMsg , MigrateMsg } ;
6
8
@@ -18,12 +20,22 @@ pub fn instantiate(
18
20
19
21
#[ entry_point]
20
22
pub fn migrate ( deps : DepsMut , env : Env , msg : MigrateMsg ) -> StdResult < Response > {
21
- // get balance and send all to recipient
22
- #[ allow( deprecated) ]
23
- let balance = deps. querier . query_all_balances ( env. contract . address ) ?;
23
+ let denom_len = msg. denoms . len ( ) ;
24
+ let denoms = BTreeSet :: < String > :: from_iter ( msg. denoms ) ; // Ensure uniqueness
25
+ if denoms. len ( ) != denom_len {
26
+ return Err ( StdError :: generic_err ( "Denoms not unique" ) ) ;
27
+ }
28
+
29
+ // get balance and send to recipient
30
+ let mut balances = Vec :: < Coin > :: with_capacity ( denoms. len ( ) ) ;
31
+ for denom in denoms {
32
+ let balance = deps. querier . query_balance ( & env. contract . address , denom) ?;
33
+ balances. push ( balance) ;
34
+ }
35
+
24
36
let send = BankMsg :: Send {
25
37
to_address : msg. payout . clone ( ) ,
26
- amount : balance ,
38
+ amount : balances ,
27
39
} ;
28
40
29
41
let deleted = cleanup ( deps. storage , msg. delete as usize ) ;
@@ -86,7 +98,7 @@ mod tests {
86
98
use cosmwasm_std:: testing:: {
87
99
message_info, mock_dependencies, mock_dependencies_with_balance, mock_env,
88
100
} ;
89
- use cosmwasm_std:: { coins, Attribute , StdError , Storage , SubMsg } ;
101
+ use cosmwasm_std:: { coin , coins, Attribute , StdError , Storage , SubMsg } ;
90
102
91
103
/// Gets the value of the first attribute with the given key
92
104
fn first_attr ( data : impl AsRef < [ Attribute ] > , search_key : & str ) -> Option < String > {
@@ -118,24 +130,64 @@ mod tests {
118
130
}
119
131
120
132
#[ test]
121
- fn migrate_sends_funds ( ) {
122
- let mut deps = mock_dependencies_with_balance ( & coins ( 123456 , "gold" ) ) ;
133
+ fn migrate_sends_one_balance ( ) {
134
+ let initial_balance = vec ! [ coin( 123456 , "gold" ) , coin( 77 , "silver" ) ] ;
135
+ let mut deps = mock_dependencies_with_balance ( & initial_balance) ;
136
+ let payout = String :: from ( "someone else" ) ;
137
+
138
+ // malformed denoms
139
+ let msg = MigrateMsg {
140
+ payout : payout. clone ( ) ,
141
+ denoms : vec ! [ "gold" . to_string( ) , "silver" . to_string( ) , "gold" . to_string( ) ] ,
142
+ delete : 0 ,
143
+ } ;
144
+ let err = migrate ( deps. as_mut ( ) , mock_env ( ) , msg) . unwrap_err ( ) ;
145
+ match err {
146
+ StdError :: GenericErr { msg, .. } => assert_eq ! ( msg, "Denoms not unique" ) ,
147
+ err => panic ! ( "Unexpected error: {err:?}" ) ,
148
+ }
149
+
150
+ // One denom
151
+ let msg = MigrateMsg {
152
+ payout : payout. clone ( ) ,
153
+ denoms : vec ! [ "gold" . to_string( ) ] ,
154
+ delete : 0 ,
155
+ } ;
156
+ let res = migrate ( deps. as_mut ( ) , mock_env ( ) , msg) . unwrap ( ) ;
157
+ // check payout
158
+ assert_eq ! ( res. messages. len( ) , 1 ) ;
159
+ let msg = res. messages . first ( ) . expect ( "no message" ) ;
160
+ assert_eq ! (
161
+ msg,
162
+ & SubMsg :: new( BankMsg :: Send {
163
+ to_address: payout,
164
+ amount: coins( 123456 , "gold" ) ,
165
+ } )
166
+ ) ;
167
+ }
168
+
169
+ // as above but this time we want all gold and silver
170
+ #[ test]
171
+ fn migrate_sends_two_balances ( ) {
172
+ let initial_balance = vec ! [ coin( 123456 , "gold" ) , coin( 77 , "silver" ) ] ;
173
+ let mut deps = mock_dependencies_with_balance ( & initial_balance) ;
123
174
124
175
// change the verifier via migrate
125
176
let payout = String :: from ( "someone else" ) ;
126
177
let msg = MigrateMsg {
127
178
payout : payout. clone ( ) ,
179
+ denoms : vec ! [ "silver" . to_string( ) , "gold" . to_string( ) ] ,
128
180
delete : 0 ,
129
181
} ;
130
182
let res = migrate ( deps. as_mut ( ) , mock_env ( ) , msg) . unwrap ( ) ;
131
183
// check payout
132
- assert_eq ! ( 1 , res. messages. len( ) ) ;
184
+ assert_eq ! ( res. messages. len( ) , 1 ) ;
133
185
let msg = res. messages . first ( ) . expect ( "no message" ) ;
134
186
assert_eq ! (
135
187
msg,
136
188
& SubMsg :: new( BankMsg :: Send {
137
189
to_address: payout,
138
- amount: coins ( 123456 , "gold" ) ,
190
+ amount: vec! [ coin ( 123456 , "gold" ) , coin ( 77 , "silver" ) ] ,
139
191
} )
140
192
) ;
141
193
}
@@ -154,6 +206,7 @@ mod tests {
154
206
// migrate all of the data in one go
155
207
let msg = MigrateMsg {
156
208
payout : "user" . to_string ( ) ,
209
+ denoms : vec ! [ ] ,
157
210
delete : 100 ,
158
211
} ;
159
212
migrate ( deps. as_mut ( ) , mock_env ( ) , msg) . unwrap ( ) ;
@@ -178,7 +231,11 @@ mod tests {
178
231
179
232
// change the verifier via migrate
180
233
let payout = String :: from ( "someone else" ) ;
181
- let msg = MigrateMsg { payout, delete : 0 } ;
234
+ let msg = MigrateMsg {
235
+ payout,
236
+ denoms : vec ! [ ] ,
237
+ delete : 0 ,
238
+ } ;
182
239
let _res = migrate ( deps. as_mut ( ) , mock_env ( ) , msg) . unwrap ( ) ;
183
240
184
241
let res = execute (
0 commit comments