diff --git a/rs/ethereum/cketh/minter/src/ledger_client.rs b/rs/ethereum/cketh/minter/src/ledger_client.rs index 6bde674bbb63..e6bba69b6237 100644 --- a/rs/ethereum/cketh/minter/src/ledger_client.rs +++ b/rs/ethereum/cketh/minter/src/ledger_client.rs @@ -71,12 +71,36 @@ impl LedgerClient { from: Account, amount: A, memo: BurnMemo, + ) -> Result { + self.burn_from_with_spender(from, None, amount, memo).await + } + + pub async fn burn_from_own_subaccount>( + &self, + subaccount: [u8; 32], + amount: A, + memo: BurnMemo, + ) -> Result { + let from = Account { + owner: ic_cdk::api::canister_self(), + subaccount: Some(subaccount), + }; + self.burn_from_with_spender(from, Some(subaccount), amount, memo) + .await + } + + async fn burn_from_with_spender>( + &self, + from: Account, + spender_subaccount: Option<[u8; 32]>, + amount: A, + memo: BurnMemo, ) -> Result { let amount = amount.into(); match self .client .transfer_from(TransferFromArgs { - spender_subaccount: None, + spender_subaccount, from, to: ic_cdk::api::canister_self().into(), amount: amount.clone(), diff --git a/rs/ethereum/cketh/minter/src/lib.rs b/rs/ethereum/cketh/minter/src/lib.rs index 3dc0d7f8d542..ccced932f0a9 100644 --- a/rs/ethereum/cketh/minter/src/lib.rs +++ b/rs/ethereum/cketh/minter/src/lib.rs @@ -45,3 +45,10 @@ pub const EVM_RPC_ID_PRODUCTION: Principal = Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 204, 1, 1]); pub const EVM_RPC_ID_STAGING: Principal = Principal::from_slice(&[0, 0, 0, 0, 2, 48, 0, 161, 1, 1]); pub const CKETH_LEDGER_MEMO_SIZE: u16 = 80; + +pub const CKETH_FEE_SUBACCOUNT: [u8; 32] = { + let mut subaccount = [0_u8; 32]; + subaccount[30] = 0x0f; + subaccount[31] = 0xee; + subaccount +};