send Ether
|
msg.data esta vacia?
/ \
yes no
/ \
receive() existe? fallback()
/ \
yes no
/ \
receive() fallback()
Por qué debes aprender Solidity
Conoce qué es Solidity
La importancia de la web3 y Solidity
Introducción a la programación con Solidity
Estructura de un contrato
Variables y tipos de datos
Estructuras de datos en Solidity: Structs y arrays
Estructuras de datos en Solidity: Mappings y enums
Estructuras de control en Solidity
Manejo de Eventos con Solidity
Programación de Funciones en Solidity
Cómo implementar funciones en Solidity
Uso de Modificadores en Solidity
Manejo de errores
Gestionando costos de gas y comisiones
Tipos de almacenamiento
Manejo del gas y comisiones
Transferencias de ether desde un contrato
Recibir ether desde un contrato
Conceptos avanzados de Solidity
Manejo de dependencias y librerías
Uso de la herencia en Solidity
Polimorfismo en contratos inteligentes
Tokens
Application Binary Interface (ABI)
Cómo continuar mi camino desarrollando en Blockchain
Cómo continuar mi camino con Solidity
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Sebastián Leonardo Perez
Aportes 8
Preguntas 12
send Ether
|
msg.data esta vacia?
/ \
yes no
/ \
receive() existe? fallback()
/ \
yes no
/ \
receive() fallback()
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)
Considero que esta clase no quedo tan clara pero aquí dejo un post que me ayudo un poco, es corto y simple: https://www.educative.io/answers/how-to-receive-ethers-inside-a-smart-contract
Recibir Ether desde un contrato
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.
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.
REMIX:
Recepcion.sol
// SPDX-License-Identifier: GLP-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Recepcion {
mapping (address => uint) balances;
uint public saldoEnviado;
receive() external payable{
balances[msg.sender] += msg.value;
}
fallback() external payable{
}
function recibirSaldo(uint numero) public payable {
saldoEnviado = msg.value;
uint monto = numero;
}
}
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.
// 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.
}
function recibirSaldo(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!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?