On-chain Interactions
Use these operations for arbitrary contract execution and chain-level protocol actions such as staking and resource delegation. These transactions can have chain-specific data requirements and may require approval before broadcast.
Create a contract call
POST /api/external/transactions/
REST request body
{
"vaultId": "vault_123",
"blockChain": "ETHEREUM",
"amount": "0",
"category": "CONTRACT_CALL",
"data": {
"callData": "0xa9059cbb000000000000000000000000...",
"toAddress": "0xTokenContract1234567890abcdef"
},
"externalId": "contract-call-1001",
"gasParams": {
"feeTier": "MEDIUM"
},
"creationOptions": {
"skipPreprocessSimulation": false
}
}Response
{
"id": "transaction_contract_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "CONTRACT_CALL",
"subCategory": "CONTRACT_CALL",
"createdAt": "2026-08-04T11:00:00Z",
"updatedAt": "2026-08-04T11:00:00Z",
"isDeleted": false,
"externalId": "contract-call-1001",
"source": {
"type": "VAULT",
"id": "vault_123",
"name": "Treasury Vault"
},
"blockChain": "ETHEREUM",
"amount": "0"
}JavaScript SDK
interface CreateContractCallTransactionRequest {
vaultId: string;
chain: string;
amount?: string;
data?:
| { callData: string; toAddress?: string }
| { canisterId: string; method: string; arg: string }
| { messageHex: string }
| { method: string; params: Record<string, unknown> };
externalId?: string;
gasParams?: { feeTier?: "HIGH" | "MEDIUM" | "LOW" };
creationOptions?: { skipPreprocessSimulation?: boolean };
}
createContractCallTransaction(
request: CreateContractCallTransactionRequest,
): Promise<Transaction>The SDK serializes chain as blockChain and injects category: "CONTRACT_CALL". The data shape depends on the target chain: EVM call data, ICP canister call, raw-signing message, or Alephium method/parameters.
Set skipPreprocessSimulation only when your integration has an explicit reason to bypass supported preprocessing or simulation.
Stake a resource
POST /api/external/transactions/
REST request body
{
"source": {
"type": "VAULT",
"id": "vault_123"
},
"asset": "TRX",
"blockChain": "TRON",
"amount": "1000",
"resourceType": "TRON_ENERGY",
"category": "STAKE",
"externalId": "stake-1001",
"memo": "Stake TRX for energy"
}Response
{
"id": "transaction_stake_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "STAKE",
"subCategory": "STAKE",
"createdAt": "2026-08-04T11:40:00Z",
"updatedAt": "2026-08-04T11:40:00Z",
"isDeleted": false,
"externalId": "stake-1001",
"memo": "Stake TRX for energy",
"source": {
"type": "VAULT",
"id": "vault_123",
"name": "Treasury Vault"
},
"blockChain": "TRON",
"asset": "TRX",
"amount": "1000"
}JavaScript SDK
interface StakeResourceRequest {
source: TransferPartyData;
asset: string;
chain: string;
amount: string;
resourceType?: "TRON_ENERGY" | "TRON_BANDWIDTH";
externalId?: string;
memo?: string;
}
stakeResource(request: StakeResourceRequest): Promise<Transaction>The SDK serializes chain as blockChain and injects category: "STAKE".
Delegate a TRON resource
POST /api/external/transactions/
REST request body
{
"source": {
"type": "VAULT",
"id": "vault_123"
},
"destination": {
"type": "CONTACT",
"id": "contact_456"
},
"asset": "TRX",
"blockChain": "TRON",
"amount": "500",
"resourceType": "TRON_ENERGY",
"category": "DELEGATE_RESOURCE",
"externalId": "delegate-1001",
"memo": "Delegate energy to operations"
}Response
{
"id": "transaction_delegate_123",
"orgId": "org_456",
"vaultId": "vault_123",
"status": "PENDING",
"transactionType": "OUTGOING",
"category": "DELEGATE_RESOURCE",
"subCategory": "DELEGATE_RESOURCE",
"createdAt": "2026-08-04T11:50:00Z",
"updatedAt": "2026-08-04T11:50:00Z",
"isDeleted": false,
"externalId": "delegate-1001",
"memo": "Delegate energy to operations",
"source": {
"type": "VAULT",
"id": "vault_123",
"name": "Treasury Vault"
},
"destination": {
"type": "CONTACT",
"id": "contact_456",
"name": "Operations Wallet"
},
"blockChain": "TRON",
"asset": "TRX",
"amount": "500"
}JavaScript SDK
interface DelegateResourceRequest {
source: TransferPartyData;
destination: TransferPartyData;
asset: string;
chain: string;
amount: string;
resourceType: "TRON_ENERGY" | "TRON_BANDWIDTH";
externalId?: string;
memo?: string;
}
delegateResource(request: DelegateResourceRequest): Promise<Transaction>The SDK serializes chain as blockChain and injects category: "DELEGATE_RESOURCE".