Как мне создать кошельки и перевести на них токены/mint с помощью python/solidity?

#python #solidity #smartcontracts #bep20

Вопрос:

Я сделал простой токен bep 20 и пытаюсь отчеканить адрес своего кошелька на 50% от запаса токенов и равномерно распределить оставшиеся 50% от запаса между 10 различными кошельками, которые я хотел бы сгенерировать с помощью кода. Я не уверен, может ли это быть сделано в рамках самого контракта или должно быть сделано отдельно через python после развертывания контракта.

вот код солидности:

 
contract Token {
    mapping(address => uint) public balances;
    mapping(address => mapping(address => uint)) public allowance;
    uint public totalSupply = 10000000000;
    string public name = 'TestToken';
    string public symbol = 'TEST';
    uint public decimals = 9;
    
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owener, address indexed spender, uint value);
    
    constructor() {
        balances[msg.sender] = totalSupply;
    }

    function balanceOf(address owner) public view returns(uint) {
        return balances[owner];
    }
    
    function transfer(address to, uint value) public returns(bool) {
        require(balanceOf(msg.sender)>= value, 'You are broke lol');
        balances[to]  = value;
        balances[msg.sender] -= value;
        emit Transfer(msg.sender, to, value);
        return true;
        }
    
    function transferFrom(address from, address to, uint value) public returns(bool) {
        require(balanceOf(from) >= value, 'You broke');
        require(allowance[from][msg.sender] >= value, 'allowance too low');
        balances[to]  = value;
        balances[from] -= value;
        emit Transfer(from, to, value);
        return true;
    }
    
    function approve(address spender, uint value) public returns(bool) {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }
}```
 

Ответ №1:

Вы можете реализовать mint() функцию таким образом, чтобы первые 50% распределялись по msg.sender (или жестко закодированному адресу), а остальные 50% — по 10 адресам, которые передаются в аргументе функции.

Ваш скрипт на python (или любой другой клиент, программное обеспечение кошелька, скрипт JS и т. Д.) генерирует 10 адресов и передает их в аргументе. Пример в JS с использованием библиотеки web3:

 const Web3 = require('web3');

const web3 = new Web3(providerUrl); // TODO fill your value
const contract = new web3.eth.Contract(abiJson, contractAddress); // TODO fill your values

const mintTokens = async () {
    const amount = web3.utils.toWei('1', 'ether');
    const addresses = await getRandomAddresses();

    await contract.methods.mint(amount, addresses).send();
}

const getRandomAddresses = async () {
    let addresses = [];

    for (let i = 0; i < 10; i  ) {
        const account = web3.eth.accounts.create();
        addresses.push(account.address);
    }

    return addresses;
}

mintTokens();
 

Имейте в виду, что в этом примере требуется _amount , чтобы число делилось на 20. В противном случае это привело бы к несколько неверным результатам (до 5% от общего числа).

Кроме того, в моем примере нет авторизации, поэтому любой может выполнить эту функцию. Вероятно, вы также захотите реализовать авторизацию (например, используя собственный шаблон) или пометить функцию как internal (чтобы она никем не выполнялась) и вызвать ее только из constructor() .

 pragma solidity ^0.8.4;

contract Token {
    mapping(address => uint) public balances;
    event Transfer(address indexed from, address indexed to, uint value);
    
    function mint(uint256 _amount, address[10] memory _receivers) external {
        // mint 50% of the _amount to one address
        balances[msg.sender]  = _amount / 2;
        emit Transfer(address(0x0), msg.sender, _amount / 2);
        
        // mint the rest (another 50%) evenly to each receiver
        // i.e. each gets 5%
        for (uint i = 0; i < 10; i  ) {
            balances[_receivers[i]]  = _amount / 20;
            emit Transfer(address(0x0), _receivers[i], _amount / 20);
        }
    }
}
 

Комментарии:

1. Спасибо за помощь! Как мне выполнить эту часть «Ваш скрипт на python (или любой другой клиент, программное обеспечение для кошелька, скрипт JS и т. Д.) Затем генерирует 10 адресов и передает их в аргументе». Кроме того, это всего лишь небольшая побочная задача, которую мне было любопытно выполнить, поэтому безопасность не должна быть серьезной проблемой.

2. @Рис Я добавил пример JS (потому что я лучше разбираюсь в JS, чем в Python), надеюсь, это поможет.

3. Ценю это, я попробую адаптировать его к python и посмотрю, что у меня получится

4. Я не смог заставить web3.eth.accounts.create() работать, поэтому вместо этого я использовал from eth_account import Account и следующий код addresses = []; i = 0 while i < 10: acct = Account.create('KEYSMASH FJAFJKLDSKF7JKFDJ 1530') address = acct.address i = 1 contract.functions.mint(10000000000, addresses).call() , однако я не уверен, как ввести номер токена и адреса и продолжать получать ошибку Function invocation failed due to no matching argument types . Ты знаешь, как с этим разобраться?