如何將變數作為字元串傳遞給可靠的建構子
我目前正在開發一個 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 合約,但未修改的程式碼將它們(名稱和符號)傳遞進去。
所以我的問題如下;
- 如何將變數作為字元串傳遞給可靠的建構子
- 我的程式碼在正確的軌道上嗎?以及我需要對我的程式碼進行哪些更改才能使其正常工作
- openZeppelin ERC721 合約不支持這個嗎?
- 我是不是走錯了路,你認為我問錯問題了嗎
請幫忙
嘗試這個:
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)**
通過簡單的改變
tokenName
和tokenSymbol
到_tokenName
和_tokenSymbol
我做錯了什麼(上一個問題的原因)。我試圖將字元串變數而不是字元串文字傳遞給建構子。
我的程式碼的邏輯是
. 收集使用者輸入:
string memory _tokenName, string memory _tokenSymbol
. 將輸入儲存在變數中(tokenName 和 tokenSymbol):
tokenName = _tokenName, tokenSymbol = _tokenSymbol
. 將變數的輸入傳遞給 ERC721 建構子:
ERC721 ( tokenName, tokenSymbol)
這是錯誤的而它應該是
. 收集使用者輸入:
_tokenName, _tokeSymbol
. 將輸入傳遞給建構子:
ERC721 ( _tokenName, _tokenSymbol)
正確的通過將使用者輸入直接傳遞給 ERC721 建構子,我能夠解決這個問題。