curl --request POST \
--url https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": [
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
]
}
'{
"jsonrpc": "<string>",
"id": 123,
"result": {}
}curl --request POST \
--url https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": [
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
]
}
'{
"jsonrpc": "<string>",
"id": 123,
"result": {}
}eth_sendRawTransaction method to submit the signed transaction to the Ethereum network for processing.
eth_sendRawTransaction is used to modify the state of the blockchain, it is not possible to duplicate the same request.data — the signed transaction. The serialized transaction data, which includes the transaction metadata such as the nonce, gas price, gas limit, recipient address, and data payload, as well as the digital signature generated using the private key associated with the address that is sending the transaction. Typically, signed with a library such as web3.py, web3.js, or ethers.js using the sender’s private key.result — the unique hash identifying the transaction or the zero hash if the transaction is not available yet. The zero hash is a special value that represents an invalid or null hash.eth_sendRawTransaction code examplesChainstackProvider in ethers.js: ethers ChainstackProvider Documentation.
With ether.js, you can use the ChainstackProvider directly if you want to run this code on the Ethereum mainnet:
const ethers = require("ethers");
// Create a ChainstackProvider instance for Ethereum mainnet
const chainstack = new ethers.ChainstackProvider("mainnet");
const ethers = require('ethers');
const NODE_URL = "CHAINSTACK_NODE_URL";
const provider = new ethers.JsonRpcProvider(NODE_URL);
async function sendEth(value) {
// Define the sender and receiver addresses, and the private key
const sender = '0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a';
const receiver = '0xe9ba4b4d84d7a3c80245514213b88d50ed937114';
const privateKey = '1111111111111111111111111111111111111111111111111111111111111111';
// Define the gas limit
const gasLimit = await provider.estimateGas({
from: sender,
to: receiver,
value: ethers.parseEther(value),
});
// Get the transaction count for the sender address
const nonce = await provider.getTransactionCount(sender);
// Define the transaction object
const transactionObject = {
to: receiver,
gasPrice: ethers.parseUnits('50', 'gwei'),
gasLimit: gasLimit.toString(),
nonce: nonce,
value: ethers.parseEther(value),
};
// Sign the transaction using the private key
const wallet = new ethers.Wallet(privateKey, provider);
console.log(`Sending transaction...`)
const transaction = await wallet.sendTransaction(transactionObject);
console.log('Transaction hash:', transaction.hash);
}
sendEth("2");
amountToSend, recipientAddress, and secretKey fields to be able to use this code.eth_sendRawTransaction is to automatically swap ETH for a token when its price reaches a certain level. eth_sendRawTransaction will allow specifying custom transaction parameters, such as gas price or gas limit, to optimize the speed and cost of the transaction.
For instance, you could build a program monitoring the price of a specific token and execute a swapExactETHForTokens transaction when the token reaches a certain price level, it could use eth_sendRawTransaction to submit a raw transaction with a custom gas price and limit that are optimized for the current network conditions.
The following code shows how to call the swapExactETHForTokens function from the SushiSwap exchange on Ethereum using ethers.js:
swapExactETHForTokens function on SushiSwap on Ethereum mainnet, and not how to track the prices. You need to build a separate part for this.const ethers = require("ethers");
// Create a ChainstackProvider instance for Ethereum mainnet
const chainstack = new ethers.ChainstackProvider("mainnet");
// ABI for the swapExactETHForTokens function
const sushiRouterABI = [
{
"inputs":[
{
"internalType":"uint256",
"name":"amountOutMin",
"type":"uint256"
},
{
"internalType":"address[]",
"name":"path",
"type":"address[]"
},
{
"internalType":"address",
"name":"to",
"type":"address"
},
{
"internalType":"uint256",
"name":"deadline",
"type":"uint256"
}
],
"name":"swapExactETHForTokens",
"outputs":[
{
"internalType":"uint256[]",
"name":"amounts",
"type":"uint256[]"
}
],
"stateMutability":"payable",
"type":"function"
}
]
async function swapETHForToken(value, token, privateKey) {
// Create a new wallet using the private key
const wallet = new ethers.Wallet(privateKey, provider);
// Get the SushiSwap Router contract and create a contract instance
const sushiRouterAddress = '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506'; // SushiSwap Router address on Ethereum Mainnet
const sushiRouterContract = new ethers.Contract(sushiRouterAddress, sushiRouterABI, wallet);
// Prepare the swap parameters
const tokenToBuy = token;
const amountOfETH = ethers.parseEther(value); // Convert the input value to Wei
const minAmountOfTokens = ethers.parseUnits('0'); // Set the minimum output token amount to 0, this means that you will always receive something.
const deadline = Math.floor(Date.now() / 1000) + 60 * 10; // Set the deadline to 10 minutes from now
// Define the token path for the swap
const path = ['0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', tokenToBuy]; // WETH to token to buy
// Parameters for the transaction object
const nonce = await wallet.getTransactionCount();
const gasPrice = await chainstack.getGasPrice();
const transactionData = sushiRouterContract.interface.encodeFunctionData('swapExactETHForTokens', [
minAmountOfTokens,
path,
wallet.address,
deadline
]);
// Calculate the gas limit based on the parameters
const gasLimit = await chainstack.estimateGas({to: sushiRouterAddress, value: amountOfETH, data: transactionData});
// Get the chain ID for replay-protected (EIP-155) transactions
const chainId = await chainstack.getNetwork().then(network => network.chainId);
// Build the transaction object
const transactionObject = {
to: sushiRouterAddress,
value: amountOfETH,
nonce: nonce,
gasPrice: gasPrice,
gasLimit: gasLimit,
data: transactionData,
chainId: chainId
};
// Sign and send the transaction
console.log(`Swapping tokens...`);
const signedTx = await wallet.signTransaction(transactionObject);
const transaction = await chainstack.sendTransaction(signedTx);
console.log(`Transaction sent; transaction hash: ${transaction.hash}\n`);
// Wait for the transaction to be confirmed
console.log(`Validating transaction...`);
const receipt = await transaction.wait();
return receipt
}
async function main() {
try {
// Set the swap parameters and private key
const quantity = '0.2'; // Amount of ETH to swap
const addressToBuy = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'; // Address of the token to buy (AAVE in this case)
const privateKey = '1111111111111111111111111111111111111111111111111111111111111111'; // Replace with your actual private key
// Execute the swap and check if successful
const receipt = await swapETHForToken(quantity, addressToBuy, privateKey);
if (receipt.status === 1) {
console.log(`The swap was successful!`);
console.log(`Transaction receipt`, receipt);
} else {
console.log(`The swap failed with status ${receipt.status}.`);
}
} catch (error) {
console.error(`An error occurred during the swap: ${error.message}`);
}
}
main();
swapETHForToken function, a new wallet is created using the provided privateKey. Then, the instance of the SushiSwap Router contract is obtained using its address and the ABI (Application Binary Interface) for the swapExactETHForTokens function. This function swaps a specified amount of ETH for a token at the current market price.
The tokenToBuy, amountOfETH, minAmountOfTokens, and deadline variables are used to prepare the swap parameters. The path variable defines the input and output token path for the swap. The nonce, gasPrice, and the transactionData variables define the parameters for the transaction object and encode the swapExactETHForTokens function call with the specified parameters.
The gasLimit variable is calculated based on the parameters, and the chainId variable is obtained for replay-protected (EIP-155) transactions. Then, the transactionObject variable is built, including the to address, the value, the nonce, the gasPrice, the gasLimit, the data, and the chainId.
Finally, the transaction is signed and sent, and the receipt is returned. If the status of the receipt is equal to 1, the swap was successful, and the receipt object is logged to the console. If the status is not equal to 1, the swap failed, and an error message is logged to the console.Was this page helpful?