Set correct mutability on Transfer Native
Change-Id: I50a34645de34cd97b801015748331cfba7cdfac9
This commit is contained in:
parent
42c3040de1
commit
f6932bebca
|
@ -11,6 +11,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
use bridge::{
|
use bridge::{
|
||||||
api::{PostMessage, PostMessageData},
|
api::{PostMessage, PostMessageData},
|
||||||
|
types::ConsistencyLevel,
|
||||||
vaa::SerializePayload,
|
vaa::SerializePayload,
|
||||||
};
|
};
|
||||||
use primitive_types::U256;
|
use primitive_types::U256;
|
||||||
|
@ -36,33 +37,36 @@ use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
#[derive(FromAccounts)]
|
#[derive(FromAccounts)]
|
||||||
pub struct TransferNative<'b> {
|
pub struct TransferNative<'b> {
|
||||||
pub payer: Signer<AccountInfo<'b>>,
|
pub payer: Mut<Signer<AccountInfo<'b>>>,
|
||||||
pub config: ConfigAccount<'b, { AccountState::Initialized }>,
|
|
||||||
|
|
||||||
pub from: Data<'b, SplAccount, { AccountState::Initialized }>,
|
pub config: Mut<ConfigAccount<'b, { AccountState::Initialized }>>,
|
||||||
pub mint: Data<'b, SplMint, { AccountState::Initialized }>,
|
|
||||||
|
|
||||||
pub custody: CustodyAccount<'b, { AccountState::MaybeInitialized }>,
|
pub from: Mut<Data<'b, SplAccount, { AccountState::Initialized }>>,
|
||||||
|
|
||||||
|
pub mint: Mut<Data<'b, SplMint, { AccountState::Initialized }>>,
|
||||||
|
|
||||||
|
pub custody: Mut<CustodyAccount<'b, { AccountState::MaybeInitialized }>>,
|
||||||
|
|
||||||
// This could allow someone to race someone else's tx if they do the approval in a separate tx.
|
// This could allow someone to race someone else's tx if they do the approval in a separate tx.
|
||||||
// Therefore the approval must be set in the same tx
|
// Therefore the approval must be set in the same tx.
|
||||||
pub authority_signer: AuthoritySigner<'b>,
|
pub authority_signer: AuthoritySigner<'b>,
|
||||||
|
|
||||||
pub custody_signer: CustodySigner<'b>,
|
pub custody_signer: CustodySigner<'b>,
|
||||||
|
|
||||||
/// CPI Context
|
/// CPI Context
|
||||||
pub bridge: Info<'b>,
|
pub bridge: Mut<Info<'b>>,
|
||||||
|
|
||||||
/// Account to store the posted message
|
/// Account to store the posted message
|
||||||
pub message: Info<'b>,
|
pub message: Mut<Info<'b>>,
|
||||||
|
|
||||||
/// Emitter of the VAA
|
/// Emitter of the VAA
|
||||||
pub emitter: EmitterAccount<'b>,
|
pub emitter: EmitterAccount<'b>,
|
||||||
|
|
||||||
/// Tracker for the emitter sequence
|
/// Tracker for the emitter sequence
|
||||||
pub sequence: Info<'b>,
|
pub sequence: Mut<Info<'b>>,
|
||||||
|
|
||||||
/// Account to collect tx fee
|
/// Account to collect tx fee
|
||||||
pub fee_collector: Info<'b>,
|
pub fee_collector: Mut<Info<'b>>,
|
||||||
|
|
||||||
pub clock: Sysvar<'b, Clock>,
|
pub clock: Sysvar<'b, Clock>,
|
||||||
}
|
}
|
||||||
|
@ -151,14 +155,14 @@ pub fn transfer_native(
|
||||||
let params = (bridge::instruction::Instruction::PostMessage, PostMessageData {
|
let params = (bridge::instruction::Instruction::PostMessage, PostMessageData {
|
||||||
nonce: data.nonce,
|
nonce: data.nonce,
|
||||||
payload: payload.try_to_vec()?,
|
payload: payload.try_to_vec()?,
|
||||||
persist: true,
|
consistency_level: ConsistencyLevel::Confirmed,
|
||||||
});
|
});
|
||||||
|
|
||||||
let ix = Instruction::new_with_bytes(
|
let ix = Instruction::new_with_bytes(
|
||||||
accs.config.wormhole_bridge,
|
accs.config.wormhole_bridge,
|
||||||
params.try_to_vec()?.as_slice(),
|
params.try_to_vec()?.as_slice(),
|
||||||
vec![
|
vec![
|
||||||
AccountMeta::new_readonly(*accs.bridge.key, false),
|
AccountMeta::new(*accs.bridge.key, false),
|
||||||
AccountMeta::new(*accs.message.key, false),
|
AccountMeta::new(*accs.message.key, false),
|
||||||
AccountMeta::new_readonly(*accs.emitter.key, true),
|
AccountMeta::new_readonly(*accs.emitter.key, true),
|
||||||
AccountMeta::new(*accs.sequence.key, false),
|
AccountMeta::new(*accs.sequence.key, false),
|
||||||
|
@ -275,7 +279,7 @@ pub fn transfer_wrapped(
|
||||||
let params = (bridge::instruction::Instruction::PostMessage, PostMessageData {
|
let params = (bridge::instruction::Instruction::PostMessage, PostMessageData {
|
||||||
nonce: data.nonce,
|
nonce: data.nonce,
|
||||||
payload: payload.try_to_vec()?,
|
payload: payload.try_to_vec()?,
|
||||||
persist: true,
|
consistency_level: ConsistencyLevel::Confirmed,
|
||||||
});
|
});
|
||||||
|
|
||||||
let ix = Instruction::new_with_bytes(
|
let ix = Instruction::new_with_bytes(
|
||||||
|
|
|
@ -316,7 +316,7 @@ pub fn transfer_native(
|
||||||
AccountMeta::new_readonly(emitter_key, false),
|
AccountMeta::new_readonly(emitter_key, false),
|
||||||
AccountMeta::new(sequence_key, false),
|
AccountMeta::new(sequence_key, false),
|
||||||
AccountMeta::new(fee_collector_key, false),
|
AccountMeta::new(fee_collector_key, false),
|
||||||
AccountMeta::new(solana_program::sysvar::clock::id(), false),
|
AccountMeta::new_readonly(solana_program::sysvar::clock::id(), false),
|
||||||
// Dependencies
|
// Dependencies
|
||||||
AccountMeta::new(solana_program::sysvar::rent::id(), false),
|
AccountMeta::new(solana_program::sysvar::rent::id(), false),
|
||||||
AccountMeta::new(solana_program::system_program::id(), false),
|
AccountMeta::new(solana_program::system_program::id(), false),
|
||||||
|
|
|
@ -100,6 +100,7 @@ pub fn execute(
|
||||||
}
|
}
|
||||||
|
|
||||||
mod helpers {
|
mod helpers {
|
||||||
|
use bridge::types::PostedMessage;
|
||||||
use token_bridge::{CompleteNativeData, TransferNativeData};
|
use token_bridge::{CompleteNativeData, TransferNativeData};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -171,6 +172,98 @@ mod helpers {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn transfer(
|
||||||
|
client: &RpcClient,
|
||||||
|
from: &Keypair,
|
||||||
|
to: &Pubkey,
|
||||||
|
lamports: u64,
|
||||||
|
) -> Result<Signature, ClientError> {
|
||||||
|
execute(
|
||||||
|
client,
|
||||||
|
from,
|
||||||
|
&[from],
|
||||||
|
&[system_instruction::transfer(&from.pubkey(), to, lamports)],
|
||||||
|
CommitmentConfig::processed(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn initialize(
|
||||||
|
client: &RpcClient,
|
||||||
|
program: &Pubkey,
|
||||||
|
payer: &Keypair,
|
||||||
|
bridge: &Pubkey,
|
||||||
|
) -> Result<Signature, ClientError> {
|
||||||
|
execute(
|
||||||
|
client,
|
||||||
|
payer,
|
||||||
|
&[payer],
|
||||||
|
&[instructions::initialize(*program, payer.pubkey(), *bridge).unwrap()],
|
||||||
|
CommitmentConfig::processed(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn attest(
|
||||||
|
client: &RpcClient,
|
||||||
|
program: &Pubkey,
|
||||||
|
bridge: &Pubkey,
|
||||||
|
payer: &Keypair,
|
||||||
|
mint: Pubkey,
|
||||||
|
mint_meta: Pubkey,
|
||||||
|
nonce: u32,
|
||||||
|
) -> Result<Signature, ClientError> {
|
||||||
|
let mint_data = Mint::unpack(
|
||||||
|
&client.get_account(&mint)?.data
|
||||||
|
).expect("Could not unpack Mint");
|
||||||
|
|
||||||
|
execute(
|
||||||
|
client,
|
||||||
|
payer,
|
||||||
|
&[payer],
|
||||||
|
&[instructions::attest(
|
||||||
|
*program,
|
||||||
|
*bridge,
|
||||||
|
payer.pubkey(),
|
||||||
|
mint,
|
||||||
|
mint_data,
|
||||||
|
mint_meta,
|
||||||
|
nonce,
|
||||||
|
)
|
||||||
|
.unwrap()],
|
||||||
|
CommitmentConfig::processed(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn transfer_native(
|
||||||
|
client: &RpcClient,
|
||||||
|
program: &Pubkey,
|
||||||
|
bridge: &Pubkey,
|
||||||
|
payer: &Keypair,
|
||||||
|
from: &Keypair,
|
||||||
|
mint: Pubkey,
|
||||||
|
) -> Result<Signature, ClientError> {
|
||||||
|
execute(
|
||||||
|
client,
|
||||||
|
payer,
|
||||||
|
&[payer],
|
||||||
|
&[instructions::transfer_native(
|
||||||
|
*program,
|
||||||
|
*bridge,
|
||||||
|
payer.pubkey(),
|
||||||
|
from.pubkey(),
|
||||||
|
mint,
|
||||||
|
TransferNativeData {
|
||||||
|
nonce: 0,
|
||||||
|
amount: 0,
|
||||||
|
fee: 0,
|
||||||
|
target_address: [0u8; 32],
|
||||||
|
target_chain: 1,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.unwrap()],
|
||||||
|
CommitmentConfig::processed(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn create_mint(
|
pub fn create_mint(
|
||||||
client: &RpcClient,
|
client: &RpcClient,
|
||||||
payer: &Keypair,
|
payer: &Keypair,
|
||||||
|
|
|
@ -181,6 +181,79 @@ fn run_integration_tests() {
|
||||||
|
|
||||||
// Initialize the bridge and verify the bridges state.
|
// Initialize the bridge and verify the bridges state.
|
||||||
test_initialize(&mut context);
|
test_initialize(&mut context);
|
||||||
|
test_transfer_native(&mut context);
|
||||||
|
test_attest(&mut context);
|
||||||
|
test_complete_native(&mut context);
|
||||||
|
//test_transfer_wrapped(&mut context);
|
||||||
|
//test_complete_wrapped(&mut context);
|
||||||
|
//test_register_chain(&mut context);
|
||||||
|
//test_create_wrapped(&mut context);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_attest(context: &mut Context) -> () {
|
||||||
|
println!("Attest");
|
||||||
|
use token_bridge::{
|
||||||
|
accounts::ConfigAccount,
|
||||||
|
types::{
|
||||||
|
Config,
|
||||||
|
FeeStructure,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let Context {
|
||||||
|
ref payer,
|
||||||
|
ref client,
|
||||||
|
ref bridge,
|
||||||
|
ref token_bridge,
|
||||||
|
ref mint_authority,
|
||||||
|
ref mint,
|
||||||
|
ref mint_meta,
|
||||||
|
..
|
||||||
|
} = context;
|
||||||
|
|
||||||
|
common::attest(
|
||||||
|
client,
|
||||||
|
token_bridge,
|
||||||
|
bridge,
|
||||||
|
payer,
|
||||||
|
mint.pubkey(),
|
||||||
|
mint_meta.pubkey(),
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_transfer_native(context: &mut Context) -> () {
|
||||||
|
println!("Transfer Native");
|
||||||
|
use token_bridge::{
|
||||||
|
accounts::ConfigAccount,
|
||||||
|
types::{
|
||||||
|
Config,
|
||||||
|
FeeStructure,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let Context {
|
||||||
|
ref payer,
|
||||||
|
ref client,
|
||||||
|
ref bridge,
|
||||||
|
ref token_bridge,
|
||||||
|
ref mint_authority,
|
||||||
|
ref mint,
|
||||||
|
ref mint_meta,
|
||||||
|
ref token_account,
|
||||||
|
..
|
||||||
|
} = context;
|
||||||
|
|
||||||
|
common::transfer_native(
|
||||||
|
client,
|
||||||
|
token_bridge,
|
||||||
|
bridge,
|
||||||
|
payer,
|
||||||
|
token_account,
|
||||||
|
mint.pubkey(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_initialize(context: &mut Context) {
|
fn test_initialize(context: &mut Context) {
|
||||||
|
|
Loading…
Reference in New Issue