sendTransaction and callContract are alternate input forms for the same prepare, fee, execute, and status lifecycle.
Send a native transfer
Pass an exported network, a recipient, and a raw base-unit value:parseUnits returns an integer string. Use the transferred token’s decimals when converting user-facing values. It rounds excess fractional precision to the nearest base unit by default; pass { roundingMode: 'reject' } when the input must match that precision exactly.
Use encoded calldata
Use the same method when your app already has encoded calldata. Setvalue to the native-token amount sent with the call:
Call a contract by method
UsecallContract when you have a method name and typed argument values instead of encoded calldata. method is the bare function name, such as 'transfer', and args is an ordered list of { type, value } pairs in parameter order. The wallet service builds the signature from the args types; a full signature such as 'transfer(address,uint256)' rejects with OMS_VALIDATION_ERROR before any request:
callContract accepts the same execution mode, fee selector, wait setting, and polling options as sendTransaction.
Send a Solana transfer
UsesendSolanaTransfer with a selected Solana wallet. Set asset to SOL for a native transfer or to an SPL token mint address. amount is a string in the asset’s smallest unit: lamports for SOL or base units for an SPL token.
to is the recipient wallet address, not an associated token account. Solana transfers accept the same execution mode, fee selector, wait setting, and polling options.
Send a Tron transaction
UsesendTronTransaction for TRX transfers and callTronContract for TRC-20 and other contract calls. Both require an active Tron wallet session and a TronNetworks value. Tron addresses are Base58Check strings that start with T.
value is a decimal string in sun (1 TRX is 1,000,000 sun). callTronContract takes a bare function name and lets the wallet service ABI-encode the arguments; address arguments accept Base58Check addresses. TRC-10 tokens are not supported.
Tron transactions take no mode. Each Tron account gets free bandwidth every day, so many Tron transactions need no fee; when it is used up, the fee is a single TRX option that your fee selector receives like any other.
Understand the lifecycle
Both methods perform one lifecycle:1
Prepare
The SDK resolves the transaction input for the selected network and obtains the execution quote.
2
Resolve fees
When a selector is provided, sponsored transactions call it with an empty array. Unsponsored transactions pass the quoted fee options.
3
Execute
The SDK submits the prepared wallet transaction and returns its
txnId.4
Wait for status
By default, the method polls until status resolves or polling times out. An onchain
txnHash appears when available.mode undefined to use the SDK’s default execution behavior. Set 'native' or 'relayer' only when your application explicitly controls that choice.
Select a fee
Whether a transaction is sponsored is decided by your project’s settings, not by your application. See Gas Sponsorship. When you provide a selector, a sponsored transaction calls it with an empty array. Returnundefined to continue with the sponsored transaction, or throw to stop execution. FeeOptionSelectors.firstAvailable handles the empty array. For a non-sponsored mainnet transaction, the built-in selector chooses the first quoted token whose raw available balance covers the fee:
selectFeeOption, the SDK uses the first option returned by OMS without checking whether the wallet can afford it.
For custom selection, return an option’s selection. This example prefers a quoted USDC fee and returns undefined when none is available:
feeOption, selection, and optional balance and available-amount fields. The callback can return synchronously or as a promise.
Read the result
Both transaction methods return:waitForStatus defaults to true. A timed-out status resolution does not remove txnId; check that ID before retrying the write.
Handle failures
OMS_TRANSACTION_EXECUTION_UNCONFIRMED, with atxnId: the SDK cannot tell whether the transaction was submitted. Check its status with thetxnIdbefore sending it again.OMS_REQUEST_FAILEDwithout atxnId: nothing was submitted. For example, simulation shows the transaction would revert, or a Tron wallet cannot cover the transfer and its fee.upstreamError.causegives the wallet API’s reason when it has one. Fix the cause before sending again.OMS_SESSION_EXPIRED: the session ended. Sign in again.