Nft

如何將變數作為字元串傳遞給可靠的建構子

  • July 3, 2022

我目前正在開發一個 NFT 項目,使用 nfts 的 openzeppelin ERC721 標準。

從 openzeppelin 繼承 ERC721 NFT 合約標準時,您需要在建構子中為 nft 傳入“tokenName”和“tokenSymbol”。

我的問題是,為了做到這一點,我需要在部署之前將 nft 的名稱和符號**硬編碼到契約中。**此程式碼片段來自一個 NFT 合約,該合約將由另一個合約(主合約)控制,我需要能夠將資訊(例如 tokenName 和 tokenSymbol)從主合約傳遞到 nft 合約

將 tokenName 和 tokenSymbol 硬編碼到這個 nft 合約中是一個問題。

當我從主合約部署合約時,我希望能夠給 NFT 一個動態名稱和符號,而不是硬編碼。

堅固性版本 0.8.4

這是來自 openzeppelin 的正常 ERC721 建構子;代幣名稱“元界代幣”和符號“METT”被硬編碼到合約中。

constructor (address marketPlaceAddress) ERC721 ("Metaverse Tokens", "METT") {
   contractAddress = marketPlaceAddress;
}

這是我修改後的程式碼;代幣名稱和符號作為輸入從合約中的建構子收集。

// 導入 erc721 代幣標準 import “@openzeppelin/contracts/token/ERC721/ERC721.sol”;

// 導入擴展以設置令牌 uri import “@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol”;

contract NFT is ERC721URIStorage { // NFT 分發器地址的合約地址 contractAddress; // 跟踪令牌 uint256 public tokenCount; 字元串公共令牌名稱;字元串公共令牌符號;

constructor (address Dispenser, string memory _tokenName, string memory _tokenSymbol) 
ERC721 (  tokenName  ,  tokenSymbol) {
   // use Dispenser address to deploy NFT contract 
   contractAddress = Dispenser;
   // set the name of the token
   tokenName = _tokenName;
   // set the symbol of the token
   tokenSymbol = _tokenSymbol;
   // set the tokenCount to 0 on deployment 
   tokenCount = 0;
}

我的程式碼的問題是它沒有將名稱和符號傳遞給它繼承的 ERC721 合約,但未修改的程式碼將它們(名稱和符號)傳遞進去。

所以我的問題如下;

  1. 如何將變數作為字元串傳遞給可靠的建構子
  2. 我的程式碼在正確的軌道上嗎?以及我需要對我的程式碼進行哪些更改才能使其正常工作
  3. openZeppelin ERC721 合約不支持這個嗎?
  4. 我是不是走錯了路,你認為我問錯問題了嗎

請幫忙

嘗試這個:

   string tokenName = "TokenName";
   string tokenSymbol = "TKS";
    address contractAddress;

   constructor (address Dispenser,) ERC721 (  tokenName  ,  tokenSymbol) 
  {
         //your other codes here, excluding token name and symbol//
         contractAddress = Dispenser;

    }

您的方法不起作用,因為建構子在部署時執行,並且您的 ERC721 繼承契約需要令牌名稱和符號,並且在您導入它之後也將其設置在它自己的建構子中..我建議您看看向上Erc721.sol

另一種方法是

   constructor() ERC721("TokenName", "Symbol") {
       //your other codes here
   }

大聲笑我想我剛剛找到了解決方案。

對於任何可能有同樣問題的人

問題的解決方案是

constructor (address Dispenser, string memory _tokenName, string memory _tokenSymbol) 
**ERC721 (  _tokenName  ,  _tokenSymbol)**

通過簡單的改變tokenNametokenSymbol_tokenName_tokenSymbol

我做錯了什麼(上一個問題的原因)。我試圖將字元串變數而不是字元串文字傳遞給建構子。

我的程式碼的邏輯是

. 收集使用者輸入:

string memory _tokenName, string memory _tokenSymbol

. 將輸入儲存在變數中(tokenName 和 tokenSymbol):

tokenName = _tokenName, tokenSymbol = _tokenSymbol 

. 將變數的輸入傳遞給 ERC721 建構子:

ERC721 ( tokenName, tokenSymbol) 這是錯誤的

而它應該是

. 收集使用者輸入:

_tokenName, _tokeSymbol 

. 將輸入傳遞給建構子:

ERC721 ( _tokenName, _tokenSymbol) 正確的

通過將使用者輸入直接傳遞給 ERC721 建構子,我能夠解決這個問題。

引用自:https://ethereum.stackexchange.com/questions/131075