Created
March 17, 2025 14:02
-
-
Save maxidev/820a8abf94edff454bdf4599ebf493ad to your computer and use it in GitHub Desktop.
unsigned_tx_erc20_transfer.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { ethers } from "ethers"; | |
| // Conexión al proveedor de Arbitrum | |
| const provider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); | |
| // Dirección del contrato USDC en Arbitrum Mainnet | |
| const usdcContractAddress = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"; | |
| // ABI mínima para la función transfer | |
| const usdcAbi = ["function transfer(address to, uint256 value) returns (bool)"]; | |
| const usdcInterface = new ethers.Interface(usdcAbi); | |
| // Función para crear una transacción raw sin firmar para transferencia de USDC | |
| async function createUnsignedRawUsdcTransfer() { | |
| try { | |
| // 1. Parámetros de la transferencia USDC | |
| const recipient = ""; // Dirección de destino | |
| const amount = ethers.parseUnits("10", 6); // 10 USDC (6 decimales) | |
| // 2. Codificar los datos de la función transfer | |
| const data = usdcInterface.encodeFunctionData("transfer", [ | |
| recipient, | |
| amount, | |
| ]); | |
| console.log("Datos codificados:", data); | |
| // 3. Definir los parámetros de la transacción | |
| const tx = { | |
| to: usdcContractAddress, // Dirección del contrato USDC | |
| value: 0, // No se envía ETH nativo | |
| gasLimit: 60000, // Estimación para llamada a contrato (ajustar según necesidad) | |
| gasPrice: ethers.parseUnits("0.1", "gwei"), // Precio del gas | |
| nonce: 1, // Nonce ficticio (ajústalo según el caso real) | |
| chainId: 42161, // Chain ID de Arbitrum Mainnet | |
| data: data, // Datos codificados de la función transfer | |
| // Opcional: Si usas EIP-1559 (tipo 2), reemplaza gasPrice por: | |
| // type: 2, | |
| // maxFeePerGas: ethers.parseUnits("0.1", "gwei"), | |
| // maxPriorityFeePerGas: ethers.parseUnits("0.01", "gwei"), | |
| }; | |
| // 4. Crear la transacción sin firmar | |
| const unsignedTx = ethers.Transaction.from(tx); | |
| // 5. Serializar la transacción en formato raw (RLP) | |
| const serializedUnsignedTx = unsignedTx.unsignedSerialized; | |
| // 6. Calcular el hash de la transacción sin firmar | |
| const txHash = ethers.keccak256(serializedUnsignedTx); | |
| // Output final: La transacción raw sin firmar y su hash | |
| return { | |
| rawUnsignedTx: serializedUnsignedTx, | |
| hash: unsignedTx.unsignedHash, | |
| }; | |
| } catch (error) { | |
| console.error("Error:", error); | |
| } | |
| } | |
| // Ejecutar la función | |
| createUnsignedRawUsdcTransfer().then((result) => { | |
| console.log("Resultado final:", result); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment