Skip to content

Commit 98e0c38

Browse files
authored
feat: testnet bnb support (#172)
* feat: simplified finalisation from solana * chore: bumped versions * docs: updated near-fin-transfer examples * feat: introduce wormhole fee * chore: bumped versions * feat: account for wormhole fee for other methods * fix: disable wormhole fee for eth * feat: bnb support * chore: bumped versions
1 parent a6f6f56 commit 98e0c38

File tree

8 files changed

+283
-197
lines changed

8 files changed

+283
-197
lines changed

Cargo.lock

Lines changed: 194 additions & 184 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] }
4848
base64 = "0.22"
4949
near-token = "0.3"
5050
near-contract-standards = "5.5"
51-
omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "306bd60ecb9e55fb946d8fe81185003baaa016cf" }
51+
omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "0639b0595992e353d88551d0ffb8e8a2cf1ee76b" }
5252
serde_with = "3.12.0"
5353
solana-sdk = "2.0.13"
5454
solana-client = "2.0.13"

bridge-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bridge-cli"
3-
version = "0.3.2"
3+
version = "0.3.3"
44
edition = "2021"
55
repository = "https://github.com/Near-One/bridge-sdk-rs"
66

bridge-cli/src/defaults.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ pub const ARB_BRIDGE_TOKEN_FACTORY_ADDRESS_TESTNET: &str =
5252
"0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA";
5353
pub const ARB_WORMHOLE_ADDRESS_TESTNET: &str = "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35";
5454

55+
pub const BNB_RPC_TESTNET: &str = "https://bsc-testnet-rpc.publicnode.com";
56+
pub const BNB_CHAIN_ID_TESTNET: u64 = 97;
57+
pub const BNB_BRIDGE_TOKEN_FACTORY_ADDRESS_TESTNET: &str =
58+
"0xEC81aFc3485a425347Ac03316675e58a680b283A";
59+
pub const BNB_WORMHOLE_ADDRESS_TESTNET: &str = "0x68605AD7b15c732a30b1BbC62BE8F2A509D74b4D";
60+
5561
pub const SOLANA_RPC_TESTNET: &str = "https://api.devnet.solana.com";
5662
pub const SOLANA_BRIDGE_ADDRESS_TESTNET: &str = "862HdJV59Vp83PbcubUnvuXc4EAXP8CDDs6LTxFpunTe";
5763
pub const SOLANA_WORMHOLE_ADDRESS_TESTNET: &str = "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5";
@@ -84,6 +90,12 @@ pub const ARB_BRIDGE_TOKEN_FACTORY_ADDRESS_DEVNET: &str =
8490
"0xd025b38762B4A4E36F0Cde483b86CB13ea00D989";
8591
pub const ARB_WORMHOLE_ADDRESS_DEVNET: &str = "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35";
8692

93+
pub const BNB_RPC_DEVNET: &str = "https://bsc-testnet-rpc.publicnode.com";
94+
pub const BNB_CHAIN_ID_DEVNET: u64 = 97;
95+
pub const BNB_BRIDGE_TOKEN_FACTORY_ADDRESS_DEVNET: &str =
96+
"0xEC81aFc3485a425347Ac03316675e58a680b283A";
97+
pub const BNB_WORMHOLE_ADDRESS_DEVNET: &str = "0x68605AD7b15c732a30b1BbC62BE8F2A509D74b4D";
98+
8799
pub const SOLANA_RPC_DEVNET: &str = "https://api.devnet.solana.com";
88100
pub const SOLANA_BRIDGE_ADDRESS_DEVNET: &str = "Gy1XPwYZURfBzHiGAxnw3SYC33SfqsEpGSS5zeBge28p";
89101
pub const SOLANA_WORMHOLE_ADDRESS_DEVNET: &str = "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5";

bridge-cli/src/main.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ struct CliConfig {
5252
#[arg(long)]
5353
arb_wormhole_address: Option<String>,
5454

55+
#[arg(long)]
56+
bnb_rpc: Option<String>,
57+
#[arg(long)]
58+
bnb_chain_id: Option<u64>,
59+
#[arg(long)]
60+
bnb_private_key: Option<String>,
61+
#[arg(long)]
62+
bnb_bridge_token_factory_address: Option<String>,
63+
#[arg(long)]
64+
bnb_wormhole_address: Option<String>,
65+
5566
#[arg(long)]
5667
solana_rpc: Option<String>,
5768
#[arg(long)]
@@ -109,6 +120,14 @@ impl CliConfig {
109120
.or(other.arb_bridge_token_factory_address),
110121
arb_wormhole_address: self.arb_wormhole_address.or(other.arb_wormhole_address),
111122

123+
bnb_rpc: self.bnb_rpc.or(other.bnb_rpc),
124+
bnb_chain_id: self.bnb_chain_id.or(other.bnb_chain_id),
125+
bnb_private_key: self.bnb_private_key.or(other.bnb_private_key),
126+
bnb_bridge_token_factory_address: self
127+
.bnb_bridge_token_factory_address
128+
.or(other.bnb_bridge_token_factory_address),
129+
bnb_wormhole_address: self.bnb_wormhole_address.or(other.bnb_wormhole_address),
130+
112131
solana_rpc: self.solana_rpc.or(other.solana_rpc),
113132
solana_bridge_address: self.solana_bridge_address.or(other.solana_bridge_address),
114133
solana_wormhole_address: self
@@ -158,6 +177,14 @@ fn env_config() -> CliConfig {
158177
arb_bridge_token_factory_address: env::var("ARB_BRIDGE_TOKEN_FACTORY_ADDRESS").ok(),
159178
arb_wormhole_address: env::var("ARB_WORMHOLE_ADDRESS").ok(),
160179

180+
bnb_rpc: env::var("BNB_RPC").ok(),
181+
bnb_chain_id: env::var("BNB_CHAIN_ID")
182+
.ok()
183+
.and_then(|val| val.parse::<u64>().ok()),
184+
bnb_private_key: env::var("BNB_PRIVATE_KEY").ok(),
185+
bnb_bridge_token_factory_address: env::var("BNB_BRIDGE_TOKEN_FACTORY_ADDRESS").ok(),
186+
bnb_wormhole_address: env::var("BNB_WORMHOLE_ADDRESS").ok(),
187+
161188
solana_rpc: env::var("SOLANA_RPC").ok(),
162189
solana_bridge_address: env::var("SOLANA_BRIDGE_ADDRESS").ok(),
163190
solana_wormhole_address: env::var("SOLANA_WORMHOLE_ADDRESS").ok(),
@@ -207,6 +234,13 @@ fn default_config(network: Network) -> CliConfig {
207234
),
208235
arb_wormhole_address: Some(defaults::ARB_WORMHOLE_ADDRESS_MAINNET.to_owned()),
209236

237+
// TODO: Replace with actual BNB defaults once it'll be deployed on mainnet
238+
bnb_rpc: None,
239+
bnb_chain_id: None,
240+
bnb_private_key: None,
241+
bnb_bridge_token_factory_address: None,
242+
bnb_wormhole_address: None,
243+
210244
solana_rpc: Some(defaults::SOLANA_RPC_MAINNET.to_owned()),
211245
solana_bridge_address: Some(defaults::SOLANA_BRIDGE_ADDRESS_MAINNET.to_owned()),
212246
solana_wormhole_address: Some(defaults::SOLANA_WORMHOLE_ADDRESS_MAINNET.to_owned()),
@@ -250,6 +284,14 @@ fn default_config(network: Network) -> CliConfig {
250284
),
251285
arb_wormhole_address: Some(defaults::ARB_WORMHOLE_ADDRESS_TESTNET.to_owned()),
252286

287+
bnb_rpc: Some(defaults::BNB_RPC_TESTNET.to_owned()),
288+
bnb_chain_id: Some(defaults::BNB_CHAIN_ID_TESTNET),
289+
bnb_private_key: None,
290+
bnb_bridge_token_factory_address: Some(
291+
defaults::BNB_BRIDGE_TOKEN_FACTORY_ADDRESS_TESTNET.to_owned(),
292+
),
293+
bnb_wormhole_address: Some(defaults::BNB_WORMHOLE_ADDRESS_TESTNET.to_owned()),
294+
253295
solana_rpc: Some(defaults::SOLANA_RPC_TESTNET.to_owned()),
254296
solana_bridge_address: Some(defaults::SOLANA_BRIDGE_ADDRESS_TESTNET.to_owned()),
255297
solana_wormhole_address: Some(defaults::SOLANA_WORMHOLE_ADDRESS_TESTNET.to_owned()),
@@ -293,6 +335,14 @@ fn default_config(network: Network) -> CliConfig {
293335
),
294336
arb_wormhole_address: Some(defaults::ARB_WORMHOLE_ADDRESS_DEVNET.to_owned()),
295337

338+
bnb_rpc: Some(defaults::BNB_RPC_DEVNET.to_owned()),
339+
bnb_chain_id: Some(defaults::BNB_CHAIN_ID_DEVNET),
340+
bnb_private_key: None,
341+
bnb_bridge_token_factory_address: Some(
342+
defaults::BNB_BRIDGE_TOKEN_FACTORY_ADDRESS_DEVNET.to_owned(),
343+
),
344+
bnb_wormhole_address: Some(defaults::BNB_WORMHOLE_ADDRESS_DEVNET.to_owned()),
345+
296346
solana_rpc: Some(defaults::SOLANA_RPC_DEVNET.to_owned()),
297347
solana_bridge_address: Some(defaults::SOLANA_BRIDGE_ADDRESS_DEVNET.to_owned()),
298348
solana_wormhole_address: Some(defaults::SOLANA_WORMHOLE_ADDRESS_DEVNET.to_owned()),

bridge-cli/src/omni_connector_command.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ pub async fn match_subcommand(cmd: OmniConnectorSubCommand, network: Network) {
398398
.unwrap();
399399
}
400400
},
401-
ChainKind::Eth | ChainKind::Arb | ChainKind::Base => {
401+
ChainKind::Eth | ChainKind::Arb | ChainKind::Base | ChainKind::Bnb => {
402402
omni_connector(network, config_cli)
403403
.deploy_token(DeployTokenArgs::EvmDeployTokenWithTxHash {
404404
chain_kind: chain,
@@ -509,7 +509,7 @@ pub async fn match_subcommand(cmd: OmniConnectorSubCommand, network: Network) {
509509
.await
510510
.unwrap();
511511
}
512-
ChainKind::Arb | ChainKind::Base | ChainKind::Sol => {
512+
ChainKind::Arb | ChainKind::Base | ChainKind::Bnb | ChainKind::Sol => {
513513
let vaa = connector
514514
.wormhole_get_vaa_by_tx_hash(tx_hash.clone())
515515
.await
@@ -831,6 +831,15 @@ fn omni_connector(network: Network, cli_config: CliConfig) -> OmniConnector {
831831
.build()
832832
.unwrap();
833833

834+
let bnb_bridge_client = EvmBridgeClientBuilder::default()
835+
.endpoint(combined_config.bnb_rpc)
836+
.chain_id(combined_config.bnb_chain_id)
837+
.private_key(combined_config.bnb_private_key)
838+
.omni_bridge_address(combined_config.bnb_bridge_token_factory_address)
839+
.wormhole_core_address(combined_config.bnb_wormhole_address)
840+
.build()
841+
.unwrap();
842+
834843
let solana_bridge_client = SolanaBridgeClientBuilder::default()
835844
.client(Some(RpcClient::new(combined_config.solana_rpc.unwrap())))
836845
.program_id(
@@ -870,6 +879,7 @@ fn omni_connector(network: Network, cli_config: CliConfig) -> OmniConnector {
870879
.eth_bridge_client(Some(eth_bridge_client))
871880
.base_bridge_client(Some(base_bridge_client))
872881
.arb_bridge_client(Some(arb_bridge_client))
882+
.bnb_bridge_client(Some(bnb_bridge_client))
873883
.solana_bridge_client(Some(solana_bridge_client))
874884
.wormhole_bridge_client(Some(wormhole_bridge_client))
875885
.btc_bridge_client(Some(btc_bridge_client))

bridge-sdk/connectors/omni-connector/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "omni-connector"
3-
version = "0.2.10"
3+
version = "0.2.11"
44
edition = "2021"
55

66
[dependencies]

bridge-sdk/connectors/omni-connector/src/omni_connector.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub struct OmniConnector {
3838
eth_bridge_client: Option<EvmBridgeClient>,
3939
base_bridge_client: Option<EvmBridgeClient>,
4040
arb_bridge_client: Option<EvmBridgeClient>,
41+
bnb_bridge_client: Option<EvmBridgeClient>,
4142
solana_bridge_client: Option<SolanaBridgeClient>,
4243
wormhole_bridge_client: Option<WormholeBridgeClient>,
4344
btc_bridge_client: Option<BtcBridgeClient>,
@@ -1111,15 +1112,17 @@ impl OmniConnector {
11111112
transaction_options: TransactionOptions,
11121113
) -> Result<String> {
11131114
match &token {
1114-
OmniAddress::Eth(address) | OmniAddress::Arb(address) | OmniAddress::Base(address) => {
1115-
self.evm_log_metadata(
1115+
OmniAddress::Eth(address)
1116+
| OmniAddress::Arb(address)
1117+
| OmniAddress::Base(address)
1118+
| OmniAddress::Bnb(address) => self
1119+
.evm_log_metadata(
11161120
address.clone(),
11171121
token.get_chain(),
11181122
transaction_options.nonce.map(std::convert::Into::into),
11191123
)
11201124
.await
1121-
.map(|hash| hash.to_string())
1122-
}
1125+
.map(|hash| hash.to_string()),
11231126
OmniAddress::Near(token_id) => self
11241127
.near_log_metadata(token_id.to_string(), transaction_options)
11251128
.await
@@ -1394,7 +1397,7 @@ impl OmniConnector {
13941397
})
13951398
.await
13961399
}
1397-
ChainKind::Eth | ChainKind::Base | ChainKind::Arb => {
1400+
ChainKind::Eth | ChainKind::Base | ChainKind::Arb | ChainKind::Bnb => {
13981401
self.evm_is_transfer_finalised(destination_chain, nonce)
13991402
.await
14001403
}
@@ -1441,10 +1444,11 @@ impl OmniConnector {
14411444

14421445
pub fn evm_bridge_client(&self, chain_kind: ChainKind) -> Result<&EvmBridgeClient> {
14431446
let bridge_client = match chain_kind {
1447+
ChainKind::Eth => self.eth_bridge_client.as_ref(),
14441448
ChainKind::Base => self.base_bridge_client.as_ref(),
14451449
ChainKind::Arb => self.arb_bridge_client.as_ref(),
1446-
ChainKind::Eth => self.eth_bridge_client.as_ref(),
1447-
_ => unreachable!("Unsupported chain kind"),
1450+
ChainKind::Bnb => self.bnb_bridge_client.as_ref(),
1451+
ChainKind::Near | ChainKind::Sol => unreachable!("Unsupported chain kind"),
14481452
};
14491453

14501454
bridge_client.ok_or(BridgeSdkError::ConfigError(
@@ -1515,7 +1519,7 @@ impl OmniConnector {
15151519
tx_hash: String,
15161520
) -> Result<Vec<StorageDepositAction>> {
15171521
match chain {
1518-
ChainKind::Eth | ChainKind::Base | ChainKind::Arb => {
1522+
ChainKind::Eth | ChainKind::Base | ChainKind::Arb | ChainKind::Bnb => {
15191523
let tx_hash = TxHash::from_str(&tx_hash).map_err(|_| {
15201524
BridgeSdkError::InvalidArgument(format!("Failed to parse tx hash: {tx_hash}"))
15211525
})?;

0 commit comments

Comments
 (0)