Skip to content
Draft
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
15 changes: 0 additions & 15 deletions packages/go-anchor/dummyibcapp/instructions.go

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

17 changes: 1 addition & 16 deletions packages/go-anchor/ics07tendermint/instructions.go

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

94 changes: 26 additions & 68 deletions packages/relayer/modules/cosmos-to-solana/src/tx_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,19 +133,14 @@ impl TxBuilder {
/// Returns an error if serialization fails
fn build_create_client_instruction(
&self,
chain_id: &str,
latest_height: u64,
client_state: &ClientState,
consensus_state: &ConsensusState,
) -> Result<Instruction> {
// Derive PDAs
let (client_state_pda, _) =
derive_ics07_client_state(chain_id, &self.solana_ics07_program_id);
let (consensus_state_pda, _) = derive_ics07_consensus_state(
&client_state_pda,
latest_height,
&self.solana_ics07_program_id,
);
let (client_state_pda, _) = derive_ics07_client_state(&self.solana_ics07_program_id);
let (consensus_state_pda, _) =
derive_ics07_consensus_state(latest_height, &self.solana_ics07_program_id);

tracing::debug!("Client state PDA: {}", client_state_pda);
tracing::debug!("Consensus state PDA: {}", consensus_state_pda);
Expand All @@ -167,8 +162,7 @@ impl TxBuilder {
// Add discriminator
instruction_data.extend_from_slice(&discriminator);

// Serialize parameters in order: chain_id, latest_height, client_state, consensus_state
instruction_data.extend_from_slice(&chain_id.try_to_vec()?);
// Serialize parameters in order: latest_height, client_state, consensus_state
instruction_data.extend_from_slice(&latest_height.try_to_vec()?);
instruction_data.extend_from_slice(&client_state.try_to_vec()?);
instruction_data.extend_from_slice(&consensus_state.try_to_vec()?);
Expand Down Expand Up @@ -426,25 +420,16 @@ impl TxBuilder {
client_message: header_bytes,
};

// Get the chain ID for PDA derivation
let chain_id = latest_block.block.header.chain_id.to_string();
let (client_state_pda, _) =
derive_ics07_client_state(&chain_id, &self.solana_ics07_program_id);
let (client_state_pda, _) = derive_ics07_client_state(&self.solana_ics07_program_id);

// Use heights already calculated above
let new_height = latest_block.block.header.height.value();

let trusted_height = new_height.saturating_sub(1);
let (trusted_consensus_state, _) = derive_ics07_consensus_state(
&client_state_pda,
trusted_height,
&self.solana_ics07_program_id,
);
let (new_consensus_state, _) = derive_ics07_consensus_state(
&client_state_pda,
new_height,
&self.solana_ics07_program_id,
);
let (trusted_consensus_state, _) =
derive_ics07_consensus_state(trusted_height, &self.solana_ics07_program_id);
let (new_consensus_state, _) =
derive_ics07_consensus_state(new_height, &self.solana_ics07_program_id);

// Build the instruction
let accounts = vec![
Expand Down Expand Up @@ -515,25 +500,15 @@ impl TxBuilder {
// Derive all required PDAs
let (router_state, _) = derive_router_state(&self.solana_ics26_program_id);
let (ibc_app, _) = derive_ibc_app(&dest_port, &self.solana_ics26_program_id);
let (client_sequence, _) =
derive_client_sequence(params.destination_client, &self.solana_ics26_program_id);
let (packet_receipt, _) = derive_packet_receipt(
params.destination_client,
params.sequence,
&self.solana_ics26_program_id,
);
let (packet_ack, _) = derive_packet_ack(
params.destination_client,
params.sequence,
&self.solana_ics26_program_id,
);
let (client, _) = derive_client(params.destination_client, &self.solana_ics26_program_id);
let (client_sequence, _) = derive_client_sequence(&self.solana_ics26_program_id);
let (packet_receipt, _) =
derive_packet_receipt(params.sequence, &self.solana_ics26_program_id);
let (packet_ack, _) = derive_packet_ack(params.sequence, &self.solana_ics26_program_id);
let (client, _) = derive_client(&self.solana_ics26_program_id);

// For light client verification, we also need ICS07 accounts
let (client_state, _) =
derive_ics07_client_state(params.source_client, &self.solana_ics07_program_id);
let (consensus_state, _) =
derive_ics07_consensus_state(&client_state, 0, &self.solana_ics07_program_id); // Use appropriate height
let (client_state, _) = derive_ics07_client_state(&self.solana_ics07_program_id);
let (consensus_state, _) = derive_ics07_consensus_state(0, &self.solana_ics07_program_id); // Use appropriate height

// Build accounts list
let accounts = vec![
Expand Down Expand Up @@ -641,12 +616,8 @@ impl TxBuilder {
let consensus_state = Self::create_consensus_state_from_block(&latest_block)?;

// Build the instruction for creating the client
let instruction = self.build_create_client_instruction(
&chain_id_str,
latest_height,
&client_state,
&consensus_state,
)?;
let instruction =
self.build_create_client_instruction(latest_height, &client_state, &consensus_state)?;

// Create unsigned transaction
let mut tx = Transaction::new_with_payer(&[instruction], Some(&self.fee_payer));
Expand Down Expand Up @@ -768,30 +739,17 @@ impl MockTxBuilder {
// Derive all required PDAs
let (router_state, _) = derive_router_state(&self.inner.solana_ics26_program_id);
let (ibc_app, _) = derive_ibc_app(&dest_port, &self.inner.solana_ics26_program_id);
let (client_sequence, _) = derive_client_sequence(
params.destination_client,
&self.inner.solana_ics26_program_id,
);
let (packet_receipt, _) = derive_packet_receipt(
params.destination_client,
params.sequence,
&self.inner.solana_ics26_program_id,
);
let (packet_ack, _) = derive_packet_ack(
params.destination_client,
params.sequence,
&self.inner.solana_ics26_program_id,
);
let (client, _) = derive_client(
params.destination_client,
&self.inner.solana_ics26_program_id,
);
let (client_sequence, _) = derive_client_sequence(&self.inner.solana_ics26_program_id);
let (packet_receipt, _) =
derive_packet_receipt(params.sequence, &self.inner.solana_ics26_program_id);
let (packet_ack, _) =
derive_packet_ack(params.sequence, &self.inner.solana_ics26_program_id);
let (client, _) = derive_client(&self.inner.solana_ics26_program_id);

// For light client verification, we also need ICS07 accounts
let (client_state, _) =
derive_ics07_client_state(params.source_client, &self.inner.solana_ics07_program_id);
let (client_state, _) = derive_ics07_client_state(&self.inner.solana_ics07_program_id);
let (consensus_state, _) =
derive_ics07_consensus_state(&client_state, 0, &self.inner.solana_ics07_program_id);
derive_ics07_consensus_state(0, &self.inner.solana_ics07_program_id);

// Build accounts list
let accounts = vec![
Expand Down
69 changes: 18 additions & 51 deletions programs/solana/packages/solana-ibc-types/src/pda.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,74 +22,41 @@ pub fn derive_ibc_app(port_id: &str, program_id: &Pubkey) -> (Pubkey, u8) {
}

/// Derive client PDA
pub fn derive_client(client_id: &str, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[CLIENT_SEED, client_id.as_bytes()], program_id)
pub fn derive_client(program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[CLIENT_SEED], program_id)
}

/// Derive client sequence PDA
pub fn derive_client_sequence(client_id: &str, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[CLIENT_SEQUENCE_SEED, client_id.as_bytes()], program_id)
pub fn derive_client_sequence(program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[CLIENT_SEQUENCE_SEED], program_id)
}

/// Derive packet commitment PDA
pub fn derive_packet_commitment(
client_id: &str,
sequence: u64,
program_id: &Pubkey,
) -> (Pubkey, u8) {
pub fn derive_packet_commitment(sequence: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(
&[
PACKET_COMMITMENT_SEED,
client_id.as_bytes(),
&sequence.to_le_bytes(),
],
&[PACKET_COMMITMENT_SEED, &sequence.to_le_bytes()],
program_id,
)
}

/// Derive packet receipt PDA
pub fn derive_packet_receipt(client_id: &str, sequence: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(
&[
PACKET_RECEIPT_SEED,
client_id.as_bytes(),
&sequence.to_le_bytes(),
],
program_id,
)
pub fn derive_packet_receipt(sequence: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[PACKET_RECEIPT_SEED, &sequence.to_le_bytes()], program_id)
}

/// Derive packet acknowledgment PDA
pub fn derive_packet_ack(client_id: &str, sequence: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(
&[
PACKET_ACK_SEED,
client_id.as_bytes(),
&sequence.to_le_bytes(),
],
program_id,
)
pub fn derive_packet_ack(sequence: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[PACKET_ACK_SEED, &sequence.to_le_bytes()], program_id)
}

/// Derive ICS07 client state PDA
pub fn derive_ics07_client_state(chain_id: &str, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[b"client", chain_id.as_bytes()], program_id)
pub fn derive_ics07_client_state(program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[b"client"], program_id)
}

/// Derive ICS07 consensus state PDA
pub fn derive_ics07_consensus_state(
client_state: &Pubkey,
height: u64,
program_id: &Pubkey,
) -> (Pubkey, u8) {
Pubkey::find_program_address(
&[
CONSENSUS_STATE_SEED,
client_state.as_ref(),
&height.to_le_bytes(),
],
program_id,
)
pub fn derive_ics07_consensus_state(height: u64, program_id: &Pubkey) -> (Pubkey, u8) {
Pubkey::find_program_address(&[CONSENSUS_STATE_SEED, &height.to_le_bytes()], program_id)
}

/// Build instruction discriminator for Anchor
Expand Down Expand Up @@ -118,13 +85,13 @@ pub fn derive_ibc_app_default(port_id: &str) -> (Pubkey, u8) {
}

/// Derive client PDA using the default ICS26 program ID
pub fn derive_client_default(client_id: &str) -> (Pubkey, u8) {
pub fn derive_client_default() -> (Pubkey, u8) {
let program_id = Pubkey::from_str(ICS26_ROUTER_ID).expect("Invalid ICS26 program ID");
derive_client(client_id, &program_id)
derive_client(&program_id)
}

/// Derive ICS07 client state PDA using the default ICS07 program ID
pub fn derive_ics07_client_state_default(chain_id: &str) -> (Pubkey, u8) {
pub fn derive_ics07_client_state_default() -> (Pubkey, u8) {
let program_id = Pubkey::from_str(ICS07_TENDERMINT_ID).expect("Invalid ICS07 program ID");
derive_ics07_client_state(chain_id, &program_id)
derive_ics07_client_state(&program_id)
}
Loading
Loading