Skip to content

Instantly share code, notes, and snippets.

@maxidev
Created March 17, 2025 14:02
Show Gist options
  • Select an option

  • Save maxidev/820a8abf94edff454bdf4599ebf493ad to your computer and use it in GitHub Desktop.

Select an option

Save maxidev/820a8abf94edff454bdf4599ebf493ad to your computer and use it in GitHub Desktop.
unsigned_tx_erc20_transfer.js
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