Thank you guys so much for everything you do. Been following Ivan On Tech’s Youtube channel since his first episode & have learned so much about blockchain & coding from him. If you are able to answer some questions, could use help with a few things. Right now im building an OpenSea fork for the Binance Smart Chain utilizing moralis & ethereum-nft-marketplace-boilerplate as well as marketplaceBoilerplate.sol. Would like to setup our native BEP-20 token BETTA (https://bscscan.com/address/0xaa6971b46E57Ccc0814f498b89d23802305d16E7#code) as the primary pair for the exchange of NFTs on our fork as well as BNB. Wondering how I could set this up utilizing Visual Studio Code & solidity? Been following this YouTube tutorial https://www.youtube.com/watch?v=WZWCzsB1xUE as well as “create-an-opensea-clone-build-an-nft-marketplace-like-opensea” article & I have dug through your forums but was unable to figure out the best solution.
Realize that it is possible to do & that it would require 2 approvals to send properly (1 for BETTA token & 1 for BNB). Just wondering exactly how to implement that into the boilerplate contract itself in visual studio code so that it can be deployed properly.
Will this work?
// SPDX-License-Identifier: MIT LICENSE
import “@openzeppelin/contracts/access/Ownable.sol”;
import “@openzeppelin/contracts/token/ERC20/IERC20.sol”;
import “@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol”;
pragma solidity ^0.8.0;
contract Collection is ERC721Enumerable, Ownable {
struct TokenInfo {
IERC20 paytoken;
uint256 costvalue;
}
TokenInfo[] public AllowedCrypto;
using Strings for uint256;
string public baseURI;
string public baseExtension = ".json";
uint256 public maxSupply = 1000;
uint256 public maxMintAmount = 5;
bool public paused = false;
constructor() ERC721("Net2Dev NFT Collection", "N2D") {}
function addCurrency(
IERC20 _paytoken,
uint256 _costvalue
) public onlyOwner {
AllowedCrypto.push(
TokenInfo({
paytoken: _paytoken,
costvalue: _costvalue
})
);
}
function _baseURI() internal view virtual override returns (string memory) {
return "ipfs://EE5MmqVp5MmqVp7ZRMBBizicVh9ficVh9fjUofWicVh9f/";
}
function mint(address _to, uint256 _mintAmount, uint256 _pid) public payable {
TokenInfo storage tokens = AllowedCrypto[_pid];
IERC20 paytoken;
paytoken = tokens.paytoken;
uint256 cost;
cost = tokens.costvalue;
uint256 supply = totalSupply();
require(!paused);
require(_mintAmount > 0);
require(_mintAmount <= maxMintAmount);
require(supply + _mintAmount <= maxSupply);
if (msg.sender != owner()) {
require(msg.value == cost * _mintAmount, "Not enough balance to complete transaction.");
}
for (uint256 i = 1; i <= _mintAmount; i++) {
paytoken.transferFrom(msg.sender, address(this), cost);
_safeMint(_to, supply + i);
}
}
function walletOfOwner(address _owner)
public
view
returns (uint256[] memory)
{
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory tokenIds = new uint256[](ownerTokenCount);
for (uint256 i; i < ownerTokenCount; i++) {
tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
}
return tokenIds;
}
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory) {
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
string memory currentBaseURI = _baseURI();
return
bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
: "";
}
// only owner
function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() {
maxMintAmount = _newmaxMintAmount;
}
function setBaseURI(string memory _newBaseURI) public onlyOwner() {
baseURI = _newBaseURI;
}
function setBaseExtension(string memory _newBaseExtension) public onlyOwner() {
baseExtension = _newBaseExtension;
}
function pause(bool _state) public onlyOwner() {
paused = _state;
}
function withdraw(uint256 _pid) public payable onlyOwner() {
TokenInfo storage tokens = AllowedCrypto[_pid];
IERC20 paytoken;
paytoken = tokens.paytoken;
paytoken.transfer(msg.sender, paytoken.balanceOf(address(this)));
}
}
Where is this contract from? Yes you would need an approve of a set amount of said ERC20 token first so your contract can use it. BNB would just be native so you wouldn’t need approve for that.