RISE Logo-Light

API Methods

Core Shred API methods for realtime transaction processing

API Methods

Core methods that power RISE's realtime capabilities.

For standard Ethereum methods, visit the Ethereum JSON-RPC Documentation.

sendTransactionSync

Creates, signs, and sends a transaction synchronously, returning the complete transaction receipt.

This is a convenience method from viem that handles the entire transaction lifecycle in one call. It's simpler to use but makes multiple RPC calls (chainId, nonce, gas estimation).

Parameters

Standard viem transaction parameters:

  • to - Recipient address
  • value - Amount to send (optional)
  • data - Transaction data (optional)
  • Other standard transaction fields

Returns

Complete TransactionReceipt object

Example

import { createWalletClient, http, parseEther } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { riseTestnet } from 'viem/chains'

const account = privateKeyToAccount('0x...')
const client = createWalletClient({
  account,
  chain: riseTestnet,
  transport: http()
})

// Simple one-call transaction
const receipt = await client.sendTransactionSync({
  to: '0x...',
  value: parseEther('1.0')
})

console.log('Transaction confirmed:', receipt)

When to Use

  • Quick prototyping: Get started fast without manual signing
  • Simple applications: When RPC overhead isn't critical
  • Standard workflows: Works with existing viem patterns

eth_sendRawTransactionSync

Sends a pre-signed transaction and waits for instant confirmation, returning the complete transaction receipt.

This method is based on EIP-7966, which introduces synchronous transaction confirmation to Ethereum. RISE implements this standard to provide instant transaction finality.

Use this for maximum performance when you need the absolute fastest transaction times, as it requires only a single RPC call.

Parameters

  1. data - Signed transaction data (hex string)

Returns

Complete TransactionReceipt object with all standard fields:

{
  transactionHash: string,
  blockNumber: string,
  blockHash: string,
  transactionIndex: string,
  from: string,
  to: string | null,
  gasUsed: string,
  cumulativeGasUsed: string,
  status: string, // "0x1" for success, "0x0" for failure
  logs: Log[],
  logsBloom: string,
  contractAddress: string | null
}

Example

const receipt = await client.request({
  method: 'eth_sendRawTransactionSync',
  params: ['0x...signed_transaction']
})

//Transaction receipt
console.log('Transaction hash:', receipt.transactionHash)
console.log('Status:', receipt.status === '0x1' ? 'Success' : 'Failed')

Using with viem

import { createWalletClient, createPublicClient, http, parseEther } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { shredActions } from 'shreds/viem'
import { riseTestnet } from 'viem/chains'

const account = privateKeyToAccount('0x...')

// Wallet client for signing
const walletClient = createWalletClient({
  account,
  chain: riseTestnet,
  transport: http()
})

// Public client for sending
const publicClient = createPublicClient({
  chain: riseTestnet,
  transport: http()
}).extend(shredActions)

// Prepare and sign transaction
const request = await walletClient.prepareTransactionRequest({
  to: '0x...',
  value: parseEther('1.0')
})

const serializedTransaction = await walletClient.signTransaction(request)

// Send with instant confirmation
const receipt = await publicClient.sendRawTransactionSync({
  serializedTransaction
})

console.log('Transaction confirmed:', receipt)

When to Use

  • Performance-critical applications: Gaming, high-frequency trading, competitive scenarios
  • Pre-signed transaction pools: Batch signing transactions in advance
  • Minimal RPC overhead: Only 1 RPC call vs 3+ with sendTransactionSync

Key Benefits

  • Instant confirmation: No waiting for block inclusion
  • Complete receipt: All transaction details immediately available
  • Synchronous flow: Simplifies application logic
  • Error handling: Failed transactions return immediately with status 0x0
  • Maximum performance: Single RPC call for fastest possible transactions

Comparison: sendTransactionSync vs sendRawTransactionSync

FeaturesendTransactionSyncsendRawTransactionSync
RPC Calls3+ (chainId, nonce, gas estimation + send)1 (send only)
Setup ComplexitySimpleRequires manual signing
PerformanceGood (~10-20ms overhead)Best (minimal overhead)
Use CasePrototyping, simple appsPerformance-critical apps
Viem SupportBuilt-inVia shreds library

Example: Simple Approach

// Using sendTransactionSync (simpler, more RPC calls)
const receipt = await client.sendTransactionSync({
  to: '0x...',
  value: parseEther('1.0')
})

Example: Performance-Optimized Approach

// Using sendRawTransactionSync (optimal, 1 RPC call)
const request = await walletClient.prepareTransactionRequest({
  to: '0x...',
  value: parseEther('1.0')
})
const serialized = await walletClient.signTransaction(request)
const receipt = await publicClient.sendRawTransactionSync({
  serializedTransaction: serialized
})

Usage Patterns

Synchronous Transaction Flow

import { sendRawTransactionSync } from 'shreds/viem'

// Traditional async pattern (not needed with RISE)
// const hash = await client.sendTransaction(tx)
// const receipt = await client.waitForTransactionReceipt({ hash })

// RISE synchronous pattern
// 1. Prepare and sign
const request = await walletClient.prepareTransactionRequest(tx)
const serialized = await walletClient.signTransaction(request)

// 2. Send and get instant receipt
const receipt = await sendRawTransactionSync(publicClient, { serializedTransaction: serialized })
// Transaction already confirmed!

Performance Characteristics

RTT (Round-Trip Time) Targets

  • Shred Confirmation: 3-5ms (p50), 10ms (p99)
  • Event Delivery: < 10ms from transaction execution
  • State Updates: Immediate upon shred confirmation

Throughput

  • Transactions per Shred: 1-100
  • Shreds per Second: 1000+
  • Total TPS: 10,000+

Best Practices

1. Choose the Right Method

// For prototyping and simple apps - use sendTransactionSync
const receipt = await client.sendTransactionSync({
  to: '0x...',
  value: parseEther('1.0')
})

// For performance-critical apps - use sendRawTransactionSync with pre-signing
const request = await walletClient.prepareTransactionRequest(tx)
const serialized = await walletClient.signTransaction(request)
const receipt = await publicClient.sendRawTransactionSync({
  serializedTransaction: serialized
})

2. Pre-sign Transactions for Maximum Performance

// Sign a batch of transactions in advance
const preSignedTxs = await Promise.all(
  txRequests.map(async (req, i) => {
    const request = await walletClient.prepareTransactionRequest({
      ...req,
      nonce: baseNonce + i
    })
    return await walletClient.signTransaction(request)
  })
)

// Send them instantly when needed (single RPC call each)
for (const signedTx of preSignedTxs) {
  const receipt = await publicClient.sendRawTransactionSync({
    serializedTransaction: signedTx
  })
}

3. Handle Errors Immediately

try {
  const receipt = await client.sendTransactionSync({
    to: '0x...',
    value: parseEther('1.0')
  })
  // Transaction confirmed immediately
} catch (error) {
  // Handle failure immediately - no need to wait
  console.error('Transaction failed:', error)
}

Next Steps