No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a Solidity

Curso de Introducción a Solidity

Sebastián Leonardo Perez

Sebastián Leonardo Perez

Recibir ether desde un contrato

15/21
Recursos

Aportes 8

Preguntas 12

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

		        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

  • 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.

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!