Estoy desarrollando un proyecto DApp con React, Web3 y solidity para estudiar y vi que las funciones de enviar eth a otra billetera, dentro del contrato inteligente, reciben un msg.sender, msg.value y un parámetro con la dirección del recipiente. A continuación les dejo mi código que tengo por ahora:
<Enviar.sol>
pragma solidity ^0.8.10; contract Send { constructor() payable {} receive() external payable {} function sendViaCall(address payable _to) external payable { (bool success, ) = _to.call{value: msg.value}(""); require(success, "Send failed"); } } contract Receive { event Log(uint256 amount, uint256 gas); receive() external payable { emit Log(msg.value, gasleft()); } }<withETH.js> (Un contexto para Web3)
import { createContext, useState, useEffect } from "react"; import { SEND_ABI, SEND_ADDRESS } from "../configs/configContract"; import Web3 from "web3"; export const ETHContext = createContext({ blockNr: null, accountId: null, send: () => null, }); export const ETHProvider = ({ children }) => { const [blockNr, setBlockNr] = useState(); const [accountId, setAccountId] = useState(); const [contract, setContract] = useState(); useEffect(() => { loadBlockchainData(); }, []); const loadBlockchainData = async () => { const web3 = new Web3(Web3.givenProvider || "http://localhost:7545"); const accounts = await web3.eth.getAccounts(); setAccountId(accounts[0]); const blockNumber = await web3.eth.getBlockNumber(); setBlockNr(blockNumber); const contract = new web3.eth.Contract(SEND_ABI, SEND_ADDRESS); setContract(contract); }; const send = async (userId) => { const web3 = new Web3(Web3.givenProvider || "http://localhost:7545"); await contract.methods.sendViaCall(userId).send({ from: accountId, to: userId, value: web3.utils.toWei("2", "ether"), }); loadBlockchainData(); }; return ( <ETHContext.Provider value={{ accountId, blockNr, send, }} > {children} </ETHContext.Provider> ); };En el fragmento de código a continuación, llamo a mi plantilla de contrato y paso la identificación de quién lo recibirá, de quién se envía (de), quién lo recibirá (a "Imagino que este parámetro es innecesario a medida que paso por el parámetro del llamada función. ¿Estoy en lo cierto?"), y el valor (valor). ¿Qué me garantiza que alguien no cambiará el valor, la identificación del receptor o su propia identificación?
await contract.methods.sendViaCall(userId).send({ from: accountId, to: userId, value: web3.utils.toWei("2", "ether"), })