Rising Tide Developers
SDKCore

rtClient.transactions

SDK methods for transaction status and history - the chain read, the indexed row, and the explorer link.

rtClient.transactions answers two different questions with a deliberately similar shape, and picking the wrong one is the mistake worth avoiding: getTransactionStatus asks the chain, while list and get read the indexed row rt-api keeps.

Client transaction flows close on broadcast - they do not poll the chain from the browser. Use rtClient.pendingTransactions for the in-flight record; use this service for a status check you have a reason to make.

rtClient.transactions.getTransactionStatus(txId, network?)

Reads the Stacks API directly. Returns ApiResponse<TransactionStatus>, and network defaults to 'testnet'.

It returns only three of the TransactionStatus values - PENDING, CONFIRMED, FAILED. Never SUBMITTED or DROPPED, which are states rt-api tracks and the chain has no opinion about. Switching exhaustively over TransactionStatus on this result will leave you with two branches that cannot happen.

const { data } = await rtClient.transactions.getTransactionStatus(txId, "testnet");

rtClient.transactions.list(params?)

The indexed history. Returns PaginatedResponse<Transaction>, filterable by eventName, status, type, isRollback, contractIdentifier, pageId, eventId, sender, blockHeight, and a startDate/endDate window.


rtClient.transactions.get(txId)

One indexed transaction with its related entities. Returns ApiResponse<Transaction>.


What a broadcast costs

A face amount is never the whole price: every broadcast burns gas, and gas is always STX even when the thing being bought is priced in sats. The SDK exports the figures, so an app gates on what rt-api can actually charge rather than on a buffer measured once.

ExportWhat it is
CALL_GAS_USTXThe gas a contract call gates on: 25,000 uSTX. Covers the most rt-api charges a Privy-signed call (its ceiling is this figure) and the most a wallet has quoted for one
callCostUstx(faceUstx = 0)The all-in STX for a call: the face amount plus CALL_GAS_USTX. A sats-priced call passes 0 and still gets the gas leg
deployGasUstx(contractBytes)The most a deploy of that size can be charged: contractBytes x DEPLOY_RATE_CEILING_USTX_PER_BYTE, floored at PROTOCOL_DEPLOY_FEE_FLOOR_USTX. An upper bound, not an estimate; contractBytes is your largest generated contract
PROTOCOL_CALL_FEE_FLOOR_USTX5,000 uSTX, the least rt-api puts on a call - and the fee a Privy call pays today, since the blend never clears it
PROTOCOL_DEPLOY_FEE_FLOOR_USTX, DEPLOY_RATE_CEILING_USTX_PER_BYTEThe deploy bounds rt-api clamps to, mirrored so a client can compute the same bound

A call's fee is a claim about the network, not about the call - the same figure covers join, move, claim and collect - which is why one constant serves every call and a deploy is a function of size. The React gate that takes these is usePaidAction.

rtClient.transactions.getTransactionExplorerUrl(txId, network?)

Builds an explorer URL. Synchronous - it returns a string, not a promise, which is the one method on this service you do not await.