diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5b73f2..1e1390b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +## [2.0.0-dev.1](https://github.com/VenusProtocol/oracle/compare/v1.11.0-dev.1...v2.0.0-dev.1) (2024-04-10) + + +### ⚠ BREAKING CHANGES + +* migrate to Solidity 0.8.25 + +### Features + +* migrate to Solidity 0.8.25 ([00d4cd0](https://github.com/VenusProtocol/oracle/commit/00d4cd0fa799ed9b15342f1f66c15c5e8e234b5f)) + +## [1.11.0-dev.1](https://github.com/VenusProtocol/oracle/compare/v1.10.0...v1.11.0-dev.1) (2024-03-22) + + +### Features + +* add Chainlink Oracle for Arbitrum checking Sequencer uptime. ([2ab8e8d](https://github.com/VenusProtocol/oracle/commit/2ab8e8d64fc3d2d8ce86464c48ba2eb4da0ff5a8)) + + +### Bug Fixes + +* VTIME-3 ([82f1e42](https://github.com/VenusProtocol/oracle/commit/82f1e429aa887ba1fdd7787cfe77bee41e4a79f4)) + ## [1.10.0](https://github.com/VenusProtocol/oracle/compare/v1.9.0...v1.10.0) (2024-02-22) diff --git a/contracts/ResilientOracle.sol b/contracts/ResilientOracle.sol index d7f10025..47c729cc 100755 --- a/contracts/ResilientOracle.sol +++ b/contracts/ResilientOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2022 Venus -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "./interfaces/VBep20Interface.sol"; diff --git a/contracts/interfaces/FeedRegistryInterface.sol b/contracts/interfaces/FeedRegistryInterface.sol index a0084f05..bea7778a 100644 --- a/contracts/interfaces/FeedRegistryInterface.sol +++ b/contracts/interfaces/FeedRegistryInterface.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity ^0.8.25; interface FeedRegistryInterface { function latestRoundDataByName( diff --git a/contracts/interfaces/IStETH.sol b/contracts/interfaces/IStETH.sol index 639a27a1..ad7a9a1f 100644 --- a/contracts/interfaces/IStETH.sol +++ b/contracts/interfaces/IStETH.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity ^0.8.25; interface IStETH { function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256); diff --git a/contracts/interfaces/OracleInterface.sol b/contracts/interfaces/OracleInterface.sol index 633c8a38..acf41673 100644 --- a/contracts/interfaces/OracleInterface.sol +++ b/contracts/interfaces/OracleInterface.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity ^0.8.25; interface OracleInterface { function getPrice(address asset) external view returns (uint256); diff --git a/contracts/interfaces/PublicResolverInterface.sol b/contracts/interfaces/PublicResolverInterface.sol index 118cf22c..d89775f4 100644 --- a/contracts/interfaces/PublicResolverInterface.sol +++ b/contracts/interfaces/PublicResolverInterface.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2022 Venus -pragma solidity 0.8.13; +pragma solidity ^0.8.25; interface PublicResolverInterface { function addr(bytes32 node) external view returns (address payable); diff --git a/contracts/interfaces/PythInterface.sol b/contracts/interfaces/PythInterface.sol index 4c477752..e556b3e9 100644 --- a/contracts/interfaces/PythInterface.sol +++ b/contracts/interfaces/PythInterface.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2021 Pyth Data Foundation -pragma solidity 0.8.13; +pragma solidity ^0.8.25; contract PythStructs { // A price with a degree of uncertainty, represented as a price +- a confidence interval. diff --git a/contracts/interfaces/SIDRegistryInterface.sol b/contracts/interfaces/SIDRegistryInterface.sol index 4ffb72d6..f81f6d69 100644 --- a/contracts/interfaces/SIDRegistryInterface.sol +++ b/contracts/interfaces/SIDRegistryInterface.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2022 Venus -pragma solidity 0.8.13; +pragma solidity ^0.8.25; interface SIDRegistryInterface { function resolver(bytes32 node) external view returns (address); diff --git a/contracts/interfaces/VBep20Interface.sol b/contracts/interfaces/VBep20Interface.sol index 4798ac7e..fcf2cb3f 100644 --- a/contracts/interfaces/VBep20Interface.sol +++ b/contracts/interfaces/VBep20Interface.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity ^0.8.25; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; diff --git a/contracts/oracles/BinanceOracle.sol b/contracts/oracles/BinanceOracle.sol index 30105efc..d34d0d78 100755 --- a/contracts/oracles/BinanceOracle.sol +++ b/contracts/oracles/BinanceOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "../interfaces/VBep20Interface.sol"; diff --git a/contracts/oracles/BoundValidator.sol b/contracts/oracles/BoundValidator.sol index f7a7f275..f8b7ac47 100755 --- a/contracts/oracles/BoundValidator.sol +++ b/contracts/oracles/BoundValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "../interfaces/VBep20Interface.sol"; import "../interfaces/OracleInterface.sol"; diff --git a/contracts/oracles/ChainlinkOracle.sol b/contracts/oracles/ChainlinkOracle.sol index 2d7505e3..fe8e3dd8 100755 --- a/contracts/oracles/ChainlinkOracle.sol +++ b/contracts/oracles/ChainlinkOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "../interfaces/VBep20Interface.sol"; import "../interfaces/OracleInterface.sol"; @@ -115,7 +115,7 @@ contract ChainlinkOracle is AccessControlledV8, OracleInterface { * @param asset Address of the asset * @return Price in USD from Chainlink or a manually set price for the asset */ - function getPrice(address asset) public view returns (uint256) { + function getPrice(address asset) public view virtual returns (uint256) { uint256 decimals; if (asset == NATIVE_TOKEN_ADDR) { diff --git a/contracts/oracles/PythOracle.sol b/contracts/oracles/PythOracle.sol index 69df4dfb..c07fab0f 100755 --- a/contracts/oracles/PythOracle.sol +++ b/contracts/oracles/PythOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@openzeppelin/contracts/utils/math/SignedMath.sol"; diff --git a/contracts/oracles/SequencerChainlinkOracle.sol b/contracts/oracles/SequencerChainlinkOracle.sol new file mode 100644 index 00000000..a0580fcd --- /dev/null +++ b/contracts/oracles/SequencerChainlinkOracle.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { ChainlinkOracle } from "./ChainlinkOracle.sol"; +import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +/** + @title Sequencer Chain Link Oracle + @notice Oracle to fetch price using chainlink oracles on L2s with sequencer +*/ +contract SequencerChainlinkOracle is ChainlinkOracle { + /// @notice L2 Sequencer feed + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + AggregatorV3Interface public immutable sequencer; + + /// @notice L2 Sequencer grace period + uint256 public constant GRACE_PERIOD_TIME = 3600; + + /** + @notice Contract constructor + @param _sequencer L2 sequencer + @custom:oz-upgrades-unsafe-allow constructor + */ + constructor(AggregatorV3Interface _sequencer) ChainlinkOracle() { + require(address(_sequencer) != address(0), "zero address"); + + sequencer = _sequencer; + } + + /// @inheritdoc ChainlinkOracle + function getPrice(address asset) public view override returns (uint) { + if (!isSequencerActive()) revert("L2 sequencer unavailable"); + return super.getPrice(asset); + } + + function isSequencerActive() internal view returns (bool) { + // answer from oracle is a variable with a value of either 1 or 0 + // 0: The sequencer is up + // 1: The sequencer is down + // startedAt: This timestamp indicates when the sequencer changed status + (, int256 answer, uint256 startedAt, , ) = sequencer.latestRoundData(); + if (block.timestamp - startedAt <= GRACE_PERIOD_TIME || answer == 1) return false; + return true; + } +} diff --git a/contracts/oracles/WstETHOracle.sol b/contracts/oracles/WstETHOracle.sol index 3d1b9be5..ad2cefb6 100755 --- a/contracts/oracles/WstETHOracle.sol +++ b/contracts/oracles/WstETHOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import { OracleInterface } from "../interfaces/OracleInterface.sol"; import { IStETH } from "../interfaces/IStETH.sol"; diff --git a/contracts/oracles/mocks/MockBinanceFeedRegistry.sol b/contracts/oracles/mocks/MockBinanceFeedRegistry.sol index 0970d6e2..126a2232 100644 --- a/contracts/oracles/mocks/MockBinanceFeedRegistry.sol +++ b/contracts/oracles/mocks/MockBinanceFeedRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "../../interfaces/FeedRegistryInterface.sol"; diff --git a/contracts/oracles/mocks/MockBinanceOracle.sol b/contracts/oracles/mocks/MockBinanceOracle.sol index 62d8ef8c..4872470c 100644 --- a/contracts/oracles/mocks/MockBinanceOracle.sol +++ b/contracts/oracles/mocks/MockBinanceOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { OracleInterface } from "../../interfaces/OracleInterface.sol"; diff --git a/contracts/oracles/mocks/MockChainlinkOracle.sol b/contracts/oracles/mocks/MockChainlinkOracle.sol index 9a06aa46..dfa3f4f3 100644 --- a/contracts/oracles/mocks/MockChainlinkOracle.sol +++ b/contracts/oracles/mocks/MockChainlinkOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { OracleInterface } from "../../interfaces/OracleInterface.sol"; diff --git a/contracts/oracles/mocks/MockPythOracle.sol b/contracts/oracles/mocks/MockPythOracle.sol index 27f31b71..92128b7c 100644 --- a/contracts/oracles/mocks/MockPythOracle.sol +++ b/contracts/oracles/mocks/MockPythOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { IPyth } from "../PythOracle.sol"; diff --git a/contracts/test/AccessControlManager.sol b/contracts/test/AccessControlManager.sol index 5af58a10..47a5ac88 100644 --- a/contracts/test/AccessControlManager.sol +++ b/contracts/test/AccessControlManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@venusprotocol/governance-contracts/contracts/Governance/AccessControlManager.sol"; diff --git a/contracts/test/BEP20Harness.sol b/contracts/test/BEP20Harness.sol index c73e1c87..f1764226 100644 --- a/contracts/test/BEP20Harness.sol +++ b/contracts/test/BEP20Harness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/contracts/test/MockPyth.sol b/contracts/test/MockPyth.sol index b0fcf1fb..cb1aae68 100644 --- a/contracts/test/MockPyth.sol +++ b/contracts/test/MockPyth.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "../interfaces/PythInterface.sol"; diff --git a/contracts/test/MockSimpleOracle.sol b/contracts/test/MockSimpleOracle.sol index b00fb307..0bd5a81a 100644 --- a/contracts/test/MockSimpleOracle.sol +++ b/contracts/test/MockSimpleOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "../interfaces/OracleInterface.sol"; diff --git a/contracts/test/MockV3Aggregator.sol b/contracts/test/MockV3Aggregator.sol index 53d1791b..755c3cc7 100644 --- a/contracts/test/MockV3Aggregator.sol +++ b/contracts/test/MockV3Aggregator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol"; diff --git a/contracts/test/PancakePairHarness.sol b/contracts/test/PancakePairHarness.sol index b39bce78..5cc15b7c 100644 --- a/contracts/test/PancakePairHarness.sol +++ b/contracts/test/PancakePairHarness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; // a library for performing various math operations diff --git a/contracts/test/VBEP20Harness.sol b/contracts/test/VBEP20Harness.sol index 9be7f22b..384e44b9 100644 --- a/contracts/test/VBEP20Harness.sol +++ b/contracts/test/VBEP20Harness.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity 0.8.13; +pragma solidity 0.8.25; import "./BEP20Harness.sol"; diff --git a/deploy/1-deploy-oracles.ts b/deploy/1-deploy-oracles.ts index d24c9a58..9c3edf3e 100644 --- a/deploy/1-deploy-oracles.ts +++ b/deploy/1-deploy-oracles.ts @@ -4,6 +4,8 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { ADDRESSES } from "../helpers/deploymentConfig"; +const ARBITRUM_SEQUENCER = "0xFdB631F5EE196F0ed6FAa767959853A9F217697D"; + const func: DeployFunction = async function ({ getNamedAccounts, deployments, network }: HardhatRuntimeEnvironment) { const { deploy } = deployments; const { deployer } = await getNamedAccounts(); @@ -61,21 +63,39 @@ const func: DeployFunction = async function ({ getNamedAccounts, deployments, ne }, }); - await deploy("ChainlinkOracle", { - contract: network.live ? "ChainlinkOracle" : "MockChainlinkOracle", - from: deployer, - log: true, - deterministicDeployment: false, - args: [], - proxy: { - owner: proxyOwnerAddress, - proxyContract: "OptimizedTransparentProxy", - execute: { - methodName: "initialize", - args: network.live ? [accessControlManagerAddress] : [], + if (network.name === "arbitrum") { + await deploy("SequencerChainlinkOracle", { + contract: "SequencerChainlinkOracle", + from: deployer, + log: true, + deterministicDeployment: false, + args: [ARBITRUM_SEQUENCER], + proxy: { + owner: proxyOwnerAddress, + proxyContract: "OptimizedTransparentProxy", + execute: { + methodName: "initialize", + args: [accessControlManagerAddress], + }, }, - }, - }); + }); + } else { + await deploy("ChainlinkOracle", { + contract: network.live ? "ChainlinkOracle" : "MockChainlinkOracle", + from: deployer, + log: true, + deterministicDeployment: false, + args: [], + proxy: { + owner: proxyOwnerAddress, + proxyContract: "OptimizedTransparentProxy", + execute: { + methodName: "initialize", + args: network.live ? [accessControlManagerAddress] : [], + }, + }, + }); + } const { pythOracleAddress } = ADDRESSES[networkName]; diff --git a/hardhat.config.ts b/hardhat.config.ts index fe340e08..e540a45d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -52,7 +52,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: "0.8.13", + version: "0.8.25", settings: { optimizer: { enabled: true, @@ -129,6 +129,15 @@ const config: HardhatUserConfig = { live: true, accounts: process.env.DEPLOYER_PRIVATE_KEY ? [`0x${process.env.DEPLOYER_PRIVATE_KEY}`] : [], }, + arbitrum: { + url: "https://arbitrum.llamarpc.com/", + chainId: 42161, + live: true, + timeout: 1200000, + accounts: { + mnemonic: process.env.MNEMONIC || "", + }, + }, }, gasReporter: { enabled: process.env.REPORT_GAS !== undefined, diff --git a/package.json b/package.json index 8784a1a5..43512854 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@venusprotocol/oracle", "description": "Venus Protocol Price Oracle", - "version": "1.10.0", + "version": "2.0.0-dev.1", "author": "Venus", "engines": { "node": ">=18.x.x" @@ -38,8 +38,8 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.8", "@openzeppelin/contracts": "^4.6.0", "@openzeppelin/contracts-upgradeable": "^4.7.3", - "@venusprotocol/governance-contracts": "^1.4.0", - "@venusprotocol/solidity-utilities": "1.3.0", + "@venusprotocol/governance-contracts": "^2.0.0", + "@venusprotocol/solidity-utilities": "^2.0.0", "@venusprotocol/venus-protocol": "^6.0.0", "ethers": "^5.6.8", "hardhat": "^2.16.1", diff --git a/test/SequencerChainlinkOracle.ts b/test/SequencerChainlinkOracle.ts new file mode 100644 index 00000000..a0ad0045 --- /dev/null +++ b/test/SequencerChainlinkOracle.ts @@ -0,0 +1,73 @@ +import { FakeContract, MockContract, smock } from "@defi-wonderland/smock"; +import chai from "chai"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers } from "hardhat"; + +import { AggregatorV3Interface, SequencerChainlinkOracle, SequencerChainlinkOracle__factory } from "../typechain-types"; +import { getTime } from "./utils/time"; + +const { expect } = chai; +chai.use(smock.matchers); + +describe("SequencerChainlinkOracle", () => { + let sequencerChainlinkOracle: MockContract; + let sequencerFeed: FakeContract; + const BNB_ADDR = "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"; + const GRACE_PERIOD = 3600; + const expectedPrice = parseUnits("1", 18); + before(async () => { + await ethers.provider.send("evm_mine", []); // Mine a block to ensure provider is initialized + sequencerFeed = await smock.fake("AggregatorV3Interface"); + const sequencerChainlinkOracleFactory = await smock.mock( + "SequencerChainlinkOracle", + ); + sequencerChainlinkOracle = await sequencerChainlinkOracleFactory.deploy(sequencerFeed.address); + // configure a hardcoded price just for the sake of returning any value + await sequencerChainlinkOracle.setVariable("prices", { + "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB": expectedPrice, // native-token address hardcoded price + }); + }); + it("Should revert if sequencer is down", async () => { + sequencerFeed.latestRoundData.returns({ + roundId: 0, // arbitraty value (not used in logic) + answer: 1, // (1 - for 'sequencer down') + startedAt: 1, // block.timestamp - startedAt should be > 3600 (GRACE_PERIOD) + updatedAt: 1, // arbitraty value (not used in logic) + answeredInRound: 1, // arbitraty value (not used in logic) + }); + + await expect(sequencerChainlinkOracle.getPrice(BNB_ADDR)).to.be.revertedWith("L2 sequencer unavailable"); + }); + it("Should revert if sequencer is up, but GRACE_PERIOD has not passed", async () => { + sequencerFeed.latestRoundData.returns({ + roundId: 0, // arbitraty value (not used in logic) + answer: 1, // (1 - for 'sequencer down') + startedAt: (await getTime()) - GRACE_PERIOD, // block.timestamp - startedAt should be = 3600 (GRACE_PERIOD) + updatedAt: 1, // arbitraty value (not used in logic) + answeredInRound: 1, // arbitraty value (not used in logic) + }); + + await expect(sequencerChainlinkOracle.getPrice(BNB_ADDR)).to.be.revertedWith("L2 sequencer unavailable"); + + sequencerFeed.latestRoundData.returns({ + roundId: 0, // arbitraty value (not used in logic) + answer: 1, // (1 - for 'sequencer down') + startedAt: await getTime(), // block.timestamp - startedAt should be < 3600 (GRACE_PERIOD) + updatedAt: 1, // arbitraty value (not used in logic) + answeredInRound: 1, // arbitraty value (not used in logic) + }); + + await expect(sequencerChainlinkOracle.getPrice(BNB_ADDR)).to.be.revertedWith("L2 sequencer unavailable"); + }); + it("Should return price", async () => { + sequencerFeed.latestRoundData.returns({ + roundId: 0, // arbitraty value (not used in logic) + answer: 0, // (0 - for 'sequencer up') + startedAt: 1, // block.timestamp - startedAt should be > 3600 (GRACE_PERIOD) + updatedAt: 1, // arbitraty value (not used in logic) + answeredInRound: 1, // arbitraty value (not used in logic) + }); + + expect(await sequencerChainlinkOracle.getPrice(BNB_ADDR)).to.equal(expectedPrice); + }); +}); diff --git a/yarn.lock b/yarn.lock index 59c41df4..4cd2831c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3135,25 +3135,25 @@ __metadata: languageName: node linkType: hard -"@venusprotocol/governance-contracts@npm:^1.4.0": - version: 1.4.0 - resolution: "@venusprotocol/governance-contracts@npm:1.4.0" +"@venusprotocol/governance-contracts@npm:^1.4.0-dev.1": + version: 1.4.0-dev.9 + resolution: "@venusprotocol/governance-contracts@npm:1.4.0-dev.9" dependencies: "@venusprotocol/solidity-utilities": ^1.1.0 hardhat-deploy-ethers: ^0.3.0-beta.13 module-alias: ^2.2.2 - checksum: 85c6b6a815edb0befa4c38e3652a58464827d390620210b99575c16960ee6505e95e7c2192ebc972da7ed758d3c62e150d32fbdd1f01acab1731f29b11d1884e + checksum: 25583a20738973d2ade4a1fdf84dcacf0caec42004f5bf755fdfa29b3602f2b9184638f2d828359195bf8baa3b082797cad941874be1a91a61900b343420cead languageName: node linkType: hard -"@venusprotocol/governance-contracts@npm:^1.4.0-dev.1": - version: 1.4.0-dev.9 - resolution: "@venusprotocol/governance-contracts@npm:1.4.0-dev.9" +"@venusprotocol/governance-contracts@npm:^2.0.0": + version: 2.0.0 + resolution: "@venusprotocol/governance-contracts@npm:2.0.0" dependencies: - "@venusprotocol/solidity-utilities": ^1.1.0 + "@venusprotocol/solidity-utilities": 2.0.0 hardhat-deploy-ethers: ^0.3.0-beta.13 module-alias: ^2.2.2 - checksum: 25583a20738973d2ade4a1fdf84dcacf0caec42004f5bf755fdfa29b3602f2b9184638f2d828359195bf8baa3b082797cad941874be1a91a61900b343420cead + checksum: 18b56d951c4e68fa1edadc93ed44daa55c8b81294778a4969d940a084de6d949630eacd4702d1b92f04ad5d709963a3a0a790014871ec34b0b2f4806cebc731c languageName: node linkType: hard @@ -3188,8 +3188,8 @@ __metadata: "@types/sinon-chai": ^3.2.9 "@typescript-eslint/eslint-plugin": ^5.27.1 "@typescript-eslint/parser": ^5.27.1 - "@venusprotocol/governance-contracts": ^1.4.0 - "@venusprotocol/solidity-utilities": 1.3.0 + "@venusprotocol/governance-contracts": ^2.0.0 + "@venusprotocol/solidity-utilities": ^2.0.0 "@venusprotocol/venus-protocol": ^6.0.0 chai: ^4.3.6 cross-env: ^7.0.3 @@ -3241,10 +3241,10 @@ __metadata: languageName: node linkType: hard -"@venusprotocol/solidity-utilities@npm:1.3.0": - version: 1.3.0 - resolution: "@venusprotocol/solidity-utilities@npm:1.3.0" - checksum: d1109365a5e01959c47b25fb129373db93792e60bf1bc0ed324b63c2a64f6e4a7878ebf016cfade94bc41a2c1245d3e861fdc6b8c5844ac210ed1d73e7307e72 +"@venusprotocol/solidity-utilities@npm:2.0.0, @venusprotocol/solidity-utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@venusprotocol/solidity-utilities@npm:2.0.0" + checksum: 87a2ce2fd1d702bc04c4e98d675b904176c7f2489476e8da586d1782b48faae92aa4f2ba894737773d189ba72a6b274f1464cf2e0308e62758303d0adde749e6 languageName: node linkType: hard