-
Notifications
You must be signed in to change notification settings - Fork 684
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Snowbridge: deposit extra fee to beneficiary on Asset Hub #4175
Snowbridge: deposit extra fee to beneficiary on Asset Hub #4175
Conversation
// Deposit both asset and fees to beneficiary so the fees will not get | ||
// trapped. Another benefit is when fees left more than ED on AssetHub could be | ||
// used to create the beneficiary account in case it does not exist. | ||
DepositAsset { assets: Wild(All), beneficiary }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe whole XCM fails if the beneficiary account does not exist and the leftover fees do not satisfy ED... :(
Maybe add an SetErrorHandler
and fall back to deposit just the assets if the wildcard one fails.
I recommend building a test or more to validate both happy and corner cases.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for review it.
fall back to deposit just the assets if the wildcard one fails.
Currently WETH or any foreign asset from Ethereum is created as non_sufficient
, so the fall back won't help in this case.
the leftover fees do not satisfy ED
As mentioned in Snowfork#137 (comment), we'll ensure this won't happen.
building a test or more to validate both happy and corner cases.
Sure, I'll do that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would avoid using DepositAsset(Wild(All))
because it can be quite expensive, e.g on the AssetHub here: https://github.com/paritytech/polkadot-sdk/blob/master/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs#L33-L51. It's better to use either Wild(AllOfCounted(2))
to deposit both the asset and fees, or to use Definite([asset, fees])
.
We encountered a very similar issue raised by the security audit team here: #3157, and there was also a recommendation to use SetAppendix
to avoid potential trapping.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I recommend building a test or more to validate both happy and corner cases.
👆 💯
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SetAppendix
if you put something in the holding register (e.g. WithdrawAsset
...) and another instruction fails, then the assets are trapped. But if you use SetAppendix(DepositAssets
and place it before the failing instruction, then assets won't be trapped in the case of error, but instead Deposited to some account, so no asset trapping.
But it depends case-by-case, I'm not saying that you need to use it, I am just saying that there is this possibility.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the reminder. I'll let our team to double check though I do think DepositAsset
should be the last instruction here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bkontur Confirmed that we don't need the SetAppendix
. We'll just leave the asset trapped when error happens.
#[test] | ||
fn send_token_from_ethereum_to_non_existent_account_on_asset_hub_with_sufficient_fee_but_do_not_satisfy_ed( | ||
) { | ||
// On AH the xcm fee is 33_873_024 and the ED is 3_300_000 | ||
send_token_from_ethereum_to_asset_hub_with_fee([1; 32], 36_000_000); | ||
|
||
AssetHubRococo::execute_with(|| { | ||
type RuntimeEvent = <AssetHubRococo as Chain>::RuntimeEvent; | ||
|
||
// Check that the token was received and issued as a foreign asset on AssetHub | ||
assert_expected_events!( | ||
AssetHubRococo, | ||
vec![ | ||
RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, | ||
] | ||
); | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
so it looks like it does fail, losing the ETH as well - was better off before when extra fees would just get trapped - at least then ETH always went through
I think you should do a SetErrorHandler(DepositAssets(JustEth))
so that if DepositAssets(AllCounted(2))
fails, you fall back to depositing just the ETH.
Later, when we have #4190 in XCMv5, we can simplify and just trap "unhandled" assets with no worries as they can be easily claimed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, we do need the custom-asset-claimer
feature. Currently it's quite a challenge to claim the trapped WETH if error happens.
@acatangiu In this commit I do add SetErrorHandler(DepositAssets(JustEth))
, but it does not help as I mentioned because WETH is created as non_sufficient asset.
As you can see from the log the test send_token_from_ethereum_to_non_existent_account_on_asset_hub_with_sufficient_fee_but_do_not_satisfy_ed
still fails and the xcm execution cost increased(as more instructions added).
So I'm not sure if it provides benefit here.
cargo test -p bridge-hub-rococo-integration-tests --lib tests::snowbridge::send_token_from_ethereum_to_non_existent_account_on_asset_hub_with_sufficient_fee_but_do_not_satisfy_ed -- --nocapture
2024-04-18T14:51:52.625030Z TRACE xcm::process_instruction: === ReceiveTeleportedAsset(Assets([Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }]))
2024-04-18T14:51:52.625037Z TRACE xcm::ensure_can_subsume_assets: worst_case_holding_len: 1, holding_limit: 64
2024-04-18T14:51:52.625075Z TRACE xcm::contains: ConcreteAssetFromSystem asset: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }, origin: Location { parents: 1, interior: X1([Parachain(1013)]) }
2024-04-18T14:51:52.625083Z TRACE xcm::fungible_adapter: can_check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }
2024-04-18T14:51:52.625102Z TRACE xcm::fungible_adapter: check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }
2024-04-18T14:51:52.625120Z TRACE xcm::fungibles_adapter: check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }
2024-04-18T14:51:52.625128Z TRACE xcm::fungibles_adapter: check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }
2024-04-18T14:51:52.625148Z TRACE xcm::fungibles_adapter: check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }
2024-04-18T14:51:52.625155Z TRACE xcm::nonfungibles_adapter: check_in origin: Location { parents: 1, interior: X1([Parachain(1013)]) }, what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }, context: XcmContext { origin: Some(Location { parents: 1, interior: X1([Parachain(1013)]) }), message_id: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], topic: None }
2024-04-18T14:51:52.625251Z TRACE xcm::process_instruction: === BuyExecution { fees: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(48000000) }, weight_limit: Limited(Weight { ref_time: 511962000, proof_size: 13757 }) }
2024-04-18T14:51:52.625291Z TRACE xcm::weight: UsingComponents::buy_weight weight: Weight { ref_time: 511962000, proof_size: 13757 }, payment: AssetsInHolding { fungible: {AssetId(Location { parents: 1, interior: Here }): 48000000}, non_fungible: {} }, context: XcmContext { origin: Some(Location { parents: 1, interior: X1([Parachain(1013)]) }), message_id: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], topic: None }
2024-04-18T14:51:52.625322Z TRACE xcm::process_instruction: === DescendOrigin(X1([PalletInstance(80)]))
2024-04-18T14:51:52.625333Z TRACE xcm::process_instruction: === UniversalOrigin(GlobalConsensus(Ethereum { chain_id: 11155111 }))
2024-04-18T14:51:52.625379Z TRACE xcm::process_instruction: === ReserveAssetDeposited(Assets([Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }]))
2024-04-18T14:51:52.625388Z TRACE xcm::ensure_can_subsume_assets: worst_case_holding_len: 2, holding_limit: 64
2024-04-18T14:51:52.625413Z TRACE xcm::contains: IsTrustedBridgedReserveLocationForConcreteAsset asset: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, origin: Location { parents: 2, interior: X1([GlobalConsensus(Ethereum { chain_id: 11155111 })]) }, universal_source: X2([GlobalConsensus(Rococo), Parachain(1000)])
2024-04-18T14:51:52.625425Z TRACE xcm::contains: Case asset: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, origin: Location { parents: 2, interior: X1([GlobalConsensus(Ethereum { chain_id: 11155111 })]) }
2024-04-18T14:51:52.625437Z TRACE xcm::contains: IsForeignConcreteAsset asset: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, origin: Location { parents: 2, interior: X1([GlobalConsensus(Ethereum { chain_id: 11155111 })]) }
2024-04-18T14:51:52.625458Z TRACE xcm::process_instruction: === ClearOrigin
2024-04-18T14:51:52.625464Z TRACE xcm::process_instruction: === SetErrorHandler(Xcm([DepositAsset { assets: Definite(Assets([Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }])), beneficiary: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) } }]))
2024-04-18T14:51:52.625474Z TRACE xcm::weight: WeightInfoBounds message: Xcm([DepositAsset { assets: Definite(Assets([Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }])), beneficiary: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) } }])
2024-04-18T14:51:52.625485Z TRACE xcm::process_instruction: === DepositAsset { assets: Wild(AllCounted(2)), beneficiary: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) } }
2024-04-18T14:51:52.625523Z TRACE xcm::fungible_adapter: deposit_asset what: Asset { id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(2143334) }, who: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) }
2024-04-18T14:51:52.625586Z TRACE xcm::execute: !!! ERROR: FailedToTransactAsset("Account cannot exist with the funds that would be given")
2024-04-18T14:51:52.625596Z TRACE xcm::execute: result: Err(ExecutorError { index: 7, xcm_error: FailedToTransactAsset("Account cannot exist with the funds that would be given"), weight: Weight { ref_time: 2241000, proof_size: 0 } })
2024-04-18T14:51:52.625602Z TRACE xcm::process: origin: None, total_surplus/refunded: Weight { ref_time: 2241000, proof_size: 0 }/Weight { ref_time: 0, proof_size: 0 }, error_handler_weight: Weight { ref_time: 0, proof_size: 0 }
2024-04-18T14:51:52.625608Z TRACE xcm::process_instruction: === DepositAsset { assets: Definite(Assets([Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }])), beneficiary: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) } }
2024-04-18T14:51:52.625659Z TRACE xcm::fungible_adapter: deposit_asset what: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, who: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) }
2024-04-18T14:51:52.625670Z TRACE xcm::fungibles_adapter: deposit_asset what: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, who: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) }
2024-04-18T14:51:52.625680Z TRACE xcm::fungibles_adapter: deposit_asset what: Asset { id: AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }), fun: Fungible(1000000) }, who: Location { parents: 0, interior: X1([AccountId32 { network: None, id: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }]) }
2024-04-18T14:51:52.625817Z TRACE xcm::execute: !!! ERROR: FailedToTransactAsset("Account cannot be created")
2024-04-18T14:51:52.625824Z TRACE xcm::execute: result: Err(ExecutorError { index: 0, xcm_error: FailedToTransactAsset("Account cannot be created"), weight: Weight { ref_time: 0, proof_size: 0 } })
2024-04-18T14:51:52.625829Z TRACE xcm::refund_surplus: total_surplus: Weight { ref_time: 2241000, proof_size: 0 }, total_refunded: Weight { ref_time: 0, proof_size: 0 }, current_surplus: Weight { ref_time: 2241000, proof_size: 0 }
2024-04-18T14:51:52.625834Z TRACE xcm::weight: UsingComponents::refund_weight weight: Weight { ref_time: 2241000, proof_size: 0 }, context: XcmContext { origin: None, message_id: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], topic: None }, available weight: Weight { ref_time: 511962000, proof_size: 13757 }, available amount: 45856666
2024-04-18T14:51:52.625892Z TRACE xcm::weight: UsingComponents::refund_weight amount to refund: 6976
2024-04-18T14:51:52.625902Z TRACE xcm::refund_surplus: total_refunded: Weight { ref_time: 2241000, proof_size: 0 }
2024-04-18T14:51:52.626082Z TRACE xcm::post_process: Trapping assets in holding register: AssetsInHolding { fungible: {AssetId(Location { parents: 1, interior: Here }): 2150310, AssetId(Location { parents: 2, interior: X2([GlobalConsensus(Ethereum { chain_id: 11155111 }), AccountKey20 { network: None, key: [135, 209, 247, 253, 254, 231, 246, 81, 250, 188, 139, 252, 182, 224, 134, 194, 120, 183, 122, 125] }]) }): 1000000}, non_fungible: {} }, context: XcmContext { origin: None, message_id: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], topic: None } (original_origin: Location { parents: 1, interior: X1([Parachain(1013)]) })
2024-04-18T14:51:52.626174Z TRACE xcm::post_process: Execution errored at 0: FailedToTransactAsset("Account cannot be created") (original_origin: Location { parents: 1, interior: X1([Parachain(1013)]) })
2024-04-18T14:51:52.626182Z TRACE xcm::process-message: XCM message execution incomplete, used weight: Weight(ref_time: 509721000, proof_size: 13757), error: FailedToTransactAsset("Account cannot be created")
...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah, that's right, it doesn't help since account doesn't exist and WETH can't count towards ED..
I guess we'll just have to trap for now
This reverts commit 3fd810c.
The CI pipeline was cancelled due to failure one of the required jobs. |
Do I need to provide anything more for this PR get merged? |
Looks good to go to me. You just need a prdoc (example: https://github.com/paritytech/polkadot-sdk/blob/master/prdoc/pr_4118.prdoc) |
@bkontur Any other concern or could you help to approve the PR? |
...arachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs
Outdated
Show resolved
Hide resolved
...arachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs
Outdated
Show resolved
Hide resolved
…idge-hub-rococo/src/tests/snowbridge.rs Co-authored-by: Clara van Staden <claravanstaden64@gmail.com>
…idge-hub-rococo/src/tests/snowbridge.rs Co-authored-by: Clara van Staden <claravanstaden64@gmail.com>
// Deposit both asset and fees to beneficiary so the fees will not get | ||
// trapped. Another benefit is when fees left more than ED on AssetHub could be | ||
// used to create the beneficiary account in case it does not exist. | ||
DepositAsset { assets: Wild(AllCounted(2)), beneficiary }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could maybe add description before every instruction for let mut instructions = vec![
:)
One question: could you point me to the place or explain where asset_hub_fee
and destination.fee
is coming from? Is it withdrawn or burned somewhere on BH? Is it the user's money, or is it money from some sovereign account on BH? Or where does this money come from?
I think it can be specific (not sure if compiles):
DepositAsset { assets: Wild(AllCounted(2)), beneficiary }, | |
DepositAsset { | |
assets: Definite(vec![asset, asset_hub_fee_asset].into())), | |
beneficiary | |
}, |
or maybe use total_fee_asset(dest_para_fee should be 0 in this branch)
instead of asset_hub_fee_asset
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't you need to fix also DepositReserveAsset {
branch?
// Deposit asset to beneficiary.
DepositAsset { assets: Definite(asset.into()), beneficiary },
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One question: could you point me to the place or explain where
asset_hub_fee
anddestination.fee
is coming from? Is it withdrawn or burned somewhere on BH? Is it the user's money, or is it money from some sovereign account on BH? Or where does this money come from?
My concern here is whether we should deposit unused fees directly to the beneficiary instead of depositing them into a sovereign account in the AH. If this is a valid scenario, then the process should resemble something like this:
DepositAsset { assets: Definite(vec![asset].into())), beneficiary},
DepositAsset { assets: Definite(vec![asset_hub_fee_asset].into())), beneficiary: LocationOfSomeSovereignAccountOnAssetHub},
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
where asset_hub_fee and destination.fee is coming from?
asset_hub_fee
from https://github.com/Snowfork/snowbridge/blob/3f90b1619d0bdbec8f50b63185b3dcc632321019/contracts/src/storage/AssetsStorage.sol#L15 which is a configurable storage on Ethereum, we charge it from the user and make sure that it can cover the execution cost on AH.
destination.fee
is always zero for AH.
whether we should deposit unused fees directly to the beneficiary
I think so, it's from end user and we do want to send the unused back to the user.
Don't you need to fix also DepositReserveAsset { branch?
Nope, that branch is for non-system parachain which may not accept AssetHub-DOT
as fee asset, we're gonna to make some fix there later and this PR focus on AH only.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think so, it's from end user and we do want to send the unused back to the user.
ok, cool, thank you :)
Don't you need to fix also DepositReserveAsset { branch?
Nope, that branch is for non-system parachain which may not accept
AssetHub-DOT
as fee asset, we're gonna to make some fix there later and this PR focus on AH only.
Ok, got it. I saw that you use Location::parent()
here for fees.assetId, so that would be probably changed and/or Destination.fee: u128
, let's see later.
So, I think using exact assets for DepositAsset, as suggested above, is not a bad idea (or maybe some exact counter of unique assetIds :))
Co-authored-by: Adrian Catangiu <adrian@parity.io>
Co-authored-by: Adrian Catangiu <adrian@parity.io>
@acatangiu Could you help to merge the PR? Good to know that we're gonna to make |
@yrong please merge master for the CI fix |
There is one CI task |
d893cde
Just the upper-stream for Snowfork#137 and more context there. --------- Co-authored-by: Clara van Staden <claravanstaden64@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io>
…#4175) Just the upper-stream for Snowfork#137 and more context there. --------- Co-authored-by: Clara van Staden <claravanstaden64@gmail.com> Co-authored-by: Adrian Catangiu <adrian@parity.io>
Just the upper-stream for Snowfork#137 and more context there.