我如何使用 python/solidity 生成钱包并向他们转移/铸造代币?

时间:2021-06-11 10:46:42

标签: python solidity smartcontracts bep20

我制作了一个简单的 bep 20 代币,我正在尝试将代币供应量的 50% 分配给我的钱包地址,并在我想用代码生成的 10 个不同钱包之间平均分配剩余的 50% 供应量。我不确定这是否可以在合同本身内完成,还是必须在合同部署后通过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 个答案:

答案 0 :(得分:0)

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

您的 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(以便任何人都无法执行)并仅从 { {1}}。

constructor()