WDK logoWDK documentation

Send Transactions

Quote and send EVM transactions through EIP-7702 gasless UserOperations.

This guide explains how to quote and send EVM transactions through ERC-4337 UserOperations.

Send a Transaction

Use sendTransaction(tx) with a single transaction object or an array of transaction objects.

Send a transaction
const result = await account.sendTransaction({
  to: '0x742C4265F5Ba4F8E0842e2b9EfE66302F7a13B6F',
  value: 1000000000000000n,
  data: '0x'
})

console.log('UserOperation hash:', result.hash)
console.log('Fee:', result.fee)

The returned hash is a UserOperation hash. Use getUserOperationReceipt(hash) or getTransactionReceipt(hash) to check inclusion.

Send a Batch

Send a batch
const result = await account.sendTransaction([
  {
    to: '0x1111111111111111111111111111111111111111',
    value: 0n,
    data: '0x'
  },
  {
    to: '0x2222222222222222222222222222222222222222',
    value: 0n,
    data: '0x'
  }
])

Quote Before Sending

Use quoteSendTransaction(tx) to estimate the fee without submitting the UserOperation.

Quote then send
const tx = {
  to: '0x742C4265F5Ba4F8E0842e2b9EfE66302F7a13B6F',
  value: 0n,
  data: '0x'
}

const quote = await account.quoteSendTransaction(tx)
console.log('Estimated fee:', quote.fee)

const result = await account.sendTransaction(tx)
console.log('UserOperation hash:', result.hash)

For paymaster-token mode, the fee is returned in the paymaster token's base units. For sponsorship mode, the quote returns fee: 0n.

Quote Reuse

Owned accounts cache a recently quoted paymaster-token transaction for up to 2 minutes. If sendTransaction() receives the same transaction during that window, the account first reads the current EntryPoint nonce. It reuses the built UserOperation only when the nonce still matches; if the nonce moved, it quotes again. A send that needs a fresh EIP-7702 authorization also rebuilds the UserOperation before submission.

Cache identity does not include per-call fee-mode configuration. Use the same fee-mode and paymaster settings for quoteSendTransaction() and the matching sendTransaction(). Do not quote with one paymaster token or mode and send the same transaction with another while the quote is cached.

Override Fee Mode for One Send

Per-call fee config
const result = await account.sendTransaction({
  to: '0x742C4265F5Ba4F8E0842e2b9EfE66302F7a13B6F',
  value: 0n,
  data: '0x'
}, {
  isSponsored: true,
  sponsorshipPolicyId: 'sp_special_case'
})

Read Receipts

Read receipts
const userOpReceipt = await account.getUserOperationReceipt(result.hash)
const txReceipt = await account.getTransactionReceipt(result.hash)

getTransactionReceipt() returns null until the bundler receipt includes an EVM transaction hash.

On this page