From e550c866d88e56d4053f2f0359c0f3384dc021d2 Mon Sep 17 00:00:00 2001 From: jeffyanta Date: Tue, 28 Apr 2026 13:31:39 -0400 Subject: [PATCH] Add token account check on Coinbase Stable Swapper flow --- ocp/rpc/transaction/swap.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ocp/rpc/transaction/swap.go b/ocp/rpc/transaction/swap.go index 617de37..08d6109 100644 --- a/ocp/rpc/transaction/swap.go +++ b/ocp/rpc/transaction/swap.go @@ -30,6 +30,7 @@ import ( "github.com/code-payments/ocp-server/protoutil" "github.com/code-payments/ocp-server/solana" "github.com/code-payments/ocp-server/solana/currencycreator" + "github.com/code-payments/ocp-server/solana/token" "github.com/code-payments/ocp-server/usdc" ) @@ -780,6 +781,18 @@ func (s *transactionServer) handleStablecoinStatefulSwap( return handleStatefulSwapError(streamer, NewSwapValidationError("owner cannot be swap authority")) } + destinationOwnerAccountInfo, _, err := s.data.GetBlockchainAccountInfo(ctx, destinationOwner.PublicKey().ToBase58(), solana.CommitmentFinalized) + switch err { + case nil: + if bytes.Equal(destinationOwnerAccountInfo.Owner, token.ProgramKey) { + return handleStatefulSwapError(streamer, NewSwapValidationError("destination owner is a token account")) + } + case solana.ErrNoAccountInfo: + default: + log.With(zap.Error(err)).Warn("failure getting destination owner blockchain account info") + return handleStatefulSwapError(streamer, err) + } + // // Section: Antispam //