1- use crate :: { ASSOCIATED_TOKEN_ACCOUNT_PROGRAM , Pubkey , find_program_address } ;
1+ use std :: sync :: LazyLock ;
22
3- pub fn get_token_account ( wallet : & str , token_mint : & str , token_program : & str ) -> String {
4- let owner = Pubkey :: from_base58 ( wallet) . unwrap ( ) ;
5- let token_program = Pubkey :: from_base58 ( token_program) . unwrap ( ) ;
6- let mint = Pubkey :: from_base58 ( token_mint) . unwrap ( ) ;
7- let associated_token_program = Pubkey :: from_base58 ( ASSOCIATED_TOKEN_ACCOUNT_PROGRAM ) . unwrap ( ) ;
3+ use crate :: { ASSOCIATED_TOKEN_ACCOUNT_PROGRAM , Pubkey , SolanaError , find_program_address} ;
4+
5+ static ASSOCIATED_TOKEN_PROGRAM : LazyLock < Pubkey > = LazyLock :: new ( || Pubkey :: from_base58 ( ASSOCIATED_TOKEN_ACCOUNT_PROGRAM ) . unwrap ( ) ) ;
6+
7+ pub fn get_token_account ( wallet : & str , token_mint : & str , token_program : & str ) -> Result < String , SolanaError > {
8+ let owner = Pubkey :: from_base58 ( wallet) ?;
9+ let token_program = Pubkey :: from_base58 ( token_program) ?;
10+ let mint = Pubkey :: from_base58 ( token_mint) ?;
811 let seeds = [ owner. as_bytes ( ) . as_ref ( ) , token_program. as_bytes ( ) . as_ref ( ) , mint. as_bytes ( ) . as_ref ( ) ] ;
912
10- find_program_address ( & associated_token_program , & seeds) . unwrap ( ) . 0 . to_string ( )
13+ Ok ( find_program_address ( & ASSOCIATED_TOKEN_PROGRAM , & seeds) ? . 0 . to_string ( ) )
1114}
1215
1316#[ cfg( test) ]
@@ -16,7 +19,7 @@ mod tests {
1619 use crate :: { PYUSD_TOKEN_MINT , TOKEN_PROGRAM , TOKEN_PROGRAM_2022 , USDC_TOKEN_MINT , USDS_TOKEN_MINT , USDT_TOKEN_MINT , WSOL_TOKEN_ADDRESS } ;
1720
1821 #[ test]
19- fn test_get_token_account ( ) {
22+ fn test_get_token_account ( ) -> Result < ( ) , Box < dyn std :: error :: Error + Send + Sync > > {
2023 let test_cases = [
2124 (
2225 "CzVqG98YbFNiMREwgTswSML59CNrfobsNX4N9j6K8fbC" ,
@@ -51,8 +54,12 @@ mod tests {
5154 ] ;
5255
5356 for ( wallet, token_mint, token_program, expected_token_account) in test_cases. iter ( ) {
54- let fee_token_account = get_token_account ( wallet, token_mint, token_program) ;
57+ let fee_token_account = get_token_account ( wallet, token_mint, token_program) ? ;
5558 assert_eq ! ( fee_token_account, * expected_token_account) ;
5659 }
60+
61+ assert ! ( get_token_account( "invalid" , USDC_TOKEN_MINT , TOKEN_PROGRAM ) . is_err( ) ) ;
62+
63+ Ok ( ( ) )
5764 }
5865}
0 commit comments