@@ -103,7 +103,7 @@ impl TransactAsset for Tuple {
103
103
fn can_check_in ( origin : & MultiLocation , what : & MultiAsset ) -> XcmResult {
104
104
for_tuples ! ( #(
105
105
match Tuple :: can_check_in( origin, what) {
106
- Err ( XcmError :: AssetNotFound ) => ( ) ,
106
+ Err ( XcmError :: AssetNotFound | XcmError :: Unimplemented ) => ( ) ,
107
107
r => return r,
108
108
}
109
109
) * ) ;
@@ -130,33 +130,42 @@ impl TransactAsset for Tuple {
130
130
131
131
fn deposit_asset ( what : & MultiAsset , who : & MultiLocation ) -> XcmResult {
132
132
for_tuples ! ( #(
133
- match Tuple :: deposit_asset( what, who) { o @ Ok ( _) => return o, _ => ( ) }
133
+ match Tuple :: deposit_asset( what, who) {
134
+ Err ( XcmError :: AssetNotFound | XcmError :: Unimplemented ) => ( ) ,
135
+ r => return r,
136
+ }
134
137
) * ) ;
135
138
log:: trace!(
136
139
target: "xcm::TransactAsset::deposit_asset" ,
137
140
"did not deposit asset: what: {:?}, who: {:?}" ,
138
141
what,
139
142
who,
140
143
) ;
141
- Err ( XcmError :: Unimplemented )
144
+ Err ( XcmError :: AssetNotFound )
142
145
}
143
146
144
147
fn withdraw_asset ( what : & MultiAsset , who : & MultiLocation ) -> Result < Assets , XcmError > {
145
148
for_tuples ! ( #(
146
- match Tuple :: withdraw_asset( what, who) { o @ Ok ( _) => return o, _ => ( ) }
149
+ match Tuple :: withdraw_asset( what, who) {
150
+ Err ( XcmError :: AssetNotFound | XcmError :: Unimplemented ) => ( ) ,
151
+ r => return r,
152
+ }
147
153
) * ) ;
148
154
log:: trace!(
149
155
target: "xcm::TransactAsset::withdraw_asset" ,
150
156
"did not withdraw asset: what: {:?}, who: {:?}" ,
151
- what,
157
+ what,
152
158
who,
153
159
) ;
154
- Err ( XcmError :: Unimplemented )
160
+ Err ( XcmError :: AssetNotFound )
155
161
}
156
162
157
163
fn transfer_asset ( what : & MultiAsset , from : & MultiLocation , to : & MultiLocation ) -> Result < Assets , XcmError > {
158
164
for_tuples ! ( #(
159
- match Tuple :: transfer_asset( what, from, to) { o @ Ok ( _) => return o, _ => ( ) }
165
+ match Tuple :: transfer_asset( what, from, to) {
166
+ Err ( XcmError :: AssetNotFound | XcmError :: Unimplemented ) => ( ) ,
167
+ r => return r,
168
+ }
160
169
) * ) ;
161
170
log:: trace!(
162
171
target: "xcm::TransactAsset::transfer_asset" ,
@@ -165,6 +174,99 @@ impl TransactAsset for Tuple {
165
174
from,
166
175
to,
167
176
) ;
168
- Err ( XcmError :: Unimplemented )
177
+ Err ( XcmError :: AssetNotFound )
178
+ }
179
+ }
180
+
181
+ #[ cfg( test) ]
182
+ mod tests {
183
+ use super :: * ;
184
+
185
+ pub struct UnimplementedTransactor ;
186
+ impl TransactAsset for UnimplementedTransactor { }
187
+
188
+ pub struct NotFoundTransactor ;
189
+ impl TransactAsset for NotFoundTransactor {
190
+ fn can_check_in ( _origin : & MultiLocation , _what : & MultiAsset ) -> XcmResult {
191
+ Err ( XcmError :: AssetNotFound )
192
+ }
193
+
194
+ fn deposit_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> XcmResult {
195
+ Err ( XcmError :: AssetNotFound )
196
+ }
197
+
198
+ fn withdraw_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> Result < Assets , XcmError > {
199
+ Err ( XcmError :: AssetNotFound )
200
+ }
201
+
202
+ fn transfer_asset ( _what : & MultiAsset , _from : & MultiLocation , _to : & MultiLocation ) -> Result < Assets , XcmError > {
203
+ Err ( XcmError :: AssetNotFound )
204
+ }
205
+ }
206
+
207
+ pub struct OverflowTransactor ;
208
+ impl TransactAsset for OverflowTransactor {
209
+ fn can_check_in ( _origin : & MultiLocation , _what : & MultiAsset ) -> XcmResult {
210
+ Err ( XcmError :: Overflow )
211
+ }
212
+
213
+ fn deposit_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> XcmResult {
214
+ Err ( XcmError :: Overflow )
215
+ }
216
+
217
+ fn withdraw_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> Result < Assets , XcmError > {
218
+ Err ( XcmError :: Overflow )
219
+ }
220
+
221
+ fn transfer_asset ( _what : & MultiAsset , _from : & MultiLocation , _to : & MultiLocation ) -> Result < Assets , XcmError > {
222
+ Err ( XcmError :: Overflow )
223
+ }
224
+ }
225
+
226
+ pub struct SuccessfulTransactor ;
227
+ impl TransactAsset for SuccessfulTransactor {
228
+ fn can_check_in ( _origin : & MultiLocation , _what : & MultiAsset ) -> XcmResult {
229
+ Ok ( ( ) )
230
+ }
231
+
232
+ fn deposit_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> XcmResult {
233
+ Ok ( ( ) )
234
+ }
235
+
236
+ fn withdraw_asset ( _what : & MultiAsset , _who : & MultiLocation ) -> Result < Assets , XcmError > {
237
+ Ok ( Assets :: default ( ) )
238
+ }
239
+
240
+ fn transfer_asset ( _what : & MultiAsset , _from : & MultiLocation , _to : & MultiLocation ) -> Result < Assets , XcmError > {
241
+ Ok ( Assets :: default ( ) )
242
+ }
243
+ }
244
+
245
+ #[ test]
246
+ fn defaults_to_asset_not_found ( ) {
247
+ type MultiTransactor = ( UnimplementedTransactor , NotFoundTransactor , UnimplementedTransactor ) ;
248
+
249
+ assert_eq ! ( MultiTransactor :: deposit_asset( & MultiAsset :: All , & MultiLocation :: Null ) , Err ( XcmError :: AssetNotFound ) ) ;
250
+ }
251
+
252
+ #[ test]
253
+ fn unimplemented_and_not_found_continue_iteration ( ) {
254
+ type MultiTransactor = ( UnimplementedTransactor , NotFoundTransactor , SuccessfulTransactor ) ;
255
+
256
+ assert_eq ! ( MultiTransactor :: deposit_asset( & MultiAsset :: All , & MultiLocation :: Null ) , Ok ( ( ) ) ) ;
257
+ }
258
+
259
+ #[ test]
260
+ fn unexpected_error_stops_iteration ( ) {
261
+ type MultiTransactor = ( OverflowTransactor , SuccessfulTransactor ) ;
262
+
263
+ assert_eq ! ( MultiTransactor :: deposit_asset( & MultiAsset :: All , & MultiLocation :: Null ) , Err ( XcmError :: Overflow ) ) ;
264
+ }
265
+
266
+ #[ test]
267
+ fn success_stops_iteration ( ) {
268
+ type MultiTransactor = ( SuccessfulTransactor , OverflowTransactor ) ;
269
+
270
+ assert_eq ! ( MultiTransactor :: deposit_asset( & MultiAsset :: All , & MultiLocation :: Null ) , Ok ( ( ) ) ) ;
169
271
}
170
272
}
0 commit comments