Openzeppelin-Sdk

編譯後無法將 undefined 或 null 轉換為對象

  • May 11, 2021

我的智能合約項目已經初始化,oz init我只有一個合約。執行後oz compile我收到一條錯誤消息Cannot convert undefined or null to object

的完整輸出oz compile

✖ Compiling contracts with solc 0.8.4 (commit.c7e474f2)
Cannot convert undefined or null to object

這不是編譯錯誤。如果存在編譯問題,這將以預期的方式顯示。

為了隔離錯誤來源,我創建了一個只有一份契約的空項目。

環境

  • MacOS 大蘇爾 11.2.3 (20D91)
  • 節點 v14.13.0
  • npm 6.14.7

文件夾內容為:

  • .openzeppelin

    • 項目.json
  • 契約

    • 令牌.sol
  • 網路.js

  • 節點模組

  • 包-lock.json

  • 包.json

項目.json

{
 "manifestVersion": "2.2",
 "contracts": {},
 "dependencies": {},
 "name": "net2u-token",
 "version": "1.0.0",
 "compiler": {
   "compilerSettings": {
     "optimizer": {}
   },
   "typechain": {
     "enabled": false
   }
 },
 "telemetryOptIn": true
}

包.json

{
 "name": "token",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
   "test": "oz compile && mocha --exit --recursive test"
 },
 "author": "",
 "license": "MIT",
 "devDependencies": {
   "@openzeppelin/cli": "^2.8.2",
   "@openzeppelin/contracts": "^4.1.0"
 }
}

令牌.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Net4uToken is Ownable, ERC20 {
   constructor (string memory name_, string memory symbol_) ERC20(name_, symbol_) Ownable() {}
}

網路.js

module.exports = {
 networks: {
   development: {
     protocol: 'http',
     host: 'localhost',
     port: 8545,
     gas: 5000000,
     gasPrice: 5e9,
     networkId: '*',
   },
 },
};

我可以使用 solc 0.7.5 和npx oz compile.

令牌.sol:

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.5;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Net4uToken is Ownable, ERC20 {
   constructor (string memory name_, string memory symbol_) ERC20(name_, symbol_) Ownable() {}
}

項目.json:

{
 "manifestVersion": "2.2",
 "contracts": {},
 "dependencies": {},
 "name": "net2u-token",
 "version": "1.0.0",
 "compiler": {
   "compilerSettings": {
     "optimizer": {
       "enabled": false,
       "runs": "200"
     }
   },
   "typechain": {
     "enabled": false
   },
   "manager": "openzeppelin",
   "solcVersion": "0.7.5",
   "artifactsDir": "build/contracts",
   "contractsDir": "contracts"
 },
 "telemetryOptIn": false
}

我還@openzeppelin/contracts使用 : 更改了包版本以匹配 solc 0.7.5 npm i @openzeppelin/contracts@3.4.0

我無法使用 solc 0.7.6 和 0.8.x 版本進行編譯,並且遇到與您相同的錯誤:Cannot convert undefined or null to object

我還嘗試從文件中編譯範例智能合約,這是相同的場景:我可以使用 0.7.5 編譯,但不能使用更新的 solc 版本。

這可能是因為 OpenZeppelin SDK 不再維護。從他們的文件:

OpenZeppelin SDK 沒有被積極開發。我們建議改用升級外掛。有關更多資訊,請參閱建構互操作性:為什麼我們專注於升級外掛。

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