Как создать кран ERC20?

У меня возникли некоторые проблемы с обдумыванием создания сборщиков ERC20. Как именно это делается? Я создал токен ( https://ropsten.etherscan.io/token/0x90de67a867b18535ad558fec0c418921340ffc91?a=0x18c59adbf99be137b3eeaffd84b083fd623a4c36 ), но я не уверен, как я буду распределять токены с помощью крана. Это чисто для целей тестирования, но я хотел бы иметь возможность отдавать уменьшающиеся значения этого тестового токена на основе предыдущей выданной суммы.

Я предполагаю, что мне нужно будет использовать Transfer(), который я использовал в моей функции getFromFaucet(), но я очень смущен тем, как даже отправить эти токены на другой адрес.

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;
    }

Например, как мне вызвать этот getFromFaucet и передать ему адрес? Я планирую распространять с веб-сайта.

Заранее спасибо!

Ответы (1)

Вы пишете сложную функцию перевода, единственное отличие в том, что отправитель не может контролировать отдаваемую сумму.

Если вы хотите создать сборщик токенов, я бы заставил получателя отправить транзакцию. Также есть двухминутный период охлаждения, чтобы ограничить возможное злоупотребление.

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;
}

Чтобы вызвать этот контракт из веб-приложения с использованием web3 v1.0, должно работать что-то вроде этого.

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

Контракт внесет несколько токенов на «адрес».

сложность функции - это не то, что меня смущает, а то, как вызвать функцию из веб-приложения.
API web3.js был именно тем, что я искал, большое спасибо! :)
@ColinFausnaught удалось создать сборщик токенов ERC20, если да, можете ли вы прислать мне несколько тестовых токенов ERC20 в сети Rinkeby? мой адрес 0x7EAA02f15Aaba8cb163F058ea506d702eB488E49 Любой токен ERC20 подходит, я хочу протестировать отправку токенов с одного адреса на другой, мне также понадобится ABI токена erc20. заранее спасибо
Обновление, с тех пор я узнал, что большинству ERC20 необходимо встроить функциональность сборщика в контракт самого токена, и я видел гораздо лучшие результаты при этом. Таким образом, вместо того, чтобы заключать новый контракт на дрипку, обычно лучше просто встроить его в сам токен (также экономит газ).