【问题标题】:How do I generate wallets and transfer/mint tokens to them using python/solidity?如何使用 python/solidity 生成钱包和转移/铸造代币给他们?
【发布时间】:2021-08-28 07:36:37
【问题描述】:

我制作了一个简单的 bep 20 代币,我正在尝试铸造我的钱包地址 50% 的代币供应,并将剩余 50% 的供应平均分配给我想用代码生成的 10 个不同的钱包。我不确定这是否可以在合同本身内完成,还是必须在部署合同后通过 python 单独完成。

这里是solidity代码:


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

【问题讨论】:

    标签: python solidity smartcontracts bep20


    【解决方案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%)。

    另外,我的示例中没有授权,因此任何人都可以执行此功能。您可能还想实现授权(例如使用ownable 模式),或将函数标记为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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助!我该怎么做这部分'你的 python 脚本(或任何其他客户端、钱包软件、JS 脚本等)然后生成 10 个地址并在参数中传递它们。此外,这只是我很好奇的一项小任务,因此安全性不应该是一个大问题。
    • @Reece 我已经添加了一个 JS 示例(因为我在 JS 中比在 Python 中更好),希望它有所帮助。
    • 欣赏它,我会尝试将它改编为python,看看我能用它做什么
    • 我无法让 web3.eth.accounts.create() 工作,所以我改用 from eth_account import Account 和以下代码 addresses = []; i = 0 while i &lt; 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。你知道如何解决这个问题吗?
    猜你喜欢
    • 2022-06-20
    • 2022-12-18
    • 2020-11-07
    • 2018-03-26
    • 2022-10-25
    • 2020-10-15
    • 2022-01-22
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多