我是新手,也在努力学习,在NFT的极限铸币方面遇到了困难。
我的合同编码如下:
> function mint(uint256 quantity_) public payable{
> require(isPublicMintEnabled, 'minting not enabled');
> require(msg.value == quantity_ * mintPrice, 'wrong mint value');
> require(totalSupply + quantity_ <= maxSupply, 'sold out');
> require(walletMints[msg.sender] + quantity_ <= maxPerWallet, 'exceed max wallet');
>
> for(uint256 i = 0; i < quantity_; i++){
> uint256 newTokenId = totalSupply + 1;
> totalSupply++;
> _safeMint(msg.sender, newTokenId);
> }
> }
和我的minting .js是代码
async function handleMint(){
if(window.ethereum){
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(
NFTAddress,
NFT.abi,
signer
);
try{
const response = await contract.mint(BigNumber.from(mintAmount), {
value: ethers.utils.parseEther((0 * mintAmount).toString()),
});
console.log('response', response);
} catch(err){
console.log("error: ", err)
}
}
}
这个限制地址只能生成一个特定的数字,但是当用户重复这个过程时,它会覆盖maxPerWallet。我在想我能不能像
if(balanceOf("address") > 2){
console.log('you already mint 2', response);
}
else{
console.log('you can mint 2', response);
}
我怎么把它翻译成我的js?
---------------------- 回答 -------------
我刚加了
mapping(address => uint256) public walletMints;
,我仍然无法得到输出。我的js是这样写的:
const MainMint = ({ accounts}) =>{
const[mintAmount] = useState(1);
const isConnected = Boolean(accounts[0]);
async function handleMint(){
if(window.ethereum){
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(
NFTAddress,
NFT.abi,
signer
);
const amount = await contract.walletMints(signer.address);
try{
if(amount < 2){
const response = await contract.mint(BigNumber.from(mintAmount), {
value: ethers.utils.parseEther((0 * mintAmount).toString()),
});
console.log('response', response);
}
else{
console.log('Mint Max');
}
}
catch(err){
console.log("error: ", err);
}
}
}
如果您使用钱包余额,您可能无法正确检查钱包的铸币数量,因为余额只告诉您钱包当前有多少代币。
我认为你应该创建一个映射来存储每个钱包的币数。在您的智能合约中创建每个钱包的薄荷量的公共映射:
mapping(address => uint) public walletMints;
然后当用户薄荷时,你需要将这个数量添加到地址:
walletMints[msg.sender] = walletMints[msg.sender] + quantity_
当你创建一个公共映射时,智能合约会自动为这个映射创建一个getter,你可以在你的javascript代码中使用它,并检查钱包的薄荷数量。
使用以太币,你可以在javascript代码中调用这个函数,传递钱包地址作为参数:const amount = await contract.walletMints(signer.address)
并验证您计划的数量是否允许:
if(amount > 2){
console.log('you already mint 2');
}
else{
console.log('you can mint 2');
}
你应该使用:
walletMints[msg.sender] += quantity_;
require(walletMints[msg.sender] <= maxPerWallet, "exceed max wallet");
更新后不再更改