From 4ffcb7f9194db7d6e38773f12faa823268287177 Mon Sep 17 00:00:00 2001 From: kubel Date: Thu, 28 Nov 2024 15:03:36 +0100 Subject: [PATCH 1/3] Add kotlin bindings for UI fields method --- crates/kotlin-ffi/src/lib.rs | 31 +++++++++- .../yttrium/src/chain_abstraction/amount.rs | 6 ++ .../yttrium/src/chain_abstraction/client.rs | 56 ++++++++++++++----- .../yttrium/src/chain_abstraction/currency.rs | 1 + 4 files changed, 77 insertions(+), 17 deletions(-) diff --git a/crates/kotlin-ffi/src/lib.rs b/crates/kotlin-ffi/src/lib.rs index a6092af3..31af5619 100644 --- a/crates/kotlin-ffi/src/lib.rs +++ b/crates/kotlin-ffi/src/lib.rs @@ -2,16 +2,19 @@ uniffi::setup_scaffolding!(); use alloy::primitives::{Bytes, U256, U64}; use alloy::providers::Provider; -use yttrium::chain_abstraction::api::route::RouteResponse; +use yttrium::chain_abstraction::api::route::{ + RouteResponse, RouteResponseAvailable, +}; use yttrium::chain_abstraction::api::status::{ StatusResponse, StatusResponseCompleted, }; use yttrium::chain_abstraction::api::Transaction as CATransaction; +use yttrium::chain_abstraction::currency::Currency; use alloy::{network::Ethereum, providers::ReqwestProvider}; use relay_rpc::domain::ProjectId; use std::time::Duration; -use yttrium::chain_abstraction::client::Client; +use yttrium::chain_abstraction::client::{Client, RouteUiFields}; use yttrium::config::Config; use yttrium::transaction::send::safe_test::{ Address, OwnerSignature as YOwnerSignature, PrimitiveSignature, @@ -156,6 +159,30 @@ impl ChainAbstractionClient { .map_err(|e| Error::General(e.to_string())) } + pub async fn get_ui_fields( + &self, + route_response: RouteResponseAvailable, + initial_transaction: InitTransaction, + currency: Currency, + ) -> Result { + let ca_transaction = CATransaction::from(initial_transaction); + self.client + .get_route_ui_fields( + route_response, + ca_transaction, + currency, + "".to_string(), + ) + .await + .map_err(|e| Error::General(e.to_string())) + // .map(|fees| Eip1559Estimation { + // max_fee_per_gas: fees.max_fee_per_gas.to_string(), + // max_priority_fee_per_gas: fees + // .max_priority_fee_per_gas + // .to_string(), + // }) + } + pub async fn estimate_fees( &self, chain_id: String, diff --git a/crates/yttrium/src/chain_abstraction/amount.rs b/crates/yttrium/src/chain_abstraction/amount.rs index 112c765a..cc67b1a2 100644 --- a/crates/yttrium/src/chain_abstraction/amount.rs +++ b/crates/yttrium/src/chain_abstraction/amount.rs @@ -3,7 +3,13 @@ use alloy::primitives::{ U256, }; +uniffi::custom_type!(Unit, String, { + try_lift: |val| Ok(val.parse()?), + lower: |obj| obj.to_string(), +}); + #[derive(Debug)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Record))] pub struct Amount { pub symbol: String, // USDC, USD pub amount: U256, // e.g. 40000, 4 diff --git a/crates/yttrium/src/chain_abstraction/client.rs b/crates/yttrium/src/chain_abstraction/client.rs index 56e28f9e..b2d3e92d 100644 --- a/crates/yttrium/src/chain_abstraction/client.rs +++ b/crates/yttrium/src/chain_abstraction/client.rs @@ -145,7 +145,7 @@ impl Client { txn: Transaction, eip1559_fees: &HashMap<&String, Eip1559Estimation>, providers: &HashMap<&String, ReqwestProvider>, - ) -> (Transaction, Eip1559Estimation, U256) { + ) -> (Transaction, Eip1559EstimationFields, U256) { let eip1559_estimation = *eip1559_fees.get(&txn.chain_id).unwrap(); let l1_data_fee = get_l1_data_fee( TransactionRequest::default() @@ -176,7 +176,8 @@ impl Client { .expect("fee overflow") .checked_add(l1_data_fee) .expect("fee overflow in adding"); - (txn, eip1559_estimation, fee) + + (txn, Eip1559EstimationFields::from(eip1559_estimation), fee) } let mut estimated_transactions = @@ -202,13 +203,13 @@ impl Client { fn compute_amounts( (txn, eip1559_estimation, fee): ( Transaction, - Eip1559Estimation, + Eip1559EstimationFields, U256, ), total_local_fee: &mut U256, const_local_unit: Unit, prices: &PriceResponseBody, - ) -> (Transaction, Eip1559Estimation, TransactionFee) { + ) -> TxnDetails { let fungible = prices.fungibles.first().unwrap(); // let fungible = prices // .fungibles @@ -229,11 +230,10 @@ impl Client { let local_fee = fee * fungible_local_exchange_rate; *total_local_fee += local_fee; - - ( - txn, - eip1559_estimation, - TransactionFee { + TxnDetails { + transaction: txn, + eip1559: eip1559_estimation, + transaction_fee: TransactionFee { fee: Amount::new( fungible.symbol.clone(), fee, @@ -245,7 +245,7 @@ impl Client { const_local_unit, ), }, - ) + } } let mut route = Vec::with_capacity(estimated_transactions.len()); @@ -265,12 +265,12 @@ impl Client { ); Ok(RouteUiFields { - route, + route_details: route, // bridge: TransactionFee { // fee: Amount::zero(), // local_fee: Amount::zero(), // }, - initial, + initial_details: initial, local_total: Amount::new( "USD".to_owned(), total_local_fee, @@ -365,21 +365,47 @@ impl Client { } #[derive(Debug)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Record))] pub struct RouteUiFields { - pub route: Vec, + pub route_details: Vec, // pub bridge: TxnDetails, - pub initial: TxnDetails, + pub initial_details: TxnDetails, pub local_total: Amount, } -pub type TxnDetails = (Transaction, Eip1559Estimation, TransactionFee); +#[derive(Debug)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Record))] +pub struct TxnDetails { + pub transaction: Transaction, + pub eip1559: Eip1559EstimationFields, + pub transaction_fee: TransactionFee, +} #[derive(Debug)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Record))] +pub struct Eip1559EstimationFields { + pub max_fee_per_gas: String, + pub max_priority_fee_per_gas: String, +} + +#[derive(Debug)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Record))] pub struct TransactionFee { pub fee: Amount, pub local_fee: Amount, } +impl From for Eip1559EstimationFields { + fn from(estimation: Eip1559Estimation) -> Self { + Eip1559EstimationFields { + max_fee_per_gas: estimation.max_fee_per_gas.to_string(), + max_priority_fee_per_gas: estimation + .max_priority_fee_per_gas + .to_string(), + } + } +} + // #[cfg(test)] // mod tests { // use super::*; diff --git a/crates/yttrium/src/chain_abstraction/currency.rs b/crates/yttrium/src/chain_abstraction/currency.rs index 2b33e032..c8ca3005 100644 --- a/crates/yttrium/src/chain_abstraction/currency.rs +++ b/crates/yttrium/src/chain_abstraction/currency.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize}; // TODO get Blockchain API to use these types? #[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[cfg_attr(feature = "uniffi", derive(uniffi_macros::Enum))] #[serde(rename_all = "lowercase")] pub enum Currency { Usd, From 3559526a3529a22f8850ddd1d6975ede990adb4b Mon Sep 17 00:00:00 2001 From: kubel Date: Thu, 28 Nov 2024 15:06:58 +0100 Subject: [PATCH 2/3] Clean up --- crates/kotlin-ffi/src/lib.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/kotlin-ffi/src/lib.rs b/crates/kotlin-ffi/src/lib.rs index 31af5619..405456f9 100644 --- a/crates/kotlin-ffi/src/lib.rs +++ b/crates/kotlin-ffi/src/lib.rs @@ -175,12 +175,6 @@ impl ChainAbstractionClient { ) .await .map_err(|e| Error::General(e.to_string())) - // .map(|fees| Eip1559Estimation { - // max_fee_per_gas: fees.max_fee_per_gas.to_string(), - // max_priority_fee_per_gas: fees - // .max_priority_fee_per_gas - // .to_string(), - // }) } pub async fn estimate_fees( From 115422f95b59981195d8d860754051c3e2c357ba Mon Sep 17 00:00:00 2001 From: kubel Date: Thu, 28 Nov 2024 15:14:58 +0100 Subject: [PATCH 3/3] Add uniffi feature flag --- crates/yttrium/src/chain_abstraction/amount.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/yttrium/src/chain_abstraction/amount.rs b/crates/yttrium/src/chain_abstraction/amount.rs index cc67b1a2..d0bb043c 100644 --- a/crates/yttrium/src/chain_abstraction/amount.rs +++ b/crates/yttrium/src/chain_abstraction/amount.rs @@ -3,6 +3,7 @@ use alloy::primitives::{ U256, }; +#[cfg(feature = "uniffi")] uniffi::custom_type!(Unit, String, { try_lift: |val| Ok(val.parse()?), lower: |obj| obj.to_string(),