send Ether
|
msg.data esta vacia?
/
yes no
/
receive() existe? fallback()
/
yes no
/
receive() fallback()
Tu comentario se veía raro (movido) en mi pc pero me gustó la idea y realicé una imagen con la manera en que lo entendí. También le agregué lo de la existencia de una función firmada payable
!Esquema Recepcion
Muy buen aporte, compañero, me ayudó a entender mejor y a plantear mejor mis dudas. Gracias
Me ayudó a comprender mucho mejor. Gracias por el aporter
wei definition:
Wei is the smallest denomination of ether—the cryptocurrency coin used on the Ethereum network. One ether = 1,000,000,000,000,000,000 wei (1018)
Gracias por compartirnos la definición
Recibir Ether desde un contrato
Receive: Recibe el saldo de trasferencias sin parámetros.
FallBack: Recibe información adjunta a la trasferencia por medio de los parámetros.
Función Payable: Se especifica el tipo payable a una función que puede recibir trasferencias.
Para los que se quedaron con la pregunta ¿Por qué colocar payable a una función?, pues para que en el invocación se pueda enviar ethers, si en la invocación de una función NO PAYABLE le incorporas el envío de ETH, entonces dará error.
Construí este esquema a partir de la clase y los aportes de Juan Carlos, Sergio. Me ayudó a comprender mejor el flujo de la transferencia, se los comparto.
RESUMEN CLASE 15:
RECIBIR ETHER
DESDE UN CONTRATO
I.- FORMAS DE RECIBIR ETHER
Receive: función opcional que se ejecuta cuando se recibe una transferencia de Ether sin parámetros.
Fallback: función opcional que se ejecuta cuando se recibe una transferencia de Ether con parámetros.
Función payable: se puede recibir Ether en una función si se le especifica el tipo payable.
Cuando se envía una transferencia lo primero que se intenta es verificar si existe una función con la firma especificada.
Si no se encuentra, se buscará una función fallback que reciba parámetros.
Si no tiene parámetros, se buscará una función de receive y en caso de no existir se buscará una función fallback sin parámetros.
Realice un deploy sobre Mumbai, envie y transferi matic y fracciones de matic, ahora entiendo cuando comentaste de trabajar los flotantes con enteros XD, hasta aqui todo bien, pero ¿que pasa cuando enviamos otro tipo de token?, entonces desplegue el contrato de un token, lo envie a mi contrato y en el scan de mumbai puedo ver que tiene el token que envie, pero ahora ¿como puedo transferir ese token que tiene el contrato a otra direccion?
Muchas gracias
Saludos
Hola Edgar, genial todo lo que estás desarrollando !
Respecto a tu consulta, la sentencia transfer que se aplica sobre una dirección payable utiliza la moneda por defecto de la red (Ether en Ethereum o Matic en Polygon). Para transferir un token, debes utilizar la función de transferencia que corresponda al mismo. Por ejemplo para el ERC20 es una función transfer que recibe una dirección y un monto.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
// Contrato que se encargue de recibir transferencias
// agregamos 3 tipos de recepciones
// 1 recepcion limpia SIN parametros!
// 2 recepcion que RECIBA parametros pero que no correspondan a ninguna funcion!
// 3 llamada a una funcion (que corresponda con la firma de la funcion) y que ademas tenga un valor asociado en Ethers!
contract Recepcion {
mapping(address=> uint) balances;// Para hacer un ejemplo : creamos un mappinn relativo a balance, en base a la cantidad de saldo que le envio por transaccion. -> (*)uint public saldoEnviado;// para ver cuanto saldo recibimos creasmo esta variable publica -> y agregamos en recibir saldo : saldo enviado!receive() external payable {// recive obligatoriamente es una funcion del tipo externa y del tipo payable (recibe pagos) los dos si o si!balances[msg.sender]+= msg.value;// (*) como primera linea de codigo le digo que al sender de la transaccion le agregue un saldo.// como se el saldo? el sender me trae el monto en weis! muchos ceros 000000000000001 weis}fallback() external payable {// funcion allback que no recive ningun parametro, va a ser external y payable.// como van a ir los parametros? los vamos acceder mediante el msg.data -> asociado a los datos que viene con el mensaje. como s en bytes o vamos a usarlo por el momento para saber que hacer si recibimos una trasnferencia con parametros.}functionrecibirSaldo(uint numero)public payable {// uint numero es solo para poner como parametro un numero x// funcion convencional de recibir saldo y no sea obligatorioriio que reciba saldo. la habilitamos y puede ser llamada aunque tenga saldo 0! saldoEnviado = msg.value;//para ver el saldo recibido -> saldo enviardo variable creada arriba!// value va a recibir el valor que le enviamos desde el deploy -> hacemos un call al contrato enviandole ese parametro (value del deploy) uint monto = numero;//aca hay un error ya que nos e una la variable monto, pero lo dejamos por ahora no afecta ya que nos interesa saber el saldo recivido que fue enviado!}
}
NOTA: al ralizar el deply los textbox que aparcen so los definidos en la sfuncniones del conrtato! Como monto y value!
Donde monto es en esta caso solo un numero sin importancia modo ejemplo
Pero value sera el saldoenviado al contrato!
NOTA 2 : sabemos que el contratot es payable porque el boton del deploy esta en rojo!
Saludos, Sebastián y compañeros. No me quedó muy claro el qué significa que una función sea external, alguien podría explicármelo?
Hola Aldo, una función external es aquella que puede ser llamada desde fuera del contrato pero no puede ser utilizado dentro del mismo. Es decir, no podrás hacer una llamada a esa función desde otra función del mismo contrato pero sí podrás desde web3, rpc o desde otro contrato
es "Recibir Ether desde un contrato" o "enviar ether a un contrado" porque segun el remix, no recibo nada.
no me quedo claro tampoco para que son las funciones receive ni fallback no les vi la utilidad. ejecute el contrato sin esas funciones e igual funciono todo...
Hola Franklin, ambas funciones sirven para que los contratos puedan recibir fondos. Si no se define ni "receive", ni "fallback", ni ninguna función de tipo payable el contrato no podrá recibir fondos. Fuera de eso, su funcionamiento será normal, sólo que no podrá almacenar Ethers en su billetera y por ende luego transferirlos.
Estoy realizando la prueba del código del contrato Recepcion.sol. Al enviarle valor 600 y recibir saldo 60, arroja en saldoEnviado un valor de "uint256: 600000000000". Tambien para correr el contrato tuve que valorar el Gas limit, porque arrojaba error por fondos insuficientes. ¿porque arroja esa respuesta de saldo y como se puede corregir?. Gracias y saludos
Aqui el ptsc del Remix y el deploy.
Pablo, lo que sucede es que la unidad que estás usando es el Gwei (fijate en la caja de la derecha), entonces te cambia la unidad de valor agregando los ceros cuando hace la transferencia. Te conviene siempre utilizar "wei" para que no tengas diferencias de unidades
Sebastian: De acuerdo, cambié las unidades y funciona perfecto. Gracias.
saludos una ves por error envie dinero 25 BUSD al contrato de la moneda me comunique con Binance y me dijeron que el monto era muy poco que no hay una manera de recuperarlos me pregunto si por codigo es posible llamando la función si es que existe XD? o como funcionan estos contratos que son monedas .
o directamente no hay nada que hacer
Hola Luis, si has enviado una transacción a un contrato y la misma es válida (es decir que por ejemplo contabas con el saldo suficiente) entonces no hay forma de revertirla. El contrato debería tener en el código alguna función para que puedas retirar esos fondos o en caso contrario no hay manera de recuperarla
Todo muy bien pero....
Cuándo recibo un pago, ¿a dónde se va ese dinero, donde se guarda, cómo lo puedo enviar a otro wallet?
Si alguien me pudiera apoyar.
Saludos.
Hola Eduardo, siempre el "dinero" (o los Ethers para ser más precisos) van a vivir dentro de la Blockchain (allí se almacena). Si la transferencia es hacia tu cuenta, puedes chequear tu balance en una wallet como Metamask y desde allí mismo puedes enviar Ethers a otra cuenta. En el caso de que el que reciba los ethers sea un contrato, la forma de gestionarlo es como se ve en este módulo ya que el saldo queda asociado al contrato y no puede modificarse desde una wallet si no que debemos transferir por medio del código.
¿Y se pueden hacer transferencias entre cuentas diferentes al contrato?
Se pueden si lo haces por fuera del contrato. Por ejemplo directamente desde Metamask
Los contratos al ser desplegados se les asigna una dirección pública, ¿cierto? Entonces hay direcciones públicas de wallets y direcciones públicas de contratos. ¿Las de wallets tienen habilitadas por defecto funciones de recepción?
¿Algún contrato que no tenga habilitado funciones de recepción entonces no puede recibir Ether?
Hola Rodrigo, es correcto ambas tienen direcciones públicas y tienen el mismo formato. Las direcciones que corresponden a cuentas que no son contratos no tienen un accionar automatizado al recibir fondos. Respecto a los contratos que no tengan receive, fallback o una función payable no podrán recibir fondos como bien dices.
a que se refiere con la firma de la funcion exactamente???
Hola Leonardo, la firma es el encabezado de la función, por ejemplo si tienes una función:
function sumar(uint numero1, uint numero2) external { ...
Tiene como firma: "sumar(uint256,uint256)"
Fijate que no incluye modificadores de acceso ni nombres de las variables, además se le agrega el 256 a los uint
Hola, una pregunta:
¿Puedo enviar saldo a un contrato payable desde otro contrato directamente sin que tenga este una función diseñada para recibirlo?
Por ejemplo algo asó como:
address(direccióndeContratoPayable).send(monto)
Hola Juan, para poder enviarle con .send a un contrato, el mismo debe tener definida la función receive() y/o la función fallback(). En caso contrario va a fallar
Hola: **Balance **reporta 0 y difiere con lo de Sebastian. ¿que puede faltar?
Hola Pablo, primero le debes enviar saldo al contrato desde la dirección que consultas en verBalance como origen. Luego de la transacción, al llamar a la función te debe de mostrar el balance deseado.
Hola Sebastian: modifique la función de acuerdo a su indicación y funciona con lo esperado. Muchas gracias.
No me quedó claro para que se usan receive y fallback, en realidad el video no muestra como trabajan estas funciones o no identifiqué como lo hacen.
Hola Javier ! Las funciones receive y fallback son llamadas automáticamente cuando se hace una transferencia de ethers hacia tu contrato. En el caso de receive es cuando la transferencia no lleva parámetros y con fallback cuando sí los tiene. Estas funciones no pueden ser llamadas de forma externa como el resto de las funciones, sólo cuando se hace una transferencia.