17. Funciones y direcciones pagaderas (payable)

Para que un contrato pueda recibir Ether o el Token nativo de Blockchain EVM que se esté ejecutando, debe tener funciones del tipo payable y para enviarlo es necesario utilizar direcciones del mismo tipo.

# Funciones pagaderas

Solo las funciones que NO son del tipo view pueden recibir Ether.

# Enviando Ether al contrato

El parámetro payable es para que el contrato pueda recibir y manejar saldos. Recordando que estamos hablando de Ether o tokens nativos como BNB, MATIC, y no de Tokens en formato ERC-20.

function invest() external payable {
  //Si envían menos de 1000 Wei, la transacción será revertida y no aceptada.
  if(msg.value < 1000) {
    revert();
  }
}

# Consultando el saldo del contrato

Para conocer el saldo del contrato en el que se está ejecutando la función, utilice la instrucción address(this).balance;

//Función para verificar si recibió el dinero:

function balanceOf() external view returns(uint) {
  return address(this).balance;

  //This -> Hace referencia a ese Smart Contract
  //Retornará el saldo del Smart Contract
}

# Payable como Parámetro

Anteriormente, se vio que para que el contrato RECIBA Ether, el parámetro pagadero debe estar presente en el encabezado de la función.

Para que el contrato se ENVÍE Ether, debe tratar con direcciones pagaderas. En el ejemplo a continuación, insertamos este parámetro como una instrucción adicional a la dirección que se pasará a la función.

function recibeEth() external payable {
  //Recibe Eth
}

function enviaEth(address payable quienRecibe) external {
  //Envía Eth
}

# Direcciones pagaderas

En el siguiente ejemplo, se transferirá 1 éter del saldo del contrato a la dirección pasada como parámetro quienRecibe a la función.

function enviaEth(address payable quienRecibe) external {
  quienRecibe.transfer(1 ether);
  //Transfiere 1 Ether desde ese Smart Contract para otra dirección.
}

En este caso será una transferencia que irá a quien llama (msg.sender) a la función retirar del contrato.

function retirar(uint256 _amount) external {
  payable(msg.sender).send(_amount); //Retorna True o False
  payable(msg.sender).transfer(_amount); //No retorna nada | Revierte la transacción si falla
}

Hay dos formas de hacer transferencias: usando la función send() o la función transfer() y la diferencia entre ellas es que la función send() devolverá true o false y la función transfer() no devuelve nada si la transferencia ha tenido lugar, así como revertirá toda la transacción si falla.

Last Updated: 9/10/2022, 4:27:54