@@ -277,13 +277,21 @@ func (p *Provider) getLookupTableAccount(accountID solana.PublicKey) (*alt.Looku
277277}
278278
279279func (p * Provider ) initStaticAlts () error {
280- xcallProgID , err := solana .PublicKeyFromBase58 (p .cfg .XcallProgram )
281- if err != nil {
282- return err
280+ addresses := solana.PublicKeySlice {solana .SystemProgramID , solana .SysVarInstructionsPubkey , p .wallet .PublicKey ()}
281+ if p .cfg .XcallProgram != "" {
282+ xcallProgID , err := solana .PublicKeyFromBase58 (p .cfg .XcallProgram )
283+ if err != nil {
284+ return err
285+ }
286+ xcallConfigAddr , err := p .pdaRegistry .XcallConfig .GetAddress ()
287+ if err != nil {
288+ return err
289+ }
290+ addresses = append (addresses , solana.PublicKeySlice {
291+ xcallConfigAddr , xcallProgID ,
292+ }... )
283293 }
284294
285- addresses := solana.PublicKeySlice {solana .SystemProgramID , solana .SysVarInstructionsPubkey , xcallProgID , p .wallet .PublicKey ()}
286-
287295 connections := append ([]string {p .cfg .ConnectionProgram }, p .cfg .OtherConnections ... )
288296 for _ , conn := range connections {
289297 connProgID , err := solana .PublicKeyFromBase58 (conn )
@@ -316,15 +324,6 @@ func (p *Provider) initStaticAlts() error {
316324 addresses = append (addresses , nidFees ... )
317325 }
318326
319- xcallConfigAddr , err := p .pdaRegistry .XcallConfig .GetAddress ()
320- if err != nil {
321- return err
322- }
323-
324- addresses = append (addresses , solana.PublicKeySlice {
325- xcallConfigAddr ,
326- }... )
327-
328327 for _ , dapp := range p .cfg .Dapps {
329328 dappAddr , err := solana .PublicKeyFromBase58 (dapp .ProgramID )
330329 if err != nil {
@@ -384,11 +383,20 @@ func (p *Provider) initStaticAlts() error {
384383func (p * Provider ) makeCallInstructions (msg * relayertypes.Message ) ([]solana.Instruction , []solana.PrivateKey , error ) {
385384 switch msg .EventType {
386385 case relayerevents .EmitMessage , relayerevents .PacketAcknowledged :
387- instructions , signers , err := p .getRecvMessageIntruction (msg )
388- if err != nil {
389- return nil , nil , fmt .Errorf ("failed to get recv message instructions: %w" , err )
386+ if p .connIdl .Metadata .Name == "intent" {
387+ instructions , signers , err := p .getRecvMessageIntructionForIntent (msg )
388+ if err != nil {
389+ return nil , nil , fmt .Errorf ("failed to get recv message instructions for intent: %w" , err )
390+ }
391+ return instructions , signers , nil
392+ } else {
393+ instructions , signers , err := p .getRecvMessageIntruction (msg )
394+ if err != nil {
395+ return nil , nil , fmt .Errorf ("failed to get recv message instructions: %w" , err )
396+ }
397+ return instructions , signers , nil
390398 }
391- return instructions , signers , nil
399+
392400 case relayerevents .CallMessage :
393401 instructions , signers , err := p .getExecuteCallInstruction (msg )
394402 if err != nil {
@@ -406,6 +414,117 @@ func (p *Provider) makeCallInstructions(msg *relayertypes.Message) ([]solana.Ins
406414 }
407415}
408416
417+ func (p * Provider ) getRecvMessageIntructionForIntent (msg * relayertypes.Message ) ([]solana.Instruction , []solana.PrivateKey , error ) {
418+ discriminator , err := p .connIdl .GetInstructionDiscriminator (types .MethodRecvMessage )
419+ if err != nil {
420+ return nil , nil , err
421+ }
422+
423+ srcArg , err := borsh .Serialize (msg .Src )
424+ if err != nil {
425+ return nil , nil , err
426+ }
427+
428+ connSnArg , err := borsh .Serialize (* msg .Sn )
429+ if err != nil {
430+ return nil , nil , err
431+ }
432+
433+ dataArg , err := borsh .Serialize (msg .Data )
434+ if err != nil {
435+ return nil , nil , err
436+ }
437+
438+ instructionData := append (discriminator , srcArg ... )
439+ instructionData = append (instructionData , connSnArg ... )
440+ instructionData = append (instructionData , dataArg ... )
441+
442+ accounts := solana.AccountMetaSlice {
443+ & solana.AccountMeta {
444+ PublicKey : p .wallet .PublicKey (),
445+ IsWritable : true ,
446+ IsSigner : true ,
447+ },
448+ }
449+
450+ acRes , err := p .queryRecvMessageAccountsForIntent (srcArg , connSnArg , dataArg )
451+ if err != nil {
452+ return nil , nil , err
453+ }
454+
455+ for _ , ac := range acRes .Accounts {
456+ accounts = append (accounts , & ac )
457+ }
458+
459+ instructions := []solana.Instruction {
460+ & solana.GenericInstruction {
461+ ProgID : p .connIdl .GetProgramID (),
462+ AccountValues : accounts ,
463+ DataBytes : instructionData ,
464+ },
465+ }
466+
467+ return instructions , []solana.PrivateKey {p .wallet .PrivateKey }, nil
468+ }
469+
470+ func (p * Provider ) queryRecvMessageAccountsForIntent (
471+ srcArg , connSnArg , dataArg []byte ,
472+ ) (* types.QueryAccountsResponsePageLess , error ) {
473+ discriminator , err := p .connIdl .GetInstructionDiscriminator (types .MethodQueryRecvMessageAccounts )
474+ if err != nil {
475+ return nil , err
476+ }
477+
478+ instructionData := append (discriminator , srcArg ... )
479+ instructionData = append (instructionData , connSnArg ... )
480+ instructionData = append (instructionData , dataArg ... )
481+
482+ connConfigAddr , err := p .pdaRegistry .ConnConfig .GetAddress ()
483+ if err != nil {
484+ return nil , err
485+ }
486+
487+ accounts := solana.AccountMetaSlice {
488+ & solana.AccountMeta {
489+ PublicKey : connConfigAddr ,
490+ IsWritable : false ,
491+ IsSigner : false ,
492+ },
493+ }
494+
495+ instructions := []solana.Instruction {
496+ & solana.GenericInstruction {
497+ ProgID : p .connIdl .GetProgramID (),
498+ AccountValues : accounts ,
499+ DataBytes : instructionData ,
500+ },
501+ }
502+
503+ signers := []solana.PrivateKey {p .wallet .PrivateKey }
504+
505+ tx , err := p .prepareTx (
506+ context .Background (),
507+ instructions ,
508+ signers ,
509+ solana .TransactionPayer (p .wallet .PublicKey ()),
510+ )
511+ if err != nil {
512+ return nil , err
513+ }
514+
515+ simres , err := p .client .SimulateTx (context .Background (), tx )
516+ if err != nil {
517+ return nil , fmt .Errorf ("failed to simulate tx: %w" , err )
518+ }
519+
520+ acRes := types.QueryAccountsResponsePageLess {}
521+ if err := parseReturnValueFromLogs (p .connIdl .GetProgramID ().String (), simres .Logs , & acRes ); err != nil {
522+ return nil , fmt .Errorf ("failed to parse return value: %w" , err )
523+ }
524+
525+ return & acRes , nil
526+ }
527+
409528func (p * Provider ) getRecvMessageIntruction (msg * relayertypes.Message ) ([]solana.Instruction , []solana.PrivateKey , error ) {
410529 discriminator , err := p .connIdl .GetInstructionDiscriminator (types .MethodRecvMessage )
411530 if err != nil {
0 commit comments