Skip to content

Commit 6a44563

Browse files
author
DogLooksGood
committed
Initialize ATA before sending settle instruction
1 parent 529dbcb commit 6a44563

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

transport/src/solana.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,10 @@ impl TransportT for SolanaTransport {
682682
let mut calc_cu_prize_addrs =
683683
vec![Pubkey::from_str(&addr).unwrap(), game_state.stake_account];
684684

685+
// We'll later check this list, to find out empty ATAs.
686+
// Empty ATAs must be initialized before we send the settle instruction.
687+
let mut ata_token_owner_list = Vec::with_capacity(20);
688+
685689
for settle in settles.iter() {
686690
ix_settles.push(IxSettle {
687691
access_version: settle.player_id,
@@ -714,6 +718,7 @@ impl TransportT for SolanaTransport {
714718
let ata = get_associated_token_address(&player.addr, &game_state.token_mint);
715719
info!("Settle: add payment receiver ATA: {}", ata);
716720
accounts.push(AccountMeta::new(ata, false));
721+
ata_token_owner_list.push((ata.clone(), game_state.token_mint.clone(), player.addr.clone()));
717722
calc_cu_prize_addrs.push(ata);
718723
}
719724
}
@@ -756,6 +761,7 @@ impl TransportT for SolanaTransport {
756761
calc_cu_prize_addrs.push(bonus_addr);
757762
info!("Settle: add bonus receiver: {}", receiver_addr);
758763
accounts.push(AccountMeta::new(receiver_addr, false));
764+
ata_token_owner_list.push((receiver_addr.clone(), bonus.token_addr.clone(), player.addr.clone()));
759765
calc_cu_prize_addrs.push(receiver_addr);
760766
}
761767
}
@@ -771,6 +777,32 @@ impl TransportT for SolanaTransport {
771777
checkpoint
772778
);
773779

780+
info!("Check if all receivers are initialized.");
781+
let atas_to_query: Vec<Pubkey> = ata_token_owner_list.iter().map(|(ata, _, _)| {
782+
ata.clone()
783+
}).collect();
784+
785+
let accounts_result = self.client.get_multiple_accounts_with_commitment(&atas_to_query, CommitmentConfig::finalized())
786+
.map_err(|e| TransportError::GetAccountError(e.to_string()))?
787+
.value;
788+
789+
for (i, acc) in accounts_result.into_iter().enumerate() {
790+
if acc.is_none() {
791+
let (_, token_addr, player_addr) = ata_token_owner_list[i];
792+
info!("ATA missing, initalize it. Player: {} Token: {}", player_addr, token_addr);
793+
let open_ata_ix = create_associated_token_account(&payer_pubkey, &player_addr, &token_addr, &spl_token::id());
794+
let message = Message::new(
795+
&[open_ata_ix],
796+
Some(&payer.pubkey())
797+
);
798+
let mut tx = Transaction::new_unsigned(message);
799+
let blockhash = self.get_blockhash()?;
800+
tx.sign(&[payer], blockhash);
801+
let sig = self.send_transaction(tx)?;
802+
info!("Open ATA signature: {}", sig);
803+
}
804+
}
805+
774806
let params = RaceInstruction::Settle {
775807
params: IxSettleParams {
776808
settles: ix_settles,

0 commit comments

Comments
 (0)