Sending XCM messages to other chains requires paying a "transport fee". This can be paid either:
from origin local account if jit_withdraw = true,
taken from Holding register otherwise.
This currently works for following hops/scenarios:
On destination no transport fee needed (only sending costs, not receiving),
Local/originating chain: just set JIT=true and fee will be paid from signed account,
Intermediary hops - only if intermediary is acting as reserve between two untrusted chains (aka only for DepositReserveAsset instruction) - this was fixed in https://github.com/paritytech/polkadot-sdk/pull/3142
But now we're seeing more complex asset transfers that are mixing reserve transfers with teleports depending on the involved chains.
E.g. transferring DOT between Relay and parachain, but through AH (using AH instead of the Relay chain as parachain's DOT reserve).
In the Parachain --1--> AssetHub --2--> Relay scenario, DOT has to be reserve-withdrawn in leg 1, then teleported in leg 2.
On the intermediary hop (AssetHub), InitiateTeleport fails to send onward message because of missing transport fees. We also can't rely on jit_withdraw because the original origin is lost on the way, and even if it weren't we can't rely on the user having funded accounts on each hop along the way.
Solution
Charge the transport fee in the executor from the transferred assets (if available).
Description
Sending XCM messages to other chains requires paying a "transport fee". This can be paid either:
origin
local account ifjit_withdraw = true
,This currently works for following hops/scenarios:
DepositReserveAsset
instruction) - this was fixed in https://github.com/paritytech/polkadot-sdk/pull/3142But now we're seeing more complex asset transfers that are mixing reserve transfers with teleports depending on the involved chains. E.g. transferring DOT between Relay and parachain, but through AH (using AH instead of the Relay chain as parachain's DOT reserve).
In the
Parachain --1--> AssetHub --2--> Relay
scenario, DOT has to be reserve-withdrawn in leg1
, then teleported in leg2
. On the intermediary hop (AssetHub),InitiateTeleport
fails to send onward message because of missing transport fees. We also can't rely onjit_withdraw
because the original origin is lost on the way, and even if it weren't we can't rely on the user having funded accounts on each hop along the way.Solution
Charge the transport fee in the executor from the transferred assets (if available).