Adding Native ERC-20/BEP-20 Token As Primary Trading Pair Instead of only ETH or BNB for marketplaceBoilerplate.sol contract

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 ( 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 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 {
            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(_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)
    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)
    returns (string memory) {
            "ERC721Metadata: URI query for nonexistent token"
            string memory currentBaseURI = _baseURI();
            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.