From 9e31fe9ac22340efbaf3e43208f3889985d3f67d Mon Sep 17 00:00:00 2001 From: jeffyanta Date: Mon, 19 Jan 2026 20:39:08 -0500 Subject: [PATCH] Improve error messaging in SubmitIntent for supported mints --- ocp/currency/usd_market_value.go | 5 +++++ ocp/rpc/transaction/intent.go | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ocp/currency/usd_market_value.go b/ocp/currency/usd_market_value.go index 71000ba..4fb5be0 100644 --- a/ocp/currency/usd_market_value.go +++ b/ocp/currency/usd_market_value.go @@ -13,6 +13,11 @@ import ( // CalculateUsdMarketValue calculates the current USD market value of a crypto // amount in quarks. func CalculateUsdMarketValue(ctx context.Context, data ocp_data.Provider, mint *common.Account, quarks uint64, at time.Time) (float64, float64, error) { + _, err := common.GetVmConfigForMint(ctx, data, mint) + if err != nil { + return 0, 0, err + } + usdExchangeRecord, err := data.GetExchangeRate(ctx, currency_lib.USD, at) if err != nil { return 0, 0, err diff --git a/ocp/rpc/transaction/intent.go b/ocp/rpc/transaction/intent.go index ce6aa86..72a7d91 100644 --- a/ocp/rpc/transaction/intent.go +++ b/ocp/rpc/transaction/intent.go @@ -95,19 +95,24 @@ func (s *transactionServer) SubmitIntent(streamer transactionpb.Transaction_Subm // Figure out what kind of intent we're operating on and initialize the intent handler var intentHandler CreateIntentHandler - switch submitActionsReq.Metadata.Type.(type) { + var protoMint *commonpb.SolanaAccountId + switch typed := submitActionsReq.Metadata.Type.(type) { case *transactionpb.Metadata_OpenAccounts: log = log.With(zap.String("intent_type", "open_accounts")) intentHandler = NewOpenAccountsIntentHandler(s.conf, s.log, s.data, s.antispamGuard) + protoMint = typed.OpenAccounts.Mint case *transactionpb.Metadata_SendPublicPayment: log = log.With(zap.String("intent_type", "send_public_payment")) intentHandler = NewSendPublicPaymentIntentHandler(s.conf, s.log, s.data, s.antispamGuard, s.amlGuard) + protoMint = typed.SendPublicPayment.Mint case *transactionpb.Metadata_ReceivePaymentsPublicly: log = log.With(zap.String("intent_type", "receive_payments_publicly")) intentHandler = NewReceivePaymentsPubliclyIntentHandler(s.conf, s.log, s.data, s.antispamGuard, s.amlGuard) + protoMint = typed.ReceivePaymentsPublicly.Mint case *transactionpb.Metadata_PublicDistribution: log = log.With(zap.String("intent_type", "public_distribution")) intentHandler = NewPublicDistributionIntentHandler(s.conf, s.log, s.data, s.antispamGuard, s.amlGuard) + protoMint = typed.PublicDistribution.Mint default: return handleSubmitIntentError(ctx, streamer, intentRecord, status.Error(codes.InvalidArgument, "SubmitIntentRequest.SubmitActions.Metadata is nil")) } @@ -233,6 +238,22 @@ func (s *transactionServer) SubmitIntent(streamer transactionpb.Transaction_Subm return handleSubmitIntentError(ctx, streamer, intentRecord, NewStaleStateError("intent already exists")) } + // Global validation on supported mint + mintAccount, err := common.GetBackwardsCompatMint(protoMint) + if err != nil { + log.With(zap.Error(err)).Warn("invalid mint account") + return handleSubmitIntentError(ctx, streamer, intentRecord, err) + } + log = log.With(zap.String("mint", mintAccount.PublicKey().ToBase58())) + + _, err = common.GetVmConfigForMint(ctx, s.data, mintAccount) + if err == common.ErrUnsupportedMint { + return handleSubmitIntentError(ctx, streamer, intentRecord, NewIntentValidationError("mint account must be the core mint or a launchpad currency")) + } else if err != nil { + log.With(zap.Error(err)).Warn("failure getting vm config for mint") + return handleSubmitIntentError(ctx, streamer, intentRecord, err) + } + // Populate metadata into the new DB record err = intentHandler.PopulateMetadata(ctx, intentRecord, submitActionsReq.Metadata) if err != nil {