Skip to main content

Send Universal Transaction

Overview

Universal transactions let you execute transfers, contract calls, asset movement, and batched transactions across Push Chain and supported external chains through one unified interface.

You do not need separate transactions, wrapping, manual bridging, or extra tooling.

To understand this concept in detail, please see Understanding Universal Transactions.

How Routing Works

sendTransaction automatically selects the execution route based on the to and from fields.

RouteInput ShapeExecutes OnNotes
Route 1to: "0x..."Push ChainDefault route for Push Chain targets.
Route 2to: { address, chain }External chainExecutes on the specified external chain.
Route 3to: "0x..." and from: { chain }Push ChainUses your CEA on the specified external chain as the execution origin.

Send a Universal Transaction

pushChainClient.universal.sendTransaction({tx}): Promise<TxResponse>

const txResponse = await pushChainClient.universal.sendTransaction({
to: '0xa54E96d3fB93BD9f6cCEf87c2170aEdB1D47E1cF',
value: PushChain.utils.helpers.parseUnits('0.1', 18), // 0.1 PC in uPC
// value: BigInt('100000000000000000') is equivalent here
});

TheseArgumentsare mandatory

ArgumentsTypeDescription
tx.tostring | { address: string; chain: CHAIN }Defines the execution target. Passing a plain address triggers Push Chain execution.

Passing { address, chain } targets an external chain.
tx.from{ chain: PushChain.CONSTANTS.CHAIN }Optional. When set to an external chain, execution uses the Chain Executor Account (CEA) for that chain as the transaction origin.

This is primarily used for external origin or CEA-based execution flows.
PushChain.CONSTANTS.CHAIN
PushChain.CONSTANTS.CHAIN.PUSH_TESTNETPushChain.CONSTANTS.CHAIN.PUSH_TESTNET_DONUTPushChain.CONSTANTS.CHAIN.ETHEREUM_SEPOLIAPushChain.CONSTANTS.CHAIN.BNB_TESTNETPushChain.CONSTANTS.CHAIN.BASE_SEPOLIAPushChain.CONSTANTS.CHAIN.ARBITRUM_SEPOLIAPushChain.CONSTANTS.CHAIN.SOLANA_DEVNET
tx.valueBigIntNative value to send, expressed in the smallest unit of the execution context.

On Push Chain this is uPC (the smallest unit, like wei in ETH).

On external execution routes, this maps to the native asset amount of that route.
tx.datastring | Array<{ to: string; value: bigint; data: string }>Encoded calldata for a single call string or batched multicall Array<{ to, value, data }>.

Use encodeTxData to produce the correct bytes for EVM (ABI) or Solana (Anchor IDL) targets.
tx.funds{ amount: BigInt; token?: PushChain.CONSTANTS.MOVEABLE.TOKEN }Moves supported assets as part of the transaction flow.

Depending on the route, assets may be moved into Push Chain or between Push Chain and a supported external chain.

If tx.data is provided, asset movement and execution happen atomically.
PushChain.CONSTANTS.MOVEABLE.TOKEN
PushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.ETHPushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.USDTPushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.USDCPushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.WETHPushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.stETHPushChain.CONSTANTS.MOVEABLE.TOKEN.ARBITRUM_SEPOLIA.ETHPushChain.CONSTANTS.MOVEABLE.TOKEN.ARBITRUM_SEPOLIA.USDTPushChain.CONSTANTS.MOVEABLE.TOKEN.ARBITRUM_SEPOLIA.USDCPushChain.CONSTANTS.MOVEABLE.TOKEN.ARBITRUM_SEPOLIA.WETHPushChain.CONSTANTS.MOVEABLE.TOKEN.BASE_SEPOLIA.ETHPushChain.CONSTANTS.MOVEABLE.TOKEN.BASE_SEPOLIA.USDTPushChain.CONSTANTS.MOVEABLE.TOKEN.BASE_SEPOLIA.USDCPushChain.CONSTANTS.MOVEABLE.TOKEN.BASE_SEPOLIA.WETHPushChain.CONSTANTS.MOVEABLE.TOKEN.BNB_TESTNET.BNBPushChain.CONSTANTS.MOVEABLE.TOKEN.BNB_TESTNET.USDTPushChain.CONSTANTS.MOVEABLE.TOKEN.SOLANA_DEVNET.SOLPushChain.CONSTANTS.MOVEABLE.TOKEN.SOLANA_DEVNET.USDTPushChain.CONSTANTS.MOVEABLE.TOKEN.SOLANA_DEVNET.USDCPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.pEthPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.pEthArbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.pEthBasePushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.pBnbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.pSolPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDT.ethPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDT.arbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDT.basePushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDT.bnbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDT.solPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDC.ethPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDC.arbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDC.basePushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDC.bnbPushChain.CONSTANTS.MOVEABLE.TOKEN.PUSH_TESTNET_DONUT.USDC.sol
tx.progressHook(progress: ProgressHookType) => voidA callback function to receive progress updates during transaction lifecycle, especially useful for tracking cross-chain transactions.

Progress Hook Type and Response

ProgressHook Type and Response
FieldTypeDescription
progressObjectThe progress of the transaction.
progress.idstringUnique identifier for the progress event.
progress.titlestringBrief title of the progress event.
progress.messagestringDetailed message describing the event.
progress.levelINFO | SUCCESS | ERRORSeverity level of the event.
progress.responseobject | nullAdditional data object for the event, or null if not applicable.
progress.timestampstringISO-8601 timestamp when the event occurred (e.g. 2025-06-26T15:04:05.000Z).

Route 1 → Execute on Push Chain

IDTitleMessageLevelResponse
SEND-TX-101Origin Chain DetectedOrigin chain: <chain> — Address: <address>INFO{ chain, address }
SEND-TX-102-01Estimating GasEstimating and fetching gas limit, gas price for TXINFO{ stage: 'estimating-gas' }
SEND-TX-102-02Gas EstimatedTotal execution cost: <cost> UPCSUCCESS{ totalCost, currency }
SEND-TX-103-01Resolving Universal Execution AccountResolving UEA – computing address, checking deployment and balanceINFO{ stage: 'resolving-uea' }
SEND-TX-103-02Universal Execution Account ResolvedUEA: <address>, Deployed: <true/false>SUCCESS{ uea, deployed }
SEND-TX-103-03Calculating Prepaid DepositCalculating required prepaid deposit (one-time >$1; refilled only when gas nears exhaustion)INFOnull
SEND-TX-103-03-01Adjusting Prepaid Deposit to be >$1Required deposit below $1 minimum — padding to $1 floorINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-103-03-02Prepaid Deposit in range (>=$1 and <$10)Required deposit ${x} within $1–$10 range — depositing as requiredINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-103-03-03Prepaid Deposit Exceeds $10 Cap, splitting Gas and FundsRequired deposit exceeds $10 cap — splitting: $10 gas leg + ${overflow} UPC overflow bridged as fundsINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-103-04Prepaid Deposit EstimatedPrepaid deposit estimatedSUCCESS{ totalPCDeposit, totalDepositUSD }
SEND-TX-104-01Awaiting TransactionAwaiting user transaction on origin chainINFO{ stage: 'awaiting-transaction' }
SEND-TX-104-02Awaiting SignatureAwaiting user signature for universal payloadINFO{ stage: 'awaiting-signature' }
SEND-TX-104-03Verification SuccessVerification completed via Transaction or SignatureSUCCESS{ stage: 'verified' }
SEND-TX-104-04Verification Declined / Signature FailedVerification declined by user | <error>ERROR{ error, isUserDecline }
SEND-TX-105-01Gas Funding In ProgressGas funding tx sent: <txHash>INFO{ txHash, originChainTx }
SEND-TX-105-02Gas Funding ConfirmedGas funding confirmed on origin chainSUCCESS{ stage: 'gas-funded', txHash }
SEND-TX-106-01Preparing Funds TransferPreparing to move <amount> <symbol> from origin chainINFO{ amount, symbol }
SEND-TX-106-02Funds Lock SubmittedLocking <amount> <symbol> — Tx: <txHash>INFO{ txHash, amount, symbol, originChainTx }
SEND-TX-106-03Awaiting ConfirmationsWaiting for <required> confirmationsINFO{ current: 0, required }
SEND-TX-106-03-01Confirmation <current>/<required> Received<current>/<required> confirmations receivedINFO{ current, required }
SEND-TX-106-03-02Confirmation <current>/<required> Received<current>/<required> confirmations receivedSUCCESS{ current, required }
SEND-TX-106-04Funds ConfirmedOrigin chain lock confirmedSUCCESS{ stage: 'funds-confirmed', txHash }
SEND-TX-106-05Syncing with Push ChainWaiting for transaction to appear on Push ChainINFO{ stage: 'syncing-push-chain' }
SEND-TX-106-06Funds Credited on Push ChainFunds credited: <amount> <symbol>SUCCESS{ amount, symbol }
SEND-TX-107Broadcasting to Push ChainSending tx to Push Chain...INFO{ stage: 'broadcasting', destination: 'push-chain' }
SEND-TX-199-01Push Chain Tx SuccessTx confirmed: <txHash>SUCCESS{ txHash, response, receipt }
SEND-TX-199-02Push Chain Tx Failed<error message>ERROR{ error }

Route 2 → Execute on External Chain

IDTitleMessageLevelResponse
SEND-TX-201<chain> DetectedExternal chain: <chain> — Target address: <address>INFO{ chain, address }
SEND-TX-202-01Estimating <chain> Chain GasQuerying Push Chain gas and UGPC relay feeINFO{ stage: 'estimating-gas', chain }
SEND-TX-202-02<chain> Chain Gas EstimatedPush gas: <n> UPC + UGPC relay: <n> UPC = <total> UPCSUCCESS{ gasEstimate, relayFee, totalCost, currency }
SEND-TX-203-01Resolving <chain> Execution AccountResolving UEA on Push Chain and CEA on <chain>INFO{ stage: 'resolving-cea', chain }
SEND-TX-203-02<chain> Execution Account ReadyUEA: <ueaAddr>. CEA: <ceaAddr> on <chain>. Deployed: <true/false>SUCCESS{ uea, cea, chain, deployed }
SEND-TX-204-01Awaiting SignatureAwaiting user signature for universal payloadINFO{ stage: 'awaiting-signature' }
SEND-TX-204-02Signature ReceivedUniversal payload signed — preparing broadcastSUCCESS{ stage: 'signed' }
SEND-TX-204-03Verification SuccessVerification completedSUCCESS{ stage: 'verified' }
SEND-TX-204-04Verification Declined / Signature FailedVerification declined by user | <error>ERROR{ error, isUserDecline }
SEND-TX-207Broadcasting from Push Chain → <chain>Sending tx to Push Chain...INFO{ chain }
SEND-TX-209-01Awaiting Push Chain RelayWaiting for UGPC to relay execution to <chain>INFO{ chain }
SEND-TX-209-02Syncing State with <chain>Polling <chain> for CEA executionINFO{ chain, elapsedMs }
SEND-TX-299-01<chain> Tx SuccessCEA executed on <chain> - tx: <txHash>SUCCESS{ txHash, ...details }
SEND-TX-299-02<chain> Tx Failed<errorMessage>ERROR{ error, chain }
SEND-TX-299-03Syncing State with <chain> TimeoutTimed out waiting for UGPC relay to <chain>ERROR{ error: 'relay timeout', chain, elapsedMs }
SEND-TX-299-99<chain> Tx CompletedIntermediate <chain> tx confirmed: <txHash>, progressing to next phaseINFO{ chain, txHash }

Route 3 → Execute on Push Chain from CEA

IDTitleMessageLevelResponse
SEND-TX-199-99-99Push Chain TX CompletedIntermediate Push Chain tx confirmed: <txHash>, progressing to next phaseINFO{ txHash }
SEND-TX-301<chain>'s Executor Account DetectedSource chain: <chain> — CEA: <ceaAddress>INFO{ chain, address }
SEND-TX-302-01Estimating <chain> GasQuerying Push Chain gas and UGPC relay feeINFO{ stage: 'estimating-gas', chain }
SEND-TX-302-02<chain> Gas EstimatedPush gas: <n> UPC + UGPC relay: <n> UPC = <total> UPCSUCCESS{ gasEstimate, relayFee, totalCost, currency }
SEND-TX-302-03Calculating Prepaid DepositCalculating required prepaid deposit (one-time >$1; refilled only when gas nears exhaustion)INFOnull
SEND-TX-302-03-01Adjusting Prepaid Deposit to be >$1Required deposit below $1 minimum — padding to $1 floorINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-302-03-02Prepaid Deposit in range (>=$1 and <$10)Required deposit ${x} within $1–$10 range — depositing as requiredINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-302-03-03Prepaid Deposit Exceeds $10 Cap, splitting Gas and FundsRequired deposit exceeds $10 cap — splitting: $10 gas leg + ${overflow} UPC overflow bridged as fundsINFO{ gasRequired, extraDepositPC, totalDepositUSD }
SEND-TX-302-04Prepaid Deposit EstimatedPrepaid deposit estimatedSUCCESS{ totalPCDeposit, totalDepositUSD }
SEND-TX-303-01Resolving Execution Accounts on ChainsResolving UEA on Push Chain and CEA on <chain>INFO{ stage: 'resolving-cea-uea', chain }
SEND-TX-303-02Execution Accounts ResolvedUEA: <ueaAddr>. CEA: <ceaAddr> on <chain>. Deployed: trueSUCCESS{ uea, cea, chain, deployed }
SEND-TX-304-01Awaiting SignatureAwaiting user signature for universal payloadINFO{ stage: 'awaiting-signature' }
SEND-TX-304-02Signature ReceivedUniversal payload signed — preparing broadcastSUCCESS{ stage: 'signed' }
SEND-TX-304-03Verification SuccessVerification completedSUCCESS{ stage: 'verified' }
SEND-TX-304-04Verification Declined / Signature FailedVerification declined by user | <error>ERROR{ error, isUserDecline }
SEND-TX-307Broadcasting from Push Chain → <chain>Sending tx from Push Chain...INFO{ chain }
SEND-TX-309-01Awaiting <chain> RelayWaiting for UGPC to relay to CEA on <chain>INFO{ chain }
SEND-TX-309-02Syncing State with <chain>Polling <chain> for CEA executionINFO{ chain, elapsedMs }
SEND-TX-309-03<chain> Tx ConfirmedCEA executed on <chain>: <txHash> — return inbound initiatedINFO{ chain, txHash }
SEND-TX-310-01<chain> → Push Chain Inbound Tx SubmittedCEA initiated return — waiting for Push Chain inbound from <chain>INFO{ chain }
SEND-TX-310-02Syncing State with Push Chain for Inbound TxPolling Push Chain for inbound from <chain>INFO{ chain, elapsedMs }
SEND-TX-399-01Push Chain Inbound Tx SuccessInbound from <chain> confirmed · Push tx: <txHash>SUCCESS{ chain, txHash, receipt }
SEND-TX-399-02<chain> Tx Failed / Push Chain Tx Failed / Push Chain Inbound Tx Failed<errorMessage>ERROR{ error, phase, chain }
SEND-TX-399-03<chain> Timeout / Push Chain Timeout / Push Chain Inbound TimeoutTimed out waiting for...ERROR{ error, phase, chain, elapsedMs }

Executing multiple transactions (Send Multichain Transations)

IDTitleMessageLevelResponse
SEND-TX-001Multichain Transactions Initiated<hopCount>-hop transaction — <chains>INFO{ hopCount, chains }
SEND-TX-002-01Starting Intermediate Transaction #<n>/<total>Starting tx <n> of <total>: <fromChain><toChain>INFO{ n, total, fromChain, toChain }
SEND-TX-002-99-99Intermediate Transaction #<n>/<total> CompleteTx <n> of <total> confirmed — proceeding to tx <n+1>INFO{ n, total }
SEND-TX-999-01All Multichain Transactions Successful<hopCount>-hop transaction confirmed across all chainsSUCCESS{ hopCount }
SEND-TX-999-02Multichain Transactions FailedCascade failed at hop <failedAt> of <total>: <error>ERROR{ failedAt, total, error }
SEND-TX-999-03Multichain Transactions TimeoutCascade timed out at hop <failedAt> of <total>ERROR{ failedAt, total, error: 'cascade timeout' }
Advanced Arguments
ArgumentsTypeDefaultDescription
tx.gasLimitBigIntSDK EstimatedOptional override for transaction gas limit. If omitted, the SDK estimates it.
tx.maxFeePerGasBigIntSDK EstimatedOptional override for max fee per gas. If omitted, the SDK estimates it when applicable.
tx.maxPriorityFeePerGasBigIntSDK EstimatedOptional override for priority fee. If omitted, the SDK estimates it when applicable.
tx.payGasWith{ token?: PushChain.CONSTANTS.PAYABLE.TOKEN; slippageBps?: number; minAmountOut?: bigint | string }-Pay universal transaction fees using a supported token (e.g., PushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.USDT).
 
Optional slippageBps (e.g., 100 = 1%) and minAmountOut (wei) let you control on-chain swap execution.
PushChain.CONSTANTS.PAYABLE.TOKEN
PushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.ETHPushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.USDTPushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.USDCPushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.WETHPushChain.CONSTANTS.PAYABLE.TOKEN.ETHEREUM_SEPOLIA.stETHPushChain.CONSTANTS.PAYABLE.TOKEN.ARBITRUM_SEPOLIA.ETHPushChain.CONSTANTS.PAYABLE.TOKEN.ARBITRUM_SEPOLIA.USDTPushChain.CONSTANTS.PAYABLE.TOKEN.ARBITRUM_SEPOLIA.USDCPushChain.CONSTANTS.PAYABLE.TOKEN.BASE_SEPOLIA.ETHPushChain.CONSTANTS.PAYABLE.TOKEN.BASE_SEPOLIA.USDTPushChain.CONSTANTS.PAYABLE.TOKEN.BASE_SEPOLIA.USDCPushChain.CONSTANTS.PAYABLE.TOKEN.BNB_TESTNET.BNBPushChain.CONSTANTS.PAYABLE.TOKEN.BNB_TESTNET.USDTPushChain.CONSTANTS.PAYABLE.TOKEN.SOLANA_DEVNET.SOLPushChain.CONSTANTS.PAYABLE.TOKEN.SOLANA_DEVNET.USDTPushChain.CONSTANTS.PAYABLE.TOKEN.SOLANA_DEVNET.USDC
tx.deadlineBigInt-Optional execution deadline for the transaction.

Returns TxResponse

Returns `TxResponse` <object>
{
hash: '0xe2302bd21ab0902f37cb605d491ce5f95ee35ce4083405dddf3657d782acae35',
origin: 'eip155:42101:0xFd6C2fE69bE13d8bE379CCB6c9306e74193EC1A9',
blockNumber: 0n,
blockHash: '',
transactionIndex: 0,
chainId: '42101',
from: '0xFd6C2fE69bE13d8bE379CCB6c9306e74193EC1A9',
to: '0x35B84d6848D16415177c64D64504663b998A6ab4',
nonce: 341,
data: '0x',
value: 1000n,
gasLimit: 21000n,
gasPrice: 1325000000n,
maxFeePerGas: 1325000000n,
maxPriorityFeePerGas: 125000000n,
accessList: [],
wait: [Function: wait],
type: '2',
typeVerbose: 'eip1559',
signature: {
r: '0x556566ba1304bf8e93025fc82daff32eb24b7ee9804a76d0baa0098dfa7237de',
s: '0x4495d7811d3dcb1beac16f29261903b542b0b65f51aa5942f65dbaf67e735724',
v: 1,
yParity: 1
},
raw: {
from: '0xFd6C2fE69bE13d8bE379CCB6c9306e74193EC1A9',
to: '0x35B84d6848D16415177c64D64504663b998A6ab4',
nonce: 341,
data: '0x',
value: 1000n
}
}
PropertyTypeDescription
hashstringUnique transaction hash identifier
originstringOrigin identifier in format "eip155:chainId:address" or "solana:chainId:address"
blockNumberBigIntBlock number where transaction was included
blockHashstringHash of the block containing this transaction
transactionIndexnumberPosition/index of transaction within the block
chainIdstringChain identifier (e.g. Push Chain = 42101)
fromstringUEA (Universal Executor Account) that executed the transaction
tostringTarget address the UEA executed against
noncenumberDerived nonce for the UEA
datastringPerceived calldata (transaction input data)
valueBigIntAmount of native tokens transferred (in wei)
gasLimitBigIntMaximum gas units allocated for transaction
gasPriceBigIntGas price for legacy transactions (in wei)
maxFeePerGasBigIntMaximum fee per gas for EIP-1559 transactions
maxPriorityFeePerGasBigIntMaximum priority fee (tip) per gas for EIP-1559
accessListarrayEIP-2930 access list for optimized storage access
typestringTransaction type identifier
typeVerbosestringHuman-readable transaction type
signatureobjectECDSA signature components
signature.rstringR component of ECDSA signature
signature.sstringS component of ECDSA signature
signature.vnumberRecovery ID (legacy format)
signature.yParitynumberY-parity for EIP-1559 (0 or 1)
rawobjectOriginal on-chain transaction data
raw.fromstringActual from address that went on chain
raw.tostringActual to address that went on chain
raw.noncenumberActual raw nonce used on chain
raw.datastringActual raw data that went on chain
raw.valueBigIntActual derived value that went on chain
waitfunctionAsync function that returns a Promise resolving to UniversalTxReceipt
Getting `txReceipt` <object> from `txResponse` <object>

Calling the wait() function from txResponse object will give you a Promise<UniversalTxReceipt> once the transaction is confirmed on-chain.


const txReceipt = await txResponse.wait(1); // number of blocks confirmations to wait for
{
hash: '0xb52706db4116dd6bbea87be5142ac2c69b17fe8ccf8e2b88ac176adb30b90dd6',
blockNumber: 3413247n,
blockHash: '0x5a7b6e2716f7d4450b6ca08aebfe74cea3d876367a8afe6f603196ba8c346a2d',
transactionIndex: 0,
from: '0xFd6C2fE69bE13d8bE379CCB6c9306e74193EC1A9',
to: '0x35B84d6848D16415177c64D64504663b998A6ab4',
contractAddress: null,
gasPrice: 1325000000n,
gasUsed: 21000n,
cumulativeGasUsed: 21000n,
logs: [],
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: 1,
raw: {
from: '0xFd6C2fE69bE13d8bE379CCB6c9306e74193EC1A9',
to: '0x35B84d6848D16415177c64D64504663b998A6ab4',
nonce: 342,
data: '0x',
value: 1000n
}
}
PropertyTypeDescription
hashstringTransaction hash (same as in transaction response)
blockNumberBigIntBlock number where transaction was confirmed
blockHashstringHash of the block containing the transaction
transactionIndexnumberPosition/index of transaction within the block
fromstringExecutor account address (UEA on Push Chain)
tostringActual intended target address of the transaction
contractAddressstring | nullAddress of deployed contract (null for regular transfers)
gasPriceBigIntGas price used for the transaction (in wei)
gasUsedBigIntActual gas consumed by the transaction
cumulativeGasUsedBigIntTotal gas used by all transactions in the block up to this one
logsarrayArray of log objects emitted by the transaction
logsBloomstringBloom filter for efficient log searching
statusnumberTransaction status (1 = success, 0 = failure)
rawobjectRaw on-chain transaction data
raw.fromstringActual from address that executed on chain
raw.tostringActual to address that was called on chain
raw.noncenumberActual nonce used on chain
raw.datastringActual calldata sent on chain
raw.valueBigIntActual value transferred on chain

Send Transaction with Contract Interaction

When calling a smart contract method via sendTransaction, supply the ABI-encoded function call as a hex string in the data field. You can choose ethers or viem or any of your favorite libraries to encode the function data. Or, use our utility function PushChain.utils.helpers.encodeTxData to encode the function data.

// Define the ABI for the ERC20 transfer function
const erc20Abi = [
'function transfer(address to, uint256 amount) returns (bool)',
];

// Generate the encoded function data using viem
const data = PushChain.utils.helpers.encodeTxData({
abi: erc20Abi,
functionName: 'transfer',
// Transfer 10 tokens, converted to 18 decimal places
args: ['0xRecipientAddress', PushChain.utils.helpers.parseUnits('10', 18)],
});

// Send the transaction using Push Chain SDK
const txResponse = await pushChainClient.universal.sendTransaction({
to: '0xTokenContractAddress', // The smart contract address on Push Chain
value: BigInt('0'), // No $PC being sent, just contract interaction
data: data, // The encoded function call
});

Send Transaction with Asset Movement

You can move supported assets (e.g., USDT, USDC, or other tokens) from your origin chain to Push Chain and execute your call in a single transaction.

Use the funds field to specify the amount of assets to move, and optionally the data field to specify the function call to execute on Push Chain.

Note: funds transactions are only supported from external origin chains.
Native Push Chain users should call ERC-20 transfer or transferFrom directly (instead of using funds).

// Send 1 USDT to the recipient address
const txResponse = await pushChainClient.universal.sendTransaction({
to: '0xRecipientAddress', // The recipient address on Push Chain
data: data, // pass this if you want to execute a function on Push Chain as well
funds: {
amount: PushChain.utils.helpers.parseUnits('1', 6), // 1 USDT
token: PushChain.CONSTANTS.MOVEABLE.TOKEN.ETHEREUM_SEPOLIA.USDT, // MoveableToken accessor from client
},
});

Send Batch Transactions (Multicall)

You can batch multiple calls into a single transaction. This pattern is commonly referred to as Multicall in EVM ecosystems.

To do so, instead of passing a single data field, supply an array of calls (each with to, value, and data) to sendTransaction.

Note: Batch transactions are only supported from external origin chains.
Native Push Chain users cannot use batch mode on Push but can use it on other chains (ie: when doing Route 2 or Route 3 universal transactions).

// Execute two increment() calls atomically
const incrementData = PushChain.utils.helpers.encodeTxData({
abi: CounterABI,
functionName: 'increment',
});

await client.universal.sendTransaction({
// Must be '0x0000000000000000000000000000000000000000' for multicall
to: '0x0000000000000000000000000000000000000000',
data: [
{ to: '0xCounterContract1', value: 0n, data: incrementData },
{ to: '0xCounterContract2', value: 0n, data: incrementData },
],
});
Multicall requirements

For multicall, the to should always be zero address (0x0000000000000000000000000000000000000000). The SDK will console.warn if you pass any other address. This will become mandatory in a future release.

Live Playground

VIRTUAL NODE IDE
Copy playground link
Copy code

Next Steps