@@ -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