@@ -4,7 +4,10 @@ use anchor_lang::AccountDeserialize;
44use futures:: { stream, StreamExt , TryFutureExt , TryStreamExt } ;
55use itertools:: Itertools ;
66pub use solana_client:: nonblocking:: rpc_client:: RpcClient as SolanaRpcClient ;
7- use solana_sdk:: { account:: Account , pubkey:: Pubkey } ;
7+ use solana_sdk:: {
8+ account:: Account , address_lookup_table:: state:: AddressLookupTable ,
9+ message:: AddressLookupTableAccount , pubkey:: Pubkey ,
10+ } ;
811
912use crate :: error:: Error ;
1013
@@ -61,6 +64,37 @@ impl GetAccount for SolanaRpcClient {
6164 }
6265}
6366
67+ #[ async_trait:: async_trait]
68+ pub trait LookupTableResolver {
69+ async fn resolve_lookup_tables (
70+ & self ,
71+ lookup_tables : Vec < Pubkey > ,
72+ ) -> Result < Vec < AddressLookupTableAccount > , Error > ;
73+ }
74+
75+ #[ async_trait:: async_trait]
76+ impl LookupTableResolver for SolanaRpcClient {
77+ async fn resolve_lookup_tables (
78+ & self ,
79+ lookup_tables : Vec < Pubkey > ,
80+ ) -> Result < Vec < AddressLookupTableAccount > , Error > {
81+ let accounts = self . get_multiple_accounts ( & lookup_tables) . await ?;
82+ Ok ( accounts
83+ . into_iter ( )
84+ . zip ( lookup_tables. iter ( ) )
85+ . filter_map ( |( maybe_acc, pubkey) | {
86+ maybe_acc. map ( |acc| {
87+ let lut = AddressLookupTable :: deserialize ( & acc. data ) . map_err ( Error :: from) ?;
88+ Ok ( AddressLookupTableAccount {
89+ key : * pubkey,
90+ addresses : lut. addresses . to_vec ( ) ,
91+ } )
92+ } )
93+ } )
94+ . collect :: < Result < Vec < _ > , Error > > ( ) ?)
95+ }
96+ }
97+
6498#[ async_trait:: async_trait]
6599impl GetAnchorAccount for SolanaRpcClient {
66100 async fn anchor_account < T : AccountDeserialize > (
0 commit comments