问题标签 [openzeppelin]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ethereum - 从其他智能合约铸造新的 ERC20 代币
最近,我在开发具有 Staking 功能的智能合约时遇到了一个问题。通过 IERC20 接口,我设法与另一个合约中的 Erc20 代币进行交互,但仍然存在一个困惑。我正在开发一个智能合约,用户可以在智能合约中质押我的代币(代币已经部署在网络中),当质押期限结束时,利益相关者可以获得他们的质押金额以及奖励代币。对于奖励代币,我想铸造新代币,以在我的智能合约中向利益相关者提供奖励。如何在另一个智能合约中使用 mint 功能?我想在我的 Staking 智能合约中使用 Erc20 mint 功能。等待您的积极回应。
转移和批准工作正常,但在 IERC20 中没有薄荷选项
ethereum - 使用 BaseURI 在 IPFS 上存储 NFT 元数据,我可以在生成令牌时动态更新 JSON 吗?
我正在尝试创建一个包含 10,000 个(ERC-721)令牌的集合,其元数据存储在 IPFS 上。与令牌关联的每个图像都将使用其唯一的 CDI 预先上传到 IPFS。
由于不会一次全部生成令牌,因此首先我希望每个元数据 json 为空并链接到占位符图像。
我的问题是:如果没有在我的合同中设置特定的 TokenURI(我想避免),如何在铸造时更改与令牌关联的 json 文件,而不更改所有令牌必须通用的 BaseURI?
这是它应该如何工作的:
我想它应该涉及 IPNS,但我找不到关于最佳实践的具体指南。尽管我看到这种方法一直都在使用,例如甚至被 Bored Ape Yacht Club 系列所使用。
blockchain - OpenZeppelin Context.sol 智能合约是抽象的,为什么?
我正在研究这个 OZ 智能合约:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
如您所见,它只有两个函数来处理 metatxs。我不明白为什么这个合约被定义为抽象的,因为这两个功能都实现了。在此先感谢大家!
ethereum - 找出 ERC20 合约中的地址
我正在编写一个 ERC20 合约,它允许另一个 ERC20 能够使用我的合约,并且不确定如何在下面给出的场景中获取特定地址。
说我的合同是CoinA
,别人的合同是PartnerCoin
。我被代理了,他们可能会也可能不会(在这种情况下,我已经知道他们是否被代理了)。假设我使用 OpenZeppelin 作为我的代理。我代币的代理合约地址是 0x123,他们的代币合约(或代理)地址是 0x456。可以说,如果PartnerCoin
被代理了,那么它们的实现地址就是0x192。
人 Bob 来了,想把他的 10 个转给PartnerCoin
他的朋友 John。Bob 的钱包地址是 0x987,John 的钱包地址是 0x654。PartnerCoin
对它的传输函数有一个要求,它必须从它可以调用的公共函数接收特定的响应CoinA
,否则它不会传输。它调用函数,我们将调用它SuperFunction
,onCoinA
并等待响应。
我只想PartnerCoin
能够打电话SuperFunction
,至少现在是这样,而且我知道PartnerCoin
地址是什么。
在我的实施合同中,比如 0x384,我相信是这样的:
msg.sender
会返回 0x123,我自己的代理,因为我的代理正在调用我的实现,对吗?
_msgSender()
将返回 0x987,因为他们是实际的最终用户。
什么会返回 0x456,PartnerCoin
的合约地址,以便CoinA
检查它确实PartnerCoin
是在调用SuperFunction
,而不是其他硬币?
感谢您的帮助!
upgrade - 升级后智能合约所有者为0x0
我正在使用 Hardhat 和 OpenZeppelin 可升级合同。到目前为止,部署合约 V1 时一切正常。但是,当我升级到 V2 时,出于某种原因,所有者设置为地址 0x0。预期的行为是合约的所有者应该保持不变,因为升级是由所有者发起的。
./scripts/prepare_upgrade.js
我在这里想念什么?
openzeppelin - ERC1155 和钱包余额
好奇钱包(例如元掩码/其他)究竟是如何知道可能在其所有权下的任何 ERC1155 代币的?
例如,我可能有一个 ERC1155 合同,它发出 100000 个不同类型的令牌(每个都有不同的 tokenId)
ERC1155 接口确实有一个balanceOf(account, id)
功能,但这当然需要钱包预先了解各种 tokenId 才能使用它。
钱包可以监听钱包地址的所有 TransferSingle 事件并从中获取代币余额,但这肯定也是有问题的,因为代币可能已经转移到其他钱包。
可以在合约中维护一个映射,该映射维护一个地址持有的 tokenIds,例如
mapping(address => uint256[] ) tokenIdsInWallet
虽然这可以工作,但它不是标准的接口功能,所以钱包不会知道它
ethereum - 交易完成,但 NFT 未转移
我创建了一个智能合约,铸造了一个 nft,现在尝试转移它。我的问题是交易完成得很好——我可以在 etherscan 等中看到它,但 nft 没有被转移。可能的根本原因是什么?
还有合同。我实际上并没有调用传输函数,因为我期望使用 openzeppelin transferFrom 函数。但是如果我使用合同中的转移函数 - 结果是一样的:
交易被执行
NFT 不会被转移。
}
solidity - 限制公众只铸造一个 ERC721 代币 (NFT) 且铸币价格为零的 Solidity 功能?
我想请求一些帮助来开发一个铸币功能,该功能限制公共用户只铸币一个,铸币价格为 0(不包括汽油费)的 NFT - 在促销赠品的情况下。这甚至可能吗?我欢迎任何建议,甚至是补充集中式解决方案。
到目前为止,这是我的功能。目前,我可以限制免费铸币 NFT 数量的唯一方法是合约所有者执行铸币。但我希望公共用户执行此功能,特别是如果免费 NFT 的数量很多,因此会产生相关的 gas 费用。它基于 OpenZeppelin 合约:
inheritance - 在solidity中覆盖函数,访问内部函数
我想从Ownable覆盖 transferOwnership但是,内部函数 _transferOwnership 未被识别。我要么必须有办法调用它,要么直接更改 _transferOwnership。