Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] }
base64 = "0.22"
near-token = "0.3"
near-contract-standards = "5.5"
omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "50aa7ae521cdb300fff0eaedd77bacf681e0aa93", features = ["abi", "__abi-generate"] }
omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "ffbdc544c0d7f670942e8bf532c7e023c1c6bfec", features = ["abi", "__abi-generate"] }
starknet = "0.17.0"
serde_with = { version = "3.12.0", features = ["schemars_0_8"] }
solana-sdk = "2.0.13"
Expand Down
2 changes: 1 addition & 1 deletion bridge-cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bridge-cli"
version = "0.3.43"
version = "0.3.44"
edition = "2021"
repository = "https://github.com/Near-One/bridge-sdk-rs"
rust-version = "1.88.0"
Expand Down
2 changes: 1 addition & 1 deletion bridge-sdk/bridge-clients/evm-bridge-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "evm-bridge-client"
version = "0.3.3"
version = "0.3.4"
edition = "2021"
rust-version = "1.88.0"

Expand Down
105 changes: 76 additions & 29 deletions bridge-sdk/bridge-clients/evm-bridge-client/src/evm_bridge_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ use alloy::{
};
use error::Result;
use ethereum_types::H256 as EthH256;
use omni_types::prover_args::EvmProof;
use omni_types::prover_result::ProofKind;
use omni_types::{near_events::OmniBridgeEvent, OmniAddress};
use omni_types::{prover_args::EvmProof, ChainKind};
use omni_types::{EvmAddress, Fee};
use sha3::{Digest, Keccak256};

Expand Down Expand Up @@ -45,9 +45,19 @@ sol! {
string feeRecipient;
bytes message;
}
struct TransferMessagePayloadWithoutMessage {
uint64 destinationNonce;
uint8 originChain;
uint64 originNonce;
address tokenAddress;
uint128 amount;
address recipient;
string feeRecipient;
}

function deployToken(bytes signatureData, MetadataPayload metadata) external returns (address);
function finTransfer(bytes, TransferMessagePayload) external;
function finTransfer(bytes, TransferMessagePayloadWithoutMessage) external;
function initTransfer(address tokenAddress, uint128 amount, uint128 fee, uint128 nativeFee, string recipient, string message) external payable;
function logMetadata(address tokenAddress) external payable;
function completedTransfers(uint64) external view returns (bool);
Expand Down Expand Up @@ -288,6 +298,7 @@ impl EvmBridgeClient {
#[tracing::instrument(skip_all, name = "EVM FIN TRANSFER")]
pub async fn fin_transfer(
&self,
chain_kind: ChainKind,
transfer_log: OmniBridgeEvent,
tx_nonce: Option<U256>,
) -> Result<TxHash> {
Expand All @@ -303,34 +314,70 @@ impl EvmBridgeClient {
)));
};

let bridge_deposit = OmniBridge::TransferMessagePayload {
destinationNonce: message_payload.destination_nonce,
originChain: message_payload.transfer_id.origin_chain.into(),
originNonce: message_payload.transfer_id.origin_nonce,
tokenAddress: Self::convert_omni_address(message_payload.token_address)?,
amount: message_payload.amount.into(),
recipient: Self::convert_omni_address(message_payload.recipient)?,
feeRecipient: message_payload
.fee_recipient
.map_or_else(String::new, |addr| addr.to_string()),
message: Bytes::from(message_payload.message),
};

let call_builder = self.prepare_tx_for_sending(
omni_bridge.finTransfer(Bytes::from(signature.to_bytes()), bridge_deposit),
tx_nonce,
self.get_wormhole_fee().await.ok(),
Some(FIN_TRANSFER_GAS),
);

let receipt = call_builder.send().await?.get_receipt().await?;

tracing::info!(
tx_hash = format!("{:?}", receipt.transaction_hash),
"Sent finalize transfer transaction"
);

Ok(receipt.transaction_hash)
match chain_kind {
ChainKind::HyperEvm | ChainKind::Abs => {
let bridge_deposit = OmniBridge::TransferMessagePayload {
destinationNonce: message_payload.destination_nonce,
originChain: message_payload.transfer_id.origin_chain.into(),
originNonce: message_payload.transfer_id.origin_nonce,
tokenAddress: Self::convert_omni_address(message_payload.token_address)?,
amount: message_payload.amount.into(),
recipient: Self::convert_omni_address(message_payload.recipient)?,
feeRecipient: message_payload
.fee_recipient
.map_or_else(String::new, |addr| addr.to_string()),
message: Bytes::from(message_payload.message),
};

let call_builder = self.prepare_tx_for_sending(
omni_bridge.finTransfer_0(Bytes::from(signature.to_bytes()), bridge_deposit),
tx_nonce,
self.get_wormhole_fee().await.ok(),
Some(FIN_TRANSFER_GAS),
);

let receipt = call_builder.send().await?.get_receipt().await?;
tracing::info!(
tx_hash = format!("{:?}", receipt.transaction_hash),
"Sent finalize transfer transaction"
);
Ok(receipt.transaction_hash)
}
ChainKind::Eth | ChainKind::Base | ChainKind::Arb | ChainKind::Bnb | ChainKind::Pol => {
let bridge_deposit = OmniBridge::TransferMessagePayloadWithoutMessage {
destinationNonce: message_payload.destination_nonce,
originChain: message_payload.transfer_id.origin_chain.into(),
originNonce: message_payload.transfer_id.origin_nonce,
tokenAddress: Self::convert_omni_address(message_payload.token_address)?,
amount: message_payload.amount.into(),
recipient: Self::convert_omni_address(message_payload.recipient)?,
feeRecipient: message_payload
.fee_recipient
.map_or_else(String::new, |addr| addr.to_string()),
};

let call_builder = self.prepare_tx_for_sending(
omni_bridge.finTransfer_1(Bytes::from(signature.to_bytes()), bridge_deposit),
tx_nonce,
self.get_wormhole_fee().await.ok(),
Some(FIN_TRANSFER_GAS),
);

let receipt = call_builder.send().await?.get_receipt().await?;
tracing::info!(
tx_hash = format!("{:?}", receipt.transaction_hash),
"Sent finalize transfer transaction"
);
Ok(receipt.transaction_hash)
}
ChainKind::Near
| ChainKind::Sol
| ChainKind::Btc
| ChainKind::Zcash
| ChainKind::Strk => Err(EvmBridgeClientError::InvalidArgument(format!(
"Expected evm chain but got {chain_kind:?}"
))),
}
}

pub async fn get_proof_for_event(
Expand Down
2 changes: 1 addition & 1 deletion bridge-sdk/connectors/omni-connector/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "omni-connector"
version = "0.3.7"
version = "0.3.8"
edition = "2021"
rust-version = "1.88.0"

Expand Down
6 changes: 4 additions & 2 deletions bridge-sdk/connectors/omni-connector/src/omni_connector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1630,7 +1630,9 @@ impl OmniConnector {
tx_nonce: Option<U256>,
) -> Result<TxHash> {
let evm_bridge_client = self.evm_bridge_client(chain_kind)?;
let tx_hash = evm_bridge_client.fin_transfer(event, tx_nonce).await?;
let tx_hash = evm_bridge_client
.fin_transfer(chain_kind, event, tx_nonce)
.await?;
Ok(tx_hash)
}

Expand All @@ -1648,7 +1650,7 @@ impl OmniConnector {
.await?;

let tx_hash = evm_bridge_client
.fin_transfer(serde_json::from_str(&transfer_log)?, tx_nonce)
.fin_transfer(chain_kind, serde_json::from_str(&transfer_log)?, tx_nonce)
.await?;

Ok(tx_hash)
Expand Down
Loading