pyth2wormhole: Add client with working initialize
Change-Id: Ie8d99373c4b7d91d1445f9697714493c32d2bd5a
This commit is contained in:
parent
2f4517e45a
commit
4fcc4f5674
File diff suppressed because it is too large
Load Diff
|
@ -1,2 +1,2 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [".", "program"]
|
members = ["client", "program"]
|
|
@ -0,0 +1,22 @@
|
||||||
|
[package]
|
||||||
|
name = "pyth2wormhole-client"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["pyth2wormhole/client"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
borsh = "0.8.1"
|
||||||
|
clap = "3.0.0-beta.2" # This beta assimilates structopt into clap
|
||||||
|
env_logger = "0.8.4"
|
||||||
|
log = "0.4.14"
|
||||||
|
pyth2wormhole = {path = "../program"}
|
||||||
|
shellexpand = "2.1.0"
|
||||||
|
solana-client = "=1.7.0"
|
||||||
|
solana-program = "=1.7.0"
|
||||||
|
solana-sdk = "=1.7.0"
|
||||||
|
solitaire-client = {path = "../../solitaire/client"}
|
||||||
|
solitaire = {path = "../../solitaire/program"}
|
|
@ -0,0 +1,50 @@
|
||||||
|
//! CLI options
|
||||||
|
|
||||||
|
use solana_program::pubkey::Pubkey;
|
||||||
|
|
||||||
|
use clap::Clap;
|
||||||
|
#[derive(Clap)]
|
||||||
|
#[clap(
|
||||||
|
about = "A client for the pyth2wormhole Solana program",
|
||||||
|
author = "The Wormhole Project"
|
||||||
|
)]
|
||||||
|
pub struct Cli {
|
||||||
|
#[clap(
|
||||||
|
short,
|
||||||
|
long,
|
||||||
|
default_value = "3",
|
||||||
|
about = "Logging level, where 0..=1 RUST_LOG=error and 5.. is RUST_LOG=trace"
|
||||||
|
)]
|
||||||
|
pub log_level: u32,
|
||||||
|
#[clap(
|
||||||
|
long,
|
||||||
|
about = "Identity JSON file for the entity meant to cover transaction costs",
|
||||||
|
default_value = "~/.config/solana/id.json"
|
||||||
|
)]
|
||||||
|
pub payer: String,
|
||||||
|
#[clap(long, default_value = "http://localhost:8899")]
|
||||||
|
pub rpc_url: String,
|
||||||
|
pub p2w_addr: Pubkey,
|
||||||
|
#[clap(subcommand)]
|
||||||
|
pub action: Action,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clap)]
|
||||||
|
pub enum Action {
|
||||||
|
#[clap(about = "Initialize a pyth2wormhole program freshly deployed under <p2w_addr>")]
|
||||||
|
Init {
|
||||||
|
#[clap(long = "owner")]
|
||||||
|
new_owner_addr: Pubkey,
|
||||||
|
#[clap(long = "wormhole")]
|
||||||
|
wormhole_addr: Pubkey,
|
||||||
|
#[clap(long = "pyth")]
|
||||||
|
pyth_owner_addr: Pubkey,
|
||||||
|
},
|
||||||
|
#[clap(
|
||||||
|
about = "Use an existing pyth2wormhole program to forward product price information to another chain"
|
||||||
|
)]
|
||||||
|
Forward {
|
||||||
|
#[clap(long = "product")]
|
||||||
|
product_addr: Pubkey,
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
pub mod cli;
|
||||||
|
|
||||||
|
use borsh::BorshSerialize;
|
||||||
|
use clap::Clap;
|
||||||
|
use log::LevelFilter;
|
||||||
|
use solana_client::rpc_client::RpcClient;
|
||||||
|
use solana_program::{hash::Hash, pubkey::Pubkey};
|
||||||
|
use solana_sdk::{
|
||||||
|
commitment_config::CommitmentConfig, signature::read_keypair_file, transaction::Transaction,
|
||||||
|
};
|
||||||
|
use solitaire::{AccountState, processors::seeded::Seeded};
|
||||||
|
use solitaire_client::{AccEntry, Keypair, SolSigner, ToInstruction};
|
||||||
|
|
||||||
|
use cli::{Action, Cli};
|
||||||
|
|
||||||
|
use pyth2wormhole::{config::P2WConfigAccount, initialize::InitializeAccounts, Pyth2WormholeConfig};
|
||||||
|
|
||||||
|
pub type ErrBox = Box<dyn std::error::Error>;
|
||||||
|
|
||||||
|
fn main() -> Result<(), ErrBox> {
|
||||||
|
let cli = Cli::parse();
|
||||||
|
init_logging(cli.log_level);
|
||||||
|
|
||||||
|
let payer = read_keypair_file(&*shellexpand::tilde(&cli.payer))?;
|
||||||
|
let rpc_client = RpcClient::new_with_commitment(cli.rpc_url, CommitmentConfig::processed());
|
||||||
|
|
||||||
|
let p2w_addr = cli.p2w_addr;
|
||||||
|
|
||||||
|
let (recent_blockhash, _) = rpc_client.get_recent_blockhash()?;
|
||||||
|
|
||||||
|
let tx = match cli.action {
|
||||||
|
Action::Init {
|
||||||
|
new_owner_addr,
|
||||||
|
wormhole_addr,
|
||||||
|
pyth_owner_addr,
|
||||||
|
} => handle_init(
|
||||||
|
payer,
|
||||||
|
p2w_addr,
|
||||||
|
new_owner_addr,
|
||||||
|
wormhole_addr,
|
||||||
|
pyth_owner_addr,
|
||||||
|
recent_blockhash,
|
||||||
|
)?,
|
||||||
|
Action::Forward { product_addr: _ } => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
rpc_client.send_and_confirm_transaction_with_spinner(&tx)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_init(
|
||||||
|
payer: Keypair,
|
||||||
|
p2w_addr: Pubkey,
|
||||||
|
new_owner_addr: Pubkey,
|
||||||
|
wormhole_addr: Pubkey,
|
||||||
|
pyth_owner_addr: Pubkey,
|
||||||
|
recent_blockhash: Hash,
|
||||||
|
) -> Result<Transaction, ErrBox> {
|
||||||
|
use AccEntry::*;
|
||||||
|
|
||||||
|
let payer_pubkey = payer.pubkey();
|
||||||
|
|
||||||
|
let accs = InitializeAccounts {
|
||||||
|
payer: Signer(payer),
|
||||||
|
new_config: Unprivileged(<P2WConfigAccount<'_, {AccountState::Uninitialized}>>::key(None, &p2w_addr)),
|
||||||
|
};
|
||||||
|
|
||||||
|
let config = Pyth2WormholeConfig {
|
||||||
|
owner: new_owner_addr,
|
||||||
|
wormhole_program_addr: wormhole_addr,
|
||||||
|
pyth_owner: pyth_owner_addr,
|
||||||
|
};
|
||||||
|
let ix_data = pyth2wormhole::instruction::Instruction::Initialize(config);
|
||||||
|
|
||||||
|
let (ix, signers) = accs.gen_client_ix(p2w_addr, ix_data.try_to_vec()?.as_slice())?;
|
||||||
|
|
||||||
|
let tx_signed = Transaction::new_signed_with_payer::<Vec<&Keypair>>(
|
||||||
|
&[ix],
|
||||||
|
Some(&payer_pubkey),
|
||||||
|
signers.iter().collect::<Vec<_>>().as_ref(),
|
||||||
|
recent_blockhash,
|
||||||
|
);
|
||||||
|
Ok(tx_signed)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_logging(verbosity: u32) {
|
||||||
|
use LevelFilter::*;
|
||||||
|
let filter = match verbosity {
|
||||||
|
0..=1 => Error,
|
||||||
|
2 => Warn,
|
||||||
|
3 => Info,
|
||||||
|
4 => Debug,
|
||||||
|
_other => Trace,
|
||||||
|
};
|
||||||
|
|
||||||
|
env_logger::builder().filter_level(filter).init();
|
||||||
|
}
|
|
@ -8,10 +8,10 @@ use solitaire::{
|
||||||
solitaire
|
solitaire
|
||||||
};
|
};
|
||||||
|
|
||||||
use config::Pyth2WormholeConfig;
|
pub use config::Pyth2WormholeConfig;
|
||||||
use forward::{forward_price, Forward, ForwardData};
|
pub use forward::{forward_price, Forward, ForwardData};
|
||||||
use initialize::{initialize, Initialize};
|
pub use initialize::{initialize, Initialize};
|
||||||
use set_config::{set_config, SetConfig};
|
pub use set_config::{set_config, SetConfig};
|
||||||
|
|
||||||
solitaire! {
|
solitaire! {
|
||||||
Forward(ForwardData) => forward_price,
|
Forward(ForwardData) => forward_price,
|
||||||
|
|
Loading…
Reference in New Issue