Skip to content

Commit 9b0f357

Browse files
authored
Merge pull request #489 from icon-project/fix/solana-intent
fix: make changes for solana intent
2 parents 7dfee50 + f914880 commit 9b0f357

File tree

3 files changed

+147
-19
lines changed

3 files changed

+147
-19
lines changed

relayer/chains/solana/listener.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,12 @@ func (p *Provider) getLatestXcallTxSignature() (*solrpc.TransactionSignature, er
275275
}
276276

277277
func (p *Provider) getSignatures(ctx context.Context, fromSignature string) ([]*solrpc.TransactionSignature, error) {
278-
progId := p.xcallIdl.GetProgramID()
278+
var progId solana.PublicKey
279+
if p.cfg.XcallProgram == "" {
280+
progId = p.connIdl.GetProgramID()
281+
} else {
282+
progId = p.xcallIdl.GetProgramID()
283+
}
279284

280285
limit := 1000
281286
opts := &solrpc.GetSignaturesForAddressOpts{

relayer/chains/solana/tx.go

Lines changed: 137 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -277,13 +277,21 @@ func (p *Provider) getLookupTableAccount(accountID solana.PublicKey) (*alt.Looku
277277
}
278278

279279
func (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 {
384383
func (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+
409528
func (p *Provider) getRecvMessageIntruction(msg *relayertypes.Message) ([]solana.Instruction, []solana.PrivateKey, error) {
410529
discriminator, err := p.connIdl.GetInstructionDiscriminator(types.MethodRecvMessage)
411530
if err != nil {

relayer/chains/solana/types/types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ type QueryAccountsResponse struct {
7272
HasNextPage bool
7373
}
7474

75+
type QueryAccountsResponsePageLess struct {
76+
Accounts []solana.AccountMeta
77+
}
78+
7579
type Dapp struct {
7680
Name string `yaml:"name"`
7781
ProgramID string `yaml:"program-id"`

0 commit comments

Comments
 (0)