title | actions | requireLogin | material | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Retiros |
|
true |
|
En el capitulo anterior, aprendimos cómo enviar Ether a un contrato. Entonces ¿Qué ocurre cuando lo envía?
Luego de enviar Ether a un contrato, este se almacena en la cuenta de Ethereum del contrato y estará atrapado ahí — a menos que añada una función para retirar el Ether del contrato
Puede escribir una función para retirar Ether del contrato de la siguiente forma:
contract GetPaid is Ownable {
function withdraw() external onlyOwner {
owner.transfer(this.balance);
}
}
Nótese que estamos utilizando owner
y onlyOwner
del contrato Ownable
, asumiendo que este fue importado.
Puede transferir Ether a una dirección utilizando la función transfer
y this.balance
devolverá el balance total almacenado en el contrato. Así que si 100 usuarios han pagado 1 Ether a nuestro contrato, this.balance
sería igual a 100 Ether.
Puede utilizar transfer
para enviar fondos a cualquier dirección de Ethereum. Por ejemplo, podría tener una función que transfiera Ether de vuelta al msg.sender
si rebasan el precio al pagar un item.
uint itemFee = 0.001 ether;
msg.sender.transfer(msg.value - itemFee);
O en un contrato con un comprador y un vendedor, usted podría guardar la dirección del vendedor en la memoria, luego, cuando alguien adquiera su item, transferirle la tasa pagada por el comprador: seller.transfer(msg.value)
.
Estos son algunos ejemplos de lo que hace de la programación de Ethereum algo realmente genial — puede tener mercados descentralizados como este que no son controlados por nadie.
-
Cree una función
withdraw
en nuestro contrato, la cual debería ser idéntica al ejemploGetPaid
anterior. -
El precio del Ether aumentó x10 en el año pasado. Así que mientras 0.001 ether es como $1 en el momento de escribir esto, si sube x10 de nuevo, 0.001 ETH sería equivalente a $10 y nuestro juego será mucho más costoso.
Así que es una buena idea crear una función que nos permita, como dueños del contrato, configurar el levelUpFee
.
a. Cree una función llamada setLevelUpFee
que tome un argumento, uint _fee
, sea external
y utilice el modificador onlyOwner
.
b. La función debería configurar levelUpFee
como igual a _fee
.