如何在合约上使用balanceOf()创建挖矿限制



我是新手,也在努力学习,在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");

更新后不再更改