Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions apps/solana/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,21 @@ type Transfer struct {
MayClosedWsolAta *solana.PublicKey
}

type InitialAssetMovementKind string

const (
InitialAssetMovementTransfer InitialAssetMovementKind = "transfer"
InitialAssetMovementBurn InitialAssetMovementKind = "burn"
)

type InitialAssetMovement struct {
Kind InitialAssetMovementKind
TokenAddress string
Sender string
Value *big.Int
Decimal uint8
}

type LookupTableStats struct {
Table string
Space uint
Expand All @@ -163,6 +178,59 @@ func FindAssociatedTokenAddress(
return addr
}

func ExtractInitialAssetMovements(tx *solana.Transaction) []*InitialAssetMovement {
var movements []*InitialAssetMovement
for _, ix := range tx.Message.Instructions {
programKey, err := tx.Message.Program(ix.ProgramIDIndex)
if err != nil {
panic(err)
}

accounts, err := ix.ResolveInstructionAccounts(&tx.Message)
if err != nil {
panic(err)
}

switch programKey {
case system.ProgramID:
transfer, ok := DecodeSystemTransfer(accounts, ix.Data)
if ok {
movements = append(movements, &InitialAssetMovement{
Kind: InitialAssetMovementTransfer,
TokenAddress: SolanaEmptyAddress,
Sender: transfer.GetFundingAccount().PublicKey.String(),
Value: new(big.Int).SetUint64(*transfer.Lamports),
Decimal: SolanaDecimal,
})
}
case solana.TokenProgramID, solana.Token2022ProgramID:
transfer, ok := DecodeTokenTransferChecked(accounts, ix.Data)
if ok {
movements = append(movements, &InitialAssetMovement{
Kind: InitialAssetMovementTransfer,
TokenAddress: transfer.GetMintAccount().PublicKey.String(),
Sender: transfer.GetOwnerAccount().PublicKey.String(),
Value: new(big.Int).SetUint64(*transfer.Amount),
Decimal: *transfer.Decimals,
})
continue
}

burn, ok := DecodeTokenBurn(accounts, ix.Data)
if ok {
movements = append(movements, &InitialAssetMovement{
Kind: InitialAssetMovementBurn,
TokenAddress: burn.GetMintAccount().PublicKey.String(),
Sender: burn.GetOwnerAccount().PublicKey.String(),
Value: new(big.Int).SetUint64(*burn.Amount),
Decimal: *burn.Decimals,
})
}
}
}
return movements
}

func BuildSignersGetter(keys ...solana.PrivateKey) func(key solana.PublicKey) *solana.PrivateKey {
mapKeys := make(map[solana.PublicKey]*solana.PrivateKey)
for _, k := range keys {
Expand Down
7 changes: 6 additions & 1 deletion solana/mvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,11 +334,16 @@ func (node *Node) processConfirmNonce(ctx context.Context, req *store.Request) (
switch flag {
case ConfirmFlagNonceAvailable:
as := node.GetSystemCallRelatedAsset(ctx, os)
expectedPrepareAssets := append([]*ReferencedTxAsset(nil), as...)
var sessions []*store.Session
prepare, tx, err := node.getSubSystemCallFromExtra(ctx, req, extra[16:])
if err != nil {
return node.failRequest(ctx, req, "")
}
if len(expectedPrepareAssets) > 0 && prepare == nil {
logger.Printf("missing prepare for system call references: %s", call.RequestId)
return node.failRequest(ctx, req, "")
}
if prepare != nil {
prepare.Superior = call.RequestId
prepare.Type = store.CallTypePrepare
Expand All @@ -357,7 +362,7 @@ func (node *Node) processConfirmNonce(ctx context.Context, req *store.Request) (
if err != nil {
return node.failRequest(ctx, req, "")
}
err = node.comparePrepareCallWithSolanaTx(tx, as)
err = node.comparePrepareCallWithSolanaTx(tx, expectedPrepareAssets, node.getMTGAddress(ctx), solana.MustPublicKeyFromBase58(user.ChainAddress), true)
logger.Printf("node.comparePrepareCallWithSolanaTx(%s) => %v", call.RequestId, err)
if err != nil {
return node.failRequest(ctx, req, "")
Expand Down
Loading
Loading