@@ -103,7 +103,7 @@ impl TransactAsset for Tuple {
103103 fn can_check_in ( origin : & MultiLocation , what : & MultiAsset ) -> XcmResult {
104104 for_tuples ! ( #(
105105 match Tuple :: can_check_in( origin, what) {
106- Err ( XcmError :: AssetNotFound ) => ( ) ,
106+ Err ( XcmError :: AssetNotFound | XcmError :: Unimplemented ) => ( ) ,
107107 r => return r,
108108 }
109109 ) * ) ;
@@ -130,33 +130,42 @@ impl TransactAsset for Tuple {
130130
131131 fn deposit_asset ( what : & MultiAsset , who : & MultiLocation ) -> XcmResult {
132132 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+ }
134137 ) * ) ;
135138 log:: trace!(
136139 target: "xcm::TransactAsset::deposit_asset" ,
137140 "did not deposit asset: what: {:?}, who: {:?}" ,
138141 what,
139142 who,
140143 ) ;
141- Err ( XcmError :: Unimplemented )
144+ Err ( XcmError :: AssetNotFound )
142145 }
143146
144147 fn withdraw_asset ( what : & MultiAsset , who : & MultiLocation ) -> Result < Assets , XcmError > {
145148 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+ }
147153 ) * ) ;
148154 log:: trace!(
149155 target: "xcm::TransactAsset::withdraw_asset" ,
150156 "did not withdraw asset: what: {:?}, who: {:?}" ,
151- what,
157+ what,
152158 who,
153159 ) ;
154- Err ( XcmError :: Unimplemented )
160+ Err ( XcmError :: AssetNotFound )
155161 }
156162
157163 fn transfer_asset ( what : & MultiAsset , from : & MultiLocation , to : & MultiLocation ) -> Result < Assets , XcmError > {
158164 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+ }
160169 ) * ) ;
161170 log:: trace!(
162171 target: "xcm::TransactAsset::transfer_asset" ,
@@ -165,6 +174,99 @@ impl TransactAsset for Tuple {
165174 from,
166175 to,
167176 ) ;
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 ( ( ) ) ) ;
169271 }
170272}
0 commit comments