尝试运行:
\n1.) Dappuniversity 项目 (dappuniversity/dbank)\n2.) pet-shop-tutorial
\nTruffle v5.3.3(核心:5.3.3)\nNode v14.15.5
\n当 Truffle 要求 it\xe2\x80\x99s 编译器/solc 匹配 5.3.3 时,ser 如何在 0.8.4 编译代码以导入 OpenZeppelin\xe2\x80\x99s ERC20.sol 模板?
\n// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.4;\n\nimport "@openzeppelin/contracts/token/ERC20/ERC20.sol";\n\ncontract Token is ERC20 {\n\n //add minter variable\n\n //add minter changed event\n\n constructor() public payable ERC20("Name", "Symbol") {\n\n //assign initial minter\n\n }\n\n //Add pass minter role function\n\n function mint(address account, uint256 amount) public {\n\n //check if msg.sender has a minter role\n\n _mint(account, amount);\n\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n未找到源 \xe2\x80\x9c@openzeppelin/contracts/token/ERC20/ERC20.sol\xe2\x80\x9d:不支持文件导入回调
\n我在安全帽控制台中创建了一个合约实例,如下所示:
\nconst contract_fac = await ethers.getContractFactory("ContractName");\nconst contract = await contract_fac.attach("CONTRACTADDR...");\nRun Code Online (Sandbox Code Playgroud)\n合约对象具有除 之外的所有公共/外部函数safeTransferFrom。为什么?
当我用它调用它时,它contract.safeTransferFrom(\xe2\x80\xa6)会抛出 JavaScript 错误 \xe2\x80\x9csafeTransferFrom 不是函数\xe2\x80\x9d。这是一个错误还是我不明白什么?safeTransferFrom函数在 ABI 中列出。
我使用未做任何更改的 OpenZeppelin (v. 4.2) 721 令牌模板、Ethers.js (v. 5.4.1) 和 Hardhat (v. 2.4.1)。
\n更新: \n问题已解决。safeTransferFrom 是一个重载函数。在 ethers 中,调用重载合约函数的语法与非重载函数不同。\n Ethers.js doc
\n错误的:
\ncontract.safeTransferFrom(addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n正确的:
\ncontract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n 我试图用参数验证我的合同,但收到此错误:
Error in plugin @nomiclabs/hardhat-etherscan: The contract verification failed.
Reason: Fail - Unable to verify
Run Code Online (Sandbox Code Playgroud)
我还导入Open Zeppelin合同ERC721Enumerable和Ownable.
这是我的NFTCollectible.sol
pragma solidity 0.8.10;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "hardhat/console.sol";
contract NFTCollectible is ERC721Enumerable, Ownable {
using Strings for uint256;
string public baseURI;
string public baseExtension = ".json";
uint256 public cost = 0.08 ether;
uint256 public maxSupply = 5000;
uint256 public maxMintAmount = 25;
mapping(address => uint256) public addressMintedBalance;
constructor(
string memory _name,
string memory _symbol, …Run Code Online (Sandbox Code Playgroud) 我很难理解为什么以及何时在 NFT 生成合约上调用 SetApprovalForAll。
以酷猫为例。为了方便起见,下面有相关交易的屏幕截图。
我注意到,对于此合同和其他合同,反复调用“Set Approval For All”。根据我自己对允许铸造的合约的有限经验,via _safeMint,我也在日志中看到了 SetApprovalForAll 交易。它没有在我的代码中直接调用。
为什么这么称呼它?钱包是否将其作为铸造过程的一部分?
我遇到了以太签名不匹配的问题。
一切正常。已经将js 代码中的domainData, types,变量与合约进行了比较。message
下面是生成签名和调用合约的JS代码。
const contractAddress = await contract.address;
domainData.chainId = 31337;
domainData.verifyingContract = contractAddress;
const signature = await signer._signTypedData(domainData, types, message);
const { r, s, v } = ethers.utils.splitSignature(signature);
const result = await contract.recoverAddressFromTypedData(
message,
v,
r,
s
);
expect(result).to.equal(signer.address);
Run Code Online (Sandbox Code Playgroud)
下面是使用“@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol”的 Solidity 代码
function recoverAddressFromTypedData(
Bid memory bid,
uint8 v,
bytes32 r,
bytes32 s
) public view returns (address) {
bytes32 digest = _hashTypedDataV4(hashBid(bid));
address signer = ecrecover(digest, v, r, s);
return signer;
} …Run Code Online (Sandbox Code Playgroud) 我正在测试 ERC721 代币的智能合约,该代币继承自 OpenZeppelin,使用 waffle 和 chai 以及 NodeJS v14.18.0,但 chai 的恢复断言似乎没有按预期运行。
依赖项:
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.1",
"@nomiclabs/hardhat-etherscan": "^2.1.0",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@typechain/ethers-v5": "^5.0.0",
"@types/chai": "^4.2.14",
"@types/mocha": "^8.2.0",
"@types/node": "^14.14.14",
"chai": "^4.2.0",
"dotenv": "^8.2.0",
"ethereum-waffle": "^3.2.1",
"ethers": "^5.0.24",
"hardhat": "^2.0.5",
"hardhat-typechain": "^0.3.4",
"ts-generator": "^0.1.1",
"ts-node": "^9.1.1",
"typechain": "^4.0.1",
"typescript": "^4.1.3"
},
Run Code Online (Sandbox Code Playgroud)
示例代码:
let genesisTokenHolders: Array<string>;
beforeEach(async () => {
genesisTokenHolders = new Array(230).fill('0x0000000000000000000000000000000000000000')
genesisTokenHolders[1] = addr1.address;
genesisTokenHolders[2] = addr2.address;
})
describe('airdrop genesis tokens', async () => {
it('should fail when non-owner …Run Code Online (Sandbox Code Playgroud) 我已使用 Solidity 扩展将 Open Zeppelin ERC721 令牌标准导入到我的 VS Code 中,但在我的所有 OZ 导入语句中看到以下警告:
为什么会发生这种情况以及此警告的解决方法是什么?
我尝试过的:
对于智能合约开发,Openzeppelin SDK 和 Truffle 有什么区别?我什么时候应该使用一种或另一种,或两者一起使用?
我正在使用“@openzeppelin/truffle-upgrades”插件来创建可升级的合同。第一次这样做,并以他们在网站上的文章为基础。https://docs.openzeppelin.com/learn/upgrading-smart-contracts
一切都编译正确,但每当我迁移“未找到所请求的合同。确保源代码可用于编译”时,3_deploy_upgradeable_box.js 就会吐出此错误,或者查看此屏幕截图https://gyazo.com/f4b8d8afea69b67965670b520e48db13
这是我的代码
// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
contract Box is Ownable {
uint256 private value;
// Emitted when the stored value changes
event ValueChanged(uint256 _value);
// Store a new value in the contract, only the owner can call this
function store(uint256 _value) public onlyOwner {
value = _value;
emit ValueChanged(_value);
}
// Retrieve the last stored value
function retrieve() public view returns(uint256) {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
// migrations/2_deploy.js
const Box …Run Code Online (Sandbox Code Playgroud) 我是 NFT 新手,我正在尝试创建测试 NFT,当我尝试部署该 NFT 时,我收到此错误,insufficient funds for intrinsic transaction cost即使我的帐户中有 1 ETH 余额,但我已附加了它的完整代码,可以有人请帮助我,如何解决这个问题?MyNFT.sol
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("MyNFT", "NFT") {}
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
Run Code Online (Sandbox Code Playgroud)
安全帽.config.js
/**
* @type import('hardhat/config').HardhatUserConfig …Run Code Online (Sandbox Code Playgroud)