Skip to content

Commit

Permalink
Solana pausability (#96)
Browse files Browse the repository at this point in the history
* Add transfer message for Solana

* Add pause and set admin method calls for Solana

* chore: some cosmetic changes

---------

Co-authored-by: Ivan Frolov <[email protected]>
  • Loading branch information
kiseln and frolvanya authored Feb 6, 2025
1 parent cdf2800 commit eed59e2
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 13 deletions.
30 changes: 28 additions & 2 deletions bridge-cli/src/omni_connector_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,16 @@ pub enum OmniConnectorSubCommand {
#[command(flatten)]
config_cli: CliConfig,
},

SolanaSetAdmin {
#[clap(short, long, help = "Admin pubkey")]
admin: String,
#[command(flatten)]
config_cli: CliConfig,
},
SolanaPause {
#[command(flatten)]
config_cli: CliConfig,
},
#[clap(about = "Bind a token on a chain that supports Wormhole")]
BindToken {
#[clap(short, long, help = "Chain to bind the token from")]
Expand Down Expand Up @@ -423,6 +432,7 @@ pub async fn match_subcommand(cmd: OmniConnectorSubCommand, network: Network) {
token: token.parse().unwrap(),
amount,
recipient,
message: String::new(),
})
.await
.unwrap();
Expand All @@ -433,7 +443,11 @@ pub async fn match_subcommand(cmd: OmniConnectorSubCommand, network: Network) {
config_cli,
} => {
omni_connector(network, config_cli)
.init_transfer(InitTransferArgs::SolanaInitTransferSol { amount, recipient })
.init_transfer(InitTransferArgs::SolanaInitTransferSol {
amount,
recipient,
message: String::new(),
})
.await
.unwrap();
}
Expand Down Expand Up @@ -478,6 +492,18 @@ pub async fn match_subcommand(cmd: OmniConnectorSubCommand, network: Network) {
.unwrap();
}
},
OmniConnectorSubCommand::SolanaSetAdmin { admin, config_cli } => {
omni_connector(network, config_cli)
.solana_set_admin(admin.parse().unwrap())
.await
.unwrap();
},
OmniConnectorSubCommand::SolanaPause { config_cli } => {
omni_connector(network, config_cli)
.solana_pause()
.await
.unwrap();
},
}
}

Expand Down
27 changes: 27 additions & 0 deletions bridge-sdk/bridge-clients/solana-bridge-client/src/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,41 @@ fn get_instruction_identifier(instruction_name: &str) -> [u8; 8] {

pub struct Initialize {
pub admin: Pubkey,
pub pausable_admin: Pubkey,
pub derived_near_bridge_address: [u8; 64],
}

impl BorshSerialize for Initialize {
fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
writer.write_all(&get_instruction_identifier("global:initialize"))?;
writer.write_all(&self.admin.to_bytes())?;
writer.write_all(&self.pausable_admin.to_bytes())?;
writer.write_all(&self.derived_near_bridge_address)?;
Ok(())
}
}

pub struct SetAdmin {
pub admin: Pubkey,
}

impl BorshSerialize for SetAdmin {
fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
writer.write_all(&get_instruction_identifier("global:set_admin"))?;
writer.write_all(&self.admin.to_bytes())?;
Ok(())
}
}

pub struct Pause {}

impl BorshSerialize for Pause {
fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
writer.write_all(&get_instruction_identifier("global:pause"))?;
Ok(())
}
}

pub struct DeployToken {
pub data: DeployTokenData,
}
Expand Down Expand Up @@ -90,6 +113,7 @@ pub struct InitTransfer {
pub recipient: String,
pub fee: u128,
pub native_fee: u64,
pub message: String,
}

impl BorshSerialize for InitTransfer {
Expand All @@ -99,6 +123,7 @@ impl BorshSerialize for InitTransfer {
self.recipient.serialize(writer)?;
self.fee.serialize(writer)?;
self.native_fee.serialize(writer)?;
self.message.serialize(writer)?;
Ok(())
}
}
Expand All @@ -108,6 +133,7 @@ pub struct InitTransferSol {
pub recipient: String,
pub fee: u128,
pub native_fee: u64,
pub message: String,
}

impl BorshSerialize for InitTransferSol {
Expand All @@ -117,6 +143,7 @@ impl BorshSerialize for InitTransferSol {
self.recipient.serialize(writer)?;
self.fee.serialize(writer)?;
self.native_fee.serialize(writer)?;
self.message.serialize(writer)?;
Ok(())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ impl SolanaBridgeClient {

let instruction_data = Initialize {
admin: keypair.pubkey(),
pausable_admin: keypair.pubkey(),
derived_near_bridge_address,
};

Expand Down Expand Up @@ -118,6 +119,54 @@ impl SolanaBridgeClient {
.await
}

pub async fn set_admin(&self, admin: Pubkey) -> Result<Signature, SolanaBridgeClientError> {
let program_id = self.program_id()?;
let keypair = self.keypair()?;

let (config, _) = Pubkey::find_program_address(&[b"config"], program_id);

let instruction_data = SetAdmin { admin };

let instruction = Instruction::new_with_borsh(
*program_id,
&instruction_data,
vec![
AccountMeta::new(config, false),
AccountMeta::new(keypair.pubkey(), true),
],
);

self.send_and_confirm_transaction(
vec![instruction],
&[keypair],
)
.await
}

pub async fn pause(&self) -> Result<Signature, SolanaBridgeClientError> {
let program_id = self.program_id()?;
let keypair = self.keypair()?;

let (config, _) = Pubkey::find_program_address(&[b"config"], program_id);

let instruction_data = Pause {};

let instruction = Instruction::new_with_borsh(
*program_id,
&instruction_data,
vec![
AccountMeta::new(config, false),
AccountMeta::new(keypair.pubkey(), true),
],
);

self.send_and_confirm_transaction(
vec![instruction],
&[keypair],
)
.await
}

pub async fn log_metadata(&self, token: Pubkey) -> Result<Signature, SolanaBridgeClientError> {
let program_id = self.program_id()?;
let wormhole_core = self.wormhole_core()?;
Expand Down Expand Up @@ -237,6 +286,7 @@ impl SolanaBridgeClient {
token: Pubkey,
amount: u128,
recipient: String,
message: String,
) -> Result<Signature, SolanaBridgeClientError> {
let program_id = self.program_id()?;
let wormhole_core = self.wormhole_core()?;
Expand Down Expand Up @@ -270,6 +320,7 @@ impl SolanaBridgeClient {
recipient,
fee: 20,
native_fee: 10,
message,
};

let instruction = Instruction::new_with_borsh(
Expand Down Expand Up @@ -310,6 +361,7 @@ impl SolanaBridgeClient {
&self,
amount: u128,
recipient: String,
message: String,
) -> Result<Signature, SolanaBridgeClientError> {
let program_id = self.program_id()?;
let wormhole_core = self.wormhole_core()?;
Expand All @@ -329,6 +381,7 @@ impl SolanaBridgeClient {
recipient,
fee: 0,
native_fee: 10,
message,
};

let instruction = Instruction::new_with_borsh(
Expand Down
54 changes: 43 additions & 11 deletions bridge-sdk/connectors/omni-connector/src/omni_connector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,12 @@ pub enum InitTransferArgs {
token: Pubkey,
amount: u128,
recipient: String,
message: String,
},
SolanaInitTransferSol {
amount: u128,
recipient: String,
message: String,
},
}

Expand Down Expand Up @@ -429,6 +431,29 @@ impl OmniConnector {
.await
}

pub async fn solana_set_admin(&self, admin: Pubkey) -> Result<Signature> {
let solana_bridge_client = self.solana_bridge_client()?;

let signature = solana_bridge_client.set_admin(admin).await?;

tracing::info!(
signature = signature.to_string(),
"Sent set admin transaction"
);

Ok(signature)
}

pub async fn solana_pause(&self) -> Result<Signature> {
let solana_bridge_client = self.solana_bridge_client()?;

let signature = solana_bridge_client.pause().await?;

tracing::info!(signature = signature.to_string(), "Sent pause transaction");

Ok(signature)
}

pub async fn solana_initialize(&self, program_keypair: Keypair) -> Result<Signature> {
// Derived based on near bridge account id and derivation path (bridge-1)
const DERIVED_NEAR_BRIDGE_ADDRESS: [u8; 64] = [
Expand All @@ -440,29 +465,29 @@ impl OmniConnector {

let solana_bridge_client = self.solana_bridge_client()?;

let tx_hash = solana_bridge_client
let signature = solana_bridge_client
.initialize(DERIVED_NEAR_BRIDGE_ADDRESS, program_keypair)
.await?;

tracing::info!(
tx_hash = format!("{:?}", tx_hash),
signature = signature.to_string(),
"Sent initialize transaction"
);

Ok(tx_hash)
Ok(signature)
}

pub async fn solana_log_metadata(&self, token: Pubkey) -> Result<Signature> {
let solana_bridge_client = self.solana_bridge_client()?;

let tx_hash = solana_bridge_client.log_metadata(token).await?;
let signature = solana_bridge_client.log_metadata(token).await?;

tracing::info!(
tx_hash = format!("{:?}", tx_hash),
signature = signature.to_string(),
"Sent register token transaction"
);

Ok(tx_hash)
Ok(signature)
}

pub async fn solana_deploy_token_with_tx_hash(
Expand Down Expand Up @@ -524,11 +549,12 @@ impl OmniConnector {
token: Pubkey,
amount: u128,
recipient: String,
message: String,
) -> Result<Signature> {
let solana_bridge_client = self.solana_bridge_client()?;

let signature = solana_bridge_client
.init_transfer(token, amount, recipient)
.init_transfer(token, amount, recipient, message)
.await?;

tracing::info!(
Expand All @@ -543,11 +569,12 @@ impl OmniConnector {
&self,
amount: u128,
recipient: String,
message: String,
) -> Result<Signature> {
let solana_bridge_client = self.solana_bridge_client()?;

let signature = solana_bridge_client
.init_transfer_sol(amount, recipient)
.init_transfer_sol(amount, recipient, message)
.await?;

tracing::info!(
Expand Down Expand Up @@ -759,12 +786,17 @@ impl OmniConnector {
token,
amount,
recipient,
message,
} => self
.solana_init_transfer(token, amount, recipient)
.solana_init_transfer(token, amount, recipient, message)
.await
.map(|tx_hash| tx_hash.to_string()),
InitTransferArgs::SolanaInitTransferSol { amount, recipient } => self
.solana_init_transfer_sol(amount, recipient)
InitTransferArgs::SolanaInitTransferSol {
amount,
recipient,
message,
} => self
.solana_init_transfer_sol(amount, recipient, message)
.await
.map(|tx_hash| tx_hash.to_string()),
}
Expand Down

0 comments on commit eed59e2

Please sign in to comment.