// Definir la dirección del contrato Lido y los decimales del token const lidoContract = "0xae7ab96520de3a18e5e111b5eaab095312d7fe84"; const tokenDecimals = 18; // Buscar el ABI de Lido desde el repositorio en GitHub const lidoAbi = fetch( "https://raw.githubusercontent.com/lidofinance/lido-subgraph/master/abis/Lido.json" ); if (!lidoAbi.ok) { return "Cargando"; // Retornar mensaje de "Cargando" si no se obtiene el ABI } const iface = new ethers.utils.Interface(lidoAbi.body); // Buscar el APR (tasa de porcentaje anual) de staking de Lido if (state.lidoArp === undefined) { const apr = fetch( "https://api.allorigins.win/get?url=https://stake.lido.fi/api/sma-steth-apr" ); if (!apr) return; State.update({ lidoArp: JSON.parse(apr?.body?.contents) ?? "..." }); } // FUNCIONES AUXILIARES // Obtener el saldo staked del receptor const getStakedBalance = (receiver) => { // Codificar los datos para la llamada a la función "balanceOf" const encodedData = iface.encodeFunctionData("balanceOf", [receiver]); // Realizar una llamada al contrato para obtener el saldo y formatearlo return Ethers.provider() .call({ to: lidoContract, data: encodedData, }) .then((rawBalance) => { const receiverBalanceHex = iface.decodeFunctionResult( "balanceOf", rawBalance ); return Big(receiverBalanceHex.toString()) .div(Big(10).pow(tokenDecimals)) .toFixed(2) .replace(/\d(?=(\d{3})+\.)/g, "$&,"); }); }; // Función para enviar ethers a través del contrato ERC20 const submitEthers = (strEther, _referral) => { if (!strEther) { return console.log("Falta la cantidad"); // Mensaje de error si falta la cantidad } const erc20 = new ethers.Contract( lidoContract, lidoAbi.body, Ethers.provider().getSigner() ); let amount = ethers.utils.parseUnits(strEther, tokenDecimals).toHexString(); // Enviar la transacción y registrar el hash de la transacción erc20.submit(lidoContract, { value: amount }).then((transactionHash) => { console.log("El hash de la transacción es " + transactionHash); }); }; // DETECTAR EL REMITENTE // Actualizar el estado con la dirección del remitente if (state.sender === undefined) { State.update({ sender: Ethers.send("eth_requestAccounts", [])[0] }); } if (!state.sender) return "Por favor, inicie sesión primero"; // Solicitar inicio de sesión si no hay remitente // BUSCAR EL SALDO DEL REMITENTE // Obtener y actualizar el saldo del remitente if (state.balance === undefined) { Ethers.provider() .getBalance(state.sender) .then((balance) => { State.update({ balance: Big(balance).div(Big(10).pow(18)).toFixed(2) }); }); } // BUSCAR EL SALDO stETH DEL REMITENTE // Obtener y actualizar el saldo staked del remitente if (state.stakedBalance === undefined) { getStakedBalance(state.sender).then((stakedBalance) => { State.update({ stakedBalance }); }); } // BUSCAR EL COSTO DE LA TRANSACCIÓN // Calcular y actualizar el costo de la transacción en USD if (state.txCost === undefined) { // Estimación del costo de gas const gasEstimate = ethers.BigNumber.from(1875000); const gasPrice = ethers.BigNumber.from(1500000000); // ... (continuar con la explicación aquí) // RESTO DEL CÓDIGO ... // ... }