¡Te agradecería mucho si me puedes ayudar con esta simple pregunta!
Quiero hacer una división de fondos en un contrato inteligente: el 10 % será para mi amigo y el 90 % para mí. Creé una variable y escribí el siguiente código en la función retirar ():
address private constant _friend = 0xAb8483F64d9C6d1EcF9b849Aeblablalbasomeaddress;En el inicio del contrato y:
function withdraw() public payable onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance / 100 * 10); payable(_friend).transfer(balance / 100 * 90); }Probé esto en una red de prueba, pero estoy un poco paranoico. ¿Funcionará este código?
¿Por qué creo que podría haber problemas con esto? Al enviar ETH, debe pagar una comisión, por lo que si envío msg.sender, luego envío este 90% + comisión, ¿tendré suficiente dinero para enviar el 10%?
payable(msg.sender).transfer(balance / 100 * 10); payable(_friend).transfer(balance / 100 * 90);Esto funcionará como se esperaba para las cantidades (en wei) que son divisibles por 100. Las cantidades que no son divisibles por 100 darán como resultado errores de redondeo, porque se trata de una división de números enteros (no de decimales). Así que cualquiera de ustedes podría obtener un poco menos de lo esperado.
Ejemplo:
balance = 200 wei
msg.sender obtiene (200/100) * 10 = (2) * 10 = 20_friend obtiene (200 / 100) * 90 = (2) * 90 = 180 balance = 150 wei
msg.sender obtiene (150/100) * 10 = (1) * 10 = 10_friend obtiene (150 / 100) * 90 = (1) * 90 = 90 Solidity resuelve ambos operadores desde la izquierda. Así que primero calcula balance / 100 y luego multiplica el resultado por 10 o 90 .
Al enviar ETH, hay que pagar una comisión
Probablemente te refieres a la tarifa del gas. Esto se paga además del value de la transacción por parte de la dirección que ejecuta la función de withdraw() . La tarifa de gas no afecta las transacciones internas (y su value ) que serán generadas por cada una de las funciones de transfer() .
Ejemplo:
Está enviando 1 value ETH (o 1000000000000000000 wei) junto con la transacción que ejecuta la función de withdraw() . La tarifa del gas es de 0,001 ETH, por lo que el monto total que pagas es de 1,001 ETH. Sin embargo, la tarifa va a la red, por lo que el contrato aún recibe solo el value de 1 ETH.
Luego se divide en dos transacciones internas: 0,1 ETH para usted (como msg.sender ) y 0,9 ETH para la dirección _friend . La tarifa de gas para estas transacciones internas ya está incluida en la tarifa de transacción principal (punto 1).