¿Cómo crear un grifo ERC20?

Tengo algunos problemas para pensar en la creación de grifos ERC20. ¿Cómo se hace esto exactamente? Creé un token ( https://ropsten.etherscan.io/token/0x90de67a867b18535ad558fec0c418921340ffc91?a=0x18c59adbf99be137b3eeaffd84b083fd623a4c36 ) pero no estoy seguro de cómo distribuiría tokens utilizando un grifo. Esto es puramente con fines de prueba, pero me gustaría poder regalar valores decrecientes de este token de prueba en función de la cantidad entregada anteriormente.

Supongo que necesitaré usar Transfer(), que usé en mi función getFromFaucet(), pero estoy extremadamente confundido sobre cómo enviar estos tokens a una dirección diferente.

function getFromFaucet(address _to) returns (bool success) {
        uint256 giveaway_value;

        if (previous_giveaway == 0){
            giveaway_value = starting_giveaway;
            previous_giveaway = starting_giveaway;
        }
        previous_giveaway = previous_giveaway / 2;

        if (balances[msg.sender] >= giveaway_value){
            balances[msg.sender] -= giveaway_value;
            balances[_to] += giveaway_value;
            Transfer(msg.sender, _to, giveaway_value);
            return true;
        }
        else return false;
    }

Por ejemplo, ¿cómo llamo a este getFromFaucet y le paso la dirección? Estoy planeando distribuir desde un sitio web.

¡Gracias de antemano!

Respuestas (1)

Estás escribiendo una función de transferencia compleja, la única diferencia es que el remitente no puede controlar la cantidad entregada.

Si desea crear un grifo de token, haría que el destinatario envíe la transacción. Tener también un periodo de enfriamiento de dos minutos para limitar posibles abusos.

uint previous_giveaway;
uint last_giveaway;

function drip() returns (bool success) {
    // Only allow to drip every two minutes to limit abuse
    if (now - last_giveaway < 2 minutes) {
        return false;
    }
    last_giveaway = now;
    // deliver half than last time
    uint giveaway_value = previous_giveaway / 2;
    if (giveaway_value == 0){
        giveaway_value = starting_giveaway;
        previous_giveaway = starting_giveaway;
    }
    // It is a faucet mint new tokens
    balances[msg.sender] += giveaway_value;
    totalSupply += giveaway_value;
    Transfer(0x0, msg.sender, giveaway_value);
    return true;
}

Para llamar a ese contrato desde una aplicación web usando web3 v1.0, algo como esto debería funcionar

const token = new eth.Contract(abiToken, addressToken);
await token.methods.drip().send({ from: "address" });

El contrato depositará unos tokens en "dirección".

la complejidad de la función no es lo que me confunde tanto como cómo invocar la función desde una aplicación web
La API web3.js era exactamente lo que estaba buscando, ¡muchas gracias! :)
@ColinFausnaught pudo crear un grifo de token ERC20, si es así, ¿puede enviarme algunos tokens ERC20 de prueba en la red Rinkeby? mi dirección es 0x7EAA02f15Aaba8cb163F058ea506d702eB488E49 Cualquier token ERC20 está bien, quiero probarlo enviando tokens de una dirección a otra, también necesitaré ABI del token erc20. gracias de antemano
Actualización, desde entonces aprendí que la mayoría de los ERC20 necesitan incorporar la funcionalidad del grifo en el contrato del token en sí y he visto resultados mucho mejores al hacerlo. Por lo tanto, en lugar de hacer un nuevo contrato por goteo, generalmente es mejor construirlo en el token (también ahorra gasolina).