@@ -6,15 +6,18 @@ use bytemuck::{bytes_of, Pod, Zeroable};
66use serde:: Deserialize ;
77use solana_client:: client_error:: reqwest;
88use solana_sdk:: {
9- address_lookup_table:: { state :: AddressLookupTable , AddressLookupTableAccount } ,
9+ address_lookup_table:: AddressLookupTableAccount ,
1010 ed25519_instruction:: { DATA_START , PUBKEY_SERIALIZED_SIZE , SIGNATURE_SERIALIZED_SIZE } ,
1111 ed25519_program,
1212 instruction:: Instruction ,
1313 pubkey:: Pubkey ,
1414} ;
1515use tuktuk_program:: { tuktuk, TaskQueueV0 , TaskV0 , TransactionSourceV0 } ;
1616
17- use crate :: { client:: GetAnchorAccount , error:: Error } ;
17+ use crate :: {
18+ client:: { GetAnchorAccount , LookupTableResolver } ,
19+ error:: Error ,
20+ } ;
1821
1922pub fn next_available_task_ids_excluding_in_progress (
2023 capacity : u16 ,
@@ -68,7 +71,8 @@ pub async fn run_ix_with_free_tasks(
6871 task : & TaskV0 ,
6972 payer : Pubkey ,
7073 next_available : Vec < u16 > ,
71- lookup_tables : Vec < AddressLookupTableAccount > ,
74+ lookup_table_pubkeys : Vec < Pubkey > ,
75+ lut_resolver : & impl LookupTableResolver ,
7276) -> Result < RunTaskResult , Error > {
7377 let transaction = & task. transaction ;
7478
@@ -125,6 +129,10 @@ pub async fn run_ix_with_free_tasks(
125129 ]
126130 . concat ( ) ;
127131
132+ let lookup_tables = lut_resolver
133+ . resolve_lookup_tables ( lookup_table_pubkeys)
134+ . await ?;
135+
128136 Ok ( RunTaskResult {
129137 instructions : vec ! [ Instruction {
130138 program_id: tuktuk_program:: tuktuk:: ID ,
@@ -176,6 +184,10 @@ pub async fn run_ix_with_free_tasks(
176184 instruction_data. extend_from_slice ( & signature) ;
177185 instruction_data. extend_from_slice ( & message) ;
178186
187+ // Combine lookup table pubkeys from task queue and remote transaction
188+ let all_lut_pubkeys = [ lookup_table_pubkeys, remote_transaction. lookup_tables ] . concat ( ) ;
189+ let lookup_tables = lut_resolver. resolve_lookup_tables ( all_lut_pubkeys) . await ?;
190+
179191 Ok ( RunTaskResult {
180192 lookup_tables,
181193 instructions : vec ! [
@@ -216,6 +228,7 @@ pub async fn run_ix_with_free_tasks(
216228
217229pub async fn run_ix (
218230 client : & impl GetAnchorAccount ,
231+ lut_resolver : & impl LookupTableResolver ,
219232 task_key : Pubkey ,
220233 payer : Pubkey ,
221234 in_progress_task_ids : & HashSet < u16 > ,
@@ -239,22 +252,15 @@ pub async fn run_ix(
239252 rand:: random_range ( 0 ..task_queue. task_bitmap . len ( ) ) ,
240253 ) ?;
241254
242- let lookup_tables = client
243- . accounts ( & task_queue. lookup_tables )
244- . await ?
245- . into_iter ( )
246- . filter_map ( |( addr, raw) | {
247- raw. map ( |acc| {
248- let lut = AddressLookupTable :: deserialize ( & acc. data ) . map_err ( Error :: from) ?;
249- Ok :: < AddressLookupTableAccount , Error > ( AddressLookupTableAccount {
250- key : addr,
251- addresses : lut. addresses . to_vec ( ) ,
252- } )
253- } )
254- } )
255- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
256-
257- run_ix_with_free_tasks ( task_key, & task, payer, next_available, lookup_tables) . await
255+ run_ix_with_free_tasks (
256+ task_key,
257+ & task,
258+ payer,
259+ next_available,
260+ task_queue. lookup_tables . clone ( ) ,
261+ lut_resolver,
262+ )
263+ . await
258264}
259265
260266#[ derive( Default , Debug , Copy , Clone , Zeroable , Pod , Eq , PartialEq ) ]
@@ -281,12 +287,14 @@ struct RemoteResponse {
281287 transaction : String ,
282288 remaining_accounts : Vec < RemoteAccountMeta > ,
283289 signature : String ,
290+ lookup_tables : Option < Vec < String > > ,
284291}
285292
286293struct FetchedRemoteResponse {
287294 transaction : Vec < u8 > ,
288295 remaining_accounts : Vec < AccountMeta > ,
289296 signature : Vec < u8 > ,
297+ lookup_tables : Vec < Pubkey > ,
290298}
291299
292300async fn fetch_remote_transaction (
@@ -327,9 +335,17 @@ async fn fetch_remote_transaction(
327335 . decode ( & json. signature )
328336 . map_err ( Error :: from) ?;
329337
338+ let lookup_tables = json
339+ . lookup_tables
340+ . unwrap_or_default ( )
341+ . into_iter ( )
342+ . map ( |key| Pubkey :: from_str ( & key) . map_err ( Error :: from) )
343+ . collect :: < Result < Vec < _ > , Error > > ( ) ?;
344+
330345 Ok ( FetchedRemoteResponse {
331346 transaction : transaction_bytes,
332347 remaining_accounts,
333348 signature : signature_bytes,
349+ lookup_tables,
334350 } )
335351}
0 commit comments