🎉 This is a beta version only. feeel free!

Docs
Smart Contract
Example
NFT

NFT

// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.22;

import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {ERC721URIStorage} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

// 1. import
interface OpenOracle {
    function getPrice(uint256 feedID) external view returns (uint256);
}

contract NFT_with_OO_Price is ERC721, ERC721URIStorage, Ownable {

    // 2. variable
    OpenOracle public openoracle;
    // +
    address public OO_ADDRESS;
    uint256 public FEED_ID;

    using Counters for Counters.Counter;
    Counters.Counter public _tokenIdCounter;
    uint256 MAX_SUPPLY = 10000;

    constructor(address _ooAddress, uint256 _feedId) Ownable(msg.sender) ERC721("MyToken", "MTK") {
        // 3. constructor
        openoracle = OpenOracle(OO_ADDRESS); // edit: address
        // +
        OO_ADDRESS = _ooAddress;
        FEED_ID = _feedId;
    }

    function mint() public payable {
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId < MAX_SUPPLY, "Sorry, all NFTs have been minted!");

        // 4. Use (build in your function (payable))
        uint256 price = openoracle.getPrice(FEED_ID); // edit: number
        require(msg.value >= price, "Insufficient funds");

        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
    }

    // + updateOracleAddress
    function updateOracleAddress(address _ooAddress) public onlyOwner {
        OO_ADDRESS = _ooAddress;
        openoracle = OpenOracle(OO_ADDRESS);
    }

    // + updateOracleFeedId
    function updateOracleFeedId(uint256 _feedId) public onlyOwner {
        FEED_ID = _feedId;
    }

    function safeMint(address to, uint256 tokenId, string memory uri)
        public
        onlyOwner
    {
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://your-ipfs-metadata/";
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}