|
|
@ -74,7 +74,6 @@ async fn main() -> Result<(), Box<dyn Error>> { |
|
|
|
config.solana_url.clone(), |
|
|
|
config.solana_url.clone(), |
|
|
|
CommitmentConfig::confirmed(), |
|
|
|
CommitmentConfig::confirmed(), |
|
|
|
)); |
|
|
|
)); |
|
|
|
|
|
|
|
|
|
|
|
let accounts_from = config |
|
|
|
let accounts_from = config |
|
|
|
.transfers |
|
|
|
.transfers |
|
|
|
.iter() |
|
|
|
.iter() |
|
|
@ -86,6 +85,11 @@ async fn main() -> Result<(), Box<dyn Error>> { |
|
|
|
.map(|s| s.receiver) |
|
|
|
.map(|s| s.receiver) |
|
|
|
.collect::<Vec<_>>(); |
|
|
|
.collect::<Vec<_>>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//**// create account
|
|
|
|
|
|
|
|
// create_account(client.clone(), &config.transfers[0].sender, &Keypair::new()).await?;
|
|
|
|
|
|
|
|
// return Ok(());
|
|
|
|
|
|
|
|
//**//
|
|
|
|
|
|
|
|
|
|
|
|
// for acc in &accounts_from {
|
|
|
|
// for acc in &accounts_from {
|
|
|
|
// println!("requesting airdrop for {acc}");
|
|
|
|
// println!("requesting airdrop for {acc}");
|
|
|
|
// let signature = client.request_airdrop(&acc, LAMPORTS_PER_SOL).await?;
|
|
|
|
// let signature = client.request_airdrop(&acc, LAMPORTS_PER_SOL).await?;
|
|
|
@ -96,7 +100,10 @@ async fn main() -> Result<(), Box<dyn Error>> { |
|
|
|
print_balances(client.clone(), all_accounts.clone()).await?; |
|
|
|
print_balances(client.clone(), all_accounts.clone()).await?; |
|
|
|
|
|
|
|
|
|
|
|
let transfer_amount = LAMPORTS_PER_SOL / 100; |
|
|
|
let transfer_amount = LAMPORTS_PER_SOL / 100; |
|
|
|
println!("sending {transfer_amount} SOL"); |
|
|
|
println!( |
|
|
|
|
|
|
|
"sending {} SOL", |
|
|
|
|
|
|
|
transfer_amount as f64 / LAMPORTS_PER_SOL as f64 |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
let transactions = run_batch(config.transfers.iter().map(|tr| { |
|
|
|
let transactions = run_batch(config.transfers.iter().map(|tr| { |
|
|
|
let instruction = |
|
|
|
let instruction = |
|
|
@ -136,6 +143,37 @@ async fn wait_for_confirmation( |
|
|
|
Ok(()) |
|
|
|
Ok(()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async fn create_account( |
|
|
|
|
|
|
|
client: Arc<RpcClient>, |
|
|
|
|
|
|
|
payer: &Keypair, |
|
|
|
|
|
|
|
new_account: &Keypair, |
|
|
|
|
|
|
|
) -> Result<(), ClientError> { |
|
|
|
|
|
|
|
let data_len = 0; |
|
|
|
|
|
|
|
let rent_exemption_amount = client |
|
|
|
|
|
|
|
.get_minimum_balance_for_rent_exemption(data_len) |
|
|
|
|
|
|
|
.await?; |
|
|
|
|
|
|
|
println!("pubkey: {}", new_account.pubkey()); |
|
|
|
|
|
|
|
println!( |
|
|
|
|
|
|
|
"privkey: {}", |
|
|
|
|
|
|
|
bs58::encode(new_account.secret().as_bytes()).into_string() |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
let instruction = system_instruction::create_account( |
|
|
|
|
|
|
|
&payer.pubkey(), |
|
|
|
|
|
|
|
&new_account.pubkey(), |
|
|
|
|
|
|
|
rent_exemption_amount, |
|
|
|
|
|
|
|
data_len as u64, |
|
|
|
|
|
|
|
&Pubkey::from_str("11111111111111111111111111111111").unwrap(), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
let mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey())); |
|
|
|
|
|
|
|
transaction.sign( |
|
|
|
|
|
|
|
&[&payer, &new_account], |
|
|
|
|
|
|
|
client.get_latest_blockhash().await?, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
client.send_and_confirm_transaction(&transaction).await?; |
|
|
|
|
|
|
|
println!("account {} created", new_account.pubkey()); |
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async fn run_batch<T>( |
|
|
|
async fn run_batch<T>( |
|
|
|
tasks: impl IntoIterator<Item = impl Future<Output = Result<T, ClientError>>>, |
|
|
|
tasks: impl IntoIterator<Item = impl Future<Output = Result<T, ClientError>>>, |
|
|
|
) -> Result<Vec<T>, ClientError> { |
|
|
|
) -> Result<Vec<T>, ClientError> { |
|
|
|