如何创建erc20令牌生成器,其中创建合约的帐户地址是唯一erc20合约地址的令牌持有人?



我正在尝试制作一个令牌生成器,我以以下方式制作了两个合约:

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) { 
_mint(msg.sender, 1000);
}
}

TokenGenerator合同:

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./ERC20.sol";
contract TokenGenerator{ 

function generateToken(string memory name, string memory symbol) public returns(address){
Token token = new Token(name, symbol);
address myAddress = address(token);
return myAddress;
}
}

然而,我正在努力理解如何在前端使用它。我通常的做法是部署合约并使用该abi生成更多令牌,在这种情况下,令牌持有者是部署的合约地址,而不是生成令牌的账户。我如何生成一个令牌,每当用户单击生成时,就会生成一个新的令牌智能合约,令牌持有人是用户帐户地址?

我建议你:

  1. emit关于generateToken事务执行的一些事件。因此,您将能够在您的UI上订阅此事件,并跟踪新生成的Token合同

  2. 跟踪区块链侧生成的Token合约地址,以便于区块链外部访问

    contract TokenGenerator {
    address[] public allTokens;
    event TokenGeneration(address indexed tokenAddress);
    function generateToken(string memory name, string memory symbol) public returns (address) {
    Token token = new Token(name, symbol);
    address myAddress = address(token);
    // Add the address of generated Token contract to the allTokens array
    allTokens.push(myAddress);
    // Emit event with the address of generated Token contract
    emit TokenGeneration(myAddress);
    return myAddress;
    }
    }
    

现在:

  1. 从您的UI中,您可以订阅TokenGeneration事件,以便在生成新的令牌合约时获得通知
  2. 从您的UI中,您可以使用allTokens数组访问所有生成的令牌合约地址

所有Token合约的ABI将是相同的。

我在部署合约并使用部署的合约地址调用generateToken函数时犯了一个错误。通过这种方法,合约地址成为msg.sender,而不是与智能合约交互的账户地址。我做了以下操作,将帐户地址作为令牌持有人,并在每次有人单击生成令牌按钮时生成一个新地址:

const generateToken = async () => {
try {
const { ethereum } = window;
if (ethereum) {
const provider = new ethers.providers.Web3Provider(ethereum);
const signer = provider.getSigner();
const factory = new ethers.ContractFactory(Token.abi, bytecode, signer);
const tokenGeneratorContract = await factory.deploy(name, symbol);
await console.log("Token Address:", tokenGeneratorContract.address);
} else {
console.log("Ethereum object doesn't exist!");
}
} catch (error) {
console.log(error);
}
};

我不需要使用TokenGenerator合约,只使用Token合约、它的ABI和字节码来部署合约。所以一般来说,一个人会有私钥来部署合约。来自ethers.js的Signer允许创建一个函数,客户端可以直接通过他们的Metamask帐户部署合约,而无需知道他们的private_key。

相关内容

  • 没有找到相关文章

最新更新