Skip to content
Merged
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
2 changes: 1 addition & 1 deletion ocp/balance/calculator.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ func CalculateFromBlockchain(ctx context.Context, data ocp_data.Provider, tokenA
}

// todo: we may need something that's more resistant to RPC nodes with stale account state
quarks, slot, err := data.GetBlockchainBalance(ctx, tokenAccount.PublicKey().ToBase58())
quarks, slot, err := data.GetBlockchainBalance(ctx, tokenAccount.PublicKey().ToBase58(), solana.CommitmentConfirmed)
if err == solana.ErrNoBalance {
// We can't tell whether
// 1. RPC node is behind, and observed a state before the account existed
Expand Down
6 changes: 3 additions & 3 deletions ocp/data/blockchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ type BlockchainData interface {

GetBlockchainAccountInfo(ctx context.Context, account string, commitment solana.Commitment) (*solana.AccountInfo, uint64, error)
GetBlockchainAccountDataAfterBlock(ctx context.Context, account string, slot uint64) ([]byte, uint64, error)
GetBlockchainBalance(ctx context.Context, account string) (uint64, uint64, error)
GetBlockchainBalance(ctx context.Context, account string, commitment solana.Commitment) (uint64, uint64, error)
GetBlockchainBlock(ctx context.Context, slot uint64) (*solana.Block, error)
GetBlockchainBlockSignatures(ctx context.Context, slot uint64) ([]string, error)
GetBlockchainBlocksWithLimit(ctx context.Context, start uint64, limit uint64) ([]uint64, error)
Expand Down Expand Up @@ -282,7 +282,7 @@ func (dp *BlockchainProvider) GetBlockchainMinimumBalanceForRentExemption(ctx co
return res, err
}

func (dp *BlockchainProvider) GetBlockchainBalance(ctx context.Context, account string) (uint64, uint64, error) {
func (dp *BlockchainProvider) GetBlockchainBalance(ctx context.Context, account string, commitment solana.Commitment) (uint64, uint64, error) {
tracer := metrics.TraceMethodCall(ctx, blockchainProviderMetricsName, "GetBlockchainBalance")
defer tracer.End()

Expand All @@ -291,7 +291,7 @@ func (dp *BlockchainProvider) GetBlockchainBalance(ctx context.Context, account
return 0, 0, err
}

quarks, slot, err := dp.sc.GetTokenAccountBalance(accountId)
quarks, slot, err := dp.sc.GetTokenAccountBalance(accountId, commitment)

if err != nil {
tracer.OnError(err)
Expand Down
10 changes: 3 additions & 7 deletions ocp/rpc/transaction/stateless_swap.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
transactionpb "github.com/code-payments/ocp-protobuf-api/generated/go/transaction/v1"

"github.com/code-payments/ocp-server/grpc/client"
"github.com/code-payments/ocp-server/ocp/balance"
"github.com/code-payments/ocp-server/ocp/common"
"github.com/code-payments/ocp-server/ocp/data/swap"
"github.com/code-payments/ocp-server/ocp/data/timelock"
Expand Down Expand Up @@ -159,17 +160,12 @@ func (s *transactionServer) handleStablecoinStatelessSwap(
return handleStatelessSwapError(streamer, err)
}

ownerFromMintAtaInfo, err := s.data.GetBlockchainTokenAccountInfo(
ctx,
ownerFromMintAta.PublicKey().ToBase58(),
fromMint.PublicKey().ToBase58(),
solana.CommitmentConfirmed,
)
ownerFromMintAtaBalance, _, err := balance.CalculateFromBlockchain(ctx, s.data, ownerFromMintAta)
if err != nil {
log.With(zap.Error(err)).Warn("failure getting owner from_mint ata info")
return handleStatelessSwapError(streamer, NewSwapValidationError("source ata not found or invalid"))
}
if ownerFromMintAtaInfo.Amount < initiateStablecoinSwapReq.SwapAmount {
if ownerFromMintAtaBalance < initiateStablecoinSwapReq.SwapAmount {
return handleStatelessSwapError(streamer, NewSwapValidationError("insufficient balance"))
}

Expand Down
2 changes: 1 addition & 1 deletion ocp/worker/geyser/external_deposit.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func maybeInitiateExternalDepositIntoVm(ctx context.Context, data ocp_data.Provi
return errors.Wrap(err, "error getting vm deposit ata")
}

balance, _, err := data.GetBlockchainBalance(ctx, vmDepositAccounts.Ata.PublicKey().ToBase58())
balance, _, err := data.GetBlockchainBalance(ctx, vmDepositAccounts.Ata.PublicKey().ToBase58(), solana.CommitmentFinalized)
if err == solana.ErrNoBalance {
return nil
} else if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions solana/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ type Client interface {
GetSignatureStatuses([]Signature) ([]*SignatureStatus, error)
GetSignaturesForAddress(owner ed25519.PublicKey, commitment Commitment, limit uint64, before, until string) ([]*TransactionSignature, error)
GetSlot(Commitment) (uint64, error)
GetTokenAccountBalance(ed25519.PublicKey) (uint64, uint64, error)
GetTokenAccountBalance(ed25519.PublicKey, Commitment) (uint64, uint64, error)
GetTokenAccountsByOwner(owner, mint ed25519.PublicKey) ([]ed25519.PublicKey, error)
GetTransaction(Signature, Commitment) (ConfirmedTransaction, error)
GetTransactionTokenBalances(Signature) (TransactionTokenBalances, error)
Expand Down Expand Up @@ -657,14 +657,14 @@ func (c *client) GetBalance(account ed25519.PublicKey) (uint64, error) {
return 0, errors.Errorf("invalid value in response")
}

func (c *client) GetTokenAccountBalance(account ed25519.PublicKey) (uint64, uint64, error) {
func (c *client) GetTokenAccountBalance(account ed25519.PublicKey, commitment Commitment) (uint64, uint64, error) {
var resp struct {
Context struct {
Slot int64 `json:"slot"`
} `json:"context"`
Value TokenAmount `json:"value"`
}
if err := c.call(&resp, "getTokenAccountBalance", base58.Encode(account[:]), CommitmentFinalized); err != nil {
if err := c.call(&resp, "getTokenAccountBalance", base58.Encode(account[:]), commitment); err != nil {
jsonRPCErr, ok := err.(*jsonrpc.RPCError)
if !ok {
return 0, 0, errors.Wrapf(err, "getTokenAccountBalance() failed to send request")
Expand Down
6 changes: 3 additions & 3 deletions solana/client_with_fallback.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,10 +197,10 @@ func (c *clientWithFallback) GetSlot(commitment Commitment) (uint64, error) {
)
}

func (c *clientWithFallback) GetTokenAccountBalance(account ed25519.PublicKey) (uint64, uint64, error) {
func (c *clientWithFallback) GetTokenAccountBalance(account ed25519.PublicKey, commitment Commitment) (uint64, uint64, error) {
return withFallback2(
func() (uint64, uint64, error) { return c.primary.GetTokenAccountBalance(account) },
func() (uint64, uint64, error) { return c.fallback.GetTokenAccountBalance(account) },
func() (uint64, uint64, error) { return c.primary.GetTokenAccountBalance(account, commitment) },
func() (uint64, uint64, error) { return c.fallback.GetTokenAccountBalance(account, commitment) },
)
}

Expand Down
2 changes: 1 addition & 1 deletion solana/client_with_fallback_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (m *mockClient) GetSignaturesForAddress(ed25519.PublicKey, Commitment, uint
m.callCount++
return nil, nil
}
func (m *mockClient) GetTokenAccountBalance(ed25519.PublicKey) (uint64, uint64, error) {
func (m *mockClient) GetTokenAccountBalance(ed25519.PublicKey, Commitment) (uint64, uint64, error) {
m.callCount++
return 0, 0, nil
}
Expand Down
Loading