0

我制作了一个简单的 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;
    }
}```
4

1 回答 1

0

您可以通过mint()将前 50% 分配给msg.sender(或硬编码地址)并将其他 50% 分配给函数参数中传递的 10 个地址的方式来实现函数。

您的 python 脚本(或任何其他客户端、钱包软件、JS 脚本等)会生成 10 个地址并在参数中传递它们。使用web3库的 JS 示例:

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);
        }
    }
}
于 2021-06-11T11:16:18.373 回答