eth_sendRawTransactionSync
curl --request POST \
--url https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300 \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "eth_sendRawTransactionSync",
"params": [
"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f",
5000
],
"id": 1
}
'import requests
url = "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300"
payload = {
"jsonrpc": "2.0",
"method": "eth_sendRawTransactionSync",
"params": ["0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f", 5000],
"id": 1
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_sendRawTransactionSync',
params: [
'0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f',
5000
],
id: 1
})
};
fetch('https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'method' => 'eth_sendRawTransactionSync',
'params' => [
'0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f',
5000
],
'id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"transactionHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"blockHash": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd",
"blockNumber": "0x12345",
"gasUsed": "0x5208",
"status": "0x1"
}
}Optimism node API
eth_sendRawTransactionSync | Optimism
Optimism API method that submits a signed transaction and blocks until the transaction receipt is returned or the timeout expires.
POST
/
efb0a5eccd2caa5135eb54eba6f7f300
eth_sendRawTransactionSync
curl --request POST \
--url https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300 \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "eth_sendRawTransactionSync",
"params": [
"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f",
5000
],
"id": 1
}
'import requests
url = "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300"
payload = {
"jsonrpc": "2.0",
"method": "eth_sendRawTransactionSync",
"params": ["0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f", 5000],
"id": 1
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_sendRawTransactionSync',
params: [
'0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f',
5000
],
id: 1
})
};
fetch('https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'method' => 'eth_sendRawTransactionSync',
'params' => [
'0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f',
5000
],
'id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://optimism-mainnet.core.chainstack.com/efb0a5eccd2caa5135eb54eba6f7f300")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_sendRawTransactionSync\",\n \"params\": [\n \"0xf86c808504a817c80082520894ab5db0e98b8ea6b7f9d8ad8e8ed0bc8fba0d1a2f870de0b6b3a764000080821b9f\",\n 5000\n ],\n \"id\": 1\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"transactionHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"blockHash": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd",
"blockNumber": "0x12345",
"gasUsed": "0x5208",
"status": "0x1"
}
}Optimism API method that submits a signed transaction and blocks until the transaction receipt is returned or the timeout expires. This is a synchronous version of
eth_sendRawTransaction — instead of returning just the transaction hash, it waits for the transaction to be included in a block and returns the full receipt.
This method is defined by EIP-7966 and is available on op-reth builds that include the EIP-7966 implementation.
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
Optimism’s ~2-second block time means sync calls usually return a receipt well within typical timeouts. Pick a
timeout that fits your application — the request returns once a receipt is available or once the timeout expires.Parameters
signedTransactionData— the signed transaction data in hexadecimal format. Includes nonce, gas price, gas limit, recipient address, value, data, and signature.timeout(optional) — maximum wait time in milliseconds, passed as a decimal integer per EIP-7966 (e.g.,5000). If omitted, the node uses its configured default. Note that Polygon (Bor) uses a different encoding — see the Polygon equivalent.
Response
result— the full transaction receipt object once the transaction is included in a block, with the same fields aseth_getTransactionReceipt. If the timeout expires before inclusion, the node returns an error.
eth_sendRawTransactionSync code examples
const ethers = require('ethers');
const NODE_URL = "CHAINSTACK_NODE_URL";
const provider = new ethers.JsonRpcProvider(NODE_URL);
const sendTransactionSync = async () => {
const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY", provider);
const tx = {
to: "0xRecipientAddress",
value: ethers.parseEther("0"),
chainId: 10,
};
// Sign the transaction
const signedTx = await wallet.signTransaction(tx);
// Send synchronously — blocks until receipt is returned or timeout expires
const receipt = await provider.send(
"eth_sendRawTransactionSync",
[signedTx, 5000]
);
console.log(`Confirmed in block: ${receipt.blockNumber}`);
console.log(`Status: ${receipt.status}`);
};
sendTransactionSync();
from web3 import Web3
node_url = "CHAINSTACK_NODE_URL"
web3 = Web3(Web3.HTTPProvider(node_url))
account = web3.eth.account.from_key("YOUR_PRIVATE_KEY")
tx = {
'nonce': web3.eth.get_transaction_count(account.address),
'to': "0xRecipientAddress",
'value': 0,
'gas': 21000,
'gasPrice': web3.eth.gas_price,
'chainId': 10, # Optimism mainnet
}
signed = account.sign_transaction(tx)
# Send synchronously with a 5-second timeout (decimal integer per EIP-7966)
receipt = web3.provider.make_request(
"eth_sendRawTransactionSync",
[signed.raw_transaction.hex(), 5000]
)
print(f"Receipt: {receipt['result']}")
curl -X POST "CHAINSTACK_NODE_URL" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "method": "eth_sendRawTransactionSync", "params": ["SIGNED_TX_DATA", 5000], "id": 1}'
When to use
Useeth_sendRawTransactionSync instead of eth_sendRawTransaction when:
- You need the receipt immediately and want to avoid polling with
eth_getTransactionReceipt. - You are building synchronous request/response flows (payments, bots, simulations).
- You want to simplify transaction submission logic by getting the result in a single call.
eth_sendRawTransaction.Body
application/json
Last modified on June 22, 2026
Was this page helpful?