signAndSend()

Use agent.signAndSend() to sign and broadcast blockchain transactions from your agent's wallet. Supports both Ethereum (EVM) and Solana networks. The transaction is signed by the agent's session wallet, broadcast to the network, and returns a transaction hash for tracking. Include an optional message parameter to help with debugging and observability in the Circuit UI.

Signature

agent.signAndSend(
  request: {
    network: string;
    message?: string;
    request: object; // Structure varies based on EVM or Solana
  }
): Promise<SignAndSendResponse>

Parameters

Param
Type
Description

request

object

Transaction configuration object

request.network

string

Network type: 'ethereum:{chainId}' | 'solana'

request.message?

string

Optional description for observability

request.request

object

Transaction details (see below)

Ethereum Transactions

When request.network is 'ethereum:{chainId}'

( request.request )

Property
Type
Description

toAddress

0x${string}

Recipient address

data

0x${string}

Transaction calldata (use "0x" for simple transfers)

value

string

ETH amount in wei (use "0" for no ETH)

Solana Transactions

When request.network is 'solana'

( request.request )

Param
Type
Description

hexTransaction

string

Serialized transaction in hex format

Returns

  • Promise<SignAndSendResponse>

type SignAndSendResponse = {
  success: boolean;
  data?: { // Only present on success
    internalTransactionId: number;
    txHash: string;
    transactionUrl?: string;
  };
  error?: string;
  errorMessage?: string;
  errorDetails?: object;
}

Examples

EVM (native ETH transfer)

const result = await agent.signAndSend({
  network: "ethereum:1",
  request: {
    toAddress: "0x742d35cc6634C0532925a3b8D65e95f32B6b5582",
    data: "0x",
    value: "1000000000000000000" // 1 ETH in wei
  },
  message: "Sending 1 ETH"
});

if (result.success && result.data) {
  await agent.log(`Sent! TX: ${result.data.txHash}`);
}

EVM (contract interaction)

const result = await agent.signAndSend({
  network: "ethereum:42161", // Arbitrum
  request: {
    toAddress: "0xTokenContract...",
    data: "0xa9059cbb...", // encoded transfer() call
    value: "0"
  },
  message: "Token transfer"
});

if (result.success && result.data) {
  await agent.log(`Contract call successful: ${result.data.transactionUrl}`);
}

Solana

const result = await agent.signAndSend({
  network: "solana",
  request: {
    hexTransaction: "010001030a0b..." // serialized VersionedTransaction
  },
  message: "Solana swap"
});

if (result.success && result.data) {
  await agent.log(`Solana TX: ${result.data.txHash}`);
}

Common Errors

Error
Cause
Solution

"Transaction failed"

Insufficient balance for value or gas

Check currentPositions before sending

"Invalid address"

Malformed toAddress

Validate address format (0x... for EVM)

"Invalid data"

Malformed calldata

Ensure data is valid hex (use "0x" for simple transfers)

"Network error"

RPC unavailable

Retry or check network status

Last updated