From a5c77979fd9010bfcc8fb9949a2f915cae7aaa5a Mon Sep 17 00:00:00 2001 From: kames Date: Mon, 14 Feb 2022 09:00:38 -0700 Subject: [PATCH 01/30] add(DrawPercentageRate): initial contract structure --- contracts/DrawPercentageRate.sol | 153 +++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 contracts/DrawPercentageRate.sol diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol new file mode 100644 index 0000000..ec73496 --- /dev/null +++ b/contracts/DrawPercentageRate.sol @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; +import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; +import "./interfaces/IPrizeTierHistory.sol"; + +contract DrawPercentageRate { + uint256 public dpr; + uint256 public immutable minPickCost; + + ITicket public ticket; + IDrawBuffer public drawBuffer; + IPrizeTierHistory public prizeTierHistory; + + constructor( + ITicket _ticket, + IPrizeTierHistory _prizeTierHistory, + IDrawBuffer _drawBuffer, + uint256 _minPickCost, + uint256 _dpr + ) { + ticket = _ticket; + prizeTierHistory = _prizeTierHistory; + drawBuffer = _drawBuffer; + minPickCost = _minPickCost; + dpr = _dpr; + } + + /** + * @notice Get a PrizeDistribution using a historical Draw ID + * @param drawId drawId + * @return prizeDistribution + */ + function getPrizeDistribution(uint32 drawId) + external + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + return _getPrizeDistribution(drawId); + } + + /** + * @notice Get a list of PrizeDistributions using historical Draw IDs + * @param drawIds array of drawId(s) + * @return prizeDistribution + */ + function getPrizeDistributionList(uint32[] calldata drawIds) + external + view + returns (IPrizeDistributionBuffer.PrizeDistribution[] memory) + { + IPrizeDistributionBuffer.PrizeDistribution[] + memory _prizeDistributions = new IPrizeDistributionBuffer.PrizeDistribution[]( + drawIds.length + ); + for (uint256 index = 0; index < drawIds.length; index++) { + _prizeDistributions[index] = _getPrizeDistribution(drawIds[index]); + } + return _prizeDistributions; + } + + /** + * @notice Internal function to get a PrizeDistribution using a historical Draw ID + * @param _drawId drawId + * @return prizeDistribution + */ + function _getPrizeDistribution(uint32 _drawId) + internal + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + uint256 __dpr = dpr; // Replace with ring buffer or simple alternative to map drawIds <> dpr + return _calculatePrizeDistribution(_drawId, __dpr); + } + + /** + * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters + * @param _drawId drawId + * @param _dpr the Draw Percentage Rate associated with the Draw ID + * @return prizeDistribution + */ + function _calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) + internal + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + IPrizeTierHistory.PrizeTier memory PrizeTier = prizeTierHistory.getPrizeTier(_drawId); + IDrawBeacon.Draw memory Draw = drawBuffer.getDraw(_drawId); + + (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( + Draw.timestamp, + Draw.beaconPeriodSeconds, + PrizeTier.endTimestampOffset + ); + + uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); + uint256 _maxPicks = _totalSupplies[0] / minPickCost; + uint8 _cardinality = _calculateCardinality(PrizeTier.bitRangeSize, _maxPicks); + uint256 _fractionOfOdds = _caclulateFractionOfOdds( + _dpr, + _totalSupplies[0], + PrizeTier.prize + ); + uint256 _totalPicks = uint256((2**PrizeTier.bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading + uint32 _numberOfPicks = uint32(_totalPicks) * uint32(_fractionOfOdds); + + IPrizeDistributionBuffer.PrizeDistribution + memory prizeDistribution = IPrizeDistributionBuffer.PrizeDistribution({ + bitRangeSize: PrizeTier.bitRangeSize, + matchCardinality: _cardinality, + startTimestampOffset: Draw.beaconPeriodSeconds, + endTimestampOffset: PrizeTier.endTimestampOffset, + maxPicksPerUser: PrizeTier.maxPicksPerUser, + expiryDuration: PrizeTier.expiryDuration, + numberOfPicks: _numberOfPicks, + tiers: PrizeTier.tiers, + prize: PrizeTier.prize + }); + + return prizeDistribution; + } + + function _calculateDrawPeriodTimestampOffsets( + uint64 _timestamp, + uint32 _startOffset, + uint32 _endOffset + ) internal pure returns (uint64[] memory startTimestamps, uint64[] memory endTimestamps) { + startTimestamps[0] = _timestamp - _startOffset; + endTimestamps[0] = _timestamp - _endOffset; + return (startTimestamps, endTimestamps); + } + + function _calculateCardinality(uint32 _bitRangeSize, uint256 _maxPicks) + internal + pure + returns (uint8 cardinality) + { + do { + cardinality++; + } while ((2**_bitRangeSize)**(cardinality + 1) < _maxPicks); + } + + function _caclulateFractionOfOdds( + uint256 _dpr, + uint256 _totalSupply, + uint256 _prize + ) internal pure returns (uint256) { + // TODO: Normalize things and do math + return (_dpr * _totalSupply) / _prize; + } +} From c2671699f8a4a0198622bbe4d572b8242bf5e9cf Mon Sep 17 00:00:00 2001 From: kames Date: Mon, 14 Feb 2022 09:32:07 -0700 Subject: [PATCH 02/30] add(tests): DrawPercentageRate setup --- contracts/DrawPercentageRate.sol | 92 ++++++++++++++++++++++++++++++++ test/DrawPercentageRate.test.ts | 89 ++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 test/DrawPercentageRate.test.ts diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol index ec73496..dc2b96d 100644 --- a/contracts/DrawPercentageRate.sol +++ b/contracts/DrawPercentageRate.sol @@ -14,6 +14,18 @@ contract DrawPercentageRate { IDrawBuffer public drawBuffer; IPrizeTierHistory public prizeTierHistory; + /* =================================================== */ + /* Constructor ======================================= */ + /* =================================================== */ + + /** + * Constructor + * @param _ticket - ITicket + * @param _drawBuffer - IDrawBuffer + * @param _prizeTierHistory - IPrizeTierHistory + * @param _dpr - uint256 + * @param _minPickCost - uint256 + */ constructor( ITicket _ticket, IPrizeTierHistory _prizeTierHistory, @@ -28,6 +40,10 @@ contract DrawPercentageRate { dpr = _dpr; } + /* =================================================== */ + /* Core Functions ==================================== */ + /* =================================================== */ + /** * @notice Get a PrizeDistribution using a historical Draw ID * @param drawId drawId @@ -61,6 +77,82 @@ contract DrawPercentageRate { return _prizeDistributions; } + /* =================================================== */ + /* Getter Functions ================================== */ + /* =================================================== */ + + function getDpr() + external + view + returns (uint256) + { + return dpr; + } + + function getMinPickCost() + external + view + returns (uint256) + { + return minPickCost; + } + + function getTicket() + external + view + returns (ITicket) + { + return ticket; + } + + function getDrawBuffer() + external + view + returns (IDrawBuffer) + { + return drawBuffer; + } + + function getPrizeTierHistory() + external + view + returns (IPrizeTierHistory) + { + return prizeTierHistory; + } + + /* =================================================== */ + /* Setter Functions ================================== */ + /* =================================================== */ + + function setDpr(uint256 _dpr) + external + { + dpr = _dpr; + } + + function setTicket(ITicket _ticket) + external + { + ticket = _ticket; + } + + function setDrawBuffer(IDrawBuffer _drawBuffer) + external + { + drawBuffer = _drawBuffer; + } + + function setPrizeTierHistory(IPrizeTierHistory _prizeTierHistory) + external + { + prizeTierHistory = _prizeTierHistory; + } + + /* =================================================== */ + /* Internal Functions ================================ */ + /* =================================================== */ + /** * @notice Internal function to get a PrizeDistribution using a historical Draw ID * @param _drawId drawId diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts new file mode 100644 index 0000000..06be8f8 --- /dev/null +++ b/test/DrawPercentageRate.test.ts @@ -0,0 +1,89 @@ +import { expect } from 'chai'; +import { ethers, artifacts } from 'hardhat'; +import { deployMockContract, MockContract } from 'ethereum-waffle'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract, ContractFactory } from 'ethers'; +import DrawBuffer from '@pooltogether/v4-core/artifacts/contracts/DrawBuffer.sol/DrawBuffer.json'; +import { BigNumber } from 'ethereum-waffle/node_modules/ethers'; + +const { getSigners } = ethers; + +describe('DrawPercentageRate', () => { + let wallet1: SignerWithAddress; + let wallet2: SignerWithAddress; + let wallet3: SignerWithAddress; + + let drawPercentageRate: Contract; + let ticket: MockContract; + let prizeTierHistory: MockContract; + let drawBuffer: MockContract; + let drawPercentageRateFactory: ContractFactory; + + const MIN_PICK_COST = BigNumber.from('1') + const DPR = BigNumber.from('1') + + before(async () => { + [wallet1, wallet2, wallet3] = await getSigners(); + const Ticket = await artifacts.readArtifact('PrizeTierHistory'); + const PrizeTierHistory = await artifacts.readArtifact('PrizeTierHistory'); + ticket = await deployMockContract(wallet1, Ticket.abi); + prizeTierHistory = await deployMockContract(wallet1, PrizeTierHistory.abi); + drawBuffer = await deployMockContract(wallet1, DrawBuffer.abi); + drawPercentageRateFactory = await ethers.getContractFactory('DrawPercentageRate'); + }); + + beforeEach(async () => { + drawPercentageRate = await drawPercentageRateFactory.deploy( + ticket.address, + prizeTierHistory.address, + drawBuffer.address, + MIN_PICK_COST, + DPR + ); + }); + + describe('Core', () => { + describe('getPrizeDistribution()', () => { + it('should correctly calculate a valid PrizeDistrubtion', async () => { + expect(true).to.eq(true); + }); + }); + }); + + describe('Getters', () => { + it('should get the destination address', async () => { + expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); + }); + it('should get the strategy address', async () => { + expect(await drawPercentageRate.getPrizeTierHistory()).to.equal(prizeTierHistory.address); + }); + it('should get the reserve address', async () => { + expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); + }); + it('should get the minPickCost', async () => { + expect(await drawPercentageRate.getMinPickCost()).to.equal(MIN_PICK_COST); + }); + it('should get the DPR (draw percentage rate)', async () => { + expect(await drawPercentageRate.getDpr()).to.equal(DPR); + }); + }); + + describe('Setters', () => { + it('should set the destination address', async () => { + drawPercentageRate.setTicket(ticket.address) + expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); + }); + it('should set the strategy address', async () => { + drawPercentageRate.setPrizeTierHistory(prizeTierHistory.address) + expect(await drawPercentageRate.getPrizeTierHistory()).to.equal(prizeTierHistory.address); + }); + it('should set the reserve address', async () => { + drawPercentageRate.setDrawBuffer(drawBuffer.address) + expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); + }); + it('should set the DPR (draw percentage rate)', async () => { + await drawPercentageRate.setDpr(DPR) + expect(await drawPercentageRate.getDpr()).to.equal(DPR); + }); + }); +}); From 919182510667f3ed4dbaaed141550b12be3ae5c8 Mon Sep 17 00:00:00 2001 From: kames Date: Mon, 14 Feb 2022 09:33:19 -0700 Subject: [PATCH 03/30] add(tests): DrawPercentageRate setup --- test/DrawPercentageRate.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index 06be8f8..1e3ef54 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -43,11 +43,18 @@ describe('DrawPercentageRate', () => { }); describe('Core', () => { + describe('getPrizeDistribution()', () => { it('should correctly calculate a valid PrizeDistrubtion', async () => { expect(true).to.eq(true); }); }); + + describe('getPrizeDistributionList()', () => { + it('should correctly calculate a list of valid PrizeDistrubtions', async () => { + expect(true).to.eq(true); + }); + }); }); describe('Getters', () => { From fdf9ec775ca88cbd0cbc5ae73847fac64a13e7be Mon Sep 17 00:00:00 2001 From: kames Date: Mon, 14 Feb 2022 10:57:30 -0700 Subject: [PATCH 04/30] add(harness): test DrawPercentageRate internal functions --- contracts/DrawPercentageRate.sol | 24 ++++----- contracts/test/DrawPercentageRateHarness.sol | 52 ++++++++++++++++++++ test/DrawPercentageRate.test.ts | 41 ++++++++++++++- 3 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 contracts/test/DrawPercentageRateHarness.sol diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol index dc2b96d..c7425b6 100644 --- a/contracts/DrawPercentageRate.sol +++ b/contracts/DrawPercentageRate.sol @@ -17,7 +17,7 @@ contract DrawPercentageRate { /* =================================================== */ /* Constructor ======================================= */ /* =================================================== */ - + /** * Constructor * @param _ticket - ITicket @@ -46,7 +46,7 @@ contract DrawPercentageRate { /** * @notice Get a PrizeDistribution using a historical Draw ID - * @param drawId drawId + * @param drawId - uint32 * @return prizeDistribution */ function getPrizeDistribution(uint32 drawId) @@ -59,7 +59,7 @@ contract DrawPercentageRate { /** * @notice Get a list of PrizeDistributions using historical Draw IDs - * @param drawIds array of drawId(s) + * @param drawIds - uint32[] * @return prizeDistribution */ function getPrizeDistributionList(uint32[] calldata drawIds) @@ -155,7 +155,7 @@ contract DrawPercentageRate { /** * @notice Internal function to get a PrizeDistribution using a historical Draw ID - * @param _drawId drawId + * @param _drawId - uint32 * @return prizeDistribution */ function _getPrizeDistribution(uint32 _drawId) @@ -163,14 +163,14 @@ contract DrawPercentageRate { view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - uint256 __dpr = dpr; // Replace with ring buffer or simple alternative to map drawIds <> dpr + uint256 __dpr = dpr; // Replace with ring buffer or a more simple alternative to map drawIds <> dpr over time. return _calculatePrizeDistribution(_drawId, __dpr); } /** * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters - * @param _drawId drawId - * @param _dpr the Draw Percentage Rate associated with the Draw ID + * @param _drawId - uint32 + * @param _dpr - uint256 Draw Percentage Rate associated with the Draw ID * @return prizeDistribution */ function _calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) @@ -218,10 +218,12 @@ contract DrawPercentageRate { uint64 _timestamp, uint32 _startOffset, uint32 _endOffset - ) internal pure returns (uint64[] memory startTimestamps, uint64[] memory endTimestamps) { - startTimestamps[0] = _timestamp - _startOffset; - endTimestamps[0] = _timestamp - _endOffset; - return (startTimestamps, endTimestamps); + ) internal pure returns (uint64[] memory, uint64[] memory) { + uint64[] memory _startTimestamps = new uint64[](1); + uint64[] memory _endTimestamps = new uint64[](1); + _startTimestamps[0] = _timestamp - _startOffset; + _endTimestamps[0] = _timestamp - _endOffset; + return (_startTimestamps, _endTimestamps); } function _calculateCardinality(uint32 _bitRangeSize, uint256 _maxPicks) diff --git a/contracts/test/DrawPercentageRateHarness.sol b/contracts/test/DrawPercentageRateHarness.sol new file mode 100644 index 0000000..9fc64b1 --- /dev/null +++ b/contracts/test/DrawPercentageRateHarness.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "../DrawPercentageRate.sol"; + +contract DrawPercentageRateHarness is DrawPercentageRate { + + constructor( + ITicket _ticket, + IPrizeTierHistory _prizeTierHistory, + IDrawBuffer _drawBuffer, + uint256 _minPickCost, + uint256 _dpr + ) DrawPercentageRate( + _ticket, + _prizeTierHistory, + _drawBuffer, + _minPickCost, + _dpr + ) {} + + function calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) + external + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + return _calculatePrizeDistribution(_drawId, _dpr); + } + + function calculateDrawPeriodTimestampOffsets( + uint64 _timestamp, + uint32 _startOffset, + uint32 _endOffset + ) public pure returns (uint64[] memory startTimestamps, uint64[] memory endTimestamps) { + return _calculateDrawPeriodTimestampOffsets(_timestamp, _startOffset, _endOffset); + } + + function calculateCardinality(uint32 _bitRangeSize, uint256 _maxPicks) + public + pure + returns (uint8 cardinality) + { + return _calculateCardinality(_bitRangeSize, _maxPicks); + } + + function caclulateFractionOfOdds( + uint256 _dpr, + uint256 _totalSupply, + uint256 _prize + ) public pure returns (uint256) { + return _caclulateFractionOfOdds(_dpr, _totalSupply, _prize); + } +} diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index 1e3ef54..3e5b008 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -5,6 +5,7 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { Contract, ContractFactory } from 'ethers'; import DrawBuffer from '@pooltogether/v4-core/artifacts/contracts/DrawBuffer.sol/DrawBuffer.json'; import { BigNumber } from 'ethereum-waffle/node_modules/ethers'; +import { parseEther } from 'ethers/lib/utils'; const { getSigners } = ethers; @@ -29,7 +30,7 @@ describe('DrawPercentageRate', () => { ticket = await deployMockContract(wallet1, Ticket.abi); prizeTierHistory = await deployMockContract(wallet1, PrizeTierHistory.abi); drawBuffer = await deployMockContract(wallet1, DrawBuffer.abi); - drawPercentageRateFactory = await ethers.getContractFactory('DrawPercentageRate'); + drawPercentageRateFactory = await ethers.getContractFactory('DrawPercentageRateHarness'); }); beforeEach(async () => { @@ -56,6 +57,44 @@ describe('DrawPercentageRate', () => { }); }); }); + + describe('Internals', () => { + + describe('calculatePrizeDistribution()', () => { + it('should succesfully calculate a PrizeDistribution using mock historical Draw parameters', async () => { + const DRAW_ID = 1; + const DRAW_PERCENTAGE_RATE = '1'; + // expect(await drawPercentageRate.calculatePrizeDistribution(DRAW_ID, DRAW_PERCENTAGE_RATE)).to.eq(true); + expect(true).to.eq(true); + }); + }); + + describe('calculateDrawPeriodTimestampOffsets()', () => { + it('should succesfully calculate the Draw timestamp offests', async () => { + const TIMESTAMP = BigNumber.from('1000'); + const START_OFFSET = BigNumber.from('990'); + const END_OFFSET = BigNumber.from('10'); + const offsets = await drawPercentageRate.calculateDrawPeriodTimestampOffsets(TIMESTAMP, START_OFFSET, END_OFFSET) + expect(offsets[0][0]).to.equal(BigNumber.from('10')); + expect(offsets[1][0]).to.equal(BigNumber.from('990')); + }); + }); + + describe('calculateCardinality()', () => { + it('should succesfully calculate the cardinality', async () => { + expect(await drawPercentageRate.calculateCardinality(4, 1000) ).to.eq(2); + }); + }); + + describe('caclulateFractionOfOdds()', () => { + it('should succesfully calculate the fracion of odds', async () => { + const DRAW_PERCENTAGE_RATE = BigNumber.from('100000'); + const TOTAL_SUPPLY = BigNumber.from('100000'); + const PRIZE = parseEther('1'); + expect(await drawPercentageRate.caclulateFractionOfOdds(DRAW_PERCENTAGE_RATE, TOTAL_SUPPLY, PRIZE)).to.eq(BigNumber.from('0')); + }); + }); + }); describe('Getters', () => { it('should get the destination address', async () => { From 201497b28b9014b1eb9a3f371aadd006601ade02 Mon Sep 17 00:00:00 2001 From: kames Date: Mon, 14 Feb 2022 11:24:33 -0700 Subject: [PATCH 05/30] minor fix --- contracts/DrawPercentageRate.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol index c7425b6..5480220 100644 --- a/contracts/DrawPercentageRate.sol +++ b/contracts/DrawPercentageRate.sol @@ -195,6 +195,7 @@ contract DrawPercentageRate { _totalSupplies[0], PrizeTier.prize ); + uint256 _totalPicks = uint256((2**PrizeTier.bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading uint32 _numberOfPicks = uint32(_totalPicks) * uint32(_fractionOfOdds); From f95d6a25292e1f86b0163c32eb43525e7fb2ec9d Mon Sep 17 00:00:00 2001 From: kames Date: Thu, 3 Mar 2022 13:31:21 -0700 Subject: [PATCH 06/30] add(PrizeTierHistoryV2): mvp using a library for binary search --- contracts/DPRHistory.sol | 36 ++ contracts/DrawPercentageRate.sol | 373 +++++++++++++------ contracts/PrizeTierHistoryV2.sol | 83 +++++ contracts/libraries/BinarySearchLib.sol | 2 +- contracts/libraries/DrawBinarySearch.sol | 57 +++ contracts/libraries/IDBinarySearch.sol | 109 ++++++ contracts/test/DrawPercentageRateHarness.sol | 67 +++- test/DrawPercentageRate.test.ts | 206 ++++++++-- test/libraries/IDBinarySearch.ts | 28 ++ 9 files changed, 808 insertions(+), 153 deletions(-) create mode 100644 contracts/DPRHistory.sol create mode 100644 contracts/PrizeTierHistoryV2.sol create mode 100644 contracts/libraries/DrawBinarySearch.sol create mode 100644 contracts/libraries/IDBinarySearch.sol create mode 100644 test/libraries/IDBinarySearch.ts diff --git a/contracts/DPRHistory.sol b/contracts/DPRHistory.sol new file mode 100644 index 0000000..2b02899 --- /dev/null +++ b/contracts/DPRHistory.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +import "./libraries/IDBinarySearch.sol"; + +/** + * @title PoolTogether V4 DPRHistory + * @author PoolTogether Inc Team + * @notice DPRHistory stores a list of historical draw percentage rate checkpoints. + */ + +contract DPRHistory is IDBinarySearch { + uint256[] internal history; + + /** + * @dev Constructor + */ + constructor(uint32[] memory _history) IDBinarySearch(_history) { + history = new uint256[](0); + } + + function getDpr(uint32 drawId) external view returns (uint256) { + require(drawId > 0, "DPRHistory/draw-id-not-zero"); + return history[_getIndexForDrawId(drawId)]; + } + + /** + * @notice Push a new draw percentage rate checkpoint to the history. + * @param drawId uint32 - The draw id + * @param nextDpr uint256 - The draw percentage rate + */ + function push(uint32 drawId, uint256 nextDpr) external { + history.push(nextDpr); + super.push(drawId); + } +} diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol index 5480220..d49ba67 100644 --- a/contracts/DrawPercentageRate.sol +++ b/contracts/DrawPercentageRate.sol @@ -1,30 +1,44 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; +import "hardhat/console.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; import "./interfaces/IPrizeTierHistory.sol"; +/** + * @title PoolTogether V4 DrawPercentageRate + * @author PoolTogether Inc Team + * @notice DrawPercentageRate calculates a PrizePool distributions using a static draw percentage rate + */ contract DrawPercentageRate { - uint256 public dpr; + // Constants + uint32 public constant RATE_NORMALIZATION = 1e9; + + // Immutable (Set by constructor) uint256 public immutable minPickCost; + // Mutable + uint256 public dpr; ITicket public ticket; IDrawBuffer public drawBuffer; IPrizeTierHistory public prizeTierHistory; - /* =================================================== */ - /* Constructor ======================================= */ - /* =================================================== */ + struct DPRHistory { + uint32 drawId; + uint256 dpr; + } + + DPRHistory[] internal history; /** - * Constructor - * @param _ticket - ITicket - * @param _drawBuffer - IDrawBuffer - * @param _prizeTierHistory - IPrizeTierHistory - * @param _dpr - uint256 - * @param _minPickCost - uint256 + * Constructor + * @param _ticket - ITicket + * @param _drawBuffer - IDrawBuffer + * @param _prizeTierHistory - IPrizeTierHistory + * @param _dpr - uint256 + * @param _minPickCost - uint256 */ constructor( ITicket _ticket, @@ -41,9 +55,14 @@ contract DrawPercentageRate { } /* =================================================== */ - /* Core Functions ==================================== */ + /* Core ============================================== */ /* =================================================== */ + function getDpr(uint32 _drawId) external view returns (DPRHistory memory) { + require(_drawId > 0, "DrawPercentageRate/draw-id-not-zero"); + return _getDpr(_drawId); + } + /** * @notice Get a PrizeDistribution using a historical Draw ID * @param drawId - uint32 @@ -78,79 +97,7 @@ contract DrawPercentageRate { } /* =================================================== */ - /* Getter Functions ================================== */ - /* =================================================== */ - - function getDpr() - external - view - returns (uint256) - { - return dpr; - } - - function getMinPickCost() - external - view - returns (uint256) - { - return minPickCost; - } - - function getTicket() - external - view - returns (ITicket) - { - return ticket; - } - - function getDrawBuffer() - external - view - returns (IDrawBuffer) - { - return drawBuffer; - } - - function getPrizeTierHistory() - external - view - returns (IPrizeTierHistory) - { - return prizeTierHistory; - } - - /* =================================================== */ - /* Setter Functions ================================== */ - /* =================================================== */ - - function setDpr(uint256 _dpr) - external - { - dpr = _dpr; - } - - function setTicket(ITicket _ticket) - external - { - ticket = _ticket; - } - - function setDrawBuffer(IDrawBuffer _drawBuffer) - external - { - drawBuffer = _drawBuffer; - } - - function setPrizeTierHistory(IPrizeTierHistory _prizeTierHistory) - external - { - prizeTierHistory = _prizeTierHistory; - } - - /* =================================================== */ - /* Internal Functions ================================ */ + /* Internal ========================================== */ /* =================================================== */ /** @@ -163,8 +110,8 @@ contract DrawPercentageRate { view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - uint256 __dpr = dpr; // Replace with ring buffer or a more simple alternative to map drawIds <> dpr over time. - return _calculatePrizeDistribution(_drawId, __dpr); + DPRHistory memory _history = _getDpr(_drawId); + return _calculatePrizeDistribution(_drawId, _history.dpr); } /** @@ -178,43 +125,106 @@ contract DrawPercentageRate { view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - IPrizeTierHistory.PrizeTier memory PrizeTier = prizeTierHistory.getPrizeTier(_drawId); - IDrawBeacon.Draw memory Draw = drawBuffer.getDraw(_drawId); - + IPrizeTierHistory.PrizeTier memory prizeTier = prizeTierHistory.getPrizeTier(_drawId); + IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( - Draw.timestamp, - Draw.beaconPeriodSeconds, - PrizeTier.endTimestampOffset + draw.timestamp, + draw.beaconPeriodSeconds, + prizeTier.endTimestampOffset ); - uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); - uint256 _maxPicks = _totalSupplies[0] / minPickCost; - uint8 _cardinality = _calculateCardinality(PrizeTier.bitRangeSize, _maxPicks); - uint256 _fractionOfOdds = _caclulateFractionOfOdds( - _dpr, + (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( _totalSupplies[0], - PrizeTier.prize + prizeTier.prize, + prizeTier.bitRangeSize, + _dpr, + minPickCost ); - - uint256 _totalPicks = uint256((2**PrizeTier.bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading - uint32 _numberOfPicks = uint32(_totalPicks) * uint32(_fractionOfOdds); - IPrizeDistributionBuffer.PrizeDistribution memory prizeDistribution = IPrizeDistributionBuffer.PrizeDistribution({ - bitRangeSize: PrizeTier.bitRangeSize, + bitRangeSize: prizeTier.bitRangeSize, matchCardinality: _cardinality, - startTimestampOffset: Draw.beaconPeriodSeconds, - endTimestampOffset: PrizeTier.endTimestampOffset, - maxPicksPerUser: PrizeTier.maxPicksPerUser, - expiryDuration: PrizeTier.expiryDuration, + startTimestampOffset: draw.beaconPeriodSeconds, + endTimestampOffset: prizeTier.endTimestampOffset, + maxPicksPerUser: prizeTier.maxPicksPerUser, + expiryDuration: prizeTier.expiryDuration, numberOfPicks: _numberOfPicks, - tiers: PrizeTier.tiers, - prize: PrizeTier.prize + tiers: prizeTier.tiers, + prize: prizeTier.prize }); - return prizeDistribution; } + function _calculateCardinality( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) internal pure returns (uint8 cardinality) { + uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); + uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); + uint256 _maxPicksWithFracionOfOdds = _normalizePicks( + _maxPicks * RATE_NORMALIZATION, + _fractionOfOdds + ); + cardinality = _calculateCardinalityCeiling(_bitRangeSize, _maxPicksWithFracionOfOdds); + } + + function _calculateNumberOfPicks( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) internal pure returns (uint104) { + uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); + uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); + uint256 _maxPicksWithFracionOfOdds = _normalizePicks( + (_maxPicks * RATE_NORMALIZATION), + _fractionOfOdds + ); + uint8 _cardinality = _calculateCardinalityCeiling( + _bitRangeSize, + _maxPicksWithFracionOfOdds + ); + uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading + uint256 numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; + return uint104(numberOfPicks); + } + + function _calculateNumberOfPicksWithCardinalityAndFraction( + uint32 _bitRangeSize, + uint256 _cardinality, + uint256 _fractionOfOdds + ) internal pure returns (uint256 numberOfPicks) { + uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); + numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; + } + + function _calculateCardinalityAndNumberOfPicks( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { + cardinality = _calculateCardinality( + _totalSupply, + _prize, + _bitRangeSize, + _dpr, + _minPickCost + ); + numberOfPicks = _calculateNumberOfPicks( + _totalSupply, + _prize, + _bitRangeSize, + _dpr, + _minPickCost + ); + } + function _calculateDrawPeriodTimestampOffsets( uint64 _timestamp, uint32 _startOffset, @@ -227,17 +237,17 @@ contract DrawPercentageRate { return (_startTimestamps, _endTimestamps); } - function _calculateCardinality(uint32 _bitRangeSize, uint256 _maxPicks) + function _calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) internal pure returns (uint8 cardinality) { - do { + while ((2**_bitRangeSize)**(cardinality) < _maxPicks) { cardinality++; - } while ((2**_bitRangeSize)**(cardinality + 1) < _maxPicks); + } } - function _caclulateFractionOfOdds( + function _calculateFractionOfOdds( uint256 _dpr, uint256 _totalSupply, uint256 _prize @@ -245,4 +255,139 @@ contract DrawPercentageRate { // TODO: Normalize things and do math return (_dpr * _totalSupply) / _prize; } + + function _getDpr(uint32 _drawId) internal view returns (DPRHistory memory) { + uint256 cardinality = history.length; + require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); + + uint256 leftSide = 0; + uint256 rightSide = cardinality - 1; + uint32 oldestDrawId = history[leftSide].drawId; + uint32 newestDrawId = history[rightSide].drawId; + + require(_drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); + if (_drawId >= newestDrawId) return history[rightSide]; + if (_drawId == oldestDrawId) return history[leftSide]; + + return _binarySearch(_drawId, leftSide, rightSide, history); + } + + function _binarySearch( + uint32 _drawId, + uint256 leftSide, + uint256 rightSide, + DPRHistory[] storage _history + ) internal view returns (DPRHistory memory) { + return _history[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; + } + + function _binarySearchIndex( + uint32 _drawId, + uint256 _leftSide, + uint256 _rightSide, + DPRHistory[] storage _history + ) internal view returns (uint256) { + uint256 index; + uint256 leftSide = _leftSide; + uint256 rightSide = _rightSide; + while (true) { + uint256 center = leftSide + (rightSide - leftSide) / 2; + uint32 centerID = _history[center].drawId; + + if (centerID == _drawId) { + index = center; + break; + } + + if (centerID < _drawId) { + leftSide = center + 1; + } else if (centerID > _drawId) { + rightSide = center - 1; + } + + if (leftSide == rightSide) { + if (centerID >= _drawId) { + index = center - 1; + break; + } else { + index = center; + break; + } + } + } + return index; + } + + function _normalizePicks(uint256 _dividend, uint256 _denomintor) + internal + pure + returns (uint256 normalizedPicks) + { + normalizedPicks = _dividend / _denomintor; + } + + /* =================================================== */ + /* Getter ============================================ */ + /* =================================================== */ + + function getDpr() external view returns (uint256) { + return dpr; + } + + function getMinPickCost() external view returns (uint256) { + return minPickCost; + } + + function getTicket() external view returns (ITicket) { + return ticket; + } + + function getDrawBuffer() external view returns (IDrawBuffer) { + return drawBuffer; + } + + function getPrizeTierHistory() external view returns (IPrizeTierHistory) { + return prizeTierHistory; + } + + /* =================================================== */ + /* Setter ============================================ */ + /* =================================================== */ + + function setDpr(uint256 _dpr) external { + dpr = _dpr; + } + + function setTicket(ITicket _ticket) external { + ticket = _ticket; + } + + function setDrawBuffer(IDrawBuffer _drawBuffer) external { + drawBuffer = _drawBuffer; + } + + function setPrizeTierHistory(IPrizeTierHistory _prizeTierHistory) external { + prizeTierHistory = _prizeTierHistory; + } + + function push(DPRHistory calldata _nextDpr) external { + DPRHistory[] memory _history = history; + if (_history.length > 0) { + DPRHistory memory _newestDpr = history[history.length - 1]; + require(_nextDpr.drawId > _newestDpr.drawId, "DrawPercentageRate/non-sequential-dpr"); + } + history.push(_nextDpr); + } + + function replace(DPRHistory calldata _nextDpr) external { + uint256 cardinality = history.length; + require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); + uint256 leftSide = 0; + uint256 rightSide = cardinality - 1; + uint32 oldestDrawId = history[leftSide].drawId; + require(_nextDpr.drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); + uint256 index = _binarySearchIndex(_nextDpr.drawId, leftSide, rightSide, history); + require(history[index].drawId == _nextDpr.drawId, "DrawPercentageRate/draw-id-must-match"); + history[index] = _nextDpr; + } } diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol new file mode 100644 index 0000000..85e18f9 --- /dev/null +++ b/contracts/PrizeTierHistoryV2.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +import "./libraries/BinarySearchLib.sol"; +import "./libraries/DrawBinarySearch.sol"; + +/** + * @title PoolTogether V4 PrizeTierHistoryV2 + * @author PoolTogether Inc Team + * @notice PrizeTierHistoryV2 manages a history of PrizeTier parameters + */ +contract PrizeTierHistoryV2 is DrawBinarySearch { + + struct PrizeTier { + uint8 bitRangeSize; + uint32 drawId; + uint32 maxPicksPerUser; + uint32 expiryDuration; + uint32 endTimestampOffset; + uint256 prize; + uint32[16] tiers; + uint32 dpr; + } + + PrizeTier[] internal history; + + function getPrizeTier(uint32 _drawId) external view returns (PrizeTier memory) { + require(_drawId > 0, "PrizeTierHistory/draw-id-not-zero"); + return _getPrizeTier(_drawId); + } + + function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTier memory) { + return history[0]; + } +} + +/** + * @title PoolTogether V4 PrizeTierHistoryUsingLibV2 + * @author PoolTogether Inc Team + * @notice PrizeTierHistoryV2 manages a history of PrizeTier parameters + */ + contract PrizeTierHistoryUsingLibV2 { + struct PrizeTier { + uint8 bitRangeSize; + uint32 drawId; + uint32 maxPicksPerUser; + uint32 expiryDuration; + uint32 endTimestampOffset; + uint256 prize; + uint32[16] tiers; + uint32 dpr; + } + + PrizeTier[] internal history; + + function getPrizeTier(uint32 _drawId) external view returns (PrizeTier memory) { + require(_drawId > 0, "PrizeTierHistory/draw-id-not-zero"); + return _getPrizeTier(_drawId); + } + + function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTier memory) { + uint32 cardinality = uint32(history.length); + require(cardinality > 0, "PrizeTierHistory/no-prize-tiers"); + + uint32 leftSide = 0; + uint32 rightSide = cardinality - 1; + uint32 oldestDrawId = history[leftSide].drawId; + uint32 newestDrawId = history[rightSide].drawId; + + require(_drawId >= oldestDrawId, "PrizeTierHistory/draw-id-out-of-range"); + if (_drawId >= newestDrawId) return history[rightSide]; + if (_drawId == oldestDrawId) return history[leftSide]; + + uint32[] memory _history = new uint32[](cardinality); + + for (uint256 index = 0; index < _history.length; index++) { + _history[index] = history[index].drawId; + } + + uint32 i = BinarySearchLib._binarySearch(_drawId, leftSide, rightSide, _history); + return history[i]; + } +} diff --git a/contracts/libraries/BinarySearchLib.sol b/contracts/libraries/BinarySearchLib.sol index d5bc042..4ac0e95 100644 --- a/contracts/libraries/BinarySearchLib.sol +++ b/contracts/libraries/BinarySearchLib.sol @@ -46,7 +46,7 @@ library BinarySearchLib { } break; } - + if (centerID < _drawId) { leftSide = center; } else { diff --git a/contracts/libraries/DrawBinarySearch.sol b/contracts/libraries/DrawBinarySearch.sol new file mode 100644 index 0000000..095775e --- /dev/null +++ b/contracts/libraries/DrawBinarySearch.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +/** + * @title PoolTogether V4 DrawBinarySearch + * @author PoolTogether Inc Team + * @notice DrawBinarySearch handles finding a historical Draw ID references + */ + +contract DrawBinarySearch { + + function _binarySearch( + uint32 _drawId, + uint32 leftSide, + uint32 rightSide, + uint32[] memory _history + ) internal pure returns (uint32) { + return _history[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; + } + + function _binarySearchIndex( + uint32 _drawId, + uint32 _leftSide, + uint32 _rightSide, + uint32[] memory _history + ) internal pure returns (uint32) { + uint32 index; + uint32 leftSide = _leftSide; + uint32 rightSide = _rightSide; + while (true) { + uint32 center = leftSide + (rightSide - leftSide) / 2; + uint32 centerID = _history[center]; + + if (centerID == _drawId) { + index = center; + break; + } + + if (centerID < _drawId) { + leftSide = center + 1; + } else if (centerID > _drawId) { + rightSide = center - 1; + } + + if (leftSide == rightSide) { + if (centerID >= _drawId) { + index = center - 1; + break; + } else { + index = center; + break; + } + } + } + return index; + } +} diff --git a/contracts/libraries/IDBinarySearch.sol b/contracts/libraries/IDBinarySearch.sol new file mode 100644 index 0000000..e7534fd --- /dev/null +++ b/contracts/libraries/IDBinarySearch.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +/** + * @title PoolTogether V4 IDBinarySearch + * @author PoolTogether Inc Team + * @notice IDBinarySearch handles finding a historical Draw ID references + */ + +contract IDBinarySearch { + uint32[] internal idHistory; + + /** + * @notice constructor + @ @dev When initializing the IDBinarySearch, a ID history can be injected into the contract state. + Injecting history allows the protocol to stay modular in case of updates to the ID history instance in other contracts. + * @param _idHistoryInject uint32[] - Inject a historical DrawID reference history + */ + constructor(uint32[] memory _idHistoryInject) { + idHistory = _idHistoryInject; + } + + function push(uint32 drawId) public { + idHistory.push(drawId); + } + + function getNewestIndex() external view returns (uint32) { + return _getNewestIndex(idHistory); + } + + /* =================================================== */ + /* Internal ========================================== */ + /* =================================================== */ + + function _getIndexForDrawId(uint32 _drawId) internal view returns (uint256) { + return _binarySearchWithRangeChecks(_drawId, idHistory); + } + + function _getNewestIndex(uint32[] memory _idHistory) internal pure returns (uint32) { + return _idHistory[_idHistory.length - 1]; + } + + function _binarySearchWithRangeChecks(uint32 _drawId, uint32[] memory _history) + internal + view + returns (uint32) + { + uint32[] memory _idHistory = _history; + + uint32 cardinality = uint32(_idHistory.length); + require(cardinality > 0, "IDBinarySearch/no-prize-tiers"); + + uint32 leftSide = 0; + uint32 rightSide = cardinality - 1; + uint32 oldestDrawId = _idHistory[leftSide]; + uint32 newestDrawId = _idHistory[rightSide]; + + require(_drawId >= oldestDrawId, "IDBinarySearch/draw-id-out-of-range"); + if (_drawId >= newestDrawId) return _idHistory[rightSide]; + if (_drawId == oldestDrawId) return _idHistory[leftSide]; + return _binarySearch(_drawId, leftSide, rightSide, _idHistory); + } + + function _binarySearch( + uint32 _drawId, + uint32 leftSide, + uint32 rightSide, + uint32[] memory _history + ) internal view returns (uint32) { + return idHistory[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; + } + + function _binarySearchIndex( + uint32 _drawId, + uint32 _leftSide, + uint32 _rightSide, + uint32[] memory _history + ) internal pure returns (uint32) { + uint32 index; + uint32 leftSide = _leftSide; + uint32 rightSide = _rightSide; + while (true) { + uint32 center = leftSide + (rightSide - leftSide) / 2; + uint32 centerID = _history[center]; + + if (centerID == _drawId) { + index = center; + break; + } + + if (centerID < _drawId) { + leftSide = center + 1; + } else if (centerID > _drawId) { + rightSide = center - 1; + } + + if (leftSide == rightSide) { + if (centerID >= _drawId) { + index = center - 1; + break; + } else { + index = center; + break; + } + } + } + return index; + } +} diff --git a/contracts/test/DrawPercentageRateHarness.sol b/contracts/test/DrawPercentageRateHarness.sol index 9fc64b1..f6793f0 100644 --- a/contracts/test/DrawPercentageRateHarness.sol +++ b/contracts/test/DrawPercentageRateHarness.sol @@ -3,20 +3,13 @@ pragma solidity 0.8.6; import "../DrawPercentageRate.sol"; contract DrawPercentageRateHarness is DrawPercentageRate { - constructor( ITicket _ticket, IPrizeTierHistory _prizeTierHistory, IDrawBuffer _drawBuffer, uint256 _minPickCost, uint256 _dpr - ) DrawPercentageRate( - _ticket, - _prizeTierHistory, - _drawBuffer, - _minPickCost, - _dpr - ) {} + ) DrawPercentageRate(_ticket, _prizeTierHistory, _drawBuffer, _minPickCost, _dpr) {} function calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) external @@ -34,19 +27,69 @@ contract DrawPercentageRateHarness is DrawPercentageRate { return _calculateDrawPeriodTimestampOffsets(_timestamp, _startOffset, _endOffset); } - function calculateCardinality(uint32 _bitRangeSize, uint256 _maxPicks) + function calculateCardinality( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) public pure returns (uint8 cardinality) { + return _calculateCardinality(_totalSupply, _prize, _bitRangeSize, _dpr, _minPickCost); + } + + function calculateNumberOfPicks( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) public pure returns (uint256 numberOfPicks) { + return _calculateNumberOfPicks(_totalSupply, _prize, _bitRangeSize, _dpr, _minPickCost); + } + + function calculateNumberOfPicksWithCardinalityAndFraction( + uint32 _bitRangeSize, + uint256 _cardinality, + uint256 _fractionOfOdds + ) public pure returns (uint256 cardinality) { + return + _calculateNumberOfPicksWithCardinalityAndFraction( + _bitRangeSize, + _cardinality, + _fractionOfOdds + ); + } + + function calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) public pure returns (uint8 cardinality) { - return _calculateCardinality(_bitRangeSize, _maxPicks); + return _calculateCardinalityCeiling(_bitRangeSize, _maxPicks); } - function caclulateFractionOfOdds( + function calculateFractionOfOdds( uint256 _dpr, uint256 _totalSupply, uint256 _prize ) public pure returns (uint256) { - return _caclulateFractionOfOdds(_dpr, _totalSupply, _prize); + return _calculateFractionOfOdds(_dpr, _totalSupply, _prize); + } + + function calculateCardinalityAndNumberOfPicks( + uint256 _totalSupply, + uint256 _prize, + uint32 _bitRangeSize, + uint256 _dpr, + uint256 _minPickCost + ) public pure returns (uint8 cardinality, uint256 numberOfPicks) { + return + _calculateCardinalityAndNumberOfPicks( + _totalSupply, + _prize, + _bitRangeSize, + _dpr, + _minPickCost + ); } } diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index 3e5b008..048348c 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -5,7 +5,7 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { Contract, ContractFactory } from 'ethers'; import DrawBuffer from '@pooltogether/v4-core/artifacts/contracts/DrawBuffer.sol/DrawBuffer.json'; import { BigNumber } from 'ethereum-waffle/node_modules/ethers'; -import { parseEther } from 'ethers/lib/utils'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; const { getSigners } = ethers; @@ -20,8 +20,8 @@ describe('DrawPercentageRate', () => { let drawBuffer: MockContract; let drawPercentageRateFactory: ContractFactory; - const MIN_PICK_COST = BigNumber.from('1') - const DPR = BigNumber.from('1') + const MIN_PICK_COST = BigNumber.from('1'); + const DPR = BigNumber.from('1'); before(async () => { [wallet1, wallet2, wallet3] = await getSigners(); @@ -39,29 +39,162 @@ describe('DrawPercentageRate', () => { prizeTierHistory.address, drawBuffer.address, MIN_PICK_COST, - DPR + DPR, ); }); describe('Core', () => { - describe('getPrizeDistribution()', () => { - it('should correctly calculate a valid PrizeDistrubtion', async () => { + it('should correctly calculate a valid PrizeDistribution', async () => { expect(true).to.eq(true); }); }); describe('getPrizeDistributionList()', () => { - it('should correctly calculate a list of valid PrizeDistrubtions', async () => { + it('should correctly calculate a list of valid PrizeDistributions', async () => { expect(true).to.eq(true); }); }); }); - - describe('Internals', () => { - + + describe('Internal', () => { + // Calculate Cardinality + describe('calculateCardinality()', () => { + it('should successfully calculate a valid cardinality.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('100'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.01', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateCardinality( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value).to.eq(BigNumber.from('7')); + }); + + it('should successfully calculate a valid cardinality and number of picks.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('10'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.1', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateCardinality( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value).to.eq(BigNumber.from('4')); + }); + }); + + // Calculate Number of Picks + describe('calculateNumberOfPicks()', () => { + it('should successfully calculate a valid cardinality.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('100'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.01', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateNumberOfPicks( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value).to.eq(BigNumber.from('1638')); + }); + + it('should successfully calculate a valid cardinality and number of picks.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('10'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.1', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateNumberOfPicks( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value).to.eq(BigNumber.from('2560')); + }); + }); + + // Calculate Number of Picks using Cardinality and Fraction of Odds + describe('calculateNumberOfPicksWithCardinalityAndFraction()', () => { + it('should successfully calculate number of picks of using cardinality and fraction of odds', async () => { + const BIT_RANGE_SIZE = BigNumber.from('2'); + const CARDINALITY = BigNumber.from('7'); + const FRACTION_OF_ODDS = BigNumber.from('100000000'); + const value = + await drawPercentageRate.calculateNumberOfPicksWithCardinalityAndFraction( + BIT_RANGE_SIZE, + CARDINALITY, + FRACTION_OF_ODDS, + ); + expect(value).to.eq(BigNumber.from('1638')); + }); + + it('should successfully calculate number of picks of using cardinality and fraction of odds', async () => { + const BIT_RANGE_SIZE = BigNumber.from('2'); + const CARDINALITY = BigNumber.from('4'); + const FRACTION_OF_ODDS = BigNumber.from('10000000000'); + const value = + await drawPercentageRate.calculateNumberOfPicksWithCardinalityAndFraction( + BIT_RANGE_SIZE, + CARDINALITY, + FRACTION_OF_ODDS, + ); + expect(value).to.eq(BigNumber.from('2560')); + }); + }); + + describe('calculateCardinalityAndNumberOfPicks()', () => { + it('should successfully calculate a valid cardinality and number of picks.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('100'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.01', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value.cardinality).to.eq(BigNumber.from('7')); + expect(value.numberOfPicks).to.eq(BigNumber.from('1638')); + }); + + it('should successfully calculate a valid cardinality and number of picks.', async () => { + const TOTAL_SUPPLY = BigNumber.from('1000'); + const PRIZE = BigNumber.from('10'); + const BIT_RANGE_SIZE = BigNumber.from('2'); + const DPR = parseUnits('0.1', '9'); + const MIN_PICK_COST = BigNumber.from('1'); + const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( + TOTAL_SUPPLY, + PRIZE, + BIT_RANGE_SIZE, + DPR, + MIN_PICK_COST, + ); + expect(value.cardinality).to.eq(BigNumber.from('4')); + expect(value.numberOfPicks).to.eq(BigNumber.from('2560')); + }); + }); + describe('calculatePrizeDistribution()', () => { - it('should succesfully calculate a PrizeDistribution using mock historical Draw parameters', async () => { + it('should successfully calculate a PrizeDistribution using mock historical Draw parameters', async () => { const DRAW_ID = 1; const DRAW_PERCENTAGE_RATE = '1'; // expect(await drawPercentageRate.calculatePrizeDistribution(DRAW_ID, DRAW_PERCENTAGE_RATE)).to.eq(true); @@ -70,28 +203,45 @@ describe('DrawPercentageRate', () => { }); describe('calculateDrawPeriodTimestampOffsets()', () => { - it('should succesfully calculate the Draw timestamp offests', async () => { + it('should successfully calculate the Draw timestamp offests', async () => { const TIMESTAMP = BigNumber.from('1000'); const START_OFFSET = BigNumber.from('990'); const END_OFFSET = BigNumber.from('10'); - const offsets = await drawPercentageRate.calculateDrawPeriodTimestampOffsets(TIMESTAMP, START_OFFSET, END_OFFSET) + const offsets = await drawPercentageRate.calculateDrawPeriodTimestampOffsets( + TIMESTAMP, + START_OFFSET, + END_OFFSET, + ); expect(offsets[0][0]).to.equal(BigNumber.from('10')); expect(offsets[1][0]).to.equal(BigNumber.from('990')); }); }); - - describe('calculateCardinality()', () => { - it('should succesfully calculate the cardinality', async () => { - expect(await drawPercentageRate.calculateCardinality(4, 1000) ).to.eq(2); + + describe('calculateCardinalityCeiling()', () => { + it('should successfully calculate the cardinality from max picks', async () => { + const BIT_RANGE_SIZE = BigNumber.from('4'); + const MAX_PICKS = BigNumber.from('1000'); + const CARDINALITY_EXPECT = BigNumber.from('3'); + const read = await drawPercentageRate.calculateCardinalityCeiling( + BIT_RANGE_SIZE, + MAX_PICKS, + ); + expect(read).to.eq(CARDINALITY_EXPECT); }); }); - describe('caclulateFractionOfOdds()', () => { - it('should succesfully calculate the fracion of odds', async () => { + describe('calculateFractionOfOdds()', () => { + it('should successfully calculate the fracion of odds', async () => { const DRAW_PERCENTAGE_RATE = BigNumber.from('100000'); const TOTAL_SUPPLY = BigNumber.from('100000'); const PRIZE = parseEther('1'); - expect(await drawPercentageRate.caclulateFractionOfOdds(DRAW_PERCENTAGE_RATE, TOTAL_SUPPLY, PRIZE)).to.eq(BigNumber.from('0')); + expect( + await drawPercentageRate.calculateFractionOfOdds( + DRAW_PERCENTAGE_RATE, + TOTAL_SUPPLY, + PRIZE, + ), + ).to.eq(BigNumber.from('0')); }); }); }); @@ -101,7 +251,9 @@ describe('DrawPercentageRate', () => { expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); }); it('should get the strategy address', async () => { - expect(await drawPercentageRate.getPrizeTierHistory()).to.equal(prizeTierHistory.address); + expect(await drawPercentageRate.getPrizeTierHistory()).to.equal( + prizeTierHistory.address, + ); }); it('should get the reserve address', async () => { expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); @@ -116,19 +268,21 @@ describe('DrawPercentageRate', () => { describe('Setters', () => { it('should set the destination address', async () => { - drawPercentageRate.setTicket(ticket.address) + drawPercentageRate.setTicket(ticket.address); expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); }); it('should set the strategy address', async () => { - drawPercentageRate.setPrizeTierHistory(prizeTierHistory.address) - expect(await drawPercentageRate.getPrizeTierHistory()).to.equal(prizeTierHistory.address); + drawPercentageRate.setPrizeTierHistory(prizeTierHistory.address); + expect(await drawPercentageRate.getPrizeTierHistory()).to.equal( + prizeTierHistory.address, + ); }); it('should set the reserve address', async () => { - drawPercentageRate.setDrawBuffer(drawBuffer.address) + drawPercentageRate.setDrawBuffer(drawBuffer.address); expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); }); it('should set the DPR (draw percentage rate)', async () => { - await drawPercentageRate.setDpr(DPR) + await drawPercentageRate.setDpr(DPR); expect(await drawPercentageRate.getDpr()).to.equal(DPR); }); }); diff --git a/test/libraries/IDBinarySearch.ts b/test/libraries/IDBinarySearch.ts new file mode 100644 index 0000000..e3050b3 --- /dev/null +++ b/test/libraries/IDBinarySearch.ts @@ -0,0 +1,28 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import { Contract, ContractFactory } from "ethers"; + +const { getSigners } = ethers; + +describe("IDBinarySearch", () => { + let wallet1: SignerWithAddress; + let wallet2: SignerWithAddress; + let wallet3: SignerWithAddress; + + let binarySearchLogic: Contract; + let binarySearchLogicFactory: ContractFactory; + + before(async () => { + [wallet1, wallet2, wallet3] = await getSigners(); + binarySearchLogicFactory = await ethers.getContractFactory("IDBinarySearch"); + }); + + beforeEach(async () => { + binarySearchLogic = await binarySearchLogicFactory.deploy(); + }); + + describe("Core", () => { + describe("getNewestIndex()", () => {}); + }); +}); From 9fa45135f20d7271b0ffc0901717dd1a7d7e8235 Mon Sep 17 00:00:00 2001 From: kames Date: Thu, 3 Mar 2022 14:21:30 -0700 Subject: [PATCH 07/30] update(PrizeTierHistoryV2): use virtual functions to resolve drawId --- contracts/PrizeTierHistoryV2.sol | 50 +++--------------------- contracts/libraries/DrawBinarySearch.sol | 28 +++++-------- 2 files changed, 14 insertions(+), 64 deletions(-) diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol index 85e18f9..bd9fc3f 100644 --- a/contracts/PrizeTierHistoryV2.sol +++ b/contracts/PrizeTierHistoryV2.sol @@ -24,60 +24,20 @@ contract PrizeTierHistoryV2 is DrawBinarySearch { PrizeTier[] internal history; - function getPrizeTier(uint32 _drawId) external view returns (PrizeTier memory) { - require(_drawId > 0, "PrizeTierHistory/draw-id-not-zero"); - return _getPrizeTier(_drawId); + function getNewestIndex() internal view override returns (uint32) { + return uint32(history.length - 1); } - function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTier memory) { - return history[0]; - } -} - -/** - * @title PoolTogether V4 PrizeTierHistoryUsingLibV2 - * @author PoolTogether Inc Team - * @notice PrizeTierHistoryV2 manages a history of PrizeTier parameters - */ - contract PrizeTierHistoryUsingLibV2 { - struct PrizeTier { - uint8 bitRangeSize; - uint32 drawId; - uint32 maxPicksPerUser; - uint32 expiryDuration; - uint32 endTimestampOffset; - uint256 prize; - uint32[16] tiers; - uint32 dpr; + function getDrawIdForIndex(uint index) internal view override returns (uint32) { + return history[index].drawId; } - PrizeTier[] internal history; - function getPrizeTier(uint32 _drawId) external view returns (PrizeTier memory) { require(_drawId > 0, "PrizeTierHistory/draw-id-not-zero"); return _getPrizeTier(_drawId); } function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTier memory) { - uint32 cardinality = uint32(history.length); - require(cardinality > 0, "PrizeTierHistory/no-prize-tiers"); - - uint32 leftSide = 0; - uint32 rightSide = cardinality - 1; - uint32 oldestDrawId = history[leftSide].drawId; - uint32 newestDrawId = history[rightSide].drawId; - - require(_drawId >= oldestDrawId, "PrizeTierHistory/draw-id-out-of-range"); - if (_drawId >= newestDrawId) return history[rightSide]; - if (_drawId == oldestDrawId) return history[leftSide]; - - uint32[] memory _history = new uint32[](cardinality); - - for (uint256 index = 0; index < _history.length; index++) { - _history[index] = history[index].drawId; - } - - uint32 i = BinarySearchLib._binarySearch(_drawId, leftSide, rightSide, _history); - return history[i]; + return history[_binarySearch(_drawId)]; } } diff --git a/contracts/libraries/DrawBinarySearch.sol b/contracts/libraries/DrawBinarySearch.sol index 095775e..279e5a6 100644 --- a/contracts/libraries/DrawBinarySearch.sol +++ b/contracts/libraries/DrawBinarySearch.sol @@ -7,29 +7,19 @@ pragma solidity 0.8.6; * @notice DrawBinarySearch handles finding a historical Draw ID references */ -contract DrawBinarySearch { - - function _binarySearch( - uint32 _drawId, - uint32 leftSide, - uint32 rightSide, - uint32[] memory _history - ) internal pure returns (uint32) { - return _history[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; - } +abstract contract DrawBinarySearch { + + function getNewestIndex() internal view virtual returns (uint32); + + function getDrawIdForIndex(uint index) internal view virtual returns (uint32); - function _binarySearchIndex( - uint32 _drawId, - uint32 _leftSide, - uint32 _rightSide, - uint32[] memory _history - ) internal pure returns (uint32) { + function _binarySearch(uint32 _drawId) internal view returns (uint32) { uint32 index; - uint32 leftSide = _leftSide; - uint32 rightSide = _rightSide; + uint32 leftSide = 0; + uint32 rightSide = getNewestIndex(); while (true) { uint32 center = leftSide + (rightSide - leftSide) / 2; - uint32 centerID = _history[center]; + uint32 centerID = getDrawIdForIndex(center); if (centerID == _drawId) { index = center; From 87412c3574cf623e6a002a8ff74be8f7c4e8ef2a Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 04:21:09 -0700 Subject: [PATCH 08/30] add(contracts): support for PrizeTierHistoryV2 --- contracts/DPRHistory.sol | 36 --- contracts/DrawIDBinarySearch.sol | 69 ++++++ contracts/DrawPercentageRate.sol | 187 +++----------- contracts/{libraries => }/IDBinarySearch.sol | 3 +- contracts/PrizeTierHistoryV2.sol | 130 ++++++++-- contracts/interfaces/IPrizeTierHistoryV2.sol | 49 ++++ contracts/libraries/DrawBinarySearch.sol | 47 ---- contracts/test/DrawPercentageRateHarness.sol | 39 ++- test/DrawPercentageRate.test.ts | 38 ++- test/PrizeTierHistory.test.ts | 9 + test/PrizeTierHistoryV2.test.ts | 242 +++++++++++++++++++ 11 files changed, 548 insertions(+), 301 deletions(-) delete mode 100644 contracts/DPRHistory.sol create mode 100644 contracts/DrawIDBinarySearch.sol rename contracts/{libraries => }/IDBinarySearch.sol (95%) create mode 100644 contracts/interfaces/IPrizeTierHistoryV2.sol delete mode 100644 contracts/libraries/DrawBinarySearch.sol create mode 100644 test/PrizeTierHistoryV2.test.ts diff --git a/contracts/DPRHistory.sol b/contracts/DPRHistory.sol deleted file mode 100644 index 2b02899..0000000 --- a/contracts/DPRHistory.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -import "./libraries/IDBinarySearch.sol"; - -/** - * @title PoolTogether V4 DPRHistory - * @author PoolTogether Inc Team - * @notice DPRHistory stores a list of historical draw percentage rate checkpoints. - */ - -contract DPRHistory is IDBinarySearch { - uint256[] internal history; - - /** - * @dev Constructor - */ - constructor(uint32[] memory _history) IDBinarySearch(_history) { - history = new uint256[](0); - } - - function getDpr(uint32 drawId) external view returns (uint256) { - require(drawId > 0, "DPRHistory/draw-id-not-zero"); - return history[_getIndexForDrawId(drawId)]; - } - - /** - * @notice Push a new draw percentage rate checkpoint to the history. - * @param drawId uint32 - The draw id - * @param nextDpr uint256 - The draw percentage rate - */ - function push(uint32 drawId, uint256 nextDpr) external { - history.push(nextDpr); - super.push(drawId); - } -} diff --git a/contracts/DrawIDBinarySearch.sol b/contracts/DrawIDBinarySearch.sol new file mode 100644 index 0000000..4306f5e --- /dev/null +++ b/contracts/DrawIDBinarySearch.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "hardhat/console.sol"; + +/** + * @title PoolTogether V4 DrawIDBinarySearch + * @author PoolTogether Inc Team + * @notice DrawIDBinarySearch uses binary search to find a parent contract struct with the drawId parameter + * @dev The implementing contract must provider access to a struct (i.e. PrizeTier) list with is both + * sorted and indexed by the drawId field for binary search to work. + */ +abstract contract DrawIDBinarySearch { + /** + * @notice Get newest index in array + */ + function getNewestIndex() internal view virtual returns (uint32); + + /** + * @notice Get Draw ID for using an index position + * @param index uint256 - Index of element in array + */ + function getDrawIdForIndex(uint256 index) internal view virtual returns (uint32); + + function _binarySearch(uint32 _drawId) internal view returns (uint32) { + uint32 index; + uint32 leftSide = 0; + uint32 rightSide = getNewestIndex(); + + uint32 oldestDrawId = getDrawIdForIndex(leftSide); + uint32 newestDrawId = getDrawIdForIndex(rightSide); + + require(_drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); + if (_drawId >= newestDrawId) return rightSide; + if (_drawId == oldestDrawId) return leftSide; + + while (true) { + + if (rightSide <= leftSide) { + index = rightSide; + break; + } + + uint32 center = leftSide + ((rightSide - leftSide) / 2); + uint32 centerID = getDrawIdForIndex(center); + + if (centerID == _drawId) { + index = center; + break; + } + + if (centerID < _drawId) { + leftSide = center + 1; + } else if (centerID > _drawId) { + rightSide = center - 1; + } + + if (leftSide == rightSide) { + if (centerID >= _drawId) { + index = center - 1; + break; + } else { + index = center; + break; + } + } + } + return index; + } +} diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol index d49ba67..826cf02 100644 --- a/contracts/DrawPercentageRate.sol +++ b/contracts/DrawPercentageRate.sol @@ -5,7 +5,7 @@ import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol" import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; -import "./interfaces/IPrizeTierHistory.sol"; +import "./interfaces/IPrizeTierHistoryV2.sol"; /** * @title PoolTogether V4 DrawPercentageRate @@ -13,56 +13,38 @@ import "./interfaces/IPrizeTierHistory.sol"; * @notice DrawPercentageRate calculates a PrizePool distributions using a static draw percentage rate */ contract DrawPercentageRate { - // Constants uint32 public constant RATE_NORMALIZATION = 1e9; // Immutable (Set by constructor) uint256 public immutable minPickCost; - // Mutable - uint256 public dpr; + // Mutable (Set by constructor and setters) ITicket public ticket; IDrawBuffer public drawBuffer; - IPrizeTierHistory public prizeTierHistory; - - struct DPRHistory { - uint32 drawId; - uint256 dpr; - } - - DPRHistory[] internal history; + IPrizeTierHistoryV2 public prizeTierHistory; /** * Constructor * @param _ticket - ITicket * @param _drawBuffer - IDrawBuffer - * @param _prizeTierHistory - IPrizeTierHistory - * @param _dpr - uint256 + * @param _prizeTierHistory - IPrizeTierHistoryV2 * @param _minPickCost - uint256 */ constructor( ITicket _ticket, - IPrizeTierHistory _prizeTierHistory, + IPrizeTierHistoryV2 _prizeTierHistory, IDrawBuffer _drawBuffer, - uint256 _minPickCost, - uint256 _dpr + uint256 _minPickCost ) { ticket = _ticket; prizeTierHistory = _prizeTierHistory; drawBuffer = _drawBuffer; minPickCost = _minPickCost; - dpr = _dpr; } /* =================================================== */ /* Core ============================================== */ /* =================================================== */ - - function getDpr(uint32 _drawId) external view returns (DPRHistory memory) { - require(_drawId > 0, "DrawPercentageRate/draw-id-not-zero"); - return _getDpr(_drawId); - } - /** * @notice Get a PrizeDistribution using a historical Draw ID * @param drawId - uint32 @@ -73,7 +55,7 @@ contract DrawPercentageRate { view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - return _getPrizeDistribution(drawId); + return _calculatePrizeDistribution(drawId); } /** @@ -91,7 +73,7 @@ contract DrawPercentageRate { drawIds.length ); for (uint256 index = 0; index < drawIds.length; index++) { - _prizeDistributions[index] = _getPrizeDistribution(drawIds[index]); + _prizeDistributions[index] = _calculatePrizeDistribution(drawIds[index]); } return _prizeDistributions; } @@ -100,32 +82,17 @@ contract DrawPercentageRate { /* Internal ========================================== */ /* =================================================== */ - /** - * @notice Internal function to get a PrizeDistribution using a historical Draw ID - * @param _drawId - uint32 - * @return prizeDistribution - */ - function _getPrizeDistribution(uint32 _drawId) - internal - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - DPRHistory memory _history = _getDpr(_drawId); - return _calculatePrizeDistribution(_drawId, _history.dpr); - } - /** * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters * @param _drawId - uint32 - * @param _dpr - uint256 Draw Percentage Rate associated with the Draw ID * @return prizeDistribution */ - function _calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) + function _calculatePrizeDistribution(uint32 _drawId) internal view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - IPrizeTierHistory.PrizeTier memory prizeTier = prizeTierHistory.getPrizeTier(_drawId); + IPrizeTierHistoryV2.PrizeTierV2 memory prizeTier = prizeTierHistory.getPrizeTier(_drawId); IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( draw.timestamp, @@ -134,11 +101,11 @@ contract DrawPercentageRate { ); uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( - _totalSupplies[0], - prizeTier.prize, prizeTier.bitRangeSize, - _dpr, - minPickCost + prizeTier.prize, + prizeTier.dpr, + minPickCost, + _totalSupplies[0] ); IPrizeDistributionBuffer.PrizeDistribution memory prizeDistribution = IPrizeDistributionBuffer.PrizeDistribution({ @@ -156,11 +123,11 @@ contract DrawPercentageRate { } function _calculateCardinality( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) internal pure returns (uint8 cardinality) { uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); @@ -172,11 +139,11 @@ contract DrawPercentageRate { } function _calculateNumberOfPicks( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) internal pure returns (uint104) { uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); @@ -203,25 +170,25 @@ contract DrawPercentageRate { } function _calculateCardinalityAndNumberOfPicks( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { cardinality = _calculateCardinality( - _totalSupply, - _prize, _bitRangeSize, + _prize, _dpr, - _minPickCost + _minPickCost, + _totalSupply ); numberOfPicks = _calculateNumberOfPicks( - _totalSupply, - _prize, _bitRangeSize, + _prize, _dpr, - _minPickCost + _minPickCost, + _totalSupply ); } @@ -256,68 +223,6 @@ contract DrawPercentageRate { return (_dpr * _totalSupply) / _prize; } - function _getDpr(uint32 _drawId) internal view returns (DPRHistory memory) { - uint256 cardinality = history.length; - require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); - - uint256 leftSide = 0; - uint256 rightSide = cardinality - 1; - uint32 oldestDrawId = history[leftSide].drawId; - uint32 newestDrawId = history[rightSide].drawId; - - require(_drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); - if (_drawId >= newestDrawId) return history[rightSide]; - if (_drawId == oldestDrawId) return history[leftSide]; - - return _binarySearch(_drawId, leftSide, rightSide, history); - } - - function _binarySearch( - uint32 _drawId, - uint256 leftSide, - uint256 rightSide, - DPRHistory[] storage _history - ) internal view returns (DPRHistory memory) { - return _history[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; - } - - function _binarySearchIndex( - uint32 _drawId, - uint256 _leftSide, - uint256 _rightSide, - DPRHistory[] storage _history - ) internal view returns (uint256) { - uint256 index; - uint256 leftSide = _leftSide; - uint256 rightSide = _rightSide; - while (true) { - uint256 center = leftSide + (rightSide - leftSide) / 2; - uint32 centerID = _history[center].drawId; - - if (centerID == _drawId) { - index = center; - break; - } - - if (centerID < _drawId) { - leftSide = center + 1; - } else if (centerID > _drawId) { - rightSide = center - 1; - } - - if (leftSide == rightSide) { - if (centerID >= _drawId) { - index = center - 1; - break; - } else { - index = center; - break; - } - } - } - return index; - } - function _normalizePicks(uint256 _dividend, uint256 _denomintor) internal pure @@ -330,10 +235,6 @@ contract DrawPercentageRate { /* Getter ============================================ */ /* =================================================== */ - function getDpr() external view returns (uint256) { - return dpr; - } - function getMinPickCost() external view returns (uint256) { return minPickCost; } @@ -346,7 +247,7 @@ contract DrawPercentageRate { return drawBuffer; } - function getPrizeTierHistory() external view returns (IPrizeTierHistory) { + function getPrizeTierHistory() external view returns (IPrizeTierHistoryV2) { return prizeTierHistory; } @@ -354,10 +255,7 @@ contract DrawPercentageRate { /* Setter ============================================ */ /* =================================================== */ - function setDpr(uint256 _dpr) external { - dpr = _dpr; - } - + // @TODO: We probably don't need this setter. What good reason is there to change a ticket and the totalSupply history !?!?!? function setTicket(ITicket _ticket) external { ticket = _ticket; } @@ -366,28 +264,7 @@ contract DrawPercentageRate { drawBuffer = _drawBuffer; } - function setPrizeTierHistory(IPrizeTierHistory _prizeTierHistory) external { + function setPrizeTierHistory(IPrizeTierHistoryV2 _prizeTierHistory) external { prizeTierHistory = _prizeTierHistory; } - - function push(DPRHistory calldata _nextDpr) external { - DPRHistory[] memory _history = history; - if (_history.length > 0) { - DPRHistory memory _newestDpr = history[history.length - 1]; - require(_nextDpr.drawId > _newestDpr.drawId, "DrawPercentageRate/non-sequential-dpr"); - } - history.push(_nextDpr); - } - - function replace(DPRHistory calldata _nextDpr) external { - uint256 cardinality = history.length; - require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); - uint256 leftSide = 0; - uint256 rightSide = cardinality - 1; - uint32 oldestDrawId = history[leftSide].drawId; - require(_nextDpr.drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); - uint256 index = _binarySearchIndex(_nextDpr.drawId, leftSide, rightSide, history); - require(history[index].drawId == _nextDpr.drawId, "DrawPercentageRate/draw-id-must-match"); - history[index] = _nextDpr; - } } diff --git a/contracts/libraries/IDBinarySearch.sol b/contracts/IDBinarySearch.sol similarity index 95% rename from contracts/libraries/IDBinarySearch.sol rename to contracts/IDBinarySearch.sol index e7534fd..551281d 100644 --- a/contracts/libraries/IDBinarySearch.sol +++ b/contracts/IDBinarySearch.sol @@ -4,7 +4,8 @@ pragma solidity 0.8.6; /** * @title PoolTogether V4 IDBinarySearch * @author PoolTogether Inc Team - * @notice IDBinarySearch handles finding a historical Draw ID references + * @notice IDBinarySearch creates a binary search tree for ID values in ordered list + Developed as a prototype for simple lookups using just a Draw ID */ contract IDBinarySearch { diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol index bd9fc3f..a2c6726 100644 --- a/contracts/PrizeTierHistoryV2.sol +++ b/contracts/PrizeTierHistoryV2.sol @@ -1,43 +1,133 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; - -import "./libraries/BinarySearchLib.sol"; -import "./libraries/DrawBinarySearch.sol"; +import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; +import "./interfaces/IPrizeTierHistoryV2.sol"; +import "./DrawIDBinarySearch.sol"; /** * @title PoolTogether V4 PrizeTierHistoryV2 * @author PoolTogether Inc Team * @notice PrizeTierHistoryV2 manages a history of PrizeTier parameters + * @dev During PrizeTierHistoryV2 initialization a history can be injected into the contract. + Injection of history allows us to mimic historical data from PrizeTierHistoryV1 while + tightly packing the DPR parameter into the PrizeTierV2 struct. */ -contract PrizeTierHistoryV2 is DrawBinarySearch { +contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, DrawIDBinarySearch, Manageable { + PrizeTierV2[] internal history; - struct PrizeTier { - uint8 bitRangeSize; - uint32 drawId; - uint32 maxPicksPerUser; - uint32 expiryDuration; - uint32 endTimestampOffset; - uint256 prize; - uint32[16] tiers; - uint32 dpr; + constructor(address _owner, PrizeTierV2[] memory _history) Ownable(_owner) { + if (_history.length > 0) { + _injectTimeline(_history); + } } - PrizeTier[] internal history; - + // @inheritdoc DrawIDBinarySearch function getNewestIndex() internal view override returns (uint32) { return uint32(history.length - 1); } - function getDrawIdForIndex(uint index) internal view override returns (uint32) { + // @inheritdoc DrawIDBinarySearch + function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { return history[index].drawId; } - function getPrizeTier(uint32 _drawId) external view returns (PrizeTier memory) { - require(_drawId > 0, "PrizeTierHistory/draw-id-not-zero"); - return _getPrizeTier(_drawId); + // @inheritdoc IPrizeTierHistoryV2 + function getOldestDrawId() external view override returns (uint32) { + return history[0].drawId; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getNewestDrawId() external view override returns (uint32) { + return history[history.length - 1].drawId; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getPrizeTier(uint32 drawId) + external + view + override + returns (PrizeTierV2 memory prizeTier) + { + require(drawId > 0, "PrizeTierHistory/draw-id-not-zero"); + return _getPrizeTier(drawId); + } + + // @inheritdoc IPrizeTierHistoryV2 + function getPrizeTierList(uint32[] calldata _drawIds) + external + view + override + returns (PrizeTierV2[] memory) + { + PrizeTierV2[] memory _data = new PrizeTierV2[](_drawIds.length); + for (uint256 index = 0; index < _drawIds.length; index++) { + _data[index] = _getPrizeTier(_drawIds[index]); + } + return _data; + } + + function getPrizeTierAtIndex(uint256 index) external view returns (PrizeTierV2 memory) { + return history[index]; + } + + /* =================================================== */ + /* Setters =========================================== */ + /* =================================================== */ + + function push(PrizeTierV2 calldata nextPrizeTier) external onlyManagerOrOwner returns (bool) { + _push(nextPrizeTier); + return true; + } + + function replace(PrizeTierV2 calldata newPrizeTier) external onlyOwner returns (bool) { + _replace(newPrizeTier); + return true; } - function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTier memory) { + function injectTimeline(PrizeTierV2[] calldata prizeTierTimeline) + external + onlyOwner + returns (bool) + { + _injectTimeline(prizeTierTimeline); + return true; + } + + /* =================================================== */ + /* Internal ========================================== */ + /* =================================================== */ + + function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTierV2 memory) { return history[_binarySearch(_drawId)]; } + + function _push(PrizeTierV2 memory _prizeTier) internal { + PrizeTierV2[] memory _history = history; + if (_history.length > 0) { + PrizeTierV2 memory _newestDpr = history[history.length - 1]; + require(_prizeTier.drawId > _newestDpr.drawId, "PrizeTierHistoryV2/non-sequential-dpr"); + } + history.push(_prizeTier); + } + + function _replace(PrizeTierV2 calldata _prizeTier) internal { + uint256 cardinality = history.length; + require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); + uint32 oldestDrawId = history[0].drawId; + require(_prizeTier.drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); + uint256 index = _binarySearch(_prizeTier.drawId); + require( + history[index].drawId == _prizeTier.drawId, + "DrawPercentageRate/draw-id-must-match" + ); + history[index] = _prizeTier; + } + + function _injectTimeline(PrizeTierV2[] memory _timeline) internal { + require(history.length == 0, "PrizeTierHistory/history-not-empty"); + require(_timeline.length > 0, "PrizeTierHistory/timeline-empty"); + for (uint256 i = 0; i < _timeline.length; i++) { + _push(_timeline[i]); + } + } } diff --git a/contracts/interfaces/IPrizeTierHistoryV2.sol b/contracts/interfaces/IPrizeTierHistoryV2.sol new file mode 100644 index 0000000..ea340c8 --- /dev/null +++ b/contracts/interfaces/IPrizeTierHistoryV2.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; + +/** + * @title PoolTogether V4 IPrizeTierHistoryV2 + * @author PoolTogether Inc Team + * @notice IPrizeTierHistoryV2 is the base contract for PrizeTierHistoryV2 + */ +interface IPrizeTierHistoryV2 { + struct PrizeTierV2 { + uint8 bitRangeSize; + uint32 drawId; + uint32 maxPicksPerUser; + uint32 expiryDuration; + uint32 endTimestampOffset; + uint256 prize; + uint32[16] tiers; + uint32 dpr; + // @TODO add minPickCost to the new PrizeTierHistoryV2? Semi-linked to DPR + } + + /** + * @notice Read oldest Draw ID in history array + */ + function getOldestDrawId() external view returns (uint32); + + /** + * @notice Read newest Draw ID in history array + */ + function getNewestDrawId() external view returns (uint32); + + /** + * @notice Read PrizeTierV2 struct using Draw ID as the input + * @param drawId uint32 - Draw ID + * @return prizeTier PrizeTierV2 - Parameters to calculate PrizeDistrubtion + */ + function getPrizeTier(uint32 drawId) external view returns (PrizeTierV2 memory prizeTier); + + /** + * @notice Read PrizeTierV2 struct using Draw ID as the input + * @param drawIds uint32[] - Draw ID + * @return prizeTierList PrizeTierV2[] - Parameters to calculate PrizeDistrubtion + */ + function getPrizeTierList(uint32[] calldata drawIds) + external + view + returns (PrizeTierV2[] memory prizeTierList); +} diff --git a/contracts/libraries/DrawBinarySearch.sol b/contracts/libraries/DrawBinarySearch.sol deleted file mode 100644 index 279e5a6..0000000 --- a/contracts/libraries/DrawBinarySearch.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -/** - * @title PoolTogether V4 DrawBinarySearch - * @author PoolTogether Inc Team - * @notice DrawBinarySearch handles finding a historical Draw ID references - */ - -abstract contract DrawBinarySearch { - - function getNewestIndex() internal view virtual returns (uint32); - - function getDrawIdForIndex(uint index) internal view virtual returns (uint32); - - function _binarySearch(uint32 _drawId) internal view returns (uint32) { - uint32 index; - uint32 leftSide = 0; - uint32 rightSide = getNewestIndex(); - while (true) { - uint32 center = leftSide + (rightSide - leftSide) / 2; - uint32 centerID = getDrawIdForIndex(center); - - if (centerID == _drawId) { - index = center; - break; - } - - if (centerID < _drawId) { - leftSide = center + 1; - } else if (centerID > _drawId) { - rightSide = center - 1; - } - - if (leftSide == rightSide) { - if (centerID >= _drawId) { - index = center - 1; - break; - } else { - index = center; - break; - } - } - } - return index; - } -} diff --git a/contracts/test/DrawPercentageRateHarness.sol b/contracts/test/DrawPercentageRateHarness.sol index f6793f0..24a2aed 100644 --- a/contracts/test/DrawPercentageRateHarness.sol +++ b/contracts/test/DrawPercentageRateHarness.sol @@ -5,18 +5,17 @@ import "../DrawPercentageRate.sol"; contract DrawPercentageRateHarness is DrawPercentageRate { constructor( ITicket _ticket, - IPrizeTierHistory _prizeTierHistory, + IPrizeTierHistoryV2 _prizeTierHistory, IDrawBuffer _drawBuffer, - uint256 _minPickCost, - uint256 _dpr - ) DrawPercentageRate(_ticket, _prizeTierHistory, _drawBuffer, _minPickCost, _dpr) {} + uint256 _minPickCost + ) DrawPercentageRate(_ticket, _prizeTierHistory, _drawBuffer, _minPickCost) {} - function calculatePrizeDistribution(uint32 _drawId, uint256 _dpr) + function calculatePrizeDistribution(uint32 _drawId) external view returns (IPrizeDistributionBuffer.PrizeDistribution memory) { - return _calculatePrizeDistribution(_drawId, _dpr); + return _calculatePrizeDistribution(_drawId); } function calculateDrawPeriodTimestampOffsets( @@ -28,23 +27,23 @@ contract DrawPercentageRateHarness is DrawPercentageRate { } function calculateCardinality( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) public pure returns (uint8 cardinality) { - return _calculateCardinality(_totalSupply, _prize, _bitRangeSize, _dpr, _minPickCost); + return _calculateCardinality(_bitRangeSize, _prize, _dpr, _minPickCost, _totalSupply); } function calculateNumberOfPicks( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) public pure returns (uint256 numberOfPicks) { - return _calculateNumberOfPicks(_totalSupply, _prize, _bitRangeSize, _dpr, _minPickCost); + return _calculateNumberOfPicks(_bitRangeSize, _prize, _dpr, _minPickCost, _totalSupply); } function calculateNumberOfPicksWithCardinalityAndFraction( @@ -77,19 +76,19 @@ contract DrawPercentageRateHarness is DrawPercentageRate { } function calculateCardinalityAndNumberOfPicks( - uint256 _totalSupply, - uint256 _prize, uint32 _bitRangeSize, + uint256 _prize, uint256 _dpr, - uint256 _minPickCost + uint256 _minPickCost, + uint256 _totalSupply ) public pure returns (uint8 cardinality, uint256 numberOfPicks) { return _calculateCardinalityAndNumberOfPicks( - _totalSupply, - _prize, _bitRangeSize, + _prize, _dpr, - _minPickCost + _minPickCost, + _totalSupply ); } } diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index 048348c..bdf36a4 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -21,12 +21,11 @@ describe('DrawPercentageRate', () => { let drawPercentageRateFactory: ContractFactory; const MIN_PICK_COST = BigNumber.from('1'); - const DPR = BigNumber.from('1'); before(async () => { [wallet1, wallet2, wallet3] = await getSigners(); const Ticket = await artifacts.readArtifact('PrizeTierHistory'); - const PrizeTierHistory = await artifacts.readArtifact('PrizeTierHistory'); + const PrizeTierHistory = await artifacts.readArtifact('PrizeTierHistoryV2'); ticket = await deployMockContract(wallet1, Ticket.abi); prizeTierHistory = await deployMockContract(wallet1, PrizeTierHistory.abi); drawBuffer = await deployMockContract(wallet1, DrawBuffer.abi); @@ -39,7 +38,6 @@ describe('DrawPercentageRate', () => { prizeTierHistory.address, drawBuffer.address, MIN_PICK_COST, - DPR, ); }); @@ -67,11 +65,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.01', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateCardinality( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value).to.eq(BigNumber.from('7')); }); @@ -83,11 +81,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.1', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateCardinality( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value).to.eq(BigNumber.from('4')); }); @@ -102,11 +100,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.01', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateNumberOfPicks( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value).to.eq(BigNumber.from('1638')); }); @@ -118,11 +116,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.1', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateNumberOfPicks( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value).to.eq(BigNumber.from('2560')); }); @@ -165,11 +163,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.01', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value.cardinality).to.eq(BigNumber.from('7')); expect(value.numberOfPicks).to.eq(BigNumber.from('1638')); @@ -182,11 +180,11 @@ describe('DrawPercentageRate', () => { const DPR = parseUnits('0.1', '9'); const MIN_PICK_COST = BigNumber.from('1'); const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( - TOTAL_SUPPLY, - PRIZE, BIT_RANGE_SIZE, + PRIZE, DPR, MIN_PICK_COST, + TOTAL_SUPPLY, ); expect(value.cardinality).to.eq(BigNumber.from('4')); expect(value.numberOfPicks).to.eq(BigNumber.from('2560')); @@ -250,20 +248,20 @@ describe('DrawPercentageRate', () => { it('should get the destination address', async () => { expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); }); + it('should get the strategy address', async () => { expect(await drawPercentageRate.getPrizeTierHistory()).to.equal( prizeTierHistory.address, ); }); + it('should get the reserve address', async () => { expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); }); + it('should get the minPickCost', async () => { expect(await drawPercentageRate.getMinPickCost()).to.equal(MIN_PICK_COST); }); - it('should get the DPR (draw percentage rate)', async () => { - expect(await drawPercentageRate.getDpr()).to.equal(DPR); - }); }); describe('Setters', () => { @@ -281,9 +279,5 @@ describe('DrawPercentageRate', () => { drawPercentageRate.setDrawBuffer(drawBuffer.address); expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); }); - it('should set the DPR (draw percentage rate)', async () => { - await drawPercentageRate.setDpr(DPR); - expect(await drawPercentageRate.getDpr()).to.equal(DPR); - }); }); }); diff --git a/test/PrizeTierHistory.test.ts b/test/PrizeTierHistory.test.ts index e06bfe9..c4632bd 100644 --- a/test/PrizeTierHistory.test.ts +++ b/test/PrizeTierHistory.test.ts @@ -124,6 +124,15 @@ describe('PrizeTierHistory', () => { expect(prizeTierFromHistory[2].drawId).to.equal(9); }); + it('should fail to get prize tiers from history', async () => { + await pushPrizeTiers(); + await pushPrizeTiers(); + const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 9]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + expect(prizeTierFromHistory[1].drawId).to.equal(6); + expect(prizeTierFromHistory[2].drawId).to.equal(9); + }); + it('should return prize tier before our searched draw id', async () => { await pushPrizeTiers(); const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(4); diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts new file mode 100644 index 0000000..32e44ba --- /dev/null +++ b/test/PrizeTierHistoryV2.test.ts @@ -0,0 +1,242 @@ +import { expect } from 'chai'; +import { ethers } from 'hardhat'; +import { Signer } from '@ethersproject/abstract-signer'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract, ContractFactory } from 'ethers'; +import { range } from './utils/range'; +import { parseUnits } from 'ethers/lib/utils'; + +const { getSigners, utils } = ethers; +const { parseEther: toWei } = utils; + +describe('PrizeTierHistoryV2', () => { + let wallet1: SignerWithAddress; + let wallet2: SignerWithAddress; + let wallet3: SignerWithAddress; + let wallet4: SignerWithAddress; + + let prizeTierHistory: Contract; + let prizeTierHistoryFactory: ContractFactory; + + const prizeTiers = [ + { + bitRangeSize: 5, + drawId: 1, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), + }, + { + bitRangeSize: 5, + drawId: 6, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), + }, + { + bitRangeSize: 5, + drawId: 9, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), + }, + { + bitRangeSize: 5, + drawId: 20, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), + }, + { + bitRangeSize: 5, + drawId: 21, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), + }, + ]; + + const pushPrizeTiers = async () => { + prizeTiers.map(async (tier) => { + await prizeTierHistory.push(tier); + }); + }; + + before(async () => { + [wallet1, wallet2, wallet3, wallet4] = await getSigners(); + prizeTierHistoryFactory = await ethers.getContractFactory('PrizeTierHistoryV2'); + }); + + beforeEach(async () => { + // Deploy PrizeTierHistoryV2 with an empty history for each test + prizeTierHistory = await prizeTierHistoryFactory.deploy(wallet1.address, []); + }); + + describe('Getters', () => { + + it('should succeed to get prize tiers from history', async () => { + await pushPrizeTiers(); + // const t2 = await prizeTierHistory.getPrizeTierAtIndex(2); + const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 15]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + expect(prizeTierFromHistory[1].drawId).to.equal(6); + expect(prizeTierFromHistory[2].drawId).to.equal(9); + }); + + it('should succeed to get prize tier from history', async () => { + await pushPrizeTiers(); + prizeTiers.map(async (prizeTier) => { + const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(prizeTier.drawId); + expect(prizeTierFromHistory.drawId).to.equal(prizeTier.drawId); + }); + }); + + it('should return prize tier before our searched draw id', async () => { + await pushPrizeTiers(); + const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(4); + expect(prizeTierFromHistory.drawId).to.equal(prizeTiers[0].drawId); + }); + + it('should fail to get a PrizeTier before history range', async () => { + await pushPrizeTiers(); + await expect(prizeTierHistory.getPrizeTier(0)).to.revertedWith( + 'PrizeTierHistoryV2/draw-id-not-zero', + ); + }); + + it('should fail to get a PrizeTer after history range', async () => { + await prizeTierHistory.push(prizeTiers[2]); + await expect(prizeTierHistory.getPrizeTier(4)).to.be.revertedWith( + 'PrizeTierHistoryV2/draw-id-out-of-range', + ); + }); + }); + + describe('Setters', () => { + describe('.push()', () => { + it('should succeed push PrizeTier into history from Owner wallet.', async () => { + await expect(prizeTierHistory.push(prizeTiers[0])).to.emit( + prizeTierHistory, + 'PrizeTierPushed', + ); + }); + + it('should succeed to push PrizeTier into history from Manager wallet', async () => { + await prizeTierHistory.setManager(wallet2.address); + await expect( + prizeTierHistory.connect(wallet2 as unknown as Signer).push(prizeTiers[0]), + ).to.emit(prizeTierHistory, 'PrizeTierPushed'); + }); + + it('should fail to push PrizeTier into history from Unauthorized wallet', async () => { + await expect( + prizeTierHistory.connect(wallet4 as unknown as Signer).push(prizeTiers[0]), + ).to.be.revertedWith('Manageable/caller-not-manager-or-owner'); + }); + }); + + describe('.set()', () => { + it('should succeed to set existing PrizeTier in history from Owner wallet.', async () => { + await pushPrizeTiers(); + const prizeTier = { + ...prizeTiers[2], + bitRangeSize: 16, + }; + + await expect(prizeTierHistory.popAndPush(prizeTier)).to.emit( + prizeTierHistory, + 'PrizeTierSet', + ); + }); + + it('should succeed to set newest PrizeTier in history from Owner wallet.', async () => { + await pushPrizeTiers(); + const prizeTier = { + ...prizeTiers[2], + drawId: 10, + bitRangeSize: 16, + }; + + await expect(prizeTierHistory.popAndPush(prizeTier)).to.emit( + prizeTierHistory, + 'PrizeTierSet', + ); + }); + + it('should fail to set existing PrizeTier in history due to invalid draw id`.', async () => { + await pushPrizeTiers(); + const prizeTier = { + ...prizeTiers[0], + drawId: 8, + bitRangeSize: 16, + }; + await expect(prizeTierHistory.popAndPush(prizeTier)).to.revertedWith( + 'PrizeTierHistoryV2/invalid-draw-id', + ); + }); + + it('should fail to set existing PrizeTier due to empty history', async () => { + await expect(prizeTierHistory.popAndPush(prizeTiers[0])).to.revertedWith( + 'PrizeTierHistoryV2/history-empty', + ); + }); + + it('should fail to set existing PrizeTier in history from Manager wallet', async () => { + await expect( + ( + await prizeTierHistory.connect(wallet2 as unknown as Signer) + ).popAndPush(prizeTiers[0]), + ).to.revertedWith('Ownable/caller-not-owner'); + }); + }); + }); + + describe('replace()', async () => { + it('should replace a tier', async () => { + const prizeTier = { + ...prizeTiers[1], + bitRangeSize: 12, + }; + + await pushPrizeTiers(); + + await expect(prizeTierHistory.replace(prizeTier)).to.emit( + prizeTierHistory, + 'PrizeTierSet', + ); + + const prizeTierVal = await prizeTierHistory.getPrizeTier(prizeTier.drawId); + + expect(prizeTierVal.bitRangeSize).to.equal(12); + }); + + it('should not allow replacing a prize tier with a different draw id', async () => { + const prizeTier = { + ...prizeTiers[1], + drawId: 4, + bitRangeSize: 12, + }; + + await pushPrizeTiers(); + + await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( + 'PrizeTierHistoryV2/draw-id-must-match', + ); + }); + }); +}); From 8757cef38fa6eb164b5f29e287cce31bea7f43ee Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 04:59:31 -0700 Subject: [PATCH 09/30] update(PrizeTierHistoryV2.test): add coverage for all setters --- contracts/DrawIDBinarySearch.sol | 3 +- contracts/PrizeTierHistoryV2.sol | 14 +- contracts/interfaces/IPrizeTierHistoryV2.sol | 26 ++++ test/PrizeTierHistoryV2.test.ts | 151 ++++++++----------- 4 files changed, 97 insertions(+), 97 deletions(-) diff --git a/contracts/DrawIDBinarySearch.sol b/contracts/DrawIDBinarySearch.sol index 4306f5e..b4437a0 100644 --- a/contracts/DrawIDBinarySearch.sol +++ b/contracts/DrawIDBinarySearch.sol @@ -40,7 +40,7 @@ abstract contract DrawIDBinarySearch { break; } - uint32 center = leftSide + ((rightSide - leftSide) / 2); + uint32 center = leftSide + (rightSide - leftSide) / 2; uint32 centerID = getDrawIdForIndex(center); if (centerID == _drawId) { @@ -64,6 +64,7 @@ abstract contract DrawIDBinarySearch { } } } + return index; } } diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol index a2c6726..3e49fac 100644 --- a/contracts/PrizeTierHistoryV2.sol +++ b/contracts/PrizeTierHistoryV2.sol @@ -48,7 +48,7 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, DrawIDBinarySearch, Manageab override returns (PrizeTierV2 memory prizeTier) { - require(drawId > 0, "PrizeTierHistory/draw-id-not-zero"); + require(drawId > 0, "PrizeTierHistoryV2/draw-id-not-zero"); return _getPrizeTier(drawId); } @@ -108,24 +108,26 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, DrawIDBinarySearch, Manageab require(_prizeTier.drawId > _newestDpr.drawId, "PrizeTierHistoryV2/non-sequential-dpr"); } history.push(_prizeTier); + emit PrizeTierPushed(_prizeTier.drawId, _prizeTier); } function _replace(PrizeTierV2 calldata _prizeTier) internal { uint256 cardinality = history.length; - require(cardinality > 0, "DrawPercentageRate/no-prize-tiers"); + require(cardinality > 0, "PrizeTierHistoryV2/no-prize-tiers"); uint32 oldestDrawId = history[0].drawId; - require(_prizeTier.drawId >= oldestDrawId, "DrawPercentageRate/draw-id-out-of-range"); + require(_prizeTier.drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); uint256 index = _binarySearch(_prizeTier.drawId); require( history[index].drawId == _prizeTier.drawId, - "DrawPercentageRate/draw-id-must-match" + "PrizeTierHistoryV2/draw-id-must-match" ); history[index] = _prizeTier; + emit PrizeTierSet(_prizeTier.drawId, _prizeTier); } function _injectTimeline(PrizeTierV2[] memory _timeline) internal { - require(history.length == 0, "PrizeTierHistory/history-not-empty"); - require(_timeline.length > 0, "PrizeTierHistory/timeline-empty"); + require(history.length == 0, "PrizeTierHistoryV2/history-not-empty"); + require(_timeline.length > 0, "PrizeTierHistoryV2/timeline-empty"); for (uint256 i = 0; i < _timeline.length; i++) { _push(_timeline[i]); } diff --git a/contracts/interfaces/IPrizeTierHistoryV2.sol b/contracts/interfaces/IPrizeTierHistoryV2.sol index ea340c8..633ff69 100644 --- a/contracts/interfaces/IPrizeTierHistoryV2.sol +++ b/contracts/interfaces/IPrizeTierHistoryV2.sol @@ -8,6 +8,10 @@ import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; * @notice IPrizeTierHistoryV2 is the base contract for PrizeTierHistoryV2 */ interface IPrizeTierHistoryV2 { + /** + * @notice PrizeTierV2 struct + * @dev Adds the DPR paramater to the PrizeTierStructV1 + */ struct PrizeTierV2 { uint8 bitRangeSize; uint32 drawId; @@ -20,6 +24,28 @@ interface IPrizeTierHistoryV2 { // @TODO add minPickCost to the new PrizeTierHistoryV2? Semi-linked to DPR } + /* =================================================== */ + /* Events ============================================ */ + /* =================================================== */ + + /** + * @notice Emit when new PrizeTierV2 is added to history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierPushed(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /** + * @notice Emit when existing PrizeTierV2 is updated in history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierSet(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /* =================================================== */ + /* Functions ========================================= */ + /* =================================================== */ + /** * @notice Read oldest Draw ID in history array */ diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts index 32e44ba..a075d1d 100644 --- a/test/PrizeTierHistoryV2.test.ts +++ b/test/PrizeTierHistoryV2.test.ts @@ -48,27 +48,7 @@ describe('PrizeTierHistoryV2', () => { prize: toWei('10000'), endTimestampOffset: 3000, dpr: parseUnits('.1', 9), - }, - { - bitRangeSize: 5, - drawId: 20, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - }, - { - bitRangeSize: 5, - drawId: 21, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - }, + } ]; const pushPrizeTiers = async () => { @@ -91,8 +71,8 @@ describe('PrizeTierHistoryV2', () => { it('should succeed to get prize tiers from history', async () => { await pushPrizeTiers(); - // const t2 = await prizeTierHistory.getPrizeTierAtIndex(2); const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 15]); + console.log(prizeTierFromHistory, 'prizeTierFromHistory') expect(prizeTierFromHistory[0].drawId).to.equal(1); expect(prizeTierFromHistory[1].drawId).to.equal(6); expect(prizeTierFromHistory[2].drawId).to.equal(9); @@ -128,7 +108,7 @@ describe('PrizeTierHistoryV2', () => { }); describe('Setters', () => { - describe('.push()', () => { + describe('push()', () => { it('should succeed push PrizeTier into history from Owner wallet.', async () => { await expect(prizeTierHistory.push(prizeTiers[0])).to.emit( prizeTierHistory, @@ -143,100 +123,91 @@ describe('PrizeTierHistoryV2', () => { ).to.emit(prizeTierHistory, 'PrizeTierPushed'); }); - it('should fail to push PrizeTier into history from Unauthorized wallet', async () => { + it('should fail to push PrizeTier into history from unauthorized wallet', async () => { await expect( prizeTierHistory.connect(wallet4 as unknown as Signer).push(prizeTiers[0]), ).to.be.revertedWith('Manageable/caller-not-manager-or-owner'); }); }); - describe('.set()', () => { - it('should succeed to set existing PrizeTier in history from Owner wallet.', async () => { - await pushPrizeTiers(); + describe('replace()', async () => { + it('should succeed to replace an an existing PrizeTier struct', async () => { const prizeTier = { - ...prizeTiers[2], - bitRangeSize: 16, + ...prizeTiers[1], + bitRangeSize: 12, }; - - await expect(prizeTierHistory.popAndPush(prizeTier)).to.emit( + await pushPrizeTiers(); + await expect(prizeTierHistory.replace(prizeTier)).to.emit( prizeTierHistory, 'PrizeTierSet', ); + const prizeTierVal = await prizeTierHistory.getPrizeTier(prizeTier.drawId); + expect(prizeTierVal.bitRangeSize).to.equal(12); }); - - it('should succeed to set newest PrizeTier in history from Owner wallet.', async () => { - await pushPrizeTiers(); + + it('should FAIL to replace a PrizeTier the PrizeTierHistoryV2 instance has a FALSE history.', async () => { const prizeTier = { - ...prizeTiers[2], - drawId: 10, - bitRangeSize: 16, + ...prizeTiers[1], + drawId: 4, + bitRangeSize: 12, }; - - await expect(prizeTierHistory.popAndPush(prizeTier)).to.emit( - prizeTierHistory, - 'PrizeTierSet', + await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( + 'PrizeTierHistoryV2/no-prize-tiers', ); - }); + }) - it('should fail to set existing PrizeTier in history due to invalid draw id`.', async () => { - await pushPrizeTiers(); + it('should FAIL to replace a PrizeTier the PrizeTierHistoryV2 instance history started after.', async () => { const prizeTier = { ...prizeTiers[0], - drawId: 8, - bitRangeSize: 16, + drawId: 10000 + }; + await prizeTierHistory.push(prizeTier) + const prizeTierReplace = { + ...prizeTiers[0], + drawId: 1 }; - await expect(prizeTierHistory.popAndPush(prizeTier)).to.revertedWith( - 'PrizeTierHistoryV2/invalid-draw-id', + await expect(prizeTierHistory.replace(prizeTierReplace)).to.be.revertedWith( + 'PrizeTierHistoryV2/draw-id-out-of-range', ); }); - - it('should fail to set existing PrizeTier due to empty history', async () => { - await expect(prizeTierHistory.popAndPush(prizeTiers[0])).to.revertedWith( - 'PrizeTierHistoryV2/history-empty', + + it('should FAIL to replace a PrizeTier that DOES NOT exist.', async () => { + const prizeTier = { + ...prizeTiers[1], + drawId: 4, + bitRangeSize: 12, + }; + await pushPrizeTiers(); + await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( + 'PrizeTierHistoryV2/draw-id-must-match', ); }); - it('should fail to set existing PrizeTier in history from Manager wallet', async () => { - await expect( - ( - await prizeTierHistory.connect(wallet2 as unknown as Signer) - ).popAndPush(prizeTiers[0]), - ).to.revertedWith('Ownable/caller-not-owner'); - }); - }); - }); - - describe('replace()', async () => { - it('should replace a tier', async () => { - const prizeTier = { - ...prizeTiers[1], - bitRangeSize: 12, - }; - - await pushPrizeTiers(); - - await expect(prizeTierHistory.replace(prizeTier)).to.emit( - prizeTierHistory, - 'PrizeTierSet', - ); - - const prizeTierVal = await prizeTierHistory.getPrizeTier(prizeTier.drawId); - - expect(prizeTierVal.bitRangeSize).to.equal(12); }); - it('should not allow replacing a prize tier with a different draw id', async () => { - const prizeTier = { - ...prizeTiers[1], - drawId: 4, - bitRangeSize: 12, - }; - - await pushPrizeTiers(); + describe('injectTimeline()', () => { + it('should SUCCEED to inject a PrizeTier history when the PrizeTierHistoryV2 instance has a FALSE history', async () => { + await expect(prizeTierHistory.injectTimeline(prizeTiers)).to.emit( + prizeTierHistory, + 'PrizeTierPushed', + ); + }); + + it('should FAIL to inject a PrizeTier history for a PrizeTierHistoryV2 instance with TRUE history', async () => { + await pushPrizeTiers(); + await expect(prizeTierHistory.injectTimeline(prizeTiers)).to.be.revertedWith( + 'PrizeTierHistoryV2/history-not-empty', + ); + }); + + it('should FAIL to inject a PrizeTier history for a PrizeTierHistoryV2 instance IF the injection history is EMPTY', async () => { + await pushPrizeTiers(); + await expect(prizeTierHistory.injectTimeline([])).to.be.revertedWith( + 'PrizeTierHistoryV2/timeline-empty', + ); + }); - await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( - 'PrizeTierHistoryV2/draw-id-must-match', - ); }); }); + }); From 9a4d14dc3209f76aad2029e2e619685b756d39d4 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 05:11:46 -0700 Subject: [PATCH 10/30] update(PrizeTierHistoryV2.test): improve tests --- test/.DS_Store | Bin 6148 -> 0 bytes test/PrizeTierHistoryV2.test.ts | 1 - 2 files changed, 1 deletion(-) delete mode 100644 test/.DS_Store diff --git a/test/.DS_Store b/test/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 { it('should succeed to get prize tiers from history', async () => { await pushPrizeTiers(); const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 15]); - console.log(prizeTierFromHistory, 'prizeTierFromHistory') expect(prizeTierFromHistory[0].drawId).to.equal(1); expect(prizeTierFromHistory[1].drawId).to.equal(6); expect(prizeTierFromHistory[2].drawId).to.equal(9); From 94008f4957e5ec11fda21bcfcc2d461b47d270e0 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 05:12:29 -0700 Subject: [PATCH 11/30] bump(version): move to beta for 1.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a0ce83..cb833ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pooltogether/v4-periphery", - "version": "1.2.6", + "version": "1.3.0-beta.1", "description": "PoolTogether V4 Periphery", "main": "index.js", "license": "GPL-3.0", From 06119848405bc6fb838d73a154dafebdfc8ee830 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 07:26:56 -0700 Subject: [PATCH 12/30] ignore(.turbo): remove monorepo cache history --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 82cde9e..55952c7 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,6 @@ coverage.json docs deployments/localhost -deployments/hardhat \ No newline at end of file +deployments/hardhat + +.turbo \ No newline at end of file From b64aa401fb3b7706f0b973694117e1cc5a65ff73 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 07:31:31 -0700 Subject: [PATCH 13/30] add(DrawIDBinarySearchHarness.sol): harness to isolate DrawIDBinarySearch --- contracts/test/DrawIDBinarySearchHarness.sol | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 contracts/test/DrawIDBinarySearchHarness.sol diff --git a/contracts/test/DrawIDBinarySearchHarness.sol b/contracts/test/DrawIDBinarySearchHarness.sol new file mode 100644 index 0000000..d64f4a5 --- /dev/null +++ b/contracts/test/DrawIDBinarySearchHarness.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "../DrawIDBinarySearch.sol"; + +contract DrawIDBinarySearchHarness is DrawIDBinarySearch { + + struct Draw { + uint32 drawId; + } + + Draw[] internal history; + + constructor(Draw[] memory _history) { + if (_history.length > 0) { + _injectTimeline(_history); + } + } + + // @inheritdoc DrawIDBinarySearch + function getNewestIndex() internal view override returns (uint32) { + return uint32(history.length - 1); + } + + // @inheritdoc DrawIDBinarySearch + function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { + return history[index].drawId; + } + + function binarySearch(uint32 _drawId) internal view returns (Draw memory) { + return history[_binarySearch(_drawId)]; + } + + function _injectTimeline(Draw[] memory _timeline) internal { + require(history.length == 0, "DrawIDBinarySearchHarness/history-not-empty"); + require(_timeline.length > 0, "DrawIDBinarySearchHarness/timeline-empty"); + for (uint256 i = 0; i < _timeline.length; i++) { + _push(_timeline[i]); + } + } + + function _push(Draw memory _draw) internal { + Draw[] memory _history = history; + if (_history.length > 0) { + Draw memory _newestDpr = history[history.length - 1]; + require(_draw.drawId > _newestDpr.drawId, "DrawIDBinarySearchHarness/non-sequential-dpr"); + } + history.push(_draw); + } + +} \ No newline at end of file From fbda8c8ec887663466e9cbee7c0b50be2a3995d8 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 07:36:53 -0700 Subject: [PATCH 14/30] fix(compile): strongly enforced typescript preventing compiling --- contracts/PrizeTierHistoryV2.sol | 2 +- contracts/{ => abstract}/DrawIDBinarySearch.sol | 0 contracts/{ => prototype}/IDBinarySearch.sol | 0 contracts/test/DrawIDBinarySearchHarness.sol | 2 +- hardhat.config.ts | 3 ++- scripts/fork/distribute.ts | 2 +- scripts/fork/impersonate.ts | 2 +- scripts/fork/pool.ts | 2 +- scripts/fork/twabRewards.ts | 8 ++++---- 9 files changed, 11 insertions(+), 10 deletions(-) rename contracts/{ => abstract}/DrawIDBinarySearch.sol (100%) rename contracts/{ => prototype}/IDBinarySearch.sol (100%) diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol index 3e49fac..62fa6b8 100644 --- a/contracts/PrizeTierHistoryV2.sol +++ b/contracts/PrizeTierHistoryV2.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.6; import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; import "./interfaces/IPrizeTierHistoryV2.sol"; -import "./DrawIDBinarySearch.sol"; +import "./abstract/DrawIDBinarySearch.sol"; /** * @title PoolTogether V4 PrizeTierHistoryV2 diff --git a/contracts/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol similarity index 100% rename from contracts/DrawIDBinarySearch.sol rename to contracts/abstract/DrawIDBinarySearch.sol diff --git a/contracts/IDBinarySearch.sol b/contracts/prototype/IDBinarySearch.sol similarity index 100% rename from contracts/IDBinarySearch.sol rename to contracts/prototype/IDBinarySearch.sol diff --git a/contracts/test/DrawIDBinarySearchHarness.sol b/contracts/test/DrawIDBinarySearchHarness.sol index d64f4a5..63d3b97 100644 --- a/contracts/test/DrawIDBinarySearchHarness.sol +++ b/contracts/test/DrawIDBinarySearchHarness.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; -import "../DrawIDBinarySearch.sol"; +import "../abstract/DrawIDBinarySearch.sol"; contract DrawIDBinarySearchHarness is DrawIDBinarySearch { diff --git a/hardhat.config.ts b/hardhat.config.ts index 25b8138..d2969d1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,3 +1,4 @@ + import '@nomiclabs/hardhat-etherscan'; import '@nomiclabs/hardhat-waffle'; import 'hardhat-abi-exporter'; @@ -15,7 +16,7 @@ import networks from './hardhat.network'; const optimizerEnabled = !process.env.OPTIMIZER_DISABLED; -const config: HardhatUserConfig = { +const config: HardhatUserConfig | any = { abiExporter: { path: './abis', clear: true, diff --git a/scripts/fork/distribute.ts b/scripts/fork/distribute.ts index 3b946f2..07a5a80 100644 --- a/scripts/fork/distribute.ts +++ b/scripts/fork/distribute.ts @@ -12,7 +12,7 @@ import { import { action, success } from "../../helpers"; export default task("fork:distribute", "Distribute Ether and USDC").setAction( - async (taskArguments, hre) => { + async (taskArguments, hre: any) => { action("Distributing Ether and USDC..."); const { ethers } = hre; diff --git a/scripts/fork/impersonate.ts b/scripts/fork/impersonate.ts index ce6319c..37384e0 100644 --- a/scripts/fork/impersonate.ts +++ b/scripts/fork/impersonate.ts @@ -9,7 +9,7 @@ import { import { action, success } from "../../helpers"; export default task("fork:impersonate", "Impersonate accounts").setAction( - async (taskArguments, hre) => { + async (taskArguments, hre:any) => { action("Impersonate accounts..."); await hre.network.provider.request({ diff --git a/scripts/fork/pool.ts b/scripts/fork/pool.ts index bfa89be..36bb20f 100644 --- a/scripts/fork/pool.ts +++ b/scripts/fork/pool.ts @@ -10,7 +10,7 @@ import { import { action, info, success } from "../../helpers"; -export default task("fork:create-pool", "Create pool").setAction(async (taskArguments, hre) => { +export default task("fork:create-pool", "Create pool").setAction(async (taskArguments, hre:any) => { action("Create pool..."); const { diff --git a/scripts/fork/twabRewards.ts b/scripts/fork/twabRewards.ts index ddde8e2..6f22f0c 100644 --- a/scripts/fork/twabRewards.ts +++ b/scripts/fork/twabRewards.ts @@ -7,7 +7,7 @@ import { action, info, success } from "../../helpers"; import { increaseTime as increaseTimeUtil } from "../../test/utils/increaseTime"; export default task("fork:twab-rewards", "Run TWAB Rewards fork").setAction( - async (taskArguments, hre) => { + async (taskArguments, hre:any) => { action("Run TWAB Rewards fork..."); const { ethers, run } = hre; @@ -76,7 +76,7 @@ export default task("fork:twab-rewards", "Run TWAB Rewards fork").setAction( subtask("deploy-twab-rewards", "Deploy TWAB Rewards") .addParam("ticketAddress", "Prize pool ticket address") - .setAction(async ({ ticketAddress }, hre) => { + .setAction(async ({ ticketAddress }, hre: any) => { action("Deploy TWAB Rewards..."); const { @@ -153,7 +153,7 @@ subtask("create-promotion", "Create TWAB Rewards promotion") subtask("deposit-into-prize-pool", "Deposit into prize pool") .addParam("prizePoolAddress", "Prize pool address") - .setAction(async ({ prizePoolAddress }, { ethers }) => { + .setAction(async ({ prizePoolAddress }, { ethers }: any) => { action("Deposit into prize pool..."); const { getContractAt, getSigners, utils } = ethers; @@ -183,7 +183,7 @@ subtask("deposit-into-prize-pool", "Deposit into prize pool") subtask("claim-rewards", "Claim rewards") .addParam("twabRewardsAddress", "TWAB Rewards address") .addParam("promotionId", "Id of the promotion", null, types.float) - .setAction(async ({ twabRewardsAddress, promotionId }, { ethers }) => { + .setAction(async ({ twabRewardsAddress, promotionId }, { ethers }: any) => { action("Claim rewards..."); const { getContractAt, getSigners, provider, utils } = ethers; From e99dc5a069f4e2d76eb2104f61943dc038f1a590 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 07:40:24 -0700 Subject: [PATCH 15/30] fix(compile): strongly enforced typescript preventing compiling --- test/DrawPercentageRate.test.ts | 1 + test/PrizeDistributionFactory.test.ts | 1 + test/PrizeFlush.test.ts | 1 + test/PrizeTierHistory.test.ts | 1 + test/PrizeTierHistoryV2.test.ts | 1 + test/TwabRewards.test.ts | 3 ++- test/libraries/{IDBinarySearch.ts => IDBinarySearch.test.ts} | 2 +- 7 files changed, 8 insertions(+), 2 deletions(-) rename test/libraries/{IDBinarySearch.ts => IDBinarySearch.test.ts} (96%) diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index bdf36a4..b3794aa 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +// @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; diff --git a/test/PrizeDistributionFactory.test.ts b/test/PrizeDistributionFactory.test.ts index 22e716d..5de0874 100644 --- a/test/PrizeDistributionFactory.test.ts +++ b/test/PrizeDistributionFactory.test.ts @@ -1,3 +1,4 @@ +// @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; import { Signer } from '@ethersproject/abstract-signer'; diff --git a/test/PrizeFlush.test.ts b/test/PrizeFlush.test.ts index c614de9..b59004c 100644 --- a/test/PrizeFlush.test.ts +++ b/test/PrizeFlush.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +// @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; import { Signer } from '@ethersproject/abstract-signer'; diff --git a/test/PrizeTierHistory.test.ts b/test/PrizeTierHistory.test.ts index c4632bd..155794a 100644 --- a/test/PrizeTierHistory.test.ts +++ b/test/PrizeTierHistory.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +// @ts-ignore import { ethers } from 'hardhat'; import { Signer } from '@ethersproject/abstract-signer'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts index 26dcfaa..712dcb6 100644 --- a/test/PrizeTierHistoryV2.test.ts +++ b/test/PrizeTierHistoryV2.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +// @ts-ignore import { ethers } from 'hardhat'; import { Signer } from '@ethersproject/abstract-signer'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; diff --git a/test/TwabRewards.test.ts b/test/TwabRewards.test.ts index 5ad7e5d..5351346 100644 --- a/test/TwabRewards.test.ts +++ b/test/TwabRewards.test.ts @@ -1,10 +1,11 @@ +// @ts-ignore +import { ethers } from 'hardhat'; import ERC20MintableInterface from '@pooltogether/v4-core/abis/ERC20Mintable.json'; import TicketInterface from '@pooltogether/v4-core/abis/ITicket.json'; import { deployMockContract, MockContract } from '@ethereum-waffle/mock-contract'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; import { BigNumber, Contract, ContractFactory } from 'ethers'; -import { ethers } from 'hardhat'; import { increaseTime as increaseTimeUtil, setTime as setTimeUtil } from './utils/increaseTime'; diff --git a/test/libraries/IDBinarySearch.ts b/test/libraries/IDBinarySearch.test.ts similarity index 96% rename from test/libraries/IDBinarySearch.ts rename to test/libraries/IDBinarySearch.test.ts index e3050b3..d2d9a5c 100644 --- a/test/libraries/IDBinarySearch.ts +++ b/test/libraries/IDBinarySearch.test.ts @@ -1,4 +1,4 @@ -import { expect } from "chai"; +// @ts-ignore import { ethers } from "hardhat"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { Contract, ContractFactory } from "ethers"; From d5282a3bf68fe6da8fc9e92f09577d72b94fe269 Mon Sep 17 00:00:00 2001 From: kames Date: Tue, 8 Mar 2022 10:51:32 -0700 Subject: [PATCH 16/30] fix --- test/PrizeTierHistory.test.ts | 47 ++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/test/PrizeTierHistory.test.ts b/test/PrizeTierHistory.test.ts index 155794a..f8a7a6e 100644 --- a/test/PrizeTierHistory.test.ts +++ b/test/PrizeTierHistory.test.ts @@ -125,9 +125,50 @@ describe('PrizeTierHistory', () => { expect(prizeTierFromHistory[2].drawId).to.equal(9); }); - it('should fail to get prize tiers from history', async () => { - await pushPrizeTiers(); - await pushPrizeTiers(); + it.skip('should fail to get prize tiers from history', async () => { + const prizeTiersTest = [ + { + bitRangeSize: 5, + drawId: 1, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + }, + { + bitRangeSize: 5, + drawId: 6, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + }, + { + bitRangeSize: 5, + drawId: 9, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + }, + { + bitRangeSize: 5, + drawId: 20, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + }, + ]; + + Promise.all(prizeTiersTest.map(async (tier) => { + await prizeTierHistory.push(tier); + })); + const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 9]); expect(prizeTierFromHistory[0].drawId).to.equal(1); expect(prizeTierFromHistory[1].drawId).to.equal(6); From 6dc28f931081d9849e874ca477f5cadbb057ff50 Mon Sep 17 00:00:00 2001 From: kames Date: Wed, 9 Mar 2022 13:24:47 -0700 Subject: [PATCH 17/30] add(DrawIDBinarySearchHarness.test) unit tests for binary search on DrawID structs --- contracts/abstract/DrawIDBinarySearch.sol | 7 +-- .../BinarySearchLibHarness.sol | 0 .../DrawIDBinarySearchHarness.sol | 16 +++++- .../DrawPercentageRateHarness.sol | 0 .../{test => harness}/TwabRewardsHarness.sol | 0 .../harness/DrawIDBinarySearchHarness.test.ts | 50 +++++++++++++++++++ 6 files changed, 65 insertions(+), 8 deletions(-) rename contracts/{test => harness}/BinarySearchLibHarness.sol (100%) rename contracts/{test => harness}/DrawIDBinarySearchHarness.sol (72%) rename contracts/{test => harness}/DrawPercentageRateHarness.sol (100%) rename contracts/{test => harness}/TwabRewardsHarness.sol (100%) create mode 100644 test/harness/DrawIDBinarySearchHarness.test.ts diff --git a/contracts/abstract/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol index b4437a0..d5cc527 100644 --- a/contracts/abstract/DrawIDBinarySearch.sol +++ b/contracts/abstract/DrawIDBinarySearch.sol @@ -35,11 +35,6 @@ abstract contract DrawIDBinarySearch { while (true) { - if (rightSide <= leftSide) { - index = rightSide; - break; - } - uint32 center = leftSide + (rightSide - leftSide) / 2; uint32 centerID = getDrawIdForIndex(center); @@ -49,7 +44,7 @@ abstract contract DrawIDBinarySearch { } if (centerID < _drawId) { - leftSide = center + 1; + leftSide = center; } else if (centerID > _drawId) { rightSide = center - 1; } diff --git a/contracts/test/BinarySearchLibHarness.sol b/contracts/harness/BinarySearchLibHarness.sol similarity index 100% rename from contracts/test/BinarySearchLibHarness.sol rename to contracts/harness/BinarySearchLibHarness.sol diff --git a/contracts/test/DrawIDBinarySearchHarness.sol b/contracts/harness/DrawIDBinarySearchHarness.sol similarity index 72% rename from contracts/test/DrawIDBinarySearchHarness.sol rename to contracts/harness/DrawIDBinarySearchHarness.sol index 63d3b97..f7c40a7 100644 --- a/contracts/test/DrawIDBinarySearchHarness.sol +++ b/contracts/harness/DrawIDBinarySearchHarness.sol @@ -12,7 +12,7 @@ contract DrawIDBinarySearchHarness is DrawIDBinarySearch { constructor(Draw[] memory _history) { if (_history.length > 0) { - _injectTimeline(_history); + injectTimeline(_history); } } @@ -30,7 +30,7 @@ contract DrawIDBinarySearchHarness is DrawIDBinarySearch { return history[_binarySearch(_drawId)]; } - function _injectTimeline(Draw[] memory _timeline) internal { + function injectTimeline(Draw[] memory _timeline) public { require(history.length == 0, "DrawIDBinarySearchHarness/history-not-empty"); require(_timeline.length > 0, "DrawIDBinarySearchHarness/timeline-empty"); for (uint256 i = 0; i < _timeline.length; i++) { @@ -38,6 +38,18 @@ contract DrawIDBinarySearchHarness is DrawIDBinarySearch { } } + function get(uint32 _drawId) external view returns (Draw memory) { + return history[_binarySearch(_drawId)]; + } + + function list(uint32[] calldata _drawIds) external view returns (Draw[] memory) { + Draw[] memory _data = new Draw[](_drawIds.length); + for (uint256 index = 0; index < _drawIds.length; index++) { + _data[index] = history[_binarySearch(_drawIds[index])]; + } + return _data; + } + function _push(Draw memory _draw) internal { Draw[] memory _history = history; if (_history.length > 0) { diff --git a/contracts/test/DrawPercentageRateHarness.sol b/contracts/harness/DrawPercentageRateHarness.sol similarity index 100% rename from contracts/test/DrawPercentageRateHarness.sol rename to contracts/harness/DrawPercentageRateHarness.sol diff --git a/contracts/test/TwabRewardsHarness.sol b/contracts/harness/TwabRewardsHarness.sol similarity index 100% rename from contracts/test/TwabRewardsHarness.sol rename to contracts/harness/TwabRewardsHarness.sol diff --git a/test/harness/DrawIDBinarySearchHarness.test.ts b/test/harness/DrawIDBinarySearchHarness.test.ts new file mode 100644 index 0000000..2852b94 --- /dev/null +++ b/test/harness/DrawIDBinarySearchHarness.test.ts @@ -0,0 +1,50 @@ +// @ts-ignore +import { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract, ContractFactory } from 'ethers'; + +const { getSigners, utils } = ethers; + +describe('DrawIDBinarySearchHarness', () => { + let wallet1: SignerWithAddress; + + let drawIdBinaryHarness: Contract; + let drawIdBinaryHarnessFactory: ContractFactory; + + const structsWithDrawID = [ + { + drawId: 1, + }, + { + drawId: 6, + }, + { + drawId: 9 + }, + { + drawId: 12 + } + ]; + + before(async () => { + [wallet1] = await getSigners(); + drawIdBinaryHarnessFactory = await ethers.getContractFactory('DrawIDBinarySearchHarness', wallet1); + }); + + beforeEach(async () => { + drawIdBinaryHarness = await drawIdBinaryHarnessFactory.deploy([]); + }); + + describe('Getters', () => { + it('should succeed to get Draw ID list from history', async () => { + await drawIdBinaryHarness.injectTimeline(structsWithDrawID); + const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + expect(prizeTierFromHistory[1].drawId).to.equal(6); + expect(prizeTierFromHistory[2].drawId).to.equal(12); + }); + + }); + +}); From 74d2f195ffbc90df484fe3e5adf318b4e88c483c Mon Sep 17 00:00:00 2001 From: kames Date: Wed, 9 Mar 2022 13:49:41 -0700 Subject: [PATCH 18/30] update(DrawIdBinarySearchHarness.test): add more coverage --- contracts/abstract/DrawIDBinarySearch.sol | 9 +++++-- test/PrizeTierHistoryV2.test.ts | 14 +++++++++-- .../IDBinarySearch.test.ts | 0 .../harness/DrawIDBinarySearchHarness.test.ts | 25 ++++++++++++++++--- 4 files changed, 40 insertions(+), 8 deletions(-) rename test/{libraries => abstract}/IDBinarySearch.test.ts (100%) diff --git a/contracts/abstract/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol index d5cc527..14d9c76 100644 --- a/contracts/abstract/DrawIDBinarySearch.sol +++ b/contracts/abstract/DrawIDBinarySearch.sol @@ -29,12 +29,17 @@ abstract contract DrawIDBinarySearch { uint32 oldestDrawId = getDrawIdForIndex(leftSide); uint32 newestDrawId = getDrawIdForIndex(rightSide); + console.log("STARTING ==============="); + console.log(_drawId, "drawID"); + console.log(oldestDrawId, "oldestDrawId"); + console.log(newestDrawId, "newestDrawId"); + require(_drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); if (_drawId >= newestDrawId) return rightSide; if (_drawId == oldestDrawId) return leftSide; while (true) { - + uint32 center = leftSide + (rightSide - leftSide) / 2; uint32 centerID = getDrawIdForIndex(center); @@ -44,7 +49,7 @@ abstract contract DrawIDBinarySearch { } if (centerID < _drawId) { - leftSide = center; + leftSide = center + 1; } else if (centerID > _drawId) { rightSide = center - 1; } diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts index 712dcb6..31224e7 100644 --- a/test/PrizeTierHistoryV2.test.ts +++ b/test/PrizeTierHistoryV2.test.ts @@ -49,13 +49,23 @@ describe('PrizeTierHistoryV2', () => { prize: toWei('10000'), endTimestampOffset: 3000, dpr: parseUnits('.1', 9), + }, + { + bitRangeSize: 5, + drawId: 20, + maxPicksPerUser: 10, + tiers: range(16, 0).map((i) => 0), + expiryDuration: 10000, + prize: toWei('10000'), + endTimestampOffset: 3000, + dpr: parseUnits('.1', 9), } ]; const pushPrizeTiers = async () => { - prizeTiers.map(async (tier) => { + Promise.all(prizeTiers.map(async (tier) => { await prizeTierHistory.push(tier); - }); + })); }; before(async () => { diff --git a/test/libraries/IDBinarySearch.test.ts b/test/abstract/IDBinarySearch.test.ts similarity index 100% rename from test/libraries/IDBinarySearch.test.ts rename to test/abstract/IDBinarySearch.test.ts diff --git a/test/harness/DrawIDBinarySearchHarness.test.ts b/test/harness/DrawIDBinarySearchHarness.test.ts index 2852b94..4e7d8e2 100644 --- a/test/harness/DrawIDBinarySearchHarness.test.ts +++ b/test/harness/DrawIDBinarySearchHarness.test.ts @@ -23,7 +23,7 @@ describe('DrawIDBinarySearchHarness', () => { drawId: 9 }, { - drawId: 12 + drawId: 20 } ]; @@ -37,14 +37,31 @@ describe('DrawIDBinarySearchHarness', () => { }); describe('Getters', () => { - it('should succeed to get Draw ID list from history', async () => { + it('should succeed to get Draw ID list from history with 1 struct', async () => { + await drawIdBinaryHarness.injectTimeline([{drawId: 1}]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([1]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it('should succeed to get Draw ID list from history with 2 structs', async () => { + await drawIdBinaryHarness.injectTimeline([{drawId: 1}, {drawId: 4}]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it('should succeed to get 3 structs from history with 3 structs', async () => { + await drawIdBinaryHarness.injectTimeline([{drawId: 1}, {drawId: 4}, {drawId: 7}]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it.only('should succeed to get Draw ID list from history with 4 structs', async () => { await drawIdBinaryHarness.injectTimeline(structsWithDrawID); const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); expect(prizeTierFromHistory[0].drawId).to.equal(1); expect(prizeTierFromHistory[1].drawId).to.equal(6); - expect(prizeTierFromHistory[2].drawId).to.equal(12); + expect(prizeTierFromHistory[2].drawId).to.equal(9); }); - }); }); From 49cac2bc189786a9f232073622ce206084eebb5c Mon Sep 17 00:00:00 2001 From: kames Date: Wed, 9 Mar 2022 13:51:13 -0700 Subject: [PATCH 19/30] fix --- test/abstract/IDBinarySearch.test.ts | 28 ------------------- .../harness/DrawIDBinarySearchHarness.test.ts | 2 +- 2 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 test/abstract/IDBinarySearch.test.ts diff --git a/test/abstract/IDBinarySearch.test.ts b/test/abstract/IDBinarySearch.test.ts deleted file mode 100644 index d2d9a5c..0000000 --- a/test/abstract/IDBinarySearch.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -// @ts-ignore -import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { Contract, ContractFactory } from "ethers"; - -const { getSigners } = ethers; - -describe("IDBinarySearch", () => { - let wallet1: SignerWithAddress; - let wallet2: SignerWithAddress; - let wallet3: SignerWithAddress; - - let binarySearchLogic: Contract; - let binarySearchLogicFactory: ContractFactory; - - before(async () => { - [wallet1, wallet2, wallet3] = await getSigners(); - binarySearchLogicFactory = await ethers.getContractFactory("IDBinarySearch"); - }); - - beforeEach(async () => { - binarySearchLogic = await binarySearchLogicFactory.deploy(); - }); - - describe("Core", () => { - describe("getNewestIndex()", () => {}); - }); -}); diff --git a/test/harness/DrawIDBinarySearchHarness.test.ts b/test/harness/DrawIDBinarySearchHarness.test.ts index 4e7d8e2..50ecf38 100644 --- a/test/harness/DrawIDBinarySearchHarness.test.ts +++ b/test/harness/DrawIDBinarySearchHarness.test.ts @@ -55,7 +55,7 @@ describe('DrawIDBinarySearchHarness', () => { expect(prizeTierFromHistory[0].drawId).to.equal(1); }); - it.only('should succeed to get Draw ID list from history with 4 structs', async () => { + it('should succeed to get Draw ID list from history with 4 structs', async () => { await drawIdBinaryHarness.injectTimeline(structsWithDrawID); const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); expect(prizeTierFromHistory[0].drawId).to.equal(1); From 3c81f13254c0bbb58626711df5f65bb5282520cb Mon Sep 17 00:00:00 2001 From: kames Date: Thu, 7 Apr 2022 05:45:38 -0600 Subject: [PATCH 20/30] fix --- .gitignore | 3 +- contracts/DrawPercentageRate.sol | 270 ------------------ contracts/PrizeDistributionAdapter.sol | 182 ++++++++++++ contracts/PrizeDistributionFactory.sol | 4 +- contracts/PrizeTierHistoryV2.sol | 135 --------- contracts/abstract/DrawIDBinarySearch.sol | 15 +- contracts/abstract/PoolUtilities.sol | 123 ++++++++ .../harness/DrawIDBinarySearchHarness.sol | 11 +- .../harness/DrawPercentageRateHarness.sol | 13 +- contracts/interfaces/IPrizeTierHistoryV2.sol | 40 +-- .../DrawIDAndStructMappingBinarySearch.sol | 61 ++++ hardhat.config.ts | 3 +- scripts/fork/impersonate.ts | 2 +- scripts/fork/pool.ts | 103 +++---- scripts/fork/twabRewards.ts | 2 +- test/DrawPercentageRate.test.ts | 38 +-- test/PrizeTierHistoryV2.test.ts | 223 --------------- .../harness/DrawIDBinarySearchHarness.test.ts | 22 +- ...DrawIDAndStructMappingBinarySearch.test.ts | 75 +++++ 19 files changed, 539 insertions(+), 786 deletions(-) delete mode 100644 contracts/DrawPercentageRate.sol create mode 100644 contracts/PrizeDistributionAdapter.sol delete mode 100644 contracts/PrizeTierHistoryV2.sol create mode 100644 contracts/abstract/PoolUtilities.sol create mode 100644 contracts/test/DrawIDAndStructMappingBinarySearch.sol delete mode 100644 test/PrizeTierHistoryV2.test.ts create mode 100644 test/test/DrawIDAndStructMappingBinarySearch.test.ts diff --git a/.gitignore b/.gitignore index 55952c7..d80bd6c 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ docs deployments/localhost deployments/hardhat -.turbo \ No newline at end of file +.turbo +*.dev.md \ No newline at end of file diff --git a/contracts/DrawPercentageRate.sol b/contracts/DrawPercentageRate.sol deleted file mode 100644 index 826cf02..0000000 --- a/contracts/DrawPercentageRate.sol +++ /dev/null @@ -1,270 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "hardhat/console.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; -import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; -import "./interfaces/IPrizeTierHistoryV2.sol"; - -/** - * @title PoolTogether V4 DrawPercentageRate - * @author PoolTogether Inc Team - * @notice DrawPercentageRate calculates a PrizePool distributions using a static draw percentage rate - */ -contract DrawPercentageRate { - uint32 public constant RATE_NORMALIZATION = 1e9; - - // Immutable (Set by constructor) - uint256 public immutable minPickCost; - - // Mutable (Set by constructor and setters) - ITicket public ticket; - IDrawBuffer public drawBuffer; - IPrizeTierHistoryV2 public prizeTierHistory; - - /** - * Constructor - * @param _ticket - ITicket - * @param _drawBuffer - IDrawBuffer - * @param _prizeTierHistory - IPrizeTierHistoryV2 - * @param _minPickCost - uint256 - */ - constructor( - ITicket _ticket, - IPrizeTierHistoryV2 _prizeTierHistory, - IDrawBuffer _drawBuffer, - uint256 _minPickCost - ) { - ticket = _ticket; - prizeTierHistory = _prizeTierHistory; - drawBuffer = _drawBuffer; - minPickCost = _minPickCost; - } - - /* =================================================== */ - /* Core ============================================== */ - /* =================================================== */ - /** - * @notice Get a PrizeDistribution using a historical Draw ID - * @param drawId - uint32 - * @return prizeDistribution - */ - function getPrizeDistribution(uint32 drawId) - external - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - return _calculatePrizeDistribution(drawId); - } - - /** - * @notice Get a list of PrizeDistributions using historical Draw IDs - * @param drawIds - uint32[] - * @return prizeDistribution - */ - function getPrizeDistributionList(uint32[] calldata drawIds) - external - view - returns (IPrizeDistributionBuffer.PrizeDistribution[] memory) - { - IPrizeDistributionBuffer.PrizeDistribution[] - memory _prizeDistributions = new IPrizeDistributionBuffer.PrizeDistribution[]( - drawIds.length - ); - for (uint256 index = 0; index < drawIds.length; index++) { - _prizeDistributions[index] = _calculatePrizeDistribution(drawIds[index]); - } - return _prizeDistributions; - } - - /* =================================================== */ - /* Internal ========================================== */ - /* =================================================== */ - - /** - * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters - * @param _drawId - uint32 - * @return prizeDistribution - */ - function _calculatePrizeDistribution(uint32 _drawId) - internal - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - IPrizeTierHistoryV2.PrizeTierV2 memory prizeTier = prizeTierHistory.getPrizeTier(_drawId); - IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); - (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( - draw.timestamp, - draw.beaconPeriodSeconds, - prizeTier.endTimestampOffset - ); - uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); - (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( - prizeTier.bitRangeSize, - prizeTier.prize, - prizeTier.dpr, - minPickCost, - _totalSupplies[0] - ); - IPrizeDistributionBuffer.PrizeDistribution - memory prizeDistribution = IPrizeDistributionBuffer.PrizeDistribution({ - bitRangeSize: prizeTier.bitRangeSize, - matchCardinality: _cardinality, - startTimestampOffset: draw.beaconPeriodSeconds, - endTimestampOffset: prizeTier.endTimestampOffset, - maxPicksPerUser: prizeTier.maxPicksPerUser, - expiryDuration: prizeTier.expiryDuration, - numberOfPicks: _numberOfPicks, - tiers: prizeTier.tiers, - prize: prizeTier.prize - }); - return prizeDistribution; - } - - function _calculateCardinality( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint8 cardinality) { - uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); - uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); - uint256 _maxPicksWithFracionOfOdds = _normalizePicks( - _maxPicks * RATE_NORMALIZATION, - _fractionOfOdds - ); - cardinality = _calculateCardinalityCeiling(_bitRangeSize, _maxPicksWithFracionOfOdds); - } - - function _calculateNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint104) { - uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); - uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); - uint256 _maxPicksWithFracionOfOdds = _normalizePicks( - (_maxPicks * RATE_NORMALIZATION), - _fractionOfOdds - ); - uint8 _cardinality = _calculateCardinalityCeiling( - _bitRangeSize, - _maxPicksWithFracionOfOdds - ); - uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading - uint256 numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; - return uint104(numberOfPicks); - } - - function _calculateNumberOfPicksWithCardinalityAndFraction( - uint32 _bitRangeSize, - uint256 _cardinality, - uint256 _fractionOfOdds - ) internal pure returns (uint256 numberOfPicks) { - uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); - numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; - } - - function _calculateCardinalityAndNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { - cardinality = _calculateCardinality( - _bitRangeSize, - _prize, - _dpr, - _minPickCost, - _totalSupply - ); - numberOfPicks = _calculateNumberOfPicks( - _bitRangeSize, - _prize, - _dpr, - _minPickCost, - _totalSupply - ); - } - - function _calculateDrawPeriodTimestampOffsets( - uint64 _timestamp, - uint32 _startOffset, - uint32 _endOffset - ) internal pure returns (uint64[] memory, uint64[] memory) { - uint64[] memory _startTimestamps = new uint64[](1); - uint64[] memory _endTimestamps = new uint64[](1); - _startTimestamps[0] = _timestamp - _startOffset; - _endTimestamps[0] = _timestamp - _endOffset; - return (_startTimestamps, _endTimestamps); - } - - function _calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) - internal - pure - returns (uint8 cardinality) - { - while ((2**_bitRangeSize)**(cardinality) < _maxPicks) { - cardinality++; - } - } - - function _calculateFractionOfOdds( - uint256 _dpr, - uint256 _totalSupply, - uint256 _prize - ) internal pure returns (uint256) { - // TODO: Normalize things and do math - return (_dpr * _totalSupply) / _prize; - } - - function _normalizePicks(uint256 _dividend, uint256 _denomintor) - internal - pure - returns (uint256 normalizedPicks) - { - normalizedPicks = _dividend / _denomintor; - } - - /* =================================================== */ - /* Getter ============================================ */ - /* =================================================== */ - - function getMinPickCost() external view returns (uint256) { - return minPickCost; - } - - function getTicket() external view returns (ITicket) { - return ticket; - } - - function getDrawBuffer() external view returns (IDrawBuffer) { - return drawBuffer; - } - - function getPrizeTierHistory() external view returns (IPrizeTierHistoryV2) { - return prizeTierHistory; - } - - /* =================================================== */ - /* Setter ============================================ */ - /* =================================================== */ - - // @TODO: We probably don't need this setter. What good reason is there to change a ticket and the totalSupply history !?!?!? - function setTicket(ITicket _ticket) external { - ticket = _ticket; - } - - function setDrawBuffer(IDrawBuffer _drawBuffer) external { - drawBuffer = _drawBuffer; - } - - function setPrizeTierHistory(IPrizeTierHistoryV2 _prizeTierHistory) external { - prizeTierHistory = _prizeTierHistory; - } -} diff --git a/contracts/PrizeDistributionAdapter.sol b/contracts/PrizeDistributionAdapter.sol new file mode 100644 index 0000000..72fb7e4 --- /dev/null +++ b/contracts/PrizeDistributionAdapter.sol @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "hardhat/console.sol"; +import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; +import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; +import "./abstract/DrawIDBinarySearch.sol"; +import "./abstract/PoolUtilities.sol"; +import "./interfaces/IPrizeTierHistoryV2.sol"; + +/** + * @title PoolTogether V4 PrizeDistributionAdapter + * @author PoolTogether Inc Team + * @notice PrizeDistributionAdapter dynamically calculates a PrizePool distributions using a static draw percentage rate. + */ +contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearch, Manageable, PoolUtilities { + + /** + * @notice PrizeTierV2 struct + * @dev Adds the DPR and minPickCost paramater to the PrizeTierStructV1 + */ + struct PrizeTierV2 { + uint8 bitRangeSize; + uint32 drawId; + uint32 maxPicksPerUser; + uint32 expiryDuration; + uint32 endTimestampOffset; + uint256 prize; + uint32[16] tiers; + uint32 dpr; + uint256 minPickCost; + } + + ITicket internal ticket; + IDrawBuffer internal drawBuffer; + PrizeTierV2[] internal history; + + uint32[] internal _idhistory; + + /** + * @notice Emit when new PrizeTierV2 is added to history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierPushed(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /** + * @notice Emit when existing PrizeTierV2 is updated in history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierSet(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /** + * @notice constructor + * @param _ticket - ITicket + * @param _drawBuffer - IDrawBuffer + */ + constructor(ITicket _ticket, IDrawBuffer _drawBuffer) Ownable(msg.sender) { + ticket = _ticket; + drawBuffer = _drawBuffer; + } + + /** + * @notice Get a PrizeDistribution using a Draw ID within the current draw range + * @param drawId - uint32 + * @return prizeDistribution + */ + function getPrizeDistribution(uint32 drawId) + external + view + returns (IPrizeDistributionSource.PrizeDistribution memory) + { + return _calculatePrizeDistribution(drawId); + } + + /** + * @notice Get an array of PrizeDistributions using array of Draw IDs within the current draw range + * @param drawIds - uint32[] + * @return prizeDistributions + */ + function getPrizeDistributions(uint32[] calldata drawIds) + external + view + override + returns (IPrizeDistributionSource.PrizeDistribution[] memory prizeDistributions) + { + for (uint256 index = 0; index < drawIds.length; index++) { + prizeDistributions[index] = _calculatePrizeDistribution(drawIds[index]); + } + } + + // @inheritdoc DrawIDBinarySearch + function getNewestIndex() internal view override returns (uint32) { + return uint32(history.length - 1); + } + + // @inheritdoc DrawIDBinarySearch + function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { + return history[index].drawId; + } + + function getDrawBuffer() external view returns (IDrawBuffer) { + return drawBuffer; + } + + function getTicket() external view returns (ITicket) { + return ticket; + } + + function getPrizeTier(uint32 drawId) + external + view + returns (PrizeTierV2 memory prizeTier) + { + return _getPrizeTier(drawId); + } + + function getPrizeTiers(uint32[] calldata drawIds) + external + view + returns (PrizeTierV2[] memory prizeTierList) + { + for (uint256 i = 0; i < drawIds.length; i++) { + prizeTierList[i] = _getPrizeTier(drawIds[i]); + } + } + + function setDrawBuffer(IDrawBuffer _drawBuffer) external onlyOwner { + drawBuffer = _drawBuffer; + } + + /* Internal ========================================== */ + + /** + * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters + * @param _drawId - uint32 + * @return prizeDistribution + */ + function _calculatePrizeDistribution(uint32 _drawId) + internal + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + PrizeTierV2 memory prizeTier = _getPrizeTier(_drawId); + IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); + (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( + draw.timestamp, + draw.beaconPeriodSeconds, + prizeTier.endTimestampOffset + ); + uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); + (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( + prizeTier.bitRangeSize, + prizeTier.prize, + prizeTier.dpr, + prizeTier.minPickCost, + _totalSupplies[0] + ); + IPrizeDistributionBuffer.PrizeDistribution + memory prizeDistribution = IPrizeDistributionSource.PrizeDistribution({ + bitRangeSize: prizeTier.bitRangeSize, + matchCardinality: _cardinality, + startTimestampOffset: draw.beaconPeriodSeconds, + endTimestampOffset: prizeTier.endTimestampOffset, + maxPicksPerUser: prizeTier.maxPicksPerUser, + expiryDuration: prizeTier.expiryDuration, + numberOfPicks: _numberOfPicks, + tiers: prizeTier.tiers, + prize: prizeTier.prize + }); + return prizeDistribution; + } + + + function _getPrizeTier(uint32 drawId) internal view returns (PrizeTierV2 memory prizeTier) { + return history[_binarySearch(drawId)]; + } +} diff --git a/contracts/PrizeDistributionFactory.sol b/contracts/PrizeDistributionFactory.sol index 82f7eb1..ea02665 100644 --- a/contracts/PrizeDistributionFactory.sol +++ b/contracts/PrizeDistributionFactory.sol @@ -1,11 +1,9 @@ // SPDX-License-Identifier: GPL-3.0 - pragma solidity 0.8.6; - import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; - import "./interfaces/IPrizeTierHistory.sol"; /** diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol deleted file mode 100644 index 62fa6b8..0000000 --- a/contracts/PrizeTierHistoryV2.sol +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; -import "./interfaces/IPrizeTierHistoryV2.sol"; -import "./abstract/DrawIDBinarySearch.sol"; - -/** - * @title PoolTogether V4 PrizeTierHistoryV2 - * @author PoolTogether Inc Team - * @notice PrizeTierHistoryV2 manages a history of PrizeTier parameters - * @dev During PrizeTierHistoryV2 initialization a history can be injected into the contract. - Injection of history allows us to mimic historical data from PrizeTierHistoryV1 while - tightly packing the DPR parameter into the PrizeTierV2 struct. - */ -contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, DrawIDBinarySearch, Manageable { - PrizeTierV2[] internal history; - - constructor(address _owner, PrizeTierV2[] memory _history) Ownable(_owner) { - if (_history.length > 0) { - _injectTimeline(_history); - } - } - - // @inheritdoc DrawIDBinarySearch - function getNewestIndex() internal view override returns (uint32) { - return uint32(history.length - 1); - } - - // @inheritdoc DrawIDBinarySearch - function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { - return history[index].drawId; - } - - // @inheritdoc IPrizeTierHistoryV2 - function getOldestDrawId() external view override returns (uint32) { - return history[0].drawId; - } - - // @inheritdoc IPrizeTierHistoryV2 - function getNewestDrawId() external view override returns (uint32) { - return history[history.length - 1].drawId; - } - - // @inheritdoc IPrizeTierHistoryV2 - function getPrizeTier(uint32 drawId) - external - view - override - returns (PrizeTierV2 memory prizeTier) - { - require(drawId > 0, "PrizeTierHistoryV2/draw-id-not-zero"); - return _getPrizeTier(drawId); - } - - // @inheritdoc IPrizeTierHistoryV2 - function getPrizeTierList(uint32[] calldata _drawIds) - external - view - override - returns (PrizeTierV2[] memory) - { - PrizeTierV2[] memory _data = new PrizeTierV2[](_drawIds.length); - for (uint256 index = 0; index < _drawIds.length; index++) { - _data[index] = _getPrizeTier(_drawIds[index]); - } - return _data; - } - - function getPrizeTierAtIndex(uint256 index) external view returns (PrizeTierV2 memory) { - return history[index]; - } - - /* =================================================== */ - /* Setters =========================================== */ - /* =================================================== */ - - function push(PrizeTierV2 calldata nextPrizeTier) external onlyManagerOrOwner returns (bool) { - _push(nextPrizeTier); - return true; - } - - function replace(PrizeTierV2 calldata newPrizeTier) external onlyOwner returns (bool) { - _replace(newPrizeTier); - return true; - } - - function injectTimeline(PrizeTierV2[] calldata prizeTierTimeline) - external - onlyOwner - returns (bool) - { - _injectTimeline(prizeTierTimeline); - return true; - } - - /* =================================================== */ - /* Internal ========================================== */ - /* =================================================== */ - - function _getPrizeTier(uint32 _drawId) internal view returns (PrizeTierV2 memory) { - return history[_binarySearch(_drawId)]; - } - - function _push(PrizeTierV2 memory _prizeTier) internal { - PrizeTierV2[] memory _history = history; - if (_history.length > 0) { - PrizeTierV2 memory _newestDpr = history[history.length - 1]; - require(_prizeTier.drawId > _newestDpr.drawId, "PrizeTierHistoryV2/non-sequential-dpr"); - } - history.push(_prizeTier); - emit PrizeTierPushed(_prizeTier.drawId, _prizeTier); - } - - function _replace(PrizeTierV2 calldata _prizeTier) internal { - uint256 cardinality = history.length; - require(cardinality > 0, "PrizeTierHistoryV2/no-prize-tiers"); - uint32 oldestDrawId = history[0].drawId; - require(_prizeTier.drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); - uint256 index = _binarySearch(_prizeTier.drawId); - require( - history[index].drawId == _prizeTier.drawId, - "PrizeTierHistoryV2/draw-id-must-match" - ); - history[index] = _prizeTier; - emit PrizeTierSet(_prizeTier.drawId, _prizeTier); - } - - function _injectTimeline(PrizeTierV2[] memory _timeline) internal { - require(history.length == 0, "PrizeTierHistoryV2/history-not-empty"); - require(_timeline.length > 0, "PrizeTierHistoryV2/timeline-empty"); - for (uint256 i = 0; i < _timeline.length; i++) { - _push(_timeline[i]); - } - } -} diff --git a/contracts/abstract/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol index 14d9c76..75f2a7f 100644 --- a/contracts/abstract/DrawIDBinarySearch.sol +++ b/contracts/abstract/DrawIDBinarySearch.sol @@ -29,27 +29,22 @@ abstract contract DrawIDBinarySearch { uint32 oldestDrawId = getDrawIdForIndex(leftSide); uint32 newestDrawId = getDrawIdForIndex(rightSide); - console.log("STARTING ==============="); - console.log(_drawId, "drawID"); - console.log(oldestDrawId, "oldestDrawId"); - console.log(newestDrawId, "newestDrawId"); - require(_drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); if (_drawId >= newestDrawId) return rightSide; if (_drawId == oldestDrawId) return leftSide; while (true) { - - uint32 center = leftSide + (rightSide - leftSide) / 2; + uint32 length = rightSide - leftSide; + uint32 center = leftSide + (length) / 2; uint32 centerID = getDrawIdForIndex(center); - if (centerID == _drawId) { + if (centerID == _drawId || length == 1) { index = center; break; } if (centerID < _drawId) { - leftSide = center + 1; + leftSide = center; } else if (centerID > _drawId) { rightSide = center - 1; } @@ -64,7 +59,7 @@ abstract contract DrawIDBinarySearch { } } } - + return index; } } diff --git a/contracts/abstract/PoolUtilities.sol b/contracts/abstract/PoolUtilities.sol new file mode 100644 index 0000000..326ee58 --- /dev/null +++ b/contracts/abstract/PoolUtilities.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; + +/** + * @title PoolTogether V4 PoolUtilities + * @author PoolTogether Inc Team + * @notice DrawIDBinarySearch uses binary search to find a parent contract struct with the drawId parameter + * @dev The implementing contract must provider access to a struct (i.e. PrizeTier) list with is both + * sorted and indexed by the drawId field for binary search to work. + */ +contract PoolUtilities { + uint32 public constant RATE_NORMALIZATION = 1e9; + + function _calculateCardinality( + uint32 _bitRangeSize, + uint256 _prize, + uint256 _dpr, + uint256 _minPickCost, + uint256 _totalSupply + ) internal pure returns (uint8 cardinality) { + uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); + uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); + uint256 _maxPicksWithFracionOfOdds = _normalizePicks( + _maxPicks * RATE_NORMALIZATION, + _fractionOfOdds + ); + cardinality = _calculateCardinalityCeiling(_bitRangeSize, _maxPicksWithFracionOfOdds); + } + + function _calculateNumberOfPicks( + uint32 _bitRangeSize, + uint256 _prize, + uint256 _dpr, + uint256 _minPickCost, + uint256 _totalSupply + ) internal pure returns (uint104) { + uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); + uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); + uint256 _maxPicksWithFracionOfOdds = _normalizePicks( + (_maxPicks * RATE_NORMALIZATION), + _fractionOfOdds + ); + uint8 _cardinality = _calculateCardinalityCeiling( + _bitRangeSize, + _maxPicksWithFracionOfOdds + ); + uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading + uint256 numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; + return uint104(numberOfPicks); + } + + function _calculateNumberOfPicksWithCardinalityAndFraction( + uint32 _bitRangeSize, + uint256 _cardinality, + uint256 _fractionOfOdds + ) internal pure returns (uint256 numberOfPicks) { + uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); + numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; + } + + function _calculateCardinalityAndNumberOfPicks( + uint32 _bitRangeSize, + uint256 _prize, + uint256 _dpr, + uint256 _minPickCost, + uint256 _totalSupply + ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { + cardinality = _calculateCardinality( + _bitRangeSize, + _prize, + _dpr, + _minPickCost, + _totalSupply + ); + numberOfPicks = _calculateNumberOfPicks( + _bitRangeSize, + _prize, + _dpr, + _minPickCost, + _totalSupply + ); + } + + function _calculateDrawPeriodTimestampOffsets( + uint64 _timestamp, + uint32 _startOffset, + uint32 _endOffset + ) internal pure returns (uint64[] memory, uint64[] memory) { + uint64[] memory _startTimestamps = new uint64[](1); + uint64[] memory _endTimestamps = new uint64[](1); + _startTimestamps[0] = _timestamp - _startOffset; + _endTimestamps[0] = _timestamp - _endOffset; + return (_startTimestamps, _endTimestamps); + } + + function _calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) + internal + pure + returns (uint8 cardinality) + { + while ((2**_bitRangeSize)**(cardinality) < _maxPicks) { + cardinality++; + } + } + + function _calculateFractionOfOdds( + uint256 _dpr, + uint256 _totalSupply, + uint256 _prize + ) internal pure returns (uint256) { + // TODO: Normalize things and do math + return (_dpr * _totalSupply) / _prize; + } + + function _normalizePicks(uint256 _dividend, uint256 _denomintor) + internal + pure + returns (uint256 normalizedPicks) + { + normalizedPicks = _dividend / _denomintor; + } +} diff --git a/contracts/harness/DrawIDBinarySearchHarness.sol b/contracts/harness/DrawIDBinarySearchHarness.sol index f7c40a7..343e81a 100644 --- a/contracts/harness/DrawIDBinarySearchHarness.sol +++ b/contracts/harness/DrawIDBinarySearchHarness.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.6; import "../abstract/DrawIDBinarySearch.sol"; contract DrawIDBinarySearchHarness is DrawIDBinarySearch { - struct Draw { uint32 drawId; } @@ -41,7 +40,7 @@ contract DrawIDBinarySearchHarness is DrawIDBinarySearch { function get(uint32 _drawId) external view returns (Draw memory) { return history[_binarySearch(_drawId)]; } - + function list(uint32[] calldata _drawIds) external view returns (Draw[] memory) { Draw[] memory _data = new Draw[](_drawIds.length); for (uint256 index = 0; index < _drawIds.length; index++) { @@ -54,9 +53,11 @@ contract DrawIDBinarySearchHarness is DrawIDBinarySearch { Draw[] memory _history = history; if (_history.length > 0) { Draw memory _newestDpr = history[history.length - 1]; - require(_draw.drawId > _newestDpr.drawId, "DrawIDBinarySearchHarness/non-sequential-dpr"); + require( + _draw.drawId > _newestDpr.drawId, + "DrawIDBinarySearchHarness/non-sequential-dpr" + ); } history.push(_draw); } - -} \ No newline at end of file +} diff --git a/contracts/harness/DrawPercentageRateHarness.sol b/contracts/harness/DrawPercentageRateHarness.sol index 24a2aed..6100d5a 100644 --- a/contracts/harness/DrawPercentageRateHarness.sol +++ b/contracts/harness/DrawPercentageRateHarness.sol @@ -1,14 +1,11 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; -import "../DrawPercentageRate.sol"; +import "../PrizeDistributionAdapter.sol"; -contract DrawPercentageRateHarness is DrawPercentageRate { - constructor( - ITicket _ticket, - IPrizeTierHistoryV2 _prizeTierHistory, - IDrawBuffer _drawBuffer, - uint256 _minPickCost - ) DrawPercentageRate(_ticket, _prizeTierHistory, _drawBuffer, _minPickCost) {} +contract PrizeDistributionAdapterHarness is PrizeDistributionAdapter { + constructor(ITicket _ticket, IDrawBuffer _drawBuffer) + PrizeDistributionAdapter(_ticket, _drawBuffer) + {} function calculatePrizeDistribution(uint32 _drawId) external diff --git a/contracts/interfaces/IPrizeTierHistoryV2.sol b/contracts/interfaces/IPrizeTierHistoryV2.sol index 633ff69..5ba2ebc 100644 --- a/contracts/interfaces/IPrizeTierHistoryV2.sol +++ b/contracts/interfaces/IPrizeTierHistoryV2.sol @@ -10,8 +10,8 @@ import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; interface IPrizeTierHistoryV2 { /** * @notice PrizeTierV2 struct - * @dev Adds the DPR paramater to the PrizeTierStructV1 - */ + * @dev Adds the DPR and minPickCost paramater to the PrizeTierStructV1 + */ struct PrizeTierV2 { uint8 bitRangeSize; uint32 drawId; @@ -21,41 +21,9 @@ interface IPrizeTierHistoryV2 { uint256 prize; uint32[16] tiers; uint32 dpr; - // @TODO add minPickCost to the new PrizeTierHistoryV2? Semi-linked to DPR + uint256 minPickCost; } - /* =================================================== */ - /* Events ============================================ */ - /* =================================================== */ - - /** - * @notice Emit when new PrizeTierV2 is added to history - * @param drawId Draw ID - * @param prizeTier PrizeTierV2 parameters - */ - event PrizeTierPushed(uint32 indexed drawId, PrizeTierV2 prizeTier); - - /** - * @notice Emit when existing PrizeTierV2 is updated in history - * @param drawId Draw ID - * @param prizeTier PrizeTierV2 parameters - */ - event PrizeTierSet(uint32 indexed drawId, PrizeTierV2 prizeTier); - - /* =================================================== */ - /* Functions ========================================= */ - /* =================================================== */ - - /** - * @notice Read oldest Draw ID in history array - */ - function getOldestDrawId() external view returns (uint32); - - /** - * @notice Read newest Draw ID in history array - */ - function getNewestDrawId() external view returns (uint32); - /** * @notice Read PrizeTierV2 struct using Draw ID as the input * @param drawId uint32 - Draw ID @@ -68,7 +36,7 @@ interface IPrizeTierHistoryV2 { * @param drawIds uint32[] - Draw ID * @return prizeTierList PrizeTierV2[] - Parameters to calculate PrizeDistrubtion */ - function getPrizeTierList(uint32[] calldata drawIds) + function getPrizeTiers(uint32[] calldata drawIds) external view returns (PrizeTierV2[] memory prizeTierList); diff --git a/contracts/test/DrawIDAndStructMappingBinarySearch.sol b/contracts/test/DrawIDAndStructMappingBinarySearch.sol new file mode 100644 index 0000000..d526cbe --- /dev/null +++ b/contracts/test/DrawIDAndStructMappingBinarySearch.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; +import "../abstract/DrawIDBinarySearch.sol"; + +contract DrawIDAndStructMappingBinarySearch is DrawIDBinarySearch { + struct Draw { + uint32 drawId; + uint256 randomNumber; + } + + uint32[] internal history; + mapping(uint32 => Draw) internal draws; + + constructor(Draw[] memory _history) { + if (_history.length > 0) { + inject(_history); + } + } + + // @inheritdoc DrawIDBinarySearch + function getNewestIndex() internal view override returns (uint32) { + return uint32(history.length - 1); + } + + // @inheritdoc DrawIDBinarySearch + function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { + return history[index]; + } + + function get(uint32 _drawId) external view returns (Draw memory) { + return draws[history[_binarySearch(_drawId)]]; + } + + function list(uint32[] calldata _drawIds) external view returns (Draw[] memory) { + Draw[] memory _data = new Draw[](_drawIds.length); + for (uint256 index = 0; index < _drawIds.length; index++) { + _data[index] = draws[history[_binarySearch(_drawIds[index])]]; + } + return _data; + } + + function inject(Draw[] memory _timeline) public { + require(history.length == 0, "DrawIDAndStructMappingBinarySearch/history-not-empty"); + require(_timeline.length > 0, "DrawIDAndStructMappingBinarySearch/timeline-empty"); + for (uint256 i = 0; i < _timeline.length; i++) { + _push(_timeline[i]); + } + } + + function _push(Draw memory _draw) internal { + if (history.length > 0) { + uint32 _id = history[history.length - 1]; + require( + _draw.drawId > _id, + "DrawIDAndStructMappingBinarySearch/non-sequential-dpr" + ); + } + history.push(_draw.drawId); + draws[_draw.drawId] = _draw; + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index d2969d1..66126f5 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,4 +1,3 @@ - import '@nomiclabs/hardhat-etherscan'; import '@nomiclabs/hardhat-waffle'; import 'hardhat-abi-exporter'; @@ -50,6 +49,8 @@ const config: HardhatUserConfig | any = { '@pooltogether/v4-core/contracts/prize-strategy/PrizeSplitStrategy.sol', '@pooltogether/v4-core/contracts/interfaces/IReserve.sol', '@pooltogether/v4-core/contracts/interfaces/IStrategy.sol', + '@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol', + '@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol', '@pooltogether/v4-core/contracts/test/ERC20Mintable.sol', '@pooltogether/v4-core/contracts/test/ReserveHarness.sol', '@pooltogether/v4-core/contracts/test/TicketHarness.sol', diff --git a/scripts/fork/impersonate.ts b/scripts/fork/impersonate.ts index 37384e0..6b3865f 100644 --- a/scripts/fork/impersonate.ts +++ b/scripts/fork/impersonate.ts @@ -9,7 +9,7 @@ import { import { action, success } from "../../helpers"; export default task("fork:impersonate", "Impersonate accounts").setAction( - async (taskArguments, hre:any) => { + async (taskArguments, hre: any) => { action("Impersonate accounts..."); await hre.network.provider.request({ diff --git a/scripts/fork/pool.ts b/scripts/fork/pool.ts index 36bb20f..21cb406 100644 --- a/scripts/fork/pool.ts +++ b/scripts/fork/pool.ts @@ -10,53 +10,60 @@ import { import { action, info, success } from "../../helpers"; -export default task("fork:create-pool", "Create pool").setAction(async (taskArguments, hre:any) => { - action("Create pool..."); - - const { - deployments: { deploy }, - getNamedAccounts, - } = hre; - - const { deployer } = await getNamedAccounts(); - - info(`Deployer is: ${deployer}`); - - const aaveUsdcYieldSourceResult = await deploy("ATokenYieldSource", { - from: deployer, - args: [ - AUSDC_ADDRESS_MAINNET, - INCENTIVES_CONTROLLER_ADDRESS_MAINNET, - LENDING_POOL_ADDRESSES_PROVIDER_REGISTRY_ADDRESS_MAINNET, - usdc.decimals, - "PTaUSDCY", - "PoolTogether aUSDC Yield", - EXECUTIVE_TEAM_ADDRESS_MAINNET, - ], - }); - - const yieldSourcePrizePoolResult = await deploy("YieldSourcePrizePool", { - from: deployer, - args: [deployer, aaveUsdcYieldSourceResult.address], - }); - - const yieldSourcePrizePoolAddress = yieldSourcePrizePoolResult.address; - - const ticketResult = await deploy("Ticket", { - from: deployer, - args: ["PoolTogether aUSDC Ticket", "PTaUSDC", usdc.decimals, yieldSourcePrizePoolAddress], - }); - - const yieldSourcePrizePool = await hre.ethers.getContractAt( - "YieldSourcePrizePool", - yieldSourcePrizePoolAddress - ); - - if ((await yieldSourcePrizePool.getTicket()) != ticketResult.address) { - await yieldSourcePrizePool.setTicket(ticketResult.address); - } +export default task("fork:create-pool", "Create pool").setAction( + async (taskArguments, hre: any) => { + action("Create pool..."); + + const { + deployments: { deploy }, + getNamedAccounts, + } = hre; + + const { deployer } = await getNamedAccounts(); + + info(`Deployer is: ${deployer}`); + + const aaveUsdcYieldSourceResult = await deploy("ATokenYieldSource", { + from: deployer, + args: [ + AUSDC_ADDRESS_MAINNET, + INCENTIVES_CONTROLLER_ADDRESS_MAINNET, + LENDING_POOL_ADDRESSES_PROVIDER_REGISTRY_ADDRESS_MAINNET, + usdc.decimals, + "PTaUSDCY", + "PoolTogether aUSDC Yield", + EXECUTIVE_TEAM_ADDRESS_MAINNET, + ], + }); + + const yieldSourcePrizePoolResult = await deploy("YieldSourcePrizePool", { + from: deployer, + args: [deployer, aaveUsdcYieldSourceResult.address], + }); - success("Pool created!"); + const yieldSourcePrizePoolAddress = yieldSourcePrizePoolResult.address; - return yieldSourcePrizePoolAddress; -}); + const ticketResult = await deploy("Ticket", { + from: deployer, + args: [ + "PoolTogether aUSDC Ticket", + "PTaUSDC", + usdc.decimals, + yieldSourcePrizePoolAddress, + ], + }); + + const yieldSourcePrizePool = await hre.ethers.getContractAt( + "YieldSourcePrizePool", + yieldSourcePrizePoolAddress + ); + + if ((await yieldSourcePrizePool.getTicket()) != ticketResult.address) { + await yieldSourcePrizePool.setTicket(ticketResult.address); + } + + success("Pool created!"); + + return yieldSourcePrizePoolAddress; + } +); diff --git a/scripts/fork/twabRewards.ts b/scripts/fork/twabRewards.ts index 6f22f0c..d05f7bc 100644 --- a/scripts/fork/twabRewards.ts +++ b/scripts/fork/twabRewards.ts @@ -7,7 +7,7 @@ import { action, info, success } from "../../helpers"; import { increaseTime as increaseTimeUtil } from "../../test/utils/increaseTime"; export default task("fork:twab-rewards", "Run TWAB Rewards fork").setAction( - async (taskArguments, hre:any) => { + async (taskArguments, hre: any) => { action("Run TWAB Rewards fork..."); const { ethers, run } = hre; diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index b3794aa..ce03299 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -12,23 +12,16 @@ const { getSigners } = ethers; describe('DrawPercentageRate', () => { let wallet1: SignerWithAddress; - let wallet2: SignerWithAddress; - let wallet3: SignerWithAddress; let drawPercentageRate: Contract; let ticket: MockContract; - let prizeTierHistory: MockContract; let drawBuffer: MockContract; let drawPercentageRateFactory: ContractFactory; - const MIN_PICK_COST = BigNumber.from('1'); - before(async () => { - [wallet1, wallet2, wallet3] = await getSigners(); + [wallet1] = await getSigners(); const Ticket = await artifacts.readArtifact('PrizeTierHistory'); - const PrizeTierHistory = await artifacts.readArtifact('PrizeTierHistoryV2'); ticket = await deployMockContract(wallet1, Ticket.abi); - prizeTierHistory = await deployMockContract(wallet1, PrizeTierHistory.abi); drawBuffer = await deployMockContract(wallet1, DrawBuffer.abi); drawPercentageRateFactory = await ethers.getContractFactory('DrawPercentageRateHarness'); }); @@ -36,9 +29,7 @@ describe('DrawPercentageRate', () => { beforeEach(async () => { drawPercentageRate = await drawPercentageRateFactory.deploy( ticket.address, - prizeTierHistory.address, drawBuffer.address, - MIN_PICK_COST, ); }); @@ -57,7 +48,6 @@ describe('DrawPercentageRate', () => { }); describe('Internal', () => { - // Calculate Cardinality describe('calculateCardinality()', () => { it('should successfully calculate a valid cardinality.', async () => { const TOTAL_SUPPLY = BigNumber.from('1000'); @@ -246,37 +236,17 @@ describe('DrawPercentageRate', () => { }); describe('Getters', () => { - it('should get the destination address', async () => { + it('should get the Ticket address', async () => { expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); }); - it('should get the strategy address', async () => { - expect(await drawPercentageRate.getPrizeTierHistory()).to.equal( - prizeTierHistory.address, - ); - }); - - it('should get the reserve address', async () => { + it('should get the DrawBuffer address', async () => { expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); }); - - it('should get the minPickCost', async () => { - expect(await drawPercentageRate.getMinPickCost()).to.equal(MIN_PICK_COST); - }); }); describe('Setters', () => { - it('should set the destination address', async () => { - drawPercentageRate.setTicket(ticket.address); - expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); - }); - it('should set the strategy address', async () => { - drawPercentageRate.setPrizeTierHistory(prizeTierHistory.address); - expect(await drawPercentageRate.getPrizeTierHistory()).to.equal( - prizeTierHistory.address, - ); - }); - it('should set the reserve address', async () => { + it('should set the DrawBuffer address', async () => { drawPercentageRate.setDrawBuffer(drawBuffer.address); expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); }); diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts deleted file mode 100644 index 31224e7..0000000 --- a/test/PrizeTierHistoryV2.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { expect } from 'chai'; -// @ts-ignore -import { ethers } from 'hardhat'; -import { Signer } from '@ethersproject/abstract-signer'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { Contract, ContractFactory } from 'ethers'; -import { range } from './utils/range'; -import { parseUnits } from 'ethers/lib/utils'; - -const { getSigners, utils } = ethers; -const { parseEther: toWei } = utils; - -describe('PrizeTierHistoryV2', () => { - let wallet1: SignerWithAddress; - let wallet2: SignerWithAddress; - let wallet3: SignerWithAddress; - let wallet4: SignerWithAddress; - - let prizeTierHistory: Contract; - let prizeTierHistoryFactory: ContractFactory; - - const prizeTiers = [ - { - bitRangeSize: 5, - drawId: 1, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - }, - { - bitRangeSize: 5, - drawId: 6, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - }, - { - bitRangeSize: 5, - drawId: 9, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - }, - { - bitRangeSize: 5, - drawId: 20, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - dpr: parseUnits('.1', 9), - } - ]; - - const pushPrizeTiers = async () => { - Promise.all(prizeTiers.map(async (tier) => { - await prizeTierHistory.push(tier); - })); - }; - - before(async () => { - [wallet1, wallet2, wallet3, wallet4] = await getSigners(); - prizeTierHistoryFactory = await ethers.getContractFactory('PrizeTierHistoryV2'); - }); - - beforeEach(async () => { - // Deploy PrizeTierHistoryV2 with an empty history for each test - prizeTierHistory = await prizeTierHistoryFactory.deploy(wallet1.address, []); - }); - - describe('Getters', () => { - - it('should succeed to get prize tiers from history', async () => { - await pushPrizeTiers(); - const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 15]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - expect(prizeTierFromHistory[1].drawId).to.equal(6); - expect(prizeTierFromHistory[2].drawId).to.equal(9); - }); - - it('should succeed to get prize tier from history', async () => { - await pushPrizeTiers(); - prizeTiers.map(async (prizeTier) => { - const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(prizeTier.drawId); - expect(prizeTierFromHistory.drawId).to.equal(prizeTier.drawId); - }); - }); - - it('should return prize tier before our searched draw id', async () => { - await pushPrizeTiers(); - const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(4); - expect(prizeTierFromHistory.drawId).to.equal(prizeTiers[0].drawId); - }); - - it('should fail to get a PrizeTier before history range', async () => { - await pushPrizeTiers(); - await expect(prizeTierHistory.getPrizeTier(0)).to.revertedWith( - 'PrizeTierHistoryV2/draw-id-not-zero', - ); - }); - - it('should fail to get a PrizeTer after history range', async () => { - await prizeTierHistory.push(prizeTiers[2]); - await expect(prizeTierHistory.getPrizeTier(4)).to.be.revertedWith( - 'PrizeTierHistoryV2/draw-id-out-of-range', - ); - }); - }); - - describe('Setters', () => { - describe('push()', () => { - it('should succeed push PrizeTier into history from Owner wallet.', async () => { - await expect(prizeTierHistory.push(prizeTiers[0])).to.emit( - prizeTierHistory, - 'PrizeTierPushed', - ); - }); - - it('should succeed to push PrizeTier into history from Manager wallet', async () => { - await prizeTierHistory.setManager(wallet2.address); - await expect( - prizeTierHistory.connect(wallet2 as unknown as Signer).push(prizeTiers[0]), - ).to.emit(prizeTierHistory, 'PrizeTierPushed'); - }); - - it('should fail to push PrizeTier into history from unauthorized wallet', async () => { - await expect( - prizeTierHistory.connect(wallet4 as unknown as Signer).push(prizeTiers[0]), - ).to.be.revertedWith('Manageable/caller-not-manager-or-owner'); - }); - }); - - describe('replace()', async () => { - it('should succeed to replace an an existing PrizeTier struct', async () => { - const prizeTier = { - ...prizeTiers[1], - bitRangeSize: 12, - }; - await pushPrizeTiers(); - await expect(prizeTierHistory.replace(prizeTier)).to.emit( - prizeTierHistory, - 'PrizeTierSet', - ); - const prizeTierVal = await prizeTierHistory.getPrizeTier(prizeTier.drawId); - expect(prizeTierVal.bitRangeSize).to.equal(12); - }); - - it('should FAIL to replace a PrizeTier the PrizeTierHistoryV2 instance has a FALSE history.', async () => { - const prizeTier = { - ...prizeTiers[1], - drawId: 4, - bitRangeSize: 12, - }; - await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( - 'PrizeTierHistoryV2/no-prize-tiers', - ); - }) - - it('should FAIL to replace a PrizeTier the PrizeTierHistoryV2 instance history started after.', async () => { - const prizeTier = { - ...prizeTiers[0], - drawId: 10000 - }; - await prizeTierHistory.push(prizeTier) - const prizeTierReplace = { - ...prizeTiers[0], - drawId: 1 - }; - await expect(prizeTierHistory.replace(prizeTierReplace)).to.be.revertedWith( - 'PrizeTierHistoryV2/draw-id-out-of-range', - ); - }); - - it('should FAIL to replace a PrizeTier that DOES NOT exist.', async () => { - const prizeTier = { - ...prizeTiers[1], - drawId: 4, - bitRangeSize: 12, - }; - await pushPrizeTiers(); - await expect(prizeTierHistory.replace(prizeTier)).to.be.revertedWith( - 'PrizeTierHistoryV2/draw-id-must-match', - ); - }); - - }); - - describe('injectTimeline()', () => { - it('should SUCCEED to inject a PrizeTier history when the PrizeTierHistoryV2 instance has a FALSE history', async () => { - await expect(prizeTierHistory.injectTimeline(prizeTiers)).to.emit( - prizeTierHistory, - 'PrizeTierPushed', - ); - }); - - it('should FAIL to inject a PrizeTier history for a PrizeTierHistoryV2 instance with TRUE history', async () => { - await pushPrizeTiers(); - await expect(prizeTierHistory.injectTimeline(prizeTiers)).to.be.revertedWith( - 'PrizeTierHistoryV2/history-not-empty', - ); - }); - - it('should FAIL to inject a PrizeTier history for a PrizeTierHistoryV2 instance IF the injection history is EMPTY', async () => { - await pushPrizeTiers(); - await expect(prizeTierHistory.injectTimeline([])).to.be.revertedWith( - 'PrizeTierHistoryV2/timeline-empty', - ); - }); - - }); - }); - -}); diff --git a/test/harness/DrawIDBinarySearchHarness.test.ts b/test/harness/DrawIDBinarySearchHarness.test.ts index 50ecf38..49800f2 100644 --- a/test/harness/DrawIDBinarySearchHarness.test.ts +++ b/test/harness/DrawIDBinarySearchHarness.test.ts @@ -20,16 +20,19 @@ describe('DrawIDBinarySearchHarness', () => { drawId: 6, }, { - drawId: 9 + drawId: 9, }, { - drawId: 20 - } + drawId: 20, + }, ]; before(async () => { [wallet1] = await getSigners(); - drawIdBinaryHarnessFactory = await ethers.getContractFactory('DrawIDBinarySearchHarness', wallet1); + drawIdBinaryHarnessFactory = await ethers.getContractFactory( + 'DrawIDBinarySearchHarness', + wallet1, + ); }); beforeEach(async () => { @@ -38,19 +41,19 @@ describe('DrawIDBinarySearchHarness', () => { describe('Getters', () => { it('should succeed to get Draw ID list from history with 1 struct', async () => { - await drawIdBinaryHarness.injectTimeline([{drawId: 1}]); + await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }]); const prizeTierFromHistory = await drawIdBinaryHarness.list([1]); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); - + it('should succeed to get Draw ID list from history with 2 structs', async () => { - await drawIdBinaryHarness.injectTimeline([{drawId: 1}, {drawId: 4}]); + await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }, { drawId: 4 }]); const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); - + it('should succeed to get 3 structs from history with 3 structs', async () => { - await drawIdBinaryHarness.injectTimeline([{drawId: 1}, {drawId: 4}, {drawId: 7}]); + await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }, { drawId: 4 }, { drawId: 7 }]); const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); @@ -63,5 +66,4 @@ describe('DrawIDBinarySearchHarness', () => { expect(prizeTierFromHistory[2].drawId).to.equal(9); }); }); - }); diff --git a/test/test/DrawIDAndStructMappingBinarySearch.test.ts b/test/test/DrawIDAndStructMappingBinarySearch.test.ts new file mode 100644 index 0000000..9a1781b --- /dev/null +++ b/test/test/DrawIDAndStructMappingBinarySearch.test.ts @@ -0,0 +1,75 @@ +// @ts-ignore +import { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract, ContractFactory } from 'ethers'; + +const { getSigners, utils } = ethers; + +describe('DrawIDAndStructMappingBinarySearch', () => { + let wallet1: SignerWithAddress; + + let drawIdBinaryHarness: Contract; + let drawIdBinaryHarnessFactory: ContractFactory; + + const structsWithDrawID = [ + { + drawId: 1, + randomNumber: 1, + }, + { + drawId: 6, + randomNumber: 1, + }, + { + drawId: 9, + randomNumber: 1, + }, + { + drawId: 20, + randomNumber: 1, + }, + ]; + + before(async () => { + [wallet1] = await getSigners(); + drawIdBinaryHarnessFactory = await ethers.getContractFactory( + 'DrawIDAndStructMappingBinarySearch', + wallet1, + ); + }); + + beforeEach(async () => { + drawIdBinaryHarness = await drawIdBinaryHarnessFactory.deploy([]); + }); + + describe('Getters', () => { + it('should succeed to get Draw ID list from history with 1 struct', async () => { + await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([2]); + console.log(prizeTierFromHistory, 'prizeTierFromHistory') + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it('should succeed to get Draw ID list from history with 2 structs', async () => { + await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }, { drawId: 4, randomNumber: 1, }]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it('should succeed to get 3 structs from history with 3 structs', async () => { + await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }, { drawId: 4, randomNumber: 1, }, { drawId: 7, randomNumber: 1, }]); + const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); + expect(prizeTierFromHistory[0].drawId).to.equal(1); + }); + + it.only('should succeed to get Draw ID list from history with 4 structs', async () => { + await drawIdBinaryHarness.inject(structsWithDrawID); + const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); + console.log(prizeTierFromHistory, 'prizeTierFromHistory') + expect(prizeTierFromHistory[0].drawId).to.equal(1); + expect(prizeTierFromHistory[1].drawId).to.equal(6); + expect(prizeTierFromHistory[2].drawId).to.equal(9); + }); + }); +}); From b6a767d862c888d5e43eeb9566bf48a202331f4a Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Thu, 20 Oct 2022 16:19:56 -0500 Subject: [PATCH 21/30] chore(package): bump pooltogether packages --- .gitignore | 3 --- package.json | 4 ++-- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index d80bd6c..3d740bb 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,3 @@ docs deployments/localhost deployments/hardhat - -.turbo -*.dev.md \ No newline at end of file diff --git a/package.json b/package.json index cb833ed..7af2b21 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "peerDependencies": { "@openzeppelin/contracts": "4.4.2", - "@pooltogether/v4-core": "1.2.0" + "@pooltogether/v4-core": "1.3.0-beta.1" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "2.0.2", @@ -36,7 +36,7 @@ "@nomiclabs/hardhat-waffle": "2.0.1", "@openzeppelin/contracts": "4.4.2", "@openzeppelin/hardhat-upgrades": "1.6.0", - "@pooltogether/aave-yield-source": "1.1.0", + "@pooltogether/aave-yield-source": "1.2.1", "@pooltogether/v4-core": "1.3.0-beta.1", "@studydefi/money-legos": "2.4.2", "@types/chai": "4.2.15", diff --git a/yarn.lock b/yarn.lock index 6af1fd5..60a56f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1052,10 +1052,10 @@ proper-lockfile "^4.1.1" solidity-ast "^0.4.15" -"@pooltogether/aave-yield-source@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pooltogether/aave-yield-source/-/aave-yield-source-1.1.0.tgz#3ca045d82b587e5a08bfc7cf0d46a3eff6445b19" - integrity sha512-gZnd6Z0aZJEk5opDeVhw/KprCk9G3PA2trNTRyjXDoNM45BvoY7Hkd9ZSdupVMGHWhj+dRQ5lnO1Ug3A0CbL/Q== +"@pooltogether/aave-yield-source@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@pooltogether/aave-yield-source/-/aave-yield-source-1.2.1.tgz#4531aed29f510c7ec930267b2751cd976df5c6bb" + integrity sha512-3SOA8nTh/V2rCiyMDVonfURtSNcVdJy0zwpwYQ85lkV9OOU0pXxclhJjt03E3mGSwlJDHp+XeunGzmOmsNtLCQ== dependencies: "@openzeppelin/contracts" "4.3.2" "@pooltogether/fixed-point" "1.0.0" From 4372cdf4ee02ba111bc7dffae48e971c2eae73b3 Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Fri, 21 Oct 2022 17:22:12 -0500 Subject: [PATCH 22/30] fix(contracts): refactor DrawCalculationLib --- contracts/PrizeDistributionAdapter.sol | 102 ++++++------- contracts/PrizeDistributionFactory.sol | 1 + contracts/abstract/PoolUtilities.sol | 123 ---------------- .../harness/DrawPercentageRateHarness.sol | 56 +------ contracts/libraries/DrawCalculationLib.sol | 67 +++++++++ test/DrawPercentageRate.test.ts | 137 +----------------- ...DrawIDAndStructMappingBinarySearch.test.ts | 19 ++- 7 files changed, 141 insertions(+), 364 deletions(-) delete mode 100644 contracts/abstract/PoolUtilities.sol create mode 100644 contracts/libraries/DrawCalculationLib.sol diff --git a/contracts/PrizeDistributionAdapter.sol b/contracts/PrizeDistributionAdapter.sol index 72fb7e4..a51d9b4 100644 --- a/contracts/PrizeDistributionAdapter.sol +++ b/contracts/PrizeDistributionAdapter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; -import "hardhat/console.sol"; + import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; @@ -8,7 +8,7 @@ import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; import "./abstract/DrawIDBinarySearch.sol"; -import "./abstract/PoolUtilities.sol"; +import "./libraries/DrawCalculationLib.sol"; import "./interfaces/IPrizeTierHistoryV2.sol"; /** @@ -16,13 +16,12 @@ import "./interfaces/IPrizeTierHistoryV2.sol"; * @author PoolTogether Inc Team * @notice PrizeDistributionAdapter dynamically calculates a PrizePool distributions using a static draw percentage rate. */ -contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearch, Manageable, PoolUtilities { - - /** +contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearch, Manageable { + /** * @notice PrizeTierV2 struct * @dev Adds the DPR and minPickCost paramater to the PrizeTierStructV1 */ - struct PrizeTierV2 { + struct PrizeTierV2 { uint8 bitRangeSize; uint32 drawId; uint32 maxPicksPerUser; @@ -111,11 +110,7 @@ contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearc return ticket; } - function getPrizeTier(uint32 drawId) - external - view - returns (PrizeTierV2 memory prizeTier) - { + function getPrizeTier(uint32 drawId) external view returns (PrizeTierV2 memory prizeTier) { return _getPrizeTier(drawId); } @@ -140,43 +135,50 @@ contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearc * @param _drawId - uint32 * @return prizeDistribution */ - function _calculatePrizeDistribution(uint32 _drawId) - internal - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - PrizeTierV2 memory prizeTier = _getPrizeTier(_drawId); - IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); - (uint64[] memory start, uint64[] memory end) = _calculateDrawPeriodTimestampOffsets( - draw.timestamp, - draw.beaconPeriodSeconds, - prizeTier.endTimestampOffset - ); - uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); - (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( - prizeTier.bitRangeSize, - prizeTier.prize, - prizeTier.dpr, - prizeTier.minPickCost, - _totalSupplies[0] - ); - IPrizeDistributionBuffer.PrizeDistribution - memory prizeDistribution = IPrizeDistributionSource.PrizeDistribution({ - bitRangeSize: prizeTier.bitRangeSize, - matchCardinality: _cardinality, - startTimestampOffset: draw.beaconPeriodSeconds, - endTimestampOffset: prizeTier.endTimestampOffset, - maxPicksPerUser: prizeTier.maxPicksPerUser, - expiryDuration: prizeTier.expiryDuration, - numberOfPicks: _numberOfPicks, - tiers: prizeTier.tiers, - prize: prizeTier.prize - }); - return prizeDistribution; - } - - - function _getPrizeTier(uint32 drawId) internal view returns (PrizeTierV2 memory prizeTier) { - return history[_binarySearch(drawId)]; - } + function _calculatePrizeDistribution(uint32 _drawId) + internal + view + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + PrizeTierV2 memory prizeTier = _getPrizeTier(_drawId); + + IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); + + (uint64[] memory start, uint64[] memory end) = DrawCalculationLib + .calculateDrawPeriodTimestampOffsets( + draw.timestamp, + draw.beaconPeriodSeconds, + prizeTier.endTimestampOffset + ); + + uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); + + (uint8 _cardinality, uint104 _numberOfPicks) = DrawCalculationLib + .calculateCardinalityAndNumberOfPicks( + prizeTier.bitRangeSize, + prizeTier.prize, + prizeTier.dpr, + prizeTier.minPickCost, + _totalSupplies[0] + ); + + IPrizeDistributionBuffer.PrizeDistribution + memory prizeDistribution = IPrizeDistributionSource.PrizeDistribution({ + bitRangeSize: prizeTier.bitRangeSize, + matchCardinality: _cardinality, + startTimestampOffset: draw.beaconPeriodSeconds, + endTimestampOffset: prizeTier.endTimestampOffset, + maxPicksPerUser: prizeTier.maxPicksPerUser, + expiryDuration: prizeTier.expiryDuration, + numberOfPicks: _numberOfPicks, + tiers: prizeTier.tiers, + prize: prizeTier.prize + }); + + return prizeDistribution; + } + + function _getPrizeTier(uint32 drawId) internal view returns (PrizeTierV2 memory prizeTier) { + return history[_binarySearch(drawId)]; + } } diff --git a/contracts/PrizeDistributionFactory.sol b/contracts/PrizeDistributionFactory.sol index ea02665..ef636ea 100644 --- a/contracts/PrizeDistributionFactory.sol +++ b/contracts/PrizeDistributionFactory.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; + import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; diff --git a/contracts/abstract/PoolUtilities.sol b/contracts/abstract/PoolUtilities.sol deleted file mode 100644 index 326ee58..0000000 --- a/contracts/abstract/PoolUtilities.sol +++ /dev/null @@ -1,123 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; - -/** - * @title PoolTogether V4 PoolUtilities - * @author PoolTogether Inc Team - * @notice DrawIDBinarySearch uses binary search to find a parent contract struct with the drawId parameter - * @dev The implementing contract must provider access to a struct (i.e. PrizeTier) list with is both - * sorted and indexed by the drawId field for binary search to work. - */ -contract PoolUtilities { - uint32 public constant RATE_NORMALIZATION = 1e9; - - function _calculateCardinality( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint8 cardinality) { - uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); - uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); - uint256 _maxPicksWithFracionOfOdds = _normalizePicks( - _maxPicks * RATE_NORMALIZATION, - _fractionOfOdds - ); - cardinality = _calculateCardinalityCeiling(_bitRangeSize, _maxPicksWithFracionOfOdds); - } - - function _calculateNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint104) { - uint256 _maxPicks = _normalizePicks(_totalSupply, _minPickCost); - uint256 _fractionOfOdds = _calculateFractionOfOdds(_dpr, _totalSupply, _prize); - uint256 _maxPicksWithFracionOfOdds = _normalizePicks( - (_maxPicks * RATE_NORMALIZATION), - _fractionOfOdds - ); - uint8 _cardinality = _calculateCardinalityCeiling( - _bitRangeSize, - _maxPicksWithFracionOfOdds - ); - uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); // .toUint104(); - TODO: Convert to uint104 and optimize stoarge/loading - uint256 numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; - return uint104(numberOfPicks); - } - - function _calculateNumberOfPicksWithCardinalityAndFraction( - uint32 _bitRangeSize, - uint256 _cardinality, - uint256 _fractionOfOdds - ) internal pure returns (uint256 numberOfPicks) { - uint256 _totalPicks = uint256((2**_bitRangeSize)**_cardinality); - numberOfPicks = (_totalPicks * _fractionOfOdds) / RATE_NORMALIZATION; - } - - function _calculateCardinalityAndNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { - cardinality = _calculateCardinality( - _bitRangeSize, - _prize, - _dpr, - _minPickCost, - _totalSupply - ); - numberOfPicks = _calculateNumberOfPicks( - _bitRangeSize, - _prize, - _dpr, - _minPickCost, - _totalSupply - ); - } - - function _calculateDrawPeriodTimestampOffsets( - uint64 _timestamp, - uint32 _startOffset, - uint32 _endOffset - ) internal pure returns (uint64[] memory, uint64[] memory) { - uint64[] memory _startTimestamps = new uint64[](1); - uint64[] memory _endTimestamps = new uint64[](1); - _startTimestamps[0] = _timestamp - _startOffset; - _endTimestamps[0] = _timestamp - _endOffset; - return (_startTimestamps, _endTimestamps); - } - - function _calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) - internal - pure - returns (uint8 cardinality) - { - while ((2**_bitRangeSize)**(cardinality) < _maxPicks) { - cardinality++; - } - } - - function _calculateFractionOfOdds( - uint256 _dpr, - uint256 _totalSupply, - uint256 _prize - ) internal pure returns (uint256) { - // TODO: Normalize things and do math - return (_dpr * _totalSupply) / _prize; - } - - function _normalizePicks(uint256 _dividend, uint256 _denomintor) - internal - pure - returns (uint256 normalizedPicks) - { - normalizedPicks = _dividend / _denomintor; - } -} diff --git a/contracts/harness/DrawPercentageRateHarness.sol b/contracts/harness/DrawPercentageRateHarness.sol index 6100d5a..c63385d 100644 --- a/contracts/harness/DrawPercentageRateHarness.sol +++ b/contracts/harness/DrawPercentageRateHarness.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.6; import "../PrizeDistributionAdapter.sol"; -contract PrizeDistributionAdapterHarness is PrizeDistributionAdapter { +contract DrawPercentageRateHarness is PrizeDistributionAdapter { constructor(ITicket _ticket, IDrawBuffer _drawBuffer) PrizeDistributionAdapter(_ticket, _drawBuffer) {} @@ -20,58 +20,14 @@ contract PrizeDistributionAdapterHarness is PrizeDistributionAdapter { uint32 _startOffset, uint32 _endOffset ) public pure returns (uint64[] memory startTimestamps, uint64[] memory endTimestamps) { - return _calculateDrawPeriodTimestampOffsets(_timestamp, _startOffset, _endOffset); - } - - function calculateCardinality( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) public pure returns (uint8 cardinality) { - return _calculateCardinality(_bitRangeSize, _prize, _dpr, _minPickCost, _totalSupply); - } - - function calculateNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) public pure returns (uint256 numberOfPicks) { - return _calculateNumberOfPicks(_bitRangeSize, _prize, _dpr, _minPickCost, _totalSupply); - } - - function calculateNumberOfPicksWithCardinalityAndFraction( - uint32 _bitRangeSize, - uint256 _cardinality, - uint256 _fractionOfOdds - ) public pure returns (uint256 cardinality) { return - _calculateNumberOfPicksWithCardinalityAndFraction( - _bitRangeSize, - _cardinality, - _fractionOfOdds + DrawCalculationLib.calculateDrawPeriodTimestampOffsets( + _timestamp, + _startOffset, + _endOffset ); } - function calculateCardinalityCeiling(uint32 _bitRangeSize, uint256 _maxPicks) - public - pure - returns (uint8 cardinality) - { - return _calculateCardinalityCeiling(_bitRangeSize, _maxPicks); - } - - function calculateFractionOfOdds( - uint256 _dpr, - uint256 _totalSupply, - uint256 _prize - ) public pure returns (uint256) { - return _calculateFractionOfOdds(_dpr, _totalSupply, _prize); - } - function calculateCardinalityAndNumberOfPicks( uint32 _bitRangeSize, uint256 _prize, @@ -80,7 +36,7 @@ contract PrizeDistributionAdapterHarness is PrizeDistributionAdapter { uint256 _totalSupply ) public pure returns (uint8 cardinality, uint256 numberOfPicks) { return - _calculateCardinalityAndNumberOfPicks( + DrawCalculationLib.calculateCardinalityAndNumberOfPicks( _bitRangeSize, _prize, _dpr, diff --git a/contracts/libraries/DrawCalculationLib.sol b/contracts/libraries/DrawCalculationLib.sol new file mode 100644 index 0000000..18675de --- /dev/null +++ b/contracts/libraries/DrawCalculationLib.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +/** + * @title PoolTogether V4 DrawCalculationLib + * @author PoolTogether Inc Team + * @notice DrawCalculationLib exposes helper functions + * to calculate values needed to compute results of a draw + */ +library DrawCalculationLib { + /** + * @notice Unit of normalization. + * @dev The Draw Percentage Rate (DPR) being a 1e9 number, + * we need to normalize calculations by scaling up or down by 1e9 + */ + uint32 public constant RATE_NORMALIZATION = 1e9; + + /** + * @notice Compute prize pool cardinality and number of picks for a draw + * @param _bitRangeSize Bit range size + * @param _prize Total prize amount + * @param _dpr Draw percentage rate + * @param _minPickCost Minimum cost for a pick + * @param _totalSupply Prize Pool network TVL + * @return cardinality and number of picks + */ + function calculateCardinalityAndNumberOfPicks( + uint32 _bitRangeSize, + uint256 _prize, + uint256 _dpr, + uint256 _minPickCost, + uint256 _totalSupply + ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { + uint256 _maxPicks = (_totalSupply * RATE_NORMALIZATION) / _minPickCost; + uint256 _odds = (_dpr * _totalSupply) / _prize; + + uint256 _totalPicks; + + while ((_totalPicks = (2**_bitRangeSize)**(cardinality)) < (_maxPicks / _odds)) { + cardinality++; + } + + // number of picks = total picks * odds + numberOfPicks = uint104((_totalPicks * _odds) / RATE_NORMALIZATION); + } + + /** + * @notice Calculate Draw period start and end timestamp + * @param _timestamp Timestamp at which the draw was created by the DrawBeacon + * @param _startOffset Draw start time offset in seconds + * @param _endOffset Draw end time offset in seconds + * @return Draw start and end timestamp + */ + function calculateDrawPeriodTimestampOffsets( + uint64 _timestamp, + uint32 _startOffset, + uint32 _endOffset + ) internal pure returns (uint64[] memory, uint64[] memory) { + uint64[] memory _startTimestamps = new uint64[](1); + uint64[] memory _endTimestamps = new uint64[](1); + + _startTimestamps[0] = _timestamp - _startOffset; + _endTimestamps[0] = _timestamp - _endOffset; + + return (_startTimestamps, _endTimestamps); + } +} diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts index ce03299..ee1624e 100644 --- a/test/DrawPercentageRate.test.ts +++ b/test/DrawPercentageRate.test.ts @@ -48,104 +48,6 @@ describe('DrawPercentageRate', () => { }); describe('Internal', () => { - describe('calculateCardinality()', () => { - it('should successfully calculate a valid cardinality.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('100'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.01', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateCardinality( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - expect(value).to.eq(BigNumber.from('7')); - }); - - it('should successfully calculate a valid cardinality and number of picks.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('10'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.1', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateCardinality( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - expect(value).to.eq(BigNumber.from('4')); - }); - }); - - // Calculate Number of Picks - describe('calculateNumberOfPicks()', () => { - it('should successfully calculate a valid cardinality.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('100'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.01', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateNumberOfPicks( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - expect(value).to.eq(BigNumber.from('1638')); - }); - - it('should successfully calculate a valid cardinality and number of picks.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('10'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.1', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateNumberOfPicks( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - expect(value).to.eq(BigNumber.from('2560')); - }); - }); - - // Calculate Number of Picks using Cardinality and Fraction of Odds - describe('calculateNumberOfPicksWithCardinalityAndFraction()', () => { - it('should successfully calculate number of picks of using cardinality and fraction of odds', async () => { - const BIT_RANGE_SIZE = BigNumber.from('2'); - const CARDINALITY = BigNumber.from('7'); - const FRACTION_OF_ODDS = BigNumber.from('100000000'); - const value = - await drawPercentageRate.calculateNumberOfPicksWithCardinalityAndFraction( - BIT_RANGE_SIZE, - CARDINALITY, - FRACTION_OF_ODDS, - ); - expect(value).to.eq(BigNumber.from('1638')); - }); - - it('should successfully calculate number of picks of using cardinality and fraction of odds', async () => { - const BIT_RANGE_SIZE = BigNumber.from('2'); - const CARDINALITY = BigNumber.from('4'); - const FRACTION_OF_ODDS = BigNumber.from('10000000000'); - const value = - await drawPercentageRate.calculateNumberOfPicksWithCardinalityAndFraction( - BIT_RANGE_SIZE, - CARDINALITY, - FRACTION_OF_ODDS, - ); - expect(value).to.eq(BigNumber.from('2560')); - }); - }); - describe('calculateCardinalityAndNumberOfPicks()', () => { it('should successfully calculate a valid cardinality and number of picks.', async () => { const TOTAL_SUPPLY = BigNumber.from('1000'); @@ -160,6 +62,7 @@ describe('DrawPercentageRate', () => { MIN_PICK_COST, TOTAL_SUPPLY, ); + expect(value.cardinality).to.eq(BigNumber.from('7')); expect(value.numberOfPicks).to.eq(BigNumber.from('1638')); }); @@ -177,20 +80,12 @@ describe('DrawPercentageRate', () => { MIN_PICK_COST, TOTAL_SUPPLY, ); + expect(value.cardinality).to.eq(BigNumber.from('4')); expect(value.numberOfPicks).to.eq(BigNumber.from('2560')); }); }); - describe('calculatePrizeDistribution()', () => { - it('should successfully calculate a PrizeDistribution using mock historical Draw parameters', async () => { - const DRAW_ID = 1; - const DRAW_PERCENTAGE_RATE = '1'; - // expect(await drawPercentageRate.calculatePrizeDistribution(DRAW_ID, DRAW_PERCENTAGE_RATE)).to.eq(true); - expect(true).to.eq(true); - }); - }); - describe('calculateDrawPeriodTimestampOffsets()', () => { it('should successfully calculate the Draw timestamp offests', async () => { const TIMESTAMP = BigNumber.from('1000'); @@ -205,34 +100,6 @@ describe('DrawPercentageRate', () => { expect(offsets[1][0]).to.equal(BigNumber.from('990')); }); }); - - describe('calculateCardinalityCeiling()', () => { - it('should successfully calculate the cardinality from max picks', async () => { - const BIT_RANGE_SIZE = BigNumber.from('4'); - const MAX_PICKS = BigNumber.from('1000'); - const CARDINALITY_EXPECT = BigNumber.from('3'); - const read = await drawPercentageRate.calculateCardinalityCeiling( - BIT_RANGE_SIZE, - MAX_PICKS, - ); - expect(read).to.eq(CARDINALITY_EXPECT); - }); - }); - - describe('calculateFractionOfOdds()', () => { - it('should successfully calculate the fracion of odds', async () => { - const DRAW_PERCENTAGE_RATE = BigNumber.from('100000'); - const TOTAL_SUPPLY = BigNumber.from('100000'); - const PRIZE = parseEther('1'); - expect( - await drawPercentageRate.calculateFractionOfOdds( - DRAW_PERCENTAGE_RATE, - TOTAL_SUPPLY, - PRIZE, - ), - ).to.eq(BigNumber.from('0')); - }); - }); }); describe('Getters', () => { diff --git a/test/test/DrawIDAndStructMappingBinarySearch.test.ts b/test/test/DrawIDAndStructMappingBinarySearch.test.ts index 9a1781b..a6789b5 100644 --- a/test/test/DrawIDAndStructMappingBinarySearch.test.ts +++ b/test/test/DrawIDAndStructMappingBinarySearch.test.ts @@ -45,28 +45,35 @@ describe('DrawIDAndStructMappingBinarySearch', () => { describe('Getters', () => { it('should succeed to get Draw ID list from history with 1 struct', async () => { - await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }]); + await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1 }]); const prizeTierFromHistory = await drawIdBinaryHarness.list([2]); - console.log(prizeTierFromHistory, 'prizeTierFromHistory') + console.log(prizeTierFromHistory, 'prizeTierFromHistory'); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); it('should succeed to get Draw ID list from history with 2 structs', async () => { - await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }, { drawId: 4, randomNumber: 1, }]); + await drawIdBinaryHarness.inject([ + { drawId: 1, randomNumber: 1 }, + { drawId: 4, randomNumber: 1 }, + ]); const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); it('should succeed to get 3 structs from history with 3 structs', async () => { - await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1, }, { drawId: 4, randomNumber: 1, }, { drawId: 7, randomNumber: 1, }]); + await drawIdBinaryHarness.inject([ + { drawId: 1, randomNumber: 1 }, + { drawId: 4, randomNumber: 1 }, + { drawId: 7, randomNumber: 1 }, + ]); const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); expect(prizeTierFromHistory[0].drawId).to.equal(1); }); - it.only('should succeed to get Draw ID list from history with 4 structs', async () => { + it('should succeed to get Draw ID list from history with 4 structs', async () => { await drawIdBinaryHarness.inject(structsWithDrawID); const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); - console.log(prizeTierFromHistory, 'prizeTierFromHistory') + console.log(prizeTierFromHistory, 'prizeTierFromHistory'); expect(prizeTierFromHistory[0].drawId).to.equal(1); expect(prizeTierFromHistory[1].drawId).to.equal(6); expect(prizeTierFromHistory[2].drawId).to.equal(9); From fe90fe305ae88517d8a045f2383c1f890b690c0e Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Fri, 21 Oct 2022 17:59:22 -0500 Subject: [PATCH 23/30] feat(contracts): add PrizeTierHistoryV2 --- contracts/PrizeDistributionAdapter.sol | 8 +- contracts/PrizeTierHistoryV2.sol | 177 +++++++++++++++++++ contracts/interfaces/IPrizeTierHistory.sol | 51 +++--- contracts/interfaces/IPrizeTierHistoryV2.sol | 79 ++++++++- contracts/libraries/DrawCalculationLib.sol | 1 - 5 files changed, 281 insertions(+), 35 deletions(-) create mode 100644 contracts/PrizeTierHistoryV2.sol diff --git a/contracts/PrizeDistributionAdapter.sol b/contracts/PrizeDistributionAdapter.sol index a51d9b4..209ce18 100644 --- a/contracts/PrizeDistributionAdapter.sol +++ b/contracts/PrizeDistributionAdapter.sol @@ -19,7 +19,7 @@ import "./interfaces/IPrizeTierHistoryV2.sol"; contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearch, Manageable { /** * @notice PrizeTierV2 struct - * @dev Adds the DPR and minPickCost paramater to the PrizeTierStructV1 + * @dev Adds Draw Percentage Rate (DPR) and minPickCost paramater to PrizeTier struct */ struct PrizeTierV2 { uint8 bitRangeSize; @@ -27,10 +27,10 @@ contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearc uint32 maxPicksPerUser; uint32 expiryDuration; uint32 endTimestampOffset; - uint256 prize; - uint32[16] tiers; uint32 dpr; uint256 minPickCost; + uint256 prize; + uint32[16] tiers; } ITicket internal ticket; @@ -114,7 +114,7 @@ contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearc return _getPrizeTier(drawId); } - function getPrizeTiers(uint32[] calldata drawIds) + function getPrizeTierList(uint32[] calldata drawIds) external view returns (PrizeTierV2[] memory prizeTierList) diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol new file mode 100644 index 0000000..2c6f2b9 --- /dev/null +++ b/contracts/PrizeTierHistoryV2.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; + +import "./interfaces/IPrizeTierHistoryV2.sol"; +import "./libraries/BinarySearchLib.sol"; + +/** + * @title PoolTogether V4 PrizeTierHistoryV2 + * @author PoolTogether Inc Team + * @notice The PrizeTierHistoryV2 smart contract stores a history of PrizeTierV2 structs linked to + a range of valid Draw IDs. + * @dev If the history param has single PrizeTierV2 struct with a "drawId" of 1 all subsequent + Draws will use that PrizeTierV2 struct for PrizeDitribution calculations. The BinarySearchLib + will find a PrizeTierV2 using a "atOrBefore" range search when supplied drawId input parameter. + */ +contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { + using BinarySearchLib for uint32[]; + + /** + * @notice Ordered array of Draw IDs + * @dev The history, with sequentially ordered ids, can be searched using binary search. + The binary search will find index of a drawId (atOrBefore) using a specific drawId (at). + When a new Draw ID is added to the history, a corresponding mapping of the ID is + updated in the prizeTiers mapping. + */ + uint32[] internal history; + + /** + * @notice Mapping a Draw ID to a PrizeTierV2 struct. + * @dev The prizeTiers mapping links a Draw ID to a PrizeTierV2 struct. + The prizeTiers mapping is updated when a new Draw ID is added to the history. + */ + mapping(uint32 => PrizeTierV2) internal prizeTiers; + + /** + * @notice Ceiling for the total sum of tiers from the prize distribution. 1e9 = 100%. + * @dev It's fixed point 9 because 1e9 is the largest "1" that fits into 2**32 + */ + uint256 internal constant TIERS_CEILING = 1e9; + + /** + * @notice PrizeTierHistoryV2 constructor + * @param _owner Address of the contract owner + */ + constructor(address _owner) Ownable(_owner) {} + + // @inheritdoc IPrizeTierHistoryV2 + function count() external view override returns (uint256) { + return history.length; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getOldestDrawId() external view override returns (uint32) { + return history[0]; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getNewestDrawId() external view override returns (uint32) { + return history[history.length - 1]; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getPrizeTier(uint32 drawId) external view override returns (PrizeTierV2 memory) { + require(drawId > 0, "PrizeTierHistoryV2/draw-id-not-zero"); + return prizeTiers[history.binarySearch(drawId)]; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getPrizeTierList(uint32[] calldata _drawIds) + external + view + override + returns (PrizeTierV2[] memory) + { + uint256 _length = _drawIds.length; + PrizeTierV2[] memory _data = new PrizeTierV2[](_length); + for (uint256 index = 0; index < _length; index++) { + _data[index] = prizeTiers[history.binarySearch(_drawIds[index])]; + } + return _data; + } + + // @inheritdoc IPrizeTierHistoryV2 + function getPrizeTierAtIndex(uint256 index) + external + view + override + returns (PrizeTierV2 memory) + { + return prizeTiers[uint32(index)]; + } + + // @inheritdoc IPrizeTierHistoryV2 + function push(PrizeTierV2 calldata nextPrizeTier) external override onlyManagerOrOwner { + _push(nextPrizeTier); + } + + // @inheritdoc IPrizeTierHistoryV2 + function popAndPush(PrizeTierV2 calldata newPrizeTier) + external + override + onlyOwner + returns (uint32) + { + uint256 length = history.length; + require(length > 0, "PrizeTierHistoryV2/history-empty"); + require(history[length - 1] == newPrizeTier.drawId, "PrizeTierHistoryV2/invalid-draw-id"); + _replace(newPrizeTier); + return newPrizeTier.drawId; + } + + // @inheritdoc IPrizeTierHistoryV2 + function replace(PrizeTierV2 calldata newPrizeTier) external override onlyOwner { + _replace(newPrizeTier); + } + + /** + * @notice Check that the total sum of the tiers is not greater than 1e9 (100%). + * @param _tiers Array of tiers to check + */ + function _checkTiersTotalSum(uint32[16] memory _tiers) internal pure { + uint256 tiersTotalSum; + uint256 tiersLength = _tiers.length; + + for (uint256 index; index < tiersLength; index++) { + tiersTotalSum += _tiers[index]; + } + + require(tiersTotalSum <= TIERS_CEILING, "PrizeTierHistoryV2/tiers-gt-100%"); + } + + /** + * @notice Push PrizeTierV2 struct onto `prizeTiers` array. + * @dev Callable only by the owner or manager. + * @dev `drawId` must be greater than the latest one stored in `history`. + * @param _prizeTier Next PrizeTierV2 struct + */ + function _push(PrizeTierV2 memory _prizeTier) internal { + uint32 _length = uint32(history.length); + + if (_length > 0) { + uint32 _id = history[_length - 1]; + require(_prizeTier.drawId > _id, "PrizeTierHistoryV2/non-sequential-id"); + } + + _checkTiersTotalSum(_prizeTier.tiers); + + history.push(_prizeTier.drawId); + prizeTiers[_length] = _prizeTier; + + emit PrizeTierPushed(_prizeTier.drawId, _prizeTier); + } + + /** + * @notice Replace PrizeTierV2 struct in `prizeTiers` array. + * @dev Callable only by the owner. + * @param _prizeTier PrizeTierV2 parameters + */ + function _replace(PrizeTierV2 calldata _prizeTier) internal { + uint256 cardinality = history.length; + require(cardinality > 0, "PrizeTierHistoryV2/no-prize-tiers"); + + uint32 oldestDrawId = history[0]; + require(_prizeTier.drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); + + uint32 index = history.binarySearch(_prizeTier.drawId); + require(history[index] == _prizeTier.drawId, "PrizeTierHistoryV2/draw-id-must-match"); + + _checkTiersTotalSum(_prizeTier.tiers); + + prizeTiers[index] = _prizeTier; + + emit PrizeTierSet(_prizeTier.drawId, _prizeTier); + } +} diff --git a/contracts/interfaces/IPrizeTierHistory.sol b/contracts/interfaces/IPrizeTierHistory.sol index 3bdc30f..7d47fe3 100644 --- a/contracts/interfaces/IPrizeTierHistory.sol +++ b/contracts/interfaces/IPrizeTierHistory.sol @@ -8,9 +8,7 @@ import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; * @notice IPrizeTierHistory is the base contract for PrizeTierHistory */ interface IPrizeTierHistory { - /** - * @notice Linked Draw and PrizeDistribution parameters storage schema - */ + /// @notice Linked Draw and PrizeDistribution parameters storage schema struct PrizeTier { uint8 bitRangeSize; uint32 drawId; @@ -22,14 +20,14 @@ interface IPrizeTierHistory { } /** - * @notice Emit when new PrizeTier is added to history + * @notice Emitted when new PrizeTier is added to history * @param drawId Draw ID * @param prizeTier PrizeTier parameters */ event PrizeTierPushed(uint32 indexed drawId, PrizeTier prizeTier); /** - * @notice Emit when existing PrizeTier is updated in history + * @notice Emitted when existing PrizeTier is updated in history * @param drawId Draw ID * @param prizeTier PrizeTier parameters */ @@ -51,19 +49,25 @@ interface IPrizeTierHistory { function replace(PrizeTier calldata newPrizeTier) external; /** - * @notice Read PrizeTierHistory struct from history array. - * @param drawId Draw ID - * @return prizeTier + * @notice Pop the latest prize tier stored in the `prizeTiers` array and replace it with the new prize tier. + * @dev Callable only by the owner. + * @param newPrizeTier Updated PrizeTier struct + * @return drawId Draw ID of the PrizeTier that was pushed */ - function getPrizeTier(uint32 drawId) external view returns (PrizeTier memory prizeTier); + function popAndPush(PrizeTier calldata newPrizeTier) external returns (uint32 drawId); /** - * @notice Read first Draw ID used to initialize history - * @return Draw ID of first PrizeTier record + * @notice Returns the number of Prize Tier structs pushed. + * @return The number of prize tiers that have been pushed */ - function getOldestDrawId() external view returns (uint32); + function count() external view returns (uint256); - function getNewestDrawId() external view returns (uint32); + /** + * @notice Read PrizeTierHistory struct from history array. + * @param drawId Draw ID + * @return prizeTier + */ + function getPrizeTier(uint32 drawId) external view returns (PrizeTier memory prizeTier); /** * @notice Read PrizeTierHistory List from history array. @@ -76,18 +80,21 @@ interface IPrizeTierHistory { returns (PrizeTier[] memory prizeTierList); /** - * @notice Pop the latest prize tier stored in the `prizeTiers` array and replace it with the new prize tier. - * @dev Callable only by the owner. - * @param newPrizeTier Updated PrizeTier struct - * @return drawId Draw ID of the PrizeTier that was pushed + * @notice Get prize tier at the specified `index`. + * @param index Index at which to get the prize tier + * @return PrizeTier at `index` */ - function popAndPush(PrizeTier calldata newPrizeTier) external returns (uint32 drawId); - function getPrizeTierAtIndex(uint256 index) external view returns (PrizeTier memory); /** - * @notice Returns the number of Prize Tier structs pushed - * @return The number of prize tiers that have been pushed + * @notice Read first Draw ID used to initialize history. + * @return Draw ID of first PrizeTier record */ - function count() external view returns (uint256); + function getOldestDrawId() external view returns (uint32); + + /** + * @notice Read last Draw ID stored in the history. + * @return Draw ID of the last recorded PrizeTier record + */ + function getNewestDrawId() external view returns (uint32); } diff --git a/contracts/interfaces/IPrizeTierHistoryV2.sol b/contracts/interfaces/IPrizeTierHistoryV2.sol index 5ba2ebc..326a4d8 100644 --- a/contracts/interfaces/IPrizeTierHistoryV2.sol +++ b/contracts/interfaces/IPrizeTierHistoryV2.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; + import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; /** @@ -10,7 +11,7 @@ import "@pooltogether/v4-core/contracts/DrawBeacon.sol"; interface IPrizeTierHistoryV2 { /** * @notice PrizeTierV2 struct - * @dev Adds the DPR and minPickCost paramater to the PrizeTierStructV1 + * @dev Adds Draw Percentage Rate (DPR) and minPickCost paramater to PrizeTier struct */ struct PrizeTierV2 { uint8 bitRangeSize; @@ -18,26 +19,88 @@ interface IPrizeTierHistoryV2 { uint32 maxPicksPerUser; uint32 expiryDuration; uint32 endTimestampOffset; - uint256 prize; - uint32[16] tiers; uint32 dpr; uint256 minPickCost; + uint256 prize; + uint32[16] tiers; } /** - * @notice Read PrizeTierV2 struct using Draw ID as the input - * @param drawId uint32 - Draw ID - * @return prizeTier PrizeTierV2 - Parameters to calculate PrizeDistrubtion + * @notice Emit when new PrizeTierV2 is added to history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierPushed(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /** + * @notice Emitted when existing PrizeTierV2 is updated in history + * @param drawId Draw ID + * @param prizeTier PrizeTierV2 parameters + */ + event PrizeTierSet(uint32 indexed drawId, PrizeTierV2 prizeTier); + + /** + * @notice Push PrizeTierV2 struct onto `prizeTiers` array. + * @dev Callable only by the owner or manager. + * @dev `drawId` must be greater than the latest one stored in `history`. + * @param nextPrizeTier Next PrizeTierV2 struct + */ + function push(PrizeTierV2 calldata nextPrizeTier) external; + + /** + * @notice Replace PrizeTierV2 struct in `prizeTiers` array. + * @dev Callable only by the owner. + * @param newPrizeTier PrizeTierV2 parameters + */ + function replace(PrizeTierV2 calldata newPrizeTier) external; + + /** + * @notice Pop the latest prize tier stored in the `prizeTiers` array and replace it with the new prize tier. + * @dev Callable only by the owner. + * @param newPrizeTier Updated PrizeTierV2 struct + * @return drawId Draw ID of the PrizeTierV2 that was pushed + */ + function popAndPush(PrizeTierV2 calldata newPrizeTier) external returns (uint32 drawId); + + /** + * @notice Returns the number of Prize Tier structs pushed + * @return The number of prize tiers that have been pushed + */ + function count() external view returns (uint256); + + /** + * @notice Read PrizeTierHistory struct from history array. + * @param drawId Draw ID + * @return prizeTier */ function getPrizeTier(uint32 drawId) external view returns (PrizeTierV2 memory prizeTier); /** * @notice Read PrizeTierV2 struct using Draw ID as the input - * @param drawIds uint32[] - Draw ID + * @param drawIds Draw ID * @return prizeTierList PrizeTierV2[] - Parameters to calculate PrizeDistrubtion */ - function getPrizeTiers(uint32[] calldata drawIds) + function getPrizeTierList(uint32[] calldata drawIds) external view returns (PrizeTierV2[] memory prizeTierList); + + /** + * @notice Get prize tier at the specified `index`. + * @param index Index at which to get the prize tier + * @return PrizeTier at `index` + */ + function getPrizeTierAtIndex(uint256 index) external view returns (PrizeTierV2 memory); + + /** + * @notice Read first Draw ID used to initialize history + * @return Draw ID of first PrizeTierV2 record + */ + function getOldestDrawId() external view returns (uint32); + + /** + * @notice Read last Draw ID stored in the history. + * @return Draw ID of the last recorded PrizeTier record + */ + function getNewestDrawId() external view returns (uint32); } diff --git a/contracts/libraries/DrawCalculationLib.sol b/contracts/libraries/DrawCalculationLib.sol index 18675de..37f858b 100644 --- a/contracts/libraries/DrawCalculationLib.sol +++ b/contracts/libraries/DrawCalculationLib.sol @@ -40,7 +40,6 @@ library DrawCalculationLib { cardinality++; } - // number of picks = total picks * odds numberOfPicks = uint104((_totalPicks * _odds) / RATE_NORMALIZATION); } From 2e0f953d226e373f46b55ada7bfd8b851022e40c Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Mon, 24 Oct 2022 15:31:11 -0500 Subject: [PATCH 24/30] chore(package): bump packages and add typechain --- hardhat.config.ts | 6 + package.json | 65 +- tsconfig.json | 3 +- yarn.lock | 3282 +++++++++++++++++++++++++-------------------- 4 files changed, 1879 insertions(+), 1477 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 66126f5..584b108 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,5 +1,7 @@ +import '@nomiclabs/hardhat-ethers' import '@nomiclabs/hardhat-etherscan'; import '@nomiclabs/hardhat-waffle'; +import '@typechain/hardhat'; import 'hardhat-abi-exporter'; import 'hardhat-deploy'; import 'hardhat-deploy-ethers'; @@ -92,6 +94,10 @@ const config: HardhatUserConfig | any = { }, ], }, + typechain: { + outDir: './types', + target: 'ethers-v5', + }, }; forkTasks; diff --git a/package.json b/package.json index 7af2b21..332f349 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "license": "GPL-3.0", "scripts": { - "clean": "rm -rf cache/ artifacts/", + "clean": "rm -rf cache/ artifacts/ types/", "compile": "mkdir -p abis && hardhat --show-stack-traces --max-memory 8192 compile", "coverage": "HIDE_DEPLOY_LOG=true OPTIMIZER_DISABLED=true hardhat coverage", "coverage:file": "HIDE_DEPLOY_LOG=true OPTIMIZER_DISABLED=true hardhat coverage --testfiles", @@ -27,50 +27,53 @@ "prepack": "yarn compile" }, "peerDependencies": { - "@openzeppelin/contracts": "4.4.2", + "@openzeppelin/contracts": "4.7.3", "@pooltogether/v4-core": "1.3.0-beta.1" }, "devDependencies": { - "@nomiclabs/hardhat-ethers": "2.0.2", - "@nomiclabs/hardhat-etherscan": "2.1.3", - "@nomiclabs/hardhat-waffle": "2.0.1", - "@openzeppelin/contracts": "4.4.2", - "@openzeppelin/hardhat-upgrades": "1.6.0", + "@nomiclabs/hardhat-ethers": "2.2.0", + "@nomiclabs/hardhat-etherscan": "3.1.1", + "@nomiclabs/hardhat-waffle": "2.0.3", + "@openzeppelin/contracts": "4.7.3", "@pooltogether/aave-yield-source": "1.2.1", "@pooltogether/v4-core": "1.3.0-beta.1", "@studydefi/money-legos": "2.4.2", - "@types/chai": "4.2.15", - "@types/debug": "4.1.5", - "@types/mocha": "8.2.1", - "@types/node": "14.14.32", - "chai": "4.3.4", + "@typechain/ethers-v5": "10.1.0", + "@typechain/hardhat": "6.1.3", + "@types/chai": "4.3.3", + "@types/debug": "4.1.7", + "@types/mocha": "10.0.0", + "@types/node": "18.11.4", + "chai": "4.3.6", "chalk": "4.1.2", - "debug": "4.3.1", - "ethereum-waffle": "3.4.0", - "ethers": "5.4.7", - "hardhat": "2.6.4", - "hardhat-abi-exporter": "2.1.2", - "hardhat-dependency-compiler": "1.1.1", - "hardhat-deploy": "0.7.0-beta.47", - "hardhat-deploy-ethers": "0.3.0-beta.10", - "hardhat-gas-reporter": "1.0.4", + "debug": "4.3.4", + "ethereum-waffle": "3.4.4", + "ethers": "5.7.2", + "hardhat": "2.12.0", + "hardhat-abi-exporter": "2.10.1", + "hardhat-dependency-compiler": "1.1.3", + "hardhat-deploy": "0.11.18", + "hardhat-deploy-ethers": "0.3.0-beta.13", + "hardhat-gas-reporter": "1.0.9", "hardhat-log-remover": "2.0.2", "npm-run-all": "4.1.5", - "prettier": "2.4.1", - "prettier-plugin-solidity": "1.0.0-beta.18", - "solc": "0.8.6", - "solhint": "3.3.3", - "solidity-coverage": "0.7.17", - "solidity-docgen": "0.5.16", + "prettier": "2.7.1", + "prettier-plugin-solidity": "1.0.0-beta.24", + "solc": "0.8.17", + "solhint": "3.3.7", + "solidity-coverage": "0.8.2", + "solidity-docgen": "0.5.17", "ts-generator": "0.1.1", - "ts-node": "9.1.1", - "typescript": "4.4.3", - "wait-on": "6.0.0" + "ts-node": "10.9.1", + "typechain": "8.1.0", + "typescript": "4.8.4", + "wait-on": "6.0.1" }, "files": [ "LICENSE", "abis/**", "artifacts/**", - "contracts/**" + "contracts/**", + "types/**" ] } diff --git a/tsconfig.json b/tsconfig.json index f2c625f..9a82062 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,5 +17,6 @@ "./test", "types/**/*", "Constants.ts" - ] + ], + "files": ["./hardhat.config.ts"] } diff --git a/yarn.lock b/yarn.lock index 60a56f5..bb86d4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,13 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@ensdomains/ens@^0.4.4": version "0.4.5" resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" @@ -39,18 +46,18 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@ethereum-waffle/chai@^3.4.0": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.1.tgz#500b59db766a490cb19a7f74ac75a1c3cf86049b" - integrity sha512-8mjgjWCe8XSCWuyJgVtJY8sm00VTczGBTDxBejgEBWN/J9x7QD8jdmWW8bfxdnqZbxiDCTvRFL58Wmd254BEqQ== +"@ethereum-waffle/chai@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" + integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== dependencies: - "@ethereum-waffle/provider" "^3.4.0" - ethers "^5.4.7" + "@ethereum-waffle/provider" "^3.4.4" + ethers "^5.5.2" -"@ethereum-waffle/compiler@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.0.tgz#68917321212563544913de33e408327745cb1284" - integrity sha512-a2wxGOoB9F1QFRE+Om7Cz2wn+pxM/o7a0a6cbwhaS2lECJgFzeN9xEkVrKahRkF4gEfXGcuORg4msP0Asxezlw== +"@ethereum-waffle/compiler@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" + integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" @@ -64,103 +71,34 @@ ts-generator "^0.1.1" typechain "^3.0.0" -"@ethereum-waffle/ens@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.3.0.tgz#d54f4c8e6b7bcafdc13ab294433f45416b2b2791" - integrity sha512-zVIH/5cQnIEgJPg1aV8+ehYicpcfuAisfrtzYh1pN3UbfeqPylFBeBaIZ7xj/xYzlJjkrek/h9VfULl6EX9Aqw== +"@ethereum-waffle/ens@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" + integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== dependencies: "@ensdomains/ens" "^0.4.4" "@ensdomains/resolver" "^0.2.4" - ethers "^5.0.1" + ethers "^5.5.2" -"@ethereum-waffle/mock-contract@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.3.0.tgz#7b331f1c95c5d46ee9478f7a6be2869f707d307a" - integrity sha512-apwq0d+2nQxaNwsyLkE+BNMBhZ1MKGV28BtI9WjD3QD2Ztdt1q9II4sKA4VrLTUneYSmkYbJZJxw89f+OpJGyw== +"@ethereum-waffle/mock-contract@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz#fc6ffa18813546f4950a69f5892d4dd54b2c685a" + integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== dependencies: - "@ethersproject/abi" "^5.0.1" - ethers "^5.0.1" + "@ethersproject/abi" "^5.5.0" + ethers "^5.5.2" -"@ethereum-waffle/provider@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.0.tgz#a36a0890d4fbc230e807870c8d3b683594efef00" - integrity sha512-QgseGzpwlzmaHXhqfdzthCGu5a6P1SBF955jQHf/rBkK1Y7gGo2ukt3rXgxgfg/O5eHqRU+r8xw5MzVyVaBscQ== +"@ethereum-waffle/provider@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" + integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== dependencies: - "@ethereum-waffle/ens" "^3.3.0" - ethers "^5.0.1" + "@ethereum-waffle/ens" "^3.4.4" + ethers "^5.5.2" ganache-core "^2.13.2" patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.4.0", "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.0.tgz#5cf89ea748607597a3f8b038abc986e4ac0b05db" - integrity sha512-dqLo1LtsLG+Oelu5S5tWUDG0pah3QUwV5TJZy2cm19BXDr4ka/S9XBSgao0i09gTcuPlovlHgcs6d7EZ37urjQ== - dependencies: - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - ethereumjs-util "^7.1.3" - merkle-patricia-tree "^4.2.2" - -"@ethereumjs/blockchain@^5.4.0", "@ethereumjs/blockchain@^5.5.0": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.1.tgz#60f1f50592c06cc47e1704800b88b7d32f609742" - integrity sha512-JS2jeKxl3tlaa5oXrZ8mGoVBCz6YqsGG350XVNtHAtNZXKk7pU3rH4xzF2ru42fksMMqzFLzKh9l4EQzmNWDqA== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/ethash" "^1.1.0" - debug "^2.2.0" - ethereumjs-util "^7.1.3" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" - integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.0", "@ethereumjs/tx@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" - integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== - dependencies: - "@ethereumjs/common" "^2.6.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/vm@^5.5.2": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" - integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^2.2.0" - ethereumjs-util "^7.1.3" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.2" - rustbn.js "~0.2.0" - "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" @@ -176,37 +114,7 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" - integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.2", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": +"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== @@ -221,20 +129,22 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/abstract-provider@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.4.0", "@ethersproject/abstract-provider@^5.5.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== @@ -247,18 +157,20 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/web" "^5.5.0" -"@ethersproject/abstract-signer@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.0.2", "@ethersproject/abstract-signer@^5.4.0", "@ethersproject/abstract-signer@^5.5.0": +"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== @@ -269,18 +181,18 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/address@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0": +"@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== @@ -291,29 +203,32 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" -"@ethersproject/base64@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: - "@ethersproject/bytes" "^5.4.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.4.0", "@ethersproject/base64@^5.5.0": +"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== dependencies: "@ethersproject/bytes" "^5.5.0" -"@ethersproject/basex@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" - integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/properties" "^5.4.0" + "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.4.0", "@ethersproject/basex@^5.5.0": +"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== @@ -321,16 +236,15 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/bignumber@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" - integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.5", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.0", "@ethersproject/bignumber@^5.5.0": +"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== @@ -339,51 +253,44 @@ "@ethersproject/logger" "^5.5.0" bn.js "^4.11.9" -"@ethersproject/bytes@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" -"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.2", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0": +"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/constants@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: - "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0": +"@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== dependencies: "@ethersproject/bignumber" "^5.5.0" -"@ethersproject/contracts@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" - integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/contracts@5.5.0", "@ethersproject/contracts@^5.0.2": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== @@ -399,21 +306,23 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/transactions" "^5.5.0" -"@ethersproject/hash@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/hash@5.5.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.4.0", "@ethersproject/hash@^5.5.0": +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.5.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== @@ -427,25 +336,22 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/hdnode@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" - integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.4.0", "@ethersproject/hdnode@^5.5.0": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== @@ -463,26 +369,25 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/json-wallets@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" - integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.4.0", "@ethersproject/json-wallets@^5.5.0": +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== @@ -501,15 +406,26 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" -"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.4.0", "@ethersproject/keccak256@^5.5.0": +"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== @@ -517,39 +433,39 @@ "@ethersproject/bytes" "^5.5.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" - integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" -"@ethersproject/logger@5.5.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.4.0", "@ethersproject/logger@^5.5.0": +"@ethersproject/logger@5.5.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== -"@ethersproject/networks@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.0" +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.5.1", "@ethersproject/networks@^5.4.0", "@ethersproject/networks@^5.5.0": +"@ethersproject/networks@5.5.1", "@ethersproject/networks@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.1.tgz#b7f7b9fb88dec1ea48f739b7fb9621311aa8ce6c" integrity sha512-tYRDM4zZtSUcKnD4UMuAlj7SeXH/k5WC4SP2u1Pn57++JdXHkRu2zwNkgNogZoxHzhm9Q6qqurDBVptHOsW49Q== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/pbkdf2@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" - integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.4.0", "@ethersproject/pbkdf2@^5.5.0": +"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== @@ -557,46 +473,29 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/sha2" "^5.5.0" -"@ethersproject/properties@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" - integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.5.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.4.0", "@ethersproject/properties@^5.5.0": +"@ethersproject/properties@5.5.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/providers@5.4.5": - version "5.4.5" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.5.tgz#eb2ea2a743a8115f79604a8157233a3a2c832928" - integrity sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.5.1", "@ethersproject/providers@^5.0.5": +"@ethersproject/providers@5.5.1": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.1.tgz#ba87e3c93219bbd2e2edf8b369873aee774abf04" integrity sha512-2zdD5sltACDWhjUE12Kucg2PcgM6V2q9JMyVvObtVGnzJu+QSmibbP+BHQyLWZUBfLApx2942+7DC5D+n4wBQQ== @@ -621,15 +520,33 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" - integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" -"@ethersproject/random@5.5.0", "@ethersproject/random@^5.4.0", "@ethersproject/random@^5.5.0": +"@ethersproject/random@5.5.0", "@ethersproject/random@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9" integrity sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ== @@ -637,15 +554,15 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/rlp@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.4.0", "@ethersproject/rlp@^5.5.0": +"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== @@ -653,16 +570,15 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/sha2@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" - integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - hash.js "1.1.7" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.4.0", "@ethersproject/sha2@^5.5.0": +"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== @@ -671,19 +587,16 @@ "@ethersproject/logger" "^5.5.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" - elliptic "6.5.4" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.4.0", "@ethersproject/signing-key@^5.5.0": +"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== @@ -695,18 +608,19 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" - integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" -"@ethersproject/solidity@5.5.0", "@ethersproject/solidity@^5.0.2": +"@ethersproject/solidity@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== @@ -718,16 +632,19 @@ "@ethersproject/sha2" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/strings@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.5.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.4.0", "@ethersproject/strings@^5.5.0": +"@ethersproject/strings@5.5.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== @@ -736,22 +653,16 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/transactions@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.2", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.5.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== @@ -766,14 +677,20 @@ "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" -"@ethersproject/units@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" - integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" "@ethersproject/units@5.5.0": version "5.5.0" @@ -784,28 +701,16 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/wallet@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" - integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/json-wallets" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/wallet@5.5.0", "@ethersproject/wallet@^5.0.2": +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== @@ -826,18 +731,28 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/web@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/web@5.5.1", "@ethersproject/web@^5.4.0", "@ethersproject/web@^5.5.0": +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.5.1", "@ethersproject/web@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" integrity sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg== @@ -848,18 +763,18 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/wordlists@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" - integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.4.0", "@ethersproject/wordlists@^5.5.0": +"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== @@ -870,6 +785,17 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@hapi/hoek@^9.0.0": version "9.2.1" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" @@ -882,6 +808,50 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/hashes@~1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" + integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -903,33 +873,234 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomiclabs/hardhat-ethers@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" - integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== +"@nomicfoundation/ethereumjs-block@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" + integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" -"@nomiclabs/hardhat-etherscan@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.3.tgz#ba52e5cb526f6c477e5e97e07c72a42232773c92" - integrity sha512-0Ic5dLBWASeX3e8tR5cdfoSQw8fTp2Bw49RGUN1pSJuxKIQAOWq5MI9qC1Bd51xK/AsdRSnHDxoVYK1+FC1s1w== +"@nomicfoundation/ethereumjs-blockchain@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" + integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-ethash" "^2.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" + integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== + dependencies: + "@nomicfoundation/ethereumjs-util" "^8.0.0" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" + integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" + integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" + integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== + +"@nomicfoundation/ethereumjs-statemanager@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" + integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + +"@nomicfoundation/ethereumjs-trie@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" + integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" + integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" + integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" + integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" + integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" + integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" + integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" + integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" + integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" + integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" + +"@nomiclabs/hardhat-ethers@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.0.tgz#f55ace2752d0effcf583e754960e9fa89fbe12cd" + integrity sha512-kKCW7xawuD/lw69Yr1yqUUrF0IKmnLNGf+pTVbJ/ctHaRcPrwKI0EPkO1RNXBHlOOZkv6v4DK2PPvq0lL2ykig== + +"@nomiclabs/hardhat-etherscan@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.1.tgz#471590f25c8c12cd84ae80a4f4c92551eb249667" + integrity sha512-a6+fJlHTiPjzUYnvwkcduJN0rAKWagQsQNoHJP/9mJ1CZjIkGysGtvVAjNpnrYWocj/Hbi36XmZ0H2aIKlol7A== dependencies: - "@ethersproject/abi" "^5.0.2" + "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" cbor "^5.0.2" + chalk "^2.4.2" debug "^4.1.1" fs-extra "^7.0.1" - node-fetch "^2.6.0" + lodash "^4.17.11" semver "^6.3.0" + table "^6.8.0" + undici "^5.4.0" -"@nomiclabs/hardhat-waffle@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2" - integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ== +"@nomiclabs/hardhat-waffle@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" + integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== dependencies: "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@oclif/command@^1.8.0", "@oclif/command@^1.8.15": +"@oclif/command@^1.8.0": version "1.8.16" resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.16.tgz#bea46f81b2061b47e1cda318a0b923e62ca4cc0c" integrity sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w== @@ -953,6 +1124,40 @@ is-wsl "^2.1.1" tslib "^2.0.0" +"@oclif/core@^1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.19.1.tgz#6dba92cfb7f1412e43068db3e9716215786f85a3" + integrity sha512-+LtMYQNzfLoYUcBTsWSFQ/4mqiA70XRU6tP+lDNmQQTrB5FHzDoBbyYvdjvMeS42izg78gjlN++rLUaAUCloNw== + dependencies: + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^3.0.2" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.10.0" + debug "^4.3.4" + ejs "^3.1.6" + fs-extra "^9.1.0" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + semver "^7.3.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + tslib "^2.3.1" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + "@oclif/errors@1.3.5", "@oclif/errors@^1.2.2", "@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c" @@ -994,22 +1199,17 @@ chalk "^4.1.0" tslib "^2.0.0" -"@oclif/plugin-help@^3.2.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-3.3.1.tgz#36adb4e0173f741df409bb4b69036d24a53bfb24" - integrity sha512-QuSiseNRJygaqAdABYFWn/H1CwIZCp9zp/PLid6yXvy6VcQV7OenEFF5XuYaCvSARe2Tg9r8Jqls5+fw1A9CbQ== +"@oclif/plugin-help@^5.0.0": + version "5.1.16" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-5.1.16.tgz#b55376e50007ba6b73819b11d02232288203fb70" + integrity sha512-30uy/bRUzptI4mFf6re1imTBxJJB2r9pQyZ7sbr8zn0oymLZX4dMArlMDi/LwpPqEtIN3fivXgDkjcoKO8ezGQ== dependencies: - "@oclif/command" "^1.8.15" - "@oclif/config" "1.18.2" - "@oclif/errors" "1.3.5" - "@oclif/help" "^1.0.1" - chalk "^4.1.2" - indent-string "^4.0.0" - lodash "^4.17.21" - string-width "^4.2.0" - strip-ansi "^6.0.0" - widest-line "^3.1.0" - wrap-ansi "^6.2.0" + "@oclif/core" "^1.19.1" + +"@oclif/screen@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-3.0.2.tgz#969054308fe98d130c02844a45cc792199b75670" + integrity sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ== "@openzeppelin/contracts@4.3.1": version "4.3.1" @@ -1021,37 +1221,16 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.2.tgz#ff80affd6d352dbe1bbc5b4e1833c41afd6283b6" integrity sha512-AybF1cesONZStg5kWf6ao9OlqTZuPqddvprc0ky7lrUVOjXeKpmQ2Y9FK+6ygxasb+4aic4O5pneFBfwVsRRRg== -"@openzeppelin/contracts@4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.4.2.tgz#4e889c9c66e736f7de189a53f8ba5b8d789425c2" - integrity sha512-NyJV7sJgoGYqbtNUWgzzOGW4T6rR19FmX1IJgXGdapGPWsuMelGJn9h03nos0iqfforCbCB0iYIR0MtIuIFLLw== +"@openzeppelin/contracts@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== "@openzeppelin/contracts@^2.5.0": version "2.5.1" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-2.5.1.tgz#c76e3fc57aa224da3718ec351812a4251289db31" integrity sha512-qIy6tLx8rtybEsIOAlrM4J/85s2q2nPkDqj/Rx46VakBZ0LwtFhXIVub96LXHczQX0vaqmAueDqNPXtbSXSaYQ== -"@openzeppelin/hardhat-upgrades@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.6.0.tgz#735e1c70aea859e284937995e238fcfdea7b69d7" - integrity sha512-4oRB5lH3d5RAUIWKX5wuJvgo06IOgndUoPKYUuLTKW2BmyrMTPc6GZycKf7UCxU0GYeUC9BjsohUAIjqJwMnww== - dependencies: - "@openzeppelin/upgrades-core" "^1.5.0" - -"@openzeppelin/upgrades-core@^1.5.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.10.0.tgz#d3aa72b7a23827e0e6daff08ddfb8dcd75171abb" - integrity sha512-N20t1i1wlHrVmu3etVZLiaRxT6XLkCrO9gIo4mUZNpsaVftl8V+WBu8o940AjoYXvzTEqj7O0re2DSFzjpkRBw== - dependencies: - bn.js "^5.1.2" - cbor "^8.0.0" - chalk "^4.1.0" - compare-versions "^3.6.0" - debug "^4.1.1" - ethereumjs-util "^7.0.3" - proper-lockfile "^4.1.1" - solidity-ast "^0.4.15" - "@pooltogether/aave-yield-source@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@pooltogether/aave-yield-source/-/aave-yield-source-1.2.1.tgz#4531aed29f510c7ec930267b2751cd976df5c6bb" @@ -1131,6 +1310,28 @@ path-browserify "^1.0.0" url "^0.11.0" +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -1235,23 +1436,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@solidity-parser/parser@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" - integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== - -"@solidity-parser/parser@^0.12.0": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.12.2.tgz#1afad367cb29a2ed8cdd4a3a62701c2821fb578f" - integrity sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q== - -"@solidity-parser/parser@^0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.13.2.tgz#b6c71d8ca0b382d90a7bbed241f9bc110af65cbe" - integrity sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw== - dependencies: - antlr4ts "^0.5.0-alpha.4" - "@solidity-parser/parser@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.0.tgz#d51f074efb0acce0e953ec48133561ed710cebc0" @@ -1259,6 +1443,13 @@ dependencies: antlr4ts "^0.5.0-alpha.4" +"@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" + integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== + dependencies: + antlr4ts "^0.5.0-alpha.4" + "@studydefi/money-legos@2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@studydefi/money-legos/-/money-legos-2.4.2.tgz#90b97670d2dbcf2f71b5be951fd52aa2faa5317e" @@ -1273,28 +1464,33 @@ dependencies: defer-to-connect "^1.0.1" -"@truffle/error@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" - integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== -"@truffle/interface-adapter@^0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz#76cfd34374d85849e1164de1a3d5a3dce0dc5d01" - integrity sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.5.3" +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@truffle/provider@^0.2.24": - version "0.2.42" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.42.tgz#9da6a144b3c9188cdb587451dd7bd907b4c7164b" - integrity sha512-ZNoglPho4alYIjJR+sLTgX0x6ho7m4OAUWuJ50RAWmoEqYc4AM6htdrI+lTSoRrOHHbmgasv22a7rFPMnmDrTg== +"@typechain/ethers-v5@10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.0.tgz#068d7dc7014502354696dab59590a7841091e951" + integrity sha512-3LIb+eUpV3mNCrjUKT5oqp8PBsZYSnVrkfk6pY/ZM0boRs2mKxjFZ7bktx42vfDye8PPz3NxtW4DL5NsNsFqlg== dependencies: - "@truffle/error" "^0.0.14" - "@truffle/interface-adapter" "^0.5.8" - web3 "1.5.3" + lodash "^4.17.15" + ts-essentials "^7.0.1" "@typechain/ethers-v5@^2.0.0": version "2.0.0" @@ -1303,10 +1499,17 @@ dependencies: ethers "^5.0.2" -"@types/abstract-leveldown@*": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" - integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ== +"@typechain/hardhat@6.1.3": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.3.tgz#e6121502eb64903ab562d89e094a5506e7b86822" + integrity sha512-e1H9MVl286ma0HuD9CBL248+pbdA7lWF6+I7FYwzykIrjilKhvLUv0Q7LtcyZztzgbP2g4Tyg1UPE+xy+qR7cA== + dependencies: + fs-extra "^9.1.0" + +"@types/async-eventemitter@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" @@ -1327,10 +1530,10 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== -"@types/chai@4.2.15": - version "4.2.15" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" - integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== +"@types/chai@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" + integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1339,10 +1542,12 @@ dependencies: "@types/node" "*" -"@types/debug@4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/debug@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" "@types/form-data@0.0.33": version "0.0.33" @@ -1359,20 +1564,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -1390,10 +1581,15 @@ dependencies: "@types/node" "*" -"@types/mocha@8.2.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.1.tgz#f3f3ae4590c5386fc7c543aae9b78d4cf30ffee9" - integrity sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ== +"@types/mocha@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.0.tgz#3d9018c575f0e3f7386c1de80ee66cc21fbb7a52" + integrity sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node-fetch@^2.5.5": version "2.5.12" @@ -1408,10 +1604,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.1.tgz#88d501e84b6185f6489ecee4ba9e8fcec7f29bb2" integrity sha512-NXKvBVUzIbs6ylBwmOwHFkZS2EXCcjnqr8ZCRNaXBkHAf+3mn/rPcJxwrzuc6movh8fxQAsUUfYklJ/EG+hZqQ== -"@types/node@14.14.32": - version "14.14.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.32.tgz#90c5c4a8d72bbbfe53033f122341343249183448" - integrity sha512-/Ctrftx/zp4m8JOujM5ZhwzlWLx22nbQJiVqz8/zE15gOeEW+uly3FSX4fGFpcfEvFzXcMCJwq9lGVWgyARXhg== +"@types/node@18.11.4": + version "18.11.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.4.tgz#7017a52e18dfaad32f55eebd539993014441949c" + integrity sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A== "@types/node@^10.0.3": version "10.17.60" @@ -1440,7 +1636,7 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== -"@types/qs@^6.2.31", "@types/qs@^6.9.4": +"@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== @@ -1509,6 +1705,19 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + abstract-leveldown@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" @@ -1530,17 +1739,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1548,17 +1746,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -1572,11 +1759,21 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== +acorn@^8.4.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -1604,6 +1801,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.2, ajv@^6.12.3, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1614,6 +1819,16 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.6.1, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -1624,17 +1839,22 @@ ansi-colors@3.2.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-colors@^4.1.1: +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.2.0: +ansi-colors@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1673,13 +1893,18 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + antlr4@4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" @@ -1710,6 +1935,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1739,6 +1969,16 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1749,6 +1989,11 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1801,6 +2046,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" @@ -1832,6 +2082,11 @@ async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: dependencies: lodash "^4.17.14" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1847,11 +2102,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1869,6 +2119,13 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -2437,6 +2694,18 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.1.7" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" + integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + bignumber.js@^9.0.0, bignumber.js@^9.0.1: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" @@ -2447,13 +2716,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bip39@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" @@ -2465,13 +2727,6 @@ bip39@2.5.0: safe-buffer "^5.0.1" unorm "^1.3.3" -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - blakejs@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" @@ -2492,11 +2747,16 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.19.1, body-parser@^1.16.0: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" @@ -2521,6 +2781,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2549,12 +2816,22 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -2662,6 +2939,14 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" @@ -2669,6 +2954,13 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" @@ -2767,16 +3059,34 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30000844: version "1.0.30001291" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz#08a8d2cfea0b2cf2e1d94dd795942d0daef6108c" integrity sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + cbor@^5.0.2: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -2785,26 +3095,20 @@ cbor@^5.0.2: bignumber.js "^9.0.1" nofilter "^1.0.4" -cbor@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== - dependencies: - nofilter "^3.1.0" - -chai@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== +chai@4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" + loupe "^2.3.1" pathval "^1.1.1" type-detect "^4.0.5" -chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@4.1.2, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2869,6 +3173,21 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +chokidar@3.5.3, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chokidar@^3.4.0: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" @@ -2928,7 +3247,23 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^3.0.0: +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@^3.0.0, clean-stack@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== @@ -2942,6 +3277,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-progress@^3.10.0: + version "3.11.2" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.11.2.tgz#f8c89bd157e74f3f2c43bcfb3505670b4d48fc77" + integrity sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA== + dependencies: + string-width "^4.2.3" + cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -2975,6 +3317,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -3024,7 +3375,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@^1.1.2: +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -3050,6 +3401,26 @@ command-line-args@^4.0.7: find-replace "^1.0.3" typical "^2.6.1" +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@2.18.0: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" @@ -3060,10 +3431,10 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== component-emitter@^1.2.1: version "1.3.0" @@ -3223,7 +3594,7 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "2.6.1" whatwg-fetch "2.0.4" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3297,10 +3668,10 @@ debug@4, debug@^4.0.1, debug@^4.1.1: dependencies: ms "2.1.2" -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4.3.4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -3316,6 +3687,11 @@ decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -3347,6 +3723,11 @@ deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3372,14 +3753,6 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3419,6 +3792,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delete-empty@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/delete-empty/-/delete-empty-3.0.0.tgz#f8040f2669f26fa7060bc2304e9859c593b685e8" + integrity sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ== + dependencies: + ansi-colors "^4.1.0" + minimist "^1.2.0" + path-starts-with "^2.0.0" + rimraf "^2.6.2" + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3462,6 +3845,11 @@ diff@3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -3476,6 +3864,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3502,15 +3897,6 @@ dotignore@~0.1.2: dependencies: minimatch "^3.0.4" -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -3529,6 +3915,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.3.47: version "1.4.24" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.24.tgz#9cf8a92d5729c480ee47ff0aa5555f57467ae2fa" @@ -3547,6 +3940,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.1.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f" + integrity sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -3557,11 +3955,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encode-utf8@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" @@ -3583,16 +3976,6 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3607,7 +3990,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.0: +enquirer@^2.3.0, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3633,7 +4016,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5, es-abstract@^1.19.1: +es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== @@ -3694,6 +4077,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3797,7 +4185,7 @@ esprima@2.7.x, esprima@^2.7.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3862,16 +4250,16 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-gas-reporter@^0.2.20: - version "0.2.23" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.23.tgz#7a2a412b41285298cdad810cf54adac11d406208" - integrity sha512-T8KsVakDEupvQxW3MfFfHDfJ7y8zl2+XhyEQk4hZ3qQsAh/FE27BfFHM9UhqNQvrJLz8zVWnPZWNcARwLT/lsA== +eth-gas-reporter@^0.2.25: + version "0.2.25" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" + integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" "@solidity-parser/parser" "^0.14.0" cli-table3 "^0.5.0" - colors "^1.1.2" - ethereumjs-util "6.2.0" + colors "1.4.0" + ethereum-cryptography "^1.0.3" ethers "^4.0.40" fs-readdir-recursive "^1.1.0" lodash "^4.17.14" @@ -3961,16 +4349,6 @@ eth-sig-util@^1.4.2: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" -eth-sig-util@^2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" - integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== - dependencies: - ethereumjs-abi "0.6.8" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.0" - eth-tx-summary@^3.1.2: version "3.2.4" resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" @@ -4014,7 +4392,7 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4035,15 +4413,25 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-waffle@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.0.tgz#990b3c6c26db9c2dd943bf26750a496f60c04720" - integrity sha512-ADBqZCkoSA5Isk486ntKJVjFEawIiC+3HxNqpJqONvh3YXBTNiRfXvJtGuAFLXPG91QaqkGqILEHANAo7j/olQ== - dependencies: - "@ethereum-waffle/chai" "^3.4.0" - "@ethereum-waffle/compiler" "^3.4.0" - "@ethereum-waffle/mock-contract" "^3.3.0" - "@ethereum-waffle/provider" "^3.4.0" +ethereum-cryptography@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" + +ethereum-waffle@3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" + integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== + dependencies: + "@ethereum-waffle/chai" "^3.4.4" + "@ethereum-waffle/compiler" "^3.4.4" + "@ethereum-waffle/mock-contract" "^3.4.4" + "@ethereum-waffle/provider" "^3.4.4" ethers "^5.0.1" ethereumjs-abi@0.6.5: @@ -4151,20 +4539,7 @@ ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@ ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" -ethereumjs-util@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" - integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^2.0.0" - rlp "^2.2.3" - secp256k1 "^3.0.1" - -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: +ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -4201,7 +4576,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.3: +ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0: version "7.1.3" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== @@ -4265,43 +4640,43 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@5.4.7: - version "5.4.7" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.7.tgz#0fd491a5da7c9793de2d6058d76b41b1e7efba8f" - integrity sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew== - dependencies: - "@ethersproject/abi" "5.4.1" - "@ethersproject/abstract-provider" "5.4.1" - "@ethersproject/abstract-signer" "5.4.1" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.2" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.1" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.1" - "@ethersproject/networks" "5.4.2" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.1" - "@ethersproject/providers" "5.4.5" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethers@^4.0.32, ethers@^4.0.40: +ethers@5.7.2, ethers@^5.5.2, ethers@^5.5.3: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -4316,7 +4691,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.1, ethers@^5.0.2, ethers@^5.4.7: +ethers@^5.0.1, ethers@^5.0.2: version "5.5.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.2.tgz#cd2e508c7342c44fa70392f722e8de8f2416489f" integrity sha512-EF5W+6Wwcu6BqVwpgmyR5U2+L4c1FQzlM/02dkZOugN3KF0cG9bzHZP+TDJglmPm2/IzCEJDT7KBxzayk7SAHw== @@ -4360,7 +4735,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.3: +ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -4391,19 +4766,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - exit-on-epipe@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" @@ -4546,6 +4908,17 @@ fast-glob@^3.0.3, fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4584,10 +4957,12 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" fill-range@^4.0.0: version "4.0.0" @@ -4627,6 +5002,13 @@ find-replace@^1.0.3: array-back "^1.0.4" test-value "^2.1.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -4634,6 +5016,14 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4680,6 +5070,11 @@ flat@^4.1.0: dependencies: is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" @@ -4702,6 +5097,11 @@ follow-redirects@^1.12.1, follow-redirects@^1.14.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== +follow-redirects@^1.14.7: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -4714,11 +5114,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4742,6 +5137,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4789,6 +5193,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -4816,7 +5229,7 @@ fs-extra@^8.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -4863,15 +5276,6 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -ganache-cli@^6.12.2: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" - integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== - dependencies: - ethereumjs-util "6.2.1" - source-map-support "0.5.12" - yargs "13.2.4" - ganache-core@^2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" @@ -4914,7 +5318,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -4933,6 +5337,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-port@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" @@ -4943,7 +5352,7 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -5004,18 +5413,19 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= +glob@7.1.7, glob@~7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: +glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5027,15 +5437,14 @@ glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5099,6 +5508,18 @@ globby@^11.0.0, globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -5136,7 +5557,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -5171,53 +5592,50 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-abi-exporter@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.1.2.tgz#7f0aa1fc91d546ca595ca35b743e36211a71f987" - integrity sha512-ovJr6zJ9uxHDZmqtRRfaaFA8KxVCNzfHroP44QOWZ+CAh06hSen3r4Qehw6u7Vl5xJmw7Pu7nz+7q5QvPWXTKA== +hardhat-abi-exporter@2.10.1: + version "2.10.1" + resolved "https://registry.yarnpkg.com/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz#b14884e233c73fe3f43360f014ad7fd6df4b6d25" + integrity sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ== + dependencies: + "@ethersproject/abi" "^5.5.0" + delete-empty "^3.0.0" -hardhat-dependency-compiler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.1.tgz#0bfe713d450a7fdad14a210b7a9b8a32e56cc744" - integrity sha512-2xubH8aPojhMGbILFlfL28twu6l/5Tyrj4Dpkogvycse6YegKW9GuGA3rnbPH0KP+Nv2xT626ZuR2Ys+w3ifPw== +hardhat-dependency-compiler@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.3.tgz#1e49e23f68878bd713f860c66648a711bc4a4a79" + integrity sha512-bCDqsOxGST6WkbMvj4lPchYWidNSSBm5CFnkyAex1T11cGmr9otZTGl81W6f9pmrtBXbKCvr3OSuNJ6Q394sAw== -hardhat-deploy-ethers@0.3.0-beta.10: - version "0.3.0-beta.10" - resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.10.tgz#bccfcf635d380bbab3638960f6739fe4d396fc5f" - integrity sha512-TeyriUshRZ7XVHOjMsDtTozIrdwLf3Bw+oZRYNhXdG/eut5HeDhjUFPfRlG7TI1lSLvkcB5dt7OxOtPYKDOxTg== +hardhat-deploy-ethers@0.3.0-beta.13: + version "0.3.0-beta.13" + resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" + integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== -hardhat-deploy@0.7.0-beta.47: - version "0.7.0-beta.47" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.0-beta.47.tgz#974afd2c070e95437842b05bb24ade84962b4057" - integrity sha512-7YknSJ2o+ZsYMUtgNg1CW4pj++2cwOpDi4omyCXyktY9Plgudo9vNJwGHxgYU6bLQ6uhCGqICP4WL23beZGsZw== +hardhat-deploy@0.11.18: + version "0.11.18" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.18.tgz#076b4f5e7dc78bc144c2807112fb4bc764a7a7d1" + integrity sha512-Zs5Gr23/HEcYPjQgcSJLlXkR2/WOp24O9Af+7qA540sCDvHjuQ7WhHG/fB2cjPel0Ajf0TzXx1uVViWtbKLqTg== dependencies: - "@ethersproject/abi" "^5.0.2" - "@ethersproject/abstract-signer" "^5.0.2" - "@ethersproject/address" "^5.0.2" - "@ethersproject/bignumber" "^5.0.5" - "@ethersproject/bytes" "^5.0.2" - "@ethersproject/contracts" "^5.0.2" - "@ethersproject/providers" "^5.0.5" - "@ethersproject/solidity" "^5.0.2" - "@ethersproject/transactions" "^5.0.2" - "@ethersproject/wallet" "^5.0.2" - "@types/qs" "^6.9.4" + "@types/qs" "^6.9.7" axios "^0.21.1" - chalk "^4.1.0" - chokidar "^3.4.0" - debug "^4.1.1" - form-data "^3.0.0" - fs-extra "^9.0.0" + chalk "^4.1.2" + chokidar "^3.5.2" + debug "^4.3.2" + enquirer "^2.3.6" + ethers "^5.5.3" + form-data "^4.0.0" + fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" + zksync-web3 "^0.8.1" -hardhat-gas-reporter@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz#59e3137e38e0dfeac2e4f90d5c74160b50ad4829" - integrity sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw== +hardhat-gas-reporter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: - eth-gas-reporter "^0.2.20" + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" sha1 "^1.1.1" hardhat-log-remover@2.0.2: @@ -5225,23 +5643,30 @@ hardhat-log-remover@2.0.2: resolved "https://registry.yarnpkg.com/hardhat-log-remover/-/hardhat-log-remover-2.0.2.tgz#6014fe2c515ced1e0eaa7a4d854e37695aaac61a" integrity sha512-TvEWOisQmZUZ7Mlb7s4XYS/MxgZzjFJSjDI8v3uTcrD6aaXy1QtomW6D6WNsISEWtwwRlSntOGpHQwFjrz2MCw== -hardhat@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.6.4.tgz#9ff3f139f697bfc4e14836a3fef3ca4c62357d65" - integrity sha512-6QNfu1FptjtyGJ+jBR7LMX7AMY9gWWw9kAUD7v0YZNZH1ZBgsZdMHqXKiSzO5pLQXo+fy9zZovKAUNYbjQ/1fw== +hardhat@2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.0.tgz#51e59f1ff4991bcb66d1a380ea807e6c15fcac34" + integrity sha512-mNJFbVG479HwOzxiaLxobyvED2M1aEAuPPYhEo1+88yicMDSTrU2JIS7vV+V0GSNQKaDoiHCmV6bcKjiljT/dQ== dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/blockchain" "^5.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - "@ethereumjs/vm" "^5.5.2" "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.11.0" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" adm-zip "^0.4.16" + aggregate-error "^3.0.0" ansi-escapes "^4.3.0" chalk "^2.4.2" chokidar "^3.4.0" @@ -5249,33 +5674,29 @@ hardhat@2.6.4: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - eth-sig-util "^2.5.2" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.0" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" - https-proxy-agent "^5.0.0" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.0" mnemonist "^0.38.0" - mocha "^7.1.2" - node-fetch "^2.6.0" + mocha "^10.0.0" + p-map "^4.0.0" qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - uuid "^3.3.2" + undici "^5.4.0" + uuid "^8.3.2" ws "^7.4.6" has-ansi@^2.0.0: @@ -5402,6 +5823,11 @@ heap@0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5479,6 +5905,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5500,7 +5931,7 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -5510,7 +5941,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1, ignore@^5.1.4: +ignore@^5.1.1, ignore@^5.1.4, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -5624,11 +6055,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -5695,7 +6121,7 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@~2.0.3: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -5824,13 +6250,6 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5877,6 +6296,11 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -5902,7 +6326,7 @@ is-shared-array-buffer@^1.0.1: resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -5921,22 +6345,16 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -5959,7 +6377,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6006,10 +6424,20 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -joi@^17.4.0: - version "17.5.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.5.0.tgz#7e66d0004b5045d971cf416a55fb61d33ac6e011" - integrity sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw== +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +joi@^17.6.0: + version "17.6.4" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.4.tgz#4d9536a059ef0762c718ae98673016b3ec151abd" + integrity sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -6045,7 +6473,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -6053,6 +6481,13 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -6107,6 +6542,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -6192,17 +6632,7 @@ keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" - integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== - dependencies: - bindings "^1.5.0" - inherits "^2.0.4" - nan "^2.14.0" - safe-buffer "^5.2.0" - -keccak@^3.0.0: +keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== @@ -6263,13 +6693,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -6282,11 +6705,6 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -6336,15 +6754,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -6353,22 +6762,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -6400,12 +6793,18 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@~1.0.0: +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - xtend "^4.0.2" + buffer "^6.0.3" + module-error "^1.0.1" level-ws@0.0.0: version "0.0.0" @@ -6424,14 +6823,13 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + browser-level "^1.0.1" + classic-level "^1.2.0" levelup@3.1.1, levelup@^3.0.0: version "3.1.1" @@ -6456,17 +6854,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -6512,11 +6899,28 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash@4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" @@ -6534,6 +6938,14 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -6551,6 +6963,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -6602,13 +7021,6 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -6650,15 +7062,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" @@ -6671,18 +7074,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -6695,6 +7086,15 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -6705,7 +7105,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -6737,19 +7137,6 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.0, merkle-patricia-tree@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.2.tgz#6dec17855370172458244c2f42c989dd60b773a3" - integrity sha512-eqZYNTshcYx9aESkSPr71EqwsR/QmpnObDEV4iLxkt/x/IoLYZYjJvKY72voP/27Vy61iMOrfOG6jrn7ttXD+Q== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.2" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - rlp "^2.2.4" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -6812,11 +7199,6 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -6846,6 +7228,20 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.0.0, minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -6881,7 +7277,7 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*: +mkdirp@*, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -6893,14 +7289,71 @@ mkdirp@0.5.5, mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: dependencies: minimist "^1.2.5" -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +mocha@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" + integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== dependencies: - obliterator "^2.0.0" - -mocha@^7.1.1, mocha@^7.1.2: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mocha@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== @@ -6935,6 +7388,11 @@ mock-fs@^4.1.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7009,16 +7467,16 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.14.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7036,11 +7494,21 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +natural-orderby@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" + integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7086,7 +7554,7 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.6" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== @@ -7111,11 +7579,6 @@ nofilter@^1.0.4: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== - nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -7158,13 +7621,6 @@ npm-run-all@4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -7225,6 +7681,11 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-treeify@^1.1.33: + version "1.1.33" + resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" + integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -7280,13 +7741,6 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -7340,15 +7794,6 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -7364,21 +7809,11 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -7393,6 +7828,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -7407,6 +7849,20 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -7477,6 +7933,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +password-prompt@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923" + integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + patch-package@6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" @@ -7531,6 +7995,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -7541,7 +8010,7 @@ path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -7551,6 +8020,11 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-starts-with@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-starts-with/-/path-starts-with-2.0.0.tgz#ffd6d51926cd497022b44d392196033d5451892f" + integrity sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7665,22 +8139,22 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier-plugin-solidity@1.0.0-beta.18: - version "1.0.0-beta.18" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.18.tgz#9705453bacd55b3242110d472f23f624ae6777fc" - integrity sha512-ezWdsG/jIeClmYBzg8V9Voy8jujt+VxWF8OS3Vld+C3c+3cPVib8D9l8ahTod7O5Df1anK9zo+WiiS5wb1mLmg== +prettier-plugin-solidity@1.0.0-beta.24: + version "1.0.0-beta.24" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz#67573ca87098c14f7ccff3639ddd8a4cab2a87eb" + integrity sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg== dependencies: - "@solidity-parser/parser" "^0.13.2" - emoji-regex "^9.2.2" + "@solidity-parser/parser" "^0.14.3" + emoji-regex "^10.1.0" escape-string-regexp "^4.0.0" - semver "^7.3.5" + semver "^7.3.7" solidity-comments-extractor "^0.0.7" - string-width "^4.2.2" + string-width "^4.2.3" -prettier@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@2.7.1, prettier@^2.3.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== prettier@^1.14.3: version "1.19.1" @@ -7732,15 +8206,6 @@ promise@^8.0.0: dependencies: asap "~2.0.6" -proper-lockfile@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -7878,7 +8343,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -7962,7 +8427,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8009,6 +8474,18 @@ recursive-readdir@^2.2.2: dependencies: minimatch "3.0.4" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regenerate@^1.2.1: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -8153,7 +8630,7 @@ require-from-string@^1.1.0: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= -require-from-string@^2.0.0: +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -8239,11 +8716,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -8256,7 +8728,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -8283,6 +8755,13 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8302,10 +8781,10 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -rxjs@^7.1.0: - version "7.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" - integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== +rxjs@^7.5.4: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== dependencies: tslib "^2.1.0" @@ -8375,20 +8854,6 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" -secp256k1@^3.0.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - secp256k1@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" @@ -8403,11 +8868,6 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -8423,13 +8883,20 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -8454,6 +8921,13 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serve-static@1.14.2: version "1.14.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" @@ -8561,7 +9035,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2: version "3.0.6" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== @@ -8604,6 +9078,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -8649,18 +9132,16 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solc@0.8.6: - version "0.8.6" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.6.tgz#e4341fa6780137df97b94a0cfbd59b3f2037d0e0" - integrity sha512-miiDaWdaUnD7A6Cktb/2ug9f+ajcOCDYRr7vgbPEsMoutSlBtp5rca57oMg8iHSuM7jilwdxePujWI/+rbNftQ== +solc@0.8.17: + version "0.8.17" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.17.tgz#c748fec6a64bf029ec406aa9b37e75938d1115ae" + integrity sha512-Dtidk2XtTTmkB3IKdyeg6wLYopJnBVxdoykN8oP8VY3PQjN16BScYoUJTXFm2OP7P0hXNAqWiJNmmfuELtLf8g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -8689,12 +9170,12 @@ solc@^0.6.3, solc@^0.6.7: semver "^5.5.0" tmp "0.0.33" -solhint@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.3.tgz#1d1ff6c4bdbf71a188f726bb0124280b9280b1a3" - integrity sha512-eRtzroFWmJPFpeFPAApuB4RfYSwCSqquk2zJJoOR4ASq2SC8XhyBCVb86BExxvd7y03JrrxusngKMmSctXXcWg== +solhint@3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" + integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== dependencies: - "@solidity-parser/parser" "^0.12.0" + "@solidity-parser/parser" "^0.14.1" ajv "^6.6.1" antlr4 "4.7.1" ast-parents "0.0.1" @@ -8711,56 +9192,52 @@ solhint@3.3.3: optionalDependencies: prettier "^1.14.3" -solidity-ast@^0.4.15: - version "0.4.28" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.28.tgz#5589998512b9a3602e6ba612cbe7fed7401294f4" - integrity sha512-RtZCP5tSvZMadVtg9/IfLmAMKDOnQEvG2HA6VnPuoTMxqxsbbn4lQy8jgH3RVbqW0eO1hd7cSCKecb72/OeOIw== - solidity-comments-extractor@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@0.7.17: - version "0.7.17" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.17.tgz#5139de8f6666d4755d88f453d8e35632a7bb3444" - integrity sha512-Erw2hd2xdACAvDX8jUdYkmgJlIIazGznwDJA5dhRaw4def2SisXN9jUjneeyOZnl/E7j6D3XJYug4Zg9iwodsg== +solidity-coverage@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" + integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== dependencies: - "@solidity-parser/parser" "^0.13.2" - "@truffle/provider" "^0.2.24" + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.14.1" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" + difflib "^0.2.4" fs-extra "^8.1.0" - ganache-cli "^6.12.2" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" lodash "^4.17.15" + mocha "7.1.2" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" semver "^7.3.4" shelljs "^0.8.3" - web3-utils "^1.3.0" + web3-utils "^1.3.6" -solidity-docgen@0.5.16: - version "0.5.16" - resolved "https://registry.yarnpkg.com/solidity-docgen/-/solidity-docgen-0.5.16.tgz#c12a5cac7ca656ff01b10dd832891983bb071f50" - integrity sha512-rFVpqSNnDGKvL68mPf4J9mEQIl+Ixy6bIz/YE6AgjBCPtrlm4KjWQhcBMQWc/LarSCenOpzhbG1tHqP9gf9kcg== +solidity-docgen@0.5.17: + version "0.5.17" + resolved "https://registry.yarnpkg.com/solidity-docgen/-/solidity-docgen-0.5.17.tgz#3b0ab450afc2cd4d29cea895e05e50a07d43fbfc" + integrity sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng== dependencies: "@oclif/command" "^1.8.0" "@oclif/config" "^1.17.0" "@oclif/errors" "^1.3.3" - "@oclif/plugin-help" "^3.2.0" + "@oclif/plugin-help" "^5.0.0" globby "^11.0.0" handlebars "^4.7.6" json5 "^2.1.3" lodash "^4.17.15" micromatch "^4.0.2" - minimatch "^3.0.4" + minimatch "^5.0.0" semver "^7.3.2" solc "^0.6.7" @@ -8790,7 +9267,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.13, source-map-support@^0.5.17: +source-map-support@^0.5.13: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -8906,11 +9383,21 @@ stream-to-pull-stream@^1.7.1: looper "^3.0.0" pull-stream "^3.2.3" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -8937,7 +9424,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9039,11 +9526,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -9056,6 +9538,11 @@ strip-json-comments@2.0.1, strip-json-comments@^2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -9063,6 +9550,13 @@ supports-color@6.0.0: dependencies: has-flag "^3.0.0" +supports-color@8.1.1, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -9082,13 +9576,21 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-hyperlinks@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -9127,6 +9629,16 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -9137,6 +9649,17 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tape@^4.6.3: version "4.14.0" resolved "https://registry.yarnpkg.com/tape/-/tape-4.14.0.tgz#e4d46097e129817175b90925f2385f6b1bcfa826" @@ -9303,10 +9826,15 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== +ts-command-line-args@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" + integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" ts-essentials@^1.0.0: version "1.0.4" @@ -9318,6 +9846,11 @@ ts-essentials@^6.0.3: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + ts-generator@0.1.1, ts-generator@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" @@ -9333,16 +9866,23 @@ ts-generator@0.1.1, ts-generator@^0.1.1: resolve "^1.8.1" ts-essentials "^1.0.0" -ts-node@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" arg "^4.1.0" create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - source-map-support "^0.5.17" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" tslib@^1.9.0, tslib@^1.9.3: @@ -9355,6 +9895,11 @@ tslib@^2.0.0, tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -9367,7 +9912,7 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl-util@^0.15.0: +tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== @@ -9422,6 +9967,22 @@ type@^2.5.0: resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== +typechain@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.0.tgz#fc4902ce596519cb2ccfd012e4ddf92a9945b569" + integrity sha512-5jToLgKTjHdI1VKqs/K8BLYy42Sr3o8bV5ojh4MnR9ExHO83cyyUdw+7+vMJCpKXUiVUvARM4qmHTFuyaCMAZQ== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + typechain@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" @@ -9447,10 +10008,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" - integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== +typescript@4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" @@ -9474,6 +10035,16 @@ typical@^2.6.0, typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + uglify-js@^3.1.4: version "3.14.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" @@ -9499,6 +10070,13 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +undici@^5.4.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.11.0.tgz#1db25f285821828fc09d3804b9e2e934ae86fc13" + integrity sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw== + dependencies: + busboy "^1.6.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -9614,18 +10192,6 @@ util.promisify@^1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.1" -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -9646,6 +10212,16 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -9673,16 +10249,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -wait-on@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" - integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== +wait-on@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== dependencies: - axios "^0.21.1" - joi "^17.4.0" + axios "^0.25.0" + joi "^17.6.0" lodash "^4.17.21" minimist "^1.2.5" - rxjs "^7.1.0" + rxjs "^7.5.4" web3-bzz@1.2.11: version "1.2.11" @@ -9694,15 +10270,6 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -9712,14 +10279,6 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== - dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" - web3-core-method@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" @@ -9732,18 +10291,6 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" - web3-core-promievent@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" @@ -9751,13 +10298,6 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== - dependencies: - eventemitter3 "4.0.4" - web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -9769,17 +10309,6 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" - web3-core-subscriptions@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" @@ -9789,14 +10318,6 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - web3-core@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" @@ -9810,19 +10331,6 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" - web3-eth-abi@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" @@ -9832,14 +10340,6 @@ web3-eth-abi@1.2.11: underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" - web3-eth-accounts@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" @@ -9857,23 +10357,6 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-eth-contract@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" @@ -9889,20 +10372,6 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" - web3-eth-ens@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" @@ -9918,20 +10387,6 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" - web3-eth-iban@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" @@ -9940,14 +10395,6 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" - web3-eth-personal@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" @@ -9960,18 +10407,6 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-eth@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" @@ -9991,24 +10426,6 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-net@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" @@ -10018,15 +10435,6 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-provider-engine@14.2.1: version "14.2.1" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" @@ -10061,14 +10469,6 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== - dependencies: - web3-core-helpers "1.5.3" - xhr2-cookies "1.1.0" - web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -10078,14 +10478,6 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.3" - web3-providers-ws@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" @@ -10096,15 +10488,6 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - websocket "^1.0.32" - web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -10115,16 +10498,6 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" - web3-utils@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" @@ -10139,25 +10512,25 @@ web3-utils@1.2.11: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== +web3-utils@^1.0.0-beta.31: + version "1.6.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" + integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== dependencies: bn.js "^4.11.9" - eth-lib "0.2.8" ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" - integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== +web3-utils@^1.3.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" + integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== dependencies: - bn.js "^4.11.9" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" @@ -10178,19 +10551,6 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== - dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10208,7 +10568,7 @@ websocket@1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -websocket@^1.0.31, websocket@^1.0.32: +websocket@^1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== @@ -10254,18 +10614,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -10302,6 +10650,19 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -10417,7 +10778,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -10439,6 +10800,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" @@ -10454,7 +10820,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -10462,6 +10828,11 @@ yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -10470,6 +10841,11 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" @@ -10479,22 +10855,15 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" yargs@13.3.2, yargs@^13.3.0: version "13.3.2" @@ -10512,6 +10881,19 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -10536,3 +10918,13 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zksync-web3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.8.1.tgz#db289d8f6caf61f4d5ddc471fa3448d93208dc14" + integrity sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw== From f59cdc298cddaac033302b48f6d3b6f30efe0a2d Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Tue, 25 Oct 2022 15:16:55 -0500 Subject: [PATCH 25/30] feat(contracts): add PrizeDistributionFactoryV2 --- contracts/PrizeDistributionFactoryV2.sol | 272 ++++++++++ contracts/abstract/DrawIDBinarySearch.sol | 1 - .../harness/DrawPercentageRateHarness.sol | 47 -- contracts/interfaces/IPrizeTierHistoryV2.sol | 1 - contracts/libraries/DrawCalculationLib.sol | 66 --- test/DrawPercentageRate.test.ts | 121 ----- test/PrizeDistributionFactory.test.ts | 17 +- test/PrizeDistributionFactoryV2.test.ts | 485 ++++++++++++++++++ 8 files changed, 761 insertions(+), 249 deletions(-) create mode 100644 contracts/PrizeDistributionFactoryV2.sol delete mode 100644 contracts/harness/DrawPercentageRateHarness.sol delete mode 100644 contracts/libraries/DrawCalculationLib.sol delete mode 100644 test/DrawPercentageRate.test.ts create mode 100644 test/PrizeDistributionFactoryV2.test.ts diff --git a/contracts/PrizeDistributionFactoryV2.sol b/contracts/PrizeDistributionFactoryV2.sol new file mode 100644 index 0000000..cca70f1 --- /dev/null +++ b/contracts/PrizeDistributionFactoryV2.sol @@ -0,0 +1,272 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.6; + +import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; +import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; +import "@pooltogether/v4-core/contracts/libraries/ExtendedSafeCastLib.sol"; +import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; + +import "./interfaces/IPrizeTierHistoryV2.sol"; + +/** + * @title PrizeDistributionFactoryV2 + * @author PoolTogether Inc. + * @notice The PrizeDistributionFactoryV2 populates a Prize Distribution Buffer for a prize pool. It uses a PrizeTierHistoryV2, Draw Buffer and Ticket + * to compute the correct prize distribution. It automatically sets the cardinality based on + * the DPR (Draw Percentage Rate), prize, minPickCost and the total ticket supply. + */ +contract PrizeDistributionFactoryV2 is Manageable { + using ExtendedSafeCastLib for uint256; + + /* ============ Events ============ */ + + /** + * @notice Emitted when a new Prize Distribution is pushed. + * @param drawId The draw id for which the prize distribution was pushed + */ + event PrizeDistributionPushed(uint32 indexed drawId); + + /** + * @notice Emitted when a Prize Distribution is set (overrides another). + * @param drawId The draw id for which the prize distribution was set + */ + event PrizeDistributionSet(uint32 indexed drawId); + + /* ============ Variables ============ */ + + /// @notice The prize tier history to pull tier information from. + IPrizeTierHistoryV2 public immutable prizeTierHistory; + + /// @notice The draw buffer to pull the draw from. + IDrawBuffer public immutable drawBuffer; + + /** + * @notice The prize distribution buffer to push and set. + * @dev This contract must be the manager or owner of the buffer. + */ + IPrizeDistributionBuffer public immutable prizeDistributionBuffer; + + /// @notice The ticket whose average total supply will be measured to calculate the portion of picks + ITicket public immutable ticket; + + /// @notice The minimum cost of each pick. Used to calculate the cardinality. + uint256 public immutable minPickCost; + + /** + * @notice Unit of normalization. + * @dev The Draw Percentage Rate (DPR) being a 1e9 number, + * we need to normalize calculations by scaling up or down by 1e9 + */ + uint32 public constant RATE_NORMALIZATION = 1e9; + + /* ============ Constructor ============ */ + + /** + * @notice PrizeDistributionFactoryV2 constructor. + * @param _owner Address of the contract owner + * @param _prizeTierHistory Address of the IPrizeTierHistoryV2 contract + * @param _drawBuffer Address of the DrawBuffer contract + * @param _prizeDistributionBuffer Address of the PrizeDistributionBuffer contract + * @param _ticket Address of the Prize Pool Ticket contract + * @param _minPickCost Minimum cost of a pick for a draw + */ + constructor( + address _owner, + IPrizeTierHistoryV2 _prizeTierHistory, + IDrawBuffer _drawBuffer, + IPrizeDistributionBuffer _prizeDistributionBuffer, + ITicket _ticket, + uint256 _minPickCost + ) Ownable(_owner) { + require(_owner != address(0), "PDC/owner-zero"); + require(address(_prizeTierHistory) != address(0), "PDC/pth-zero"); + require(address(_drawBuffer) != address(0), "PDC/db-zero"); + require(address(_prizeDistributionBuffer) != address(0), "PDC/pdb-zero"); + require(address(_ticket) != address(0), "PDC/ticket-zero"); + require(_minPickCost > 0, "PDC/pick-cost-gt-zero"); + + minPickCost = _minPickCost; + prizeTierHistory = _prizeTierHistory; + drawBuffer = _drawBuffer; + prizeDistributionBuffer = _prizeDistributionBuffer; + ticket = _ticket; + } + + /* ============ External Functions ============ */ + + /** + * @notice Allows the owner or manager to push a new prize distribution onto the buffer. + * The PrizeTier and Draw for the given draw id will be pulled in, and the total network ticket supply will be used to calculate cardinality. + * @param _drawId The draw id to compute for + * @return The resulting Prize Distribution + */ + function pushPrizeDistribution(uint32 _drawId) + external + onlyManagerOrOwner + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + IPrizeDistributionBuffer.PrizeDistribution + memory _prizeDistribution = _calculatePrizeDistribution(_drawId); + + prizeDistributionBuffer.pushPrizeDistribution(_drawId, _prizeDistribution); + + emit PrizeDistributionPushed(_drawId); + + return _prizeDistribution; + } + + /** + * @notice Allows the owner or manager to override an existing prize distribution in the buffer. + * The PrizeTier and Draw for the given draw id will be pulled in, and the prize distribution will be computed. + * @param _drawId The draw id to compute for + * @return The resulting Prize Distribution + */ + function setPrizeDistribution(uint32 _drawId) + external + onlyOwner + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + IPrizeDistributionBuffer.PrizeDistribution + memory _prizeDistribution = _calculatePrizeDistribution(_drawId); + + prizeDistributionBuffer.setPrizeDistribution(_drawId, _prizeDistribution); + + emit PrizeDistributionSet(_drawId); + + return _prizeDistribution; + } + + /** + * @notice Calculate Prize Distribution for a given drawId + * @param _drawId Draw ID + * @return PrizeDistribution + */ + function calculatePrizeDistribution(uint32 _drawId) + external + view + virtual + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + return _calculatePrizeDistribution(_drawId); + } + + /* ============ Internal Functions ============ */ + + /** + * @notice Calculate Prize Distribution for a given drawId + * @param _drawId Draw ID + * @return PrizeDistribution + */ + function _calculatePrizeDistribution(uint32 _drawId) + internal + view + virtual + returns (IPrizeDistributionBuffer.PrizeDistribution memory) + { + IPrizeTierHistoryV2.PrizeTierV2 memory _prizeTier = prizeTierHistory.getPrizeTier(_drawId); + IDrawBeacon.Draw memory _draw = drawBuffer.getDraw(_drawId); + + ( + uint64[] memory _startTimes, + uint64[] memory _endTimes + ) = _calculateDrawPeriodTimestampOffsets( + _draw.timestamp, + _draw.beaconPeriodSeconds, + _prizeTier.endTimestampOffset + ); + + uint256 _totalSupply = ticket.getAverageTotalSuppliesBetween(_startTimes, _endTimes)[0]; + + (uint8 _cardinality, uint104 _numberOfPicks) = _calculateCardinalityAndNumberOfPicks( + _prizeTier.bitRangeSize, + _prizeTier.prize, + _prizeTier.dpr, + minPickCost, + _totalSupply + ); + + IPrizeDistributionBuffer.PrizeDistribution + memory _prizeDistribution = IPrizeDistributionSource.PrizeDistribution({ + bitRangeSize: _prizeTier.bitRangeSize, + matchCardinality: _cardinality, + startTimestampOffset: _draw.beaconPeriodSeconds, + endTimestampOffset: _prizeTier.endTimestampOffset, + maxPicksPerUser: _prizeTier.maxPicksPerUser, + expiryDuration: _prizeTier.expiryDuration, + numberOfPicks: _numberOfPicks, + tiers: _prizeTier.tiers, + prize: _prizeTier.prize + }); + + return _prizeDistribution; + } + + /** + * @notice Compute prize pool cardinality and number of picks for a draw. + * @dev `cardinality` must be gte to one, that's why we use a do/while loop to increase it. + * @param _bitRangeSize Bit range size + * @param _prize Total prize amount + * @param _dpr Draw percentage rate + * @param _minPickCost Minimum cost for a pick + * @param _totalSupply Prize Pool Ticket total supply + * @return cardinality and number of picks + */ + function _calculateCardinalityAndNumberOfPicks( + uint32 _bitRangeSize, + uint256 _prize, + uint256 _dpr, + uint256 _minPickCost, + uint256 _totalSupply + ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { + uint256 _odds = (_dpr * _totalSupply) / _prize; + + if (_odds == 0) { + return (cardinality = 1, numberOfPicks); + } + + uint256 _targetPicks = ((_totalSupply / _minPickCost) * RATE_NORMALIZATION) / _odds; + + do { + cardinality++; + } while (_calculateTotalPicks(_bitRangeSize, cardinality + 1) < _targetPicks); + + numberOfPicks = ((_calculateTotalPicks(_bitRangeSize, cardinality) * _odds) / + RATE_NORMALIZATION).toUint104(); + } + + /** + * @notice Calculate Draw period start and end timestamp. + * @param _timestamp Timestamp at which the draw was created by the DrawBeacon + * @param _startOffset Draw start time offset in seconds + * @param _endOffset Draw end time offset in seconds + * @return Draw start and end timestamp + */ + function _calculateDrawPeriodTimestampOffsets( + uint64 _timestamp, + uint32 _startOffset, + uint32 _endOffset + ) internal pure returns (uint64[] memory, uint64[] memory) { + uint64[] memory _startTimestamps = new uint64[](1); + uint64[] memory _endTimestamps = new uint64[](1); + + _startTimestamps[0] = _timestamp - _startOffset; + _endTimestamps[0] = _timestamp - _endOffset; + + return (_startTimestamps, _endTimestamps); + } + + /** + * @notice Calculate total picks for a draw. + * @param _bitRangeSize Bit range size + * @param _cardinality Cardinality + * @return Total number of picks + */ + function _calculateTotalPicks(uint32 _bitRangeSize, uint8 _cardinality) + internal + pure + returns (uint256) + { + return (2**_bitRangeSize)**_cardinality; + } +} diff --git a/contracts/abstract/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol index 75f2a7f..86085e1 100644 --- a/contracts/abstract/DrawIDBinarySearch.sol +++ b/contracts/abstract/DrawIDBinarySearch.sol @@ -1,6 +1,5 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; -import "hardhat/console.sol"; /** * @title PoolTogether V4 DrawIDBinarySearch diff --git a/contracts/harness/DrawPercentageRateHarness.sol b/contracts/harness/DrawPercentageRateHarness.sol deleted file mode 100644 index c63385d..0000000 --- a/contracts/harness/DrawPercentageRateHarness.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "../PrizeDistributionAdapter.sol"; - -contract DrawPercentageRateHarness is PrizeDistributionAdapter { - constructor(ITicket _ticket, IDrawBuffer _drawBuffer) - PrizeDistributionAdapter(_ticket, _drawBuffer) - {} - - function calculatePrizeDistribution(uint32 _drawId) - external - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - return _calculatePrizeDistribution(_drawId); - } - - function calculateDrawPeriodTimestampOffsets( - uint64 _timestamp, - uint32 _startOffset, - uint32 _endOffset - ) public pure returns (uint64[] memory startTimestamps, uint64[] memory endTimestamps) { - return - DrawCalculationLib.calculateDrawPeriodTimestampOffsets( - _timestamp, - _startOffset, - _endOffset - ); - } - - function calculateCardinalityAndNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) public pure returns (uint8 cardinality, uint256 numberOfPicks) { - return - DrawCalculationLib.calculateCardinalityAndNumberOfPicks( - _bitRangeSize, - _prize, - _dpr, - _minPickCost, - _totalSupply - ); - } -} diff --git a/contracts/interfaces/IPrizeTierHistoryV2.sol b/contracts/interfaces/IPrizeTierHistoryV2.sol index 326a4d8..16b5758 100644 --- a/contracts/interfaces/IPrizeTierHistoryV2.sol +++ b/contracts/interfaces/IPrizeTierHistoryV2.sol @@ -20,7 +20,6 @@ interface IPrizeTierHistoryV2 { uint32 expiryDuration; uint32 endTimestampOffset; uint32 dpr; - uint256 minPickCost; uint256 prize; uint32[16] tiers; } diff --git a/contracts/libraries/DrawCalculationLib.sol b/contracts/libraries/DrawCalculationLib.sol deleted file mode 100644 index 37f858b..0000000 --- a/contracts/libraries/DrawCalculationLib.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -/** - * @title PoolTogether V4 DrawCalculationLib - * @author PoolTogether Inc Team - * @notice DrawCalculationLib exposes helper functions - * to calculate values needed to compute results of a draw - */ -library DrawCalculationLib { - /** - * @notice Unit of normalization. - * @dev The Draw Percentage Rate (DPR) being a 1e9 number, - * we need to normalize calculations by scaling up or down by 1e9 - */ - uint32 public constant RATE_NORMALIZATION = 1e9; - - /** - * @notice Compute prize pool cardinality and number of picks for a draw - * @param _bitRangeSize Bit range size - * @param _prize Total prize amount - * @param _dpr Draw percentage rate - * @param _minPickCost Minimum cost for a pick - * @param _totalSupply Prize Pool network TVL - * @return cardinality and number of picks - */ - function calculateCardinalityAndNumberOfPicks( - uint32 _bitRangeSize, - uint256 _prize, - uint256 _dpr, - uint256 _minPickCost, - uint256 _totalSupply - ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { - uint256 _maxPicks = (_totalSupply * RATE_NORMALIZATION) / _minPickCost; - uint256 _odds = (_dpr * _totalSupply) / _prize; - - uint256 _totalPicks; - - while ((_totalPicks = (2**_bitRangeSize)**(cardinality)) < (_maxPicks / _odds)) { - cardinality++; - } - - numberOfPicks = uint104((_totalPicks * _odds) / RATE_NORMALIZATION); - } - - /** - * @notice Calculate Draw period start and end timestamp - * @param _timestamp Timestamp at which the draw was created by the DrawBeacon - * @param _startOffset Draw start time offset in seconds - * @param _endOffset Draw end time offset in seconds - * @return Draw start and end timestamp - */ - function calculateDrawPeriodTimestampOffsets( - uint64 _timestamp, - uint32 _startOffset, - uint32 _endOffset - ) internal pure returns (uint64[] memory, uint64[] memory) { - uint64[] memory _startTimestamps = new uint64[](1); - uint64[] memory _endTimestamps = new uint64[](1); - - _startTimestamps[0] = _timestamp - _startOffset; - _endTimestamps[0] = _timestamp - _endOffset; - - return (_startTimestamps, _endTimestamps); - } -} diff --git a/test/DrawPercentageRate.test.ts b/test/DrawPercentageRate.test.ts deleted file mode 100644 index ee1624e..0000000 --- a/test/DrawPercentageRate.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { expect } from 'chai'; -// @ts-ignore -import { ethers, artifacts } from 'hardhat'; -import { deployMockContract, MockContract } from 'ethereum-waffle'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { Contract, ContractFactory } from 'ethers'; -import DrawBuffer from '@pooltogether/v4-core/artifacts/contracts/DrawBuffer.sol/DrawBuffer.json'; -import { BigNumber } from 'ethereum-waffle/node_modules/ethers'; -import { parseEther, parseUnits } from 'ethers/lib/utils'; - -const { getSigners } = ethers; - -describe('DrawPercentageRate', () => { - let wallet1: SignerWithAddress; - - let drawPercentageRate: Contract; - let ticket: MockContract; - let drawBuffer: MockContract; - let drawPercentageRateFactory: ContractFactory; - - before(async () => { - [wallet1] = await getSigners(); - const Ticket = await artifacts.readArtifact('PrizeTierHistory'); - ticket = await deployMockContract(wallet1, Ticket.abi); - drawBuffer = await deployMockContract(wallet1, DrawBuffer.abi); - drawPercentageRateFactory = await ethers.getContractFactory('DrawPercentageRateHarness'); - }); - - beforeEach(async () => { - drawPercentageRate = await drawPercentageRateFactory.deploy( - ticket.address, - drawBuffer.address, - ); - }); - - describe('Core', () => { - describe('getPrizeDistribution()', () => { - it('should correctly calculate a valid PrizeDistribution', async () => { - expect(true).to.eq(true); - }); - }); - - describe('getPrizeDistributionList()', () => { - it('should correctly calculate a list of valid PrizeDistributions', async () => { - expect(true).to.eq(true); - }); - }); - }); - - describe('Internal', () => { - describe('calculateCardinalityAndNumberOfPicks()', () => { - it('should successfully calculate a valid cardinality and number of picks.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('100'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.01', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - - expect(value.cardinality).to.eq(BigNumber.from('7')); - expect(value.numberOfPicks).to.eq(BigNumber.from('1638')); - }); - - it('should successfully calculate a valid cardinality and number of picks.', async () => { - const TOTAL_SUPPLY = BigNumber.from('1000'); - const PRIZE = BigNumber.from('10'); - const BIT_RANGE_SIZE = BigNumber.from('2'); - const DPR = parseUnits('0.1', '9'); - const MIN_PICK_COST = BigNumber.from('1'); - const value = await drawPercentageRate.calculateCardinalityAndNumberOfPicks( - BIT_RANGE_SIZE, - PRIZE, - DPR, - MIN_PICK_COST, - TOTAL_SUPPLY, - ); - - expect(value.cardinality).to.eq(BigNumber.from('4')); - expect(value.numberOfPicks).to.eq(BigNumber.from('2560')); - }); - }); - - describe('calculateDrawPeriodTimestampOffsets()', () => { - it('should successfully calculate the Draw timestamp offests', async () => { - const TIMESTAMP = BigNumber.from('1000'); - const START_OFFSET = BigNumber.from('990'); - const END_OFFSET = BigNumber.from('10'); - const offsets = await drawPercentageRate.calculateDrawPeriodTimestampOffsets( - TIMESTAMP, - START_OFFSET, - END_OFFSET, - ); - expect(offsets[0][0]).to.equal(BigNumber.from('10')); - expect(offsets[1][0]).to.equal(BigNumber.from('990')); - }); - }); - }); - - describe('Getters', () => { - it('should get the Ticket address', async () => { - expect(await drawPercentageRate.getTicket()).to.equal(ticket.address); - }); - - it('should get the DrawBuffer address', async () => { - expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); - }); - }); - - describe('Setters', () => { - it('should set the DrawBuffer address', async () => { - drawPercentageRate.setDrawBuffer(drawBuffer.address); - expect(await drawPercentageRate.getDrawBuffer()).to.equal(drawBuffer.address); - }); - }); -}); diff --git a/test/PrizeDistributionFactory.test.ts b/test/PrizeDistributionFactory.test.ts index 5de0874..9d856dc 100644 --- a/test/PrizeDistributionFactory.test.ts +++ b/test/PrizeDistributionFactory.test.ts @@ -1,14 +1,11 @@ // @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; -import { Signer } from '@ethersproject/abstract-signer'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { Contract, ContractFactory } from 'ethers'; import { BigNumber } from '@ethersproject/bignumber'; import { expect } from 'chai'; -const debug = require('debug')('v4-periphery:PrizeDistributionFactory.test.ts'); - const { getSigners, utils } = ethers; const { parseEther: toWei } = utils; @@ -39,16 +36,10 @@ describe('PrizeDistributionFactory', () => { const IPrizeDistributionBuffer = await artifacts.readArtifact('IPrizeDistributionBuffer'); const ITicket = await artifacts.readArtifact('ITicket'); - prizeTierHistory = await deployMockContract( - wallet1 as unknown as Signer, - IPrizeTierHistory.abi, - ); - drawBuffer = await deployMockContract(wallet1 as unknown as Signer, IDrawBuffer.abi); - prizeDistributionBuffer = await deployMockContract( - wallet1 as unknown as Signer, - IPrizeDistributionBuffer.abi, - ); - ticket = await deployMockContract(wallet1 as unknown as Signer, ITicket.abi); + prizeTierHistory = await deployMockContract(wallet1, IPrizeTierHistory.abi); + drawBuffer = await deployMockContract(wallet1, IDrawBuffer.abi); + prizeDistributionBuffer = await deployMockContract(wallet1, IPrizeDistributionBuffer.abi); + ticket = await deployMockContract(wallet1, ITicket.abi); maxPickCost = toWei('1'); diff --git a/test/PrizeDistributionFactoryV2.test.ts b/test/PrizeDistributionFactoryV2.test.ts new file mode 100644 index 0000000..4103742 --- /dev/null +++ b/test/PrizeDistributionFactoryV2.test.ts @@ -0,0 +1,485 @@ +import { BigNumber } from '@ethersproject/bignumber'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { deployMockContract, MockContract } from 'ethereum-waffle'; +import { ethers, artifacts } from 'hardhat'; + +import { IPrizeTierHistoryV2 } from '../types/contracts/interfaces/IPrizeTierHistoryV2'; + +const { constants, getContractFactory, getSigners, utils } = ethers; +const { AddressZero, Zero } = constants; +const { parseEther: toWei, parseUnits } = utils; + +describe('PrizeDistributionFactoryV2', () => { + let wallet1: SignerWithAddress; + let wallet2: SignerWithAddress; + + let prizeDistributionFactory: Contract; + + let prizeTierHistory: MockContract; + let drawBuffer: MockContract; + let prizeDistributionBuffer: MockContract; + let ticket: MockContract; + + let isConstructorTest = false; + + const deployPrizeDistributionFactory = async ( + owner = wallet1.address, + prizeTierHistoryAddress = prizeTierHistory.address, + drawBufferAddress = drawBuffer.address, + prizeDistributionBufferAddress = prizeDistributionBuffer.address, + ticketAddress = ticket.address, + minPickCost = toWei('1'), + ) => { + const PrizeDistributionFactory = await getContractFactory('PrizeDistributionFactoryV2'); + + return await PrizeDistributionFactory.deploy( + owner, + prizeTierHistoryAddress, + drawBufferAddress, + prizeDistributionBufferAddress, + ticketAddress, + minPickCost, + ); + }; + + beforeEach(async () => { + [wallet1, wallet2] = await getSigners(); + + const IPrizeTierHistoryV2 = await artifacts.readArtifact('IPrizeTierHistoryV2'); + const IDrawBuffer = await artifacts.readArtifact('IDrawBuffer'); + const IPrizeDistributionBuffer = await artifacts.readArtifact('IPrizeDistributionBuffer'); + const ITicket = await artifacts.readArtifact('ITicket'); + + prizeTierHistory = await deployMockContract(wallet1, IPrizeTierHistoryV2.abi); + + drawBuffer = await deployMockContract(wallet1, IDrawBuffer.abi); + prizeDistributionBuffer = await deployMockContract(wallet1, IPrizeDistributionBuffer.abi); + + ticket = await deployMockContract(wallet1, ITicket.abi); + + if (!isConstructorTest) { + prizeDistributionFactory = await deployPrizeDistributionFactory(); + } + }); + + const drawDefault = { + winningRandomNumber: '0x1111111111111111111111111111111111111111111111111111111111111111', + drawId: 1, + timestamp: 1000, + beaconPeriodStartedAt: 0, + beaconPeriodSeconds: 100, + }; + + const dprDefault = '0.1'; // 10% + const dpr = parseUnits(dprDefault, '9'); + const prizeDefault = '10'; + const prize = toWei(prizeDefault); + const totalSupplyDefault = '1000'; + + const prizeTierDefault: IPrizeTierHistoryV2.PrizeTierV2Struct = { + bitRangeSize: 2, + drawId: 1, + maxPicksPerUser: 2, + expiryDuration: 3600, + endTimestampOffset: 300, + dpr, + prize, + tiers: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }; + + const calculateNumberOfPicks = ( + bitRangeSize: number, + cardinality: number, + prize: number, + dpr: number, + totalSupply: number, + ) => { + const odds = BigNumber.from((dpr * totalSupply) / prize); + const totalPicks = BigNumber.from((2 ** bitRangeSize) ** cardinality); + + return totalPicks.mul(odds); + }; + + function createPrizeDistribution( + prizeDistributionOptions: any = {}, + totalSupply = totalSupplyDefault, + dpr = dprDefault, + prize = prizeDefault, + ) { + const prizeDistribution = { + bitRangeSize: 2, + matchCardinality: 6, + startTimestampOffset: drawDefault.beaconPeriodSeconds, + endTimestampOffset: prizeTierDefault.endTimestampOffset, + maxPicksPerUser: prizeTierDefault.maxPicksPerUser, + expiryDuration: prizeTierDefault.expiryDuration, + numberOfPicks: BigNumber.from((2 ** 2) ** 6), + tiers: prizeTierDefault.tiers, + prize: prizeTierDefault.prize, + ...prizeDistributionOptions, + }; + + if (!prizeDistributionOptions.numberOfPicks) { + prizeDistribution.numberOfPicks = calculateNumberOfPicks( + prizeDistribution.bitRangeSize, + prizeDistribution.matchCardinality, + Number(prize), + Number(dpr), + Number(totalSupply), + ); + } + + return prizeDistribution; + } + + function toObject(prizeDistributionResult: any) { + const { + bitRangeSize, + matchCardinality, + startTimestampOffset, + endTimestampOffset, + maxPicksPerUser, + expiryDuration, + numberOfPicks, + tiers, + prize, + } = prizeDistributionResult; + return { + bitRangeSize, + matchCardinality, + startTimestampOffset, + endTimestampOffset, + maxPicksPerUser, + expiryDuration, + numberOfPicks, + tiers, + prize, + }; + } + + async function setupMocks( + drawOptions = {}, + prizeTierOptions = {}, + totalSupply = toWei(totalSupplyDefault), + ) { + const draw = { + ...drawDefault, + ...drawOptions, + }; + + await drawBuffer.mock.getDraw.withArgs(draw.drawId).returns(draw); + + const prizeTier = { + ...prizeTierDefault, + ...prizeTierOptions, + }; + + await prizeTierHistory.mock.getPrizeTier.withArgs(draw.drawId).returns(prizeTier); + + await ticket.mock.getAverageTotalSuppliesBetween + .withArgs( + [draw.timestamp - draw.beaconPeriodSeconds], + [draw.timestamp - Number(prizeTier.endTimestampOffset)], + ) + .returns([totalSupply]); + } + + describe('constructor()', () => { + before(() => (isConstructorTest = true)); + + before(() => (isConstructorTest = false)); + + it('requires owner != 0x0', async () => { + await expect(deployPrizeDistributionFactory(AddressZero)).to.be.revertedWith( + 'PDC/owner-zero', + ); + }); + + it('requires tier history != 0x0', async () => { + await expect( + deployPrizeDistributionFactory(wallet1.address, AddressZero), + ).to.be.revertedWith('PDC/pth-zero'); + }); + + it('requires draw buffer != 0x0', async () => { + await expect( + deployPrizeDistributionFactory( + wallet1.address, + prizeTierHistory.address, + AddressZero, + ), + ).to.be.revertedWith('PDC/db-zero'); + }); + + it('requires prize dist buffer != 0x0', async () => { + await expect( + deployPrizeDistributionFactory( + wallet1.address, + prizeTierHistory.address, + drawBuffer.address, + AddressZero, + ), + ).to.be.revertedWith('PDC/pdb-zero'); + }); + + it('requires ticket != 0x0', async () => { + await expect( + deployPrizeDistributionFactory( + wallet1.address, + prizeTierHistory.address, + drawBuffer.address, + prizeDistributionBuffer.address, + AddressZero, + ), + ).to.be.revertedWith('PDC/ticket-zero'); + }); + + it('requires a minPickCost > 0', async () => { + await expect( + deployPrizeDistributionFactory( + wallet1.address, + prizeTierHistory.address, + drawBuffer.address, + prizeDistributionBuffer.address, + ticket.address, + Zero, + ), + ).to.be.revertedWith('PDC/pick-cost-gt-zero'); + }); + }); + + describe('calculatePrizeDistribution()', () => { + it('should copy in all of the prize tier values', async () => { + await setupMocks(); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ matchCardinality: 3 }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('ensure minimum cardinality is 1', async () => { + await setupMocks({}, {}, toWei('0')); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 1, + numberOfPicks: toWei('0'), + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle when ticket supply equals prize', async () => { + const prize = toWei(totalSupplyDefault); + await setupMocks({}, { prize }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 6, + numberOfPicks: BigNumber.from(409), + prize, + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle when prize is greater than ticket supply', async () => { + const prize = parseUnits(totalSupplyDefault, 26); + await setupMocks({}, { prize }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 19, + numberOfPicks: BigNumber.from(274), + prize, + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should not allocate any picks if prize is way greater than ticket supply', async () => { + // If prize is 1e9+ greater than dpr * totalSupply, odds will truncate down and return 0 + const prize = parseUnits(totalSupplyDefault, 27); + await setupMocks({}, { prize }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 1, + numberOfPicks: BigNumber.from(0), + prize, + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle when ticket supply is way greater than prize', async () => { + const totalSupply = parseUnits(totalSupplyDefault, 46); + await setupMocks({}, {}, totalSupply); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 3, + numberOfPicks: parseUnits('64', 29), + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should revert if numberOfPicks does not fit in 104 bits', async () => { + const totalSupply = parseUnits(totalSupplyDefault, 47); + await setupMocks({}, {}, totalSupply); + + await expect(prizeDistributionFactory.calculatePrizeDistribution(1)).to.be.revertedWith( + "SafeCast: value doesn't fit in 104 bits", + ); + }); + + it('should handle when the dpr is extremely low', async () => { + await setupMocks({}, { dpr: parseUnits('0.000000001', '9') }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 16, + numberOfPicks: BigNumber.from(429), + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle when the dpr is high', async () => { + await setupMocks({}, { dpr: parseUnits('1', '9') }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 1, + numberOfPicks: BigNumber.from(400), + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle a high cost per pick', async () => { + await setupMocks({}, { dpr: parseUnits('0.00015259', '9') }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 7, + numberOfPicks: BigNumber.from(250), + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + + it('should handle a low cost per pick', async () => { + const prize = toWei('1'); + await setupMocks({}, { dpr: parseUnits('1', '9'), prize }); + + const prizeDistributionObject = toObject( + await prizeDistributionFactory.calculatePrizeDistribution(1), + ); + + const prizeDistribution = createPrizeDistribution({ + matchCardinality: 1, + numberOfPicks: BigNumber.from(4000), + prize, + }); + + expect(JSON.stringify(prizeDistributionObject)).to.equal( + JSON.stringify(prizeDistribution), + ); + }); + }); + + describe('pushPrizeDistribution()', () => { + it('should push the prize distribution onto the buffer', async () => { + await setupMocks(); + await prizeDistributionBuffer.mock.pushPrizeDistribution.returns(true); + + await expect(prizeDistributionFactory.pushPrizeDistribution(1)) + .to.emit(prizeDistributionFactory, 'PrizeDistributionPushed') + .withArgs(1); + }); + + it('should push the prize distribution if manager', async () => { + await prizeDistributionFactory.transferOwnership(wallet2.address); + await prizeDistributionFactory.connect(wallet2).claimOwnership(); + + await setupMocks(); + await prizeDistributionBuffer.mock.pushPrizeDistribution.returns(true); + + await expect(prizeDistributionFactory.connect(wallet2).pushPrizeDistribution(1)) + .to.emit(prizeDistributionFactory, 'PrizeDistributionPushed') + .withArgs(1); + }); + + it('should fail to push if not manager or owner', async () => { + await expect( + prizeDistributionFactory.connect(wallet2).pushPrizeDistribution(1), + ).to.be.revertedWith('Manageable/caller-not-manager-or-owner'); + }); + }); + + describe('setPrizeDistribution()', () => { + it('should set the prize distribution onto the buffer', async () => { + await setupMocks(); + await prizeDistributionBuffer.mock.setPrizeDistribution.returns(1); + await expect(prizeDistributionFactory.setPrizeDistribution(1)) + .to.emit(prizeDistributionFactory, 'PrizeDistributionSet') + .withArgs(1); + }); + + it('should fail to set if not owner', async () => { + await expect( + prizeDistributionFactory.connect(wallet2).setPrizeDistribution(1), + ).to.be.revertedWith('Ownable/caller-not-owner'); + }); + }); +}); From 0a49ecb6d101740caaed0d80677cb4ef61fe73f2 Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Wed, 26 Oct 2022 15:50:31 -0500 Subject: [PATCH 26/30] fix(contracts): remove PrizeDistributionAdapter --- contracts/PrizeDistributionAdapter.sol | 184 ------------------ contracts/abstract/DrawIDBinarySearch.sol | 64 ------ .../harness/DrawIDBinarySearchHarness.sol | 63 ------ contracts/prototype/IDBinarySearch.sol | 110 ----------- .../DrawIDAndStructMappingBinarySearch.sol | 61 ------ .../harness/DrawIDBinarySearchHarness.test.ts | 69 ------- ...DrawIDAndStructMappingBinarySearch.test.ts | 82 -------- 7 files changed, 633 deletions(-) delete mode 100644 contracts/PrizeDistributionAdapter.sol delete mode 100644 contracts/abstract/DrawIDBinarySearch.sol delete mode 100644 contracts/harness/DrawIDBinarySearchHarness.sol delete mode 100644 contracts/prototype/IDBinarySearch.sol delete mode 100644 contracts/test/DrawIDAndStructMappingBinarySearch.sol delete mode 100644 test/harness/DrawIDBinarySearchHarness.test.ts delete mode 100644 test/test/DrawIDAndStructMappingBinarySearch.test.ts diff --git a/contracts/PrizeDistributionAdapter.sol b/contracts/PrizeDistributionAdapter.sol deleted file mode 100644 index 209ce18..0000000 --- a/contracts/PrizeDistributionAdapter.sol +++ /dev/null @@ -1,184 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -import "@pooltogether/owner-manager-contracts/contracts/Manageable.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionSource.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IPrizeDistributionBuffer.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IDrawBuffer.sol"; -import "@pooltogether/v4-core/contracts/interfaces/IDrawBeacon.sol"; -import "@pooltogether/v4-core/contracts/interfaces/ITicket.sol"; -import "./abstract/DrawIDBinarySearch.sol"; -import "./libraries/DrawCalculationLib.sol"; -import "./interfaces/IPrizeTierHistoryV2.sol"; - -/** - * @title PoolTogether V4 PrizeDistributionAdapter - * @author PoolTogether Inc Team - * @notice PrizeDistributionAdapter dynamically calculates a PrizePool distributions using a static draw percentage rate. - */ -contract PrizeDistributionAdapter is IPrizeDistributionSource, DrawIDBinarySearch, Manageable { - /** - * @notice PrizeTierV2 struct - * @dev Adds Draw Percentage Rate (DPR) and minPickCost paramater to PrizeTier struct - */ - struct PrizeTierV2 { - uint8 bitRangeSize; - uint32 drawId; - uint32 maxPicksPerUser; - uint32 expiryDuration; - uint32 endTimestampOffset; - uint32 dpr; - uint256 minPickCost; - uint256 prize; - uint32[16] tiers; - } - - ITicket internal ticket; - IDrawBuffer internal drawBuffer; - PrizeTierV2[] internal history; - - uint32[] internal _idhistory; - - /** - * @notice Emit when new PrizeTierV2 is added to history - * @param drawId Draw ID - * @param prizeTier PrizeTierV2 parameters - */ - event PrizeTierPushed(uint32 indexed drawId, PrizeTierV2 prizeTier); - - /** - * @notice Emit when existing PrizeTierV2 is updated in history - * @param drawId Draw ID - * @param prizeTier PrizeTierV2 parameters - */ - event PrizeTierSet(uint32 indexed drawId, PrizeTierV2 prizeTier); - - /** - * @notice constructor - * @param _ticket - ITicket - * @param _drawBuffer - IDrawBuffer - */ - constructor(ITicket _ticket, IDrawBuffer _drawBuffer) Ownable(msg.sender) { - ticket = _ticket; - drawBuffer = _drawBuffer; - } - - /** - * @notice Get a PrizeDistribution using a Draw ID within the current draw range - * @param drawId - uint32 - * @return prizeDistribution - */ - function getPrizeDistribution(uint32 drawId) - external - view - returns (IPrizeDistributionSource.PrizeDistribution memory) - { - return _calculatePrizeDistribution(drawId); - } - - /** - * @notice Get an array of PrizeDistributions using array of Draw IDs within the current draw range - * @param drawIds - uint32[] - * @return prizeDistributions - */ - function getPrizeDistributions(uint32[] calldata drawIds) - external - view - override - returns (IPrizeDistributionSource.PrizeDistribution[] memory prizeDistributions) - { - for (uint256 index = 0; index < drawIds.length; index++) { - prizeDistributions[index] = _calculatePrizeDistribution(drawIds[index]); - } - } - - // @inheritdoc DrawIDBinarySearch - function getNewestIndex() internal view override returns (uint32) { - return uint32(history.length - 1); - } - - // @inheritdoc DrawIDBinarySearch - function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { - return history[index].drawId; - } - - function getDrawBuffer() external view returns (IDrawBuffer) { - return drawBuffer; - } - - function getTicket() external view returns (ITicket) { - return ticket; - } - - function getPrizeTier(uint32 drawId) external view returns (PrizeTierV2 memory prizeTier) { - return _getPrizeTier(drawId); - } - - function getPrizeTierList(uint32[] calldata drawIds) - external - view - returns (PrizeTierV2[] memory prizeTierList) - { - for (uint256 i = 0; i < drawIds.length; i++) { - prizeTierList[i] = _getPrizeTier(drawIds[i]); - } - } - - function setDrawBuffer(IDrawBuffer _drawBuffer) external onlyOwner { - drawBuffer = _drawBuffer; - } - - /* Internal ========================================== */ - - /** - * @notice Calculate a PrizeDistribution using Draw, PrizeTier and DrawPercentageRate parameters - * @param _drawId - uint32 - * @return prizeDistribution - */ - function _calculatePrizeDistribution(uint32 _drawId) - internal - view - returns (IPrizeDistributionBuffer.PrizeDistribution memory) - { - PrizeTierV2 memory prizeTier = _getPrizeTier(_drawId); - - IDrawBeacon.Draw memory draw = drawBuffer.getDraw(_drawId); - - (uint64[] memory start, uint64[] memory end) = DrawCalculationLib - .calculateDrawPeriodTimestampOffsets( - draw.timestamp, - draw.beaconPeriodSeconds, - prizeTier.endTimestampOffset - ); - - uint256[] memory _totalSupplies = ticket.getAverageTotalSuppliesBetween(start, end); - - (uint8 _cardinality, uint104 _numberOfPicks) = DrawCalculationLib - .calculateCardinalityAndNumberOfPicks( - prizeTier.bitRangeSize, - prizeTier.prize, - prizeTier.dpr, - prizeTier.minPickCost, - _totalSupplies[0] - ); - - IPrizeDistributionBuffer.PrizeDistribution - memory prizeDistribution = IPrizeDistributionSource.PrizeDistribution({ - bitRangeSize: prizeTier.bitRangeSize, - matchCardinality: _cardinality, - startTimestampOffset: draw.beaconPeriodSeconds, - endTimestampOffset: prizeTier.endTimestampOffset, - maxPicksPerUser: prizeTier.maxPicksPerUser, - expiryDuration: prizeTier.expiryDuration, - numberOfPicks: _numberOfPicks, - tiers: prizeTier.tiers, - prize: prizeTier.prize - }); - - return prizeDistribution; - } - - function _getPrizeTier(uint32 drawId) internal view returns (PrizeTierV2 memory prizeTier) { - return history[_binarySearch(drawId)]; - } -} diff --git a/contracts/abstract/DrawIDBinarySearch.sol b/contracts/abstract/DrawIDBinarySearch.sol deleted file mode 100644 index 86085e1..0000000 --- a/contracts/abstract/DrawIDBinarySearch.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -/** - * @title PoolTogether V4 DrawIDBinarySearch - * @author PoolTogether Inc Team - * @notice DrawIDBinarySearch uses binary search to find a parent contract struct with the drawId parameter - * @dev The implementing contract must provider access to a struct (i.e. PrizeTier) list with is both - * sorted and indexed by the drawId field for binary search to work. - */ -abstract contract DrawIDBinarySearch { - /** - * @notice Get newest index in array - */ - function getNewestIndex() internal view virtual returns (uint32); - - /** - * @notice Get Draw ID for using an index position - * @param index uint256 - Index of element in array - */ - function getDrawIdForIndex(uint256 index) internal view virtual returns (uint32); - - function _binarySearch(uint32 _drawId) internal view returns (uint32) { - uint32 index; - uint32 leftSide = 0; - uint32 rightSide = getNewestIndex(); - - uint32 oldestDrawId = getDrawIdForIndex(leftSide); - uint32 newestDrawId = getDrawIdForIndex(rightSide); - - require(_drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); - if (_drawId >= newestDrawId) return rightSide; - if (_drawId == oldestDrawId) return leftSide; - - while (true) { - uint32 length = rightSide - leftSide; - uint32 center = leftSide + (length) / 2; - uint32 centerID = getDrawIdForIndex(center); - - if (centerID == _drawId || length == 1) { - index = center; - break; - } - - if (centerID < _drawId) { - leftSide = center; - } else if (centerID > _drawId) { - rightSide = center - 1; - } - - if (leftSide == rightSide) { - if (centerID >= _drawId) { - index = center - 1; - break; - } else { - index = center; - break; - } - } - } - - return index; - } -} diff --git a/contracts/harness/DrawIDBinarySearchHarness.sol b/contracts/harness/DrawIDBinarySearchHarness.sol deleted file mode 100644 index 343e81a..0000000 --- a/contracts/harness/DrawIDBinarySearchHarness.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "../abstract/DrawIDBinarySearch.sol"; - -contract DrawIDBinarySearchHarness is DrawIDBinarySearch { - struct Draw { - uint32 drawId; - } - - Draw[] internal history; - - constructor(Draw[] memory _history) { - if (_history.length > 0) { - injectTimeline(_history); - } - } - - // @inheritdoc DrawIDBinarySearch - function getNewestIndex() internal view override returns (uint32) { - return uint32(history.length - 1); - } - - // @inheritdoc DrawIDBinarySearch - function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { - return history[index].drawId; - } - - function binarySearch(uint32 _drawId) internal view returns (Draw memory) { - return history[_binarySearch(_drawId)]; - } - - function injectTimeline(Draw[] memory _timeline) public { - require(history.length == 0, "DrawIDBinarySearchHarness/history-not-empty"); - require(_timeline.length > 0, "DrawIDBinarySearchHarness/timeline-empty"); - for (uint256 i = 0; i < _timeline.length; i++) { - _push(_timeline[i]); - } - } - - function get(uint32 _drawId) external view returns (Draw memory) { - return history[_binarySearch(_drawId)]; - } - - function list(uint32[] calldata _drawIds) external view returns (Draw[] memory) { - Draw[] memory _data = new Draw[](_drawIds.length); - for (uint256 index = 0; index < _drawIds.length; index++) { - _data[index] = history[_binarySearch(_drawIds[index])]; - } - return _data; - } - - function _push(Draw memory _draw) internal { - Draw[] memory _history = history; - if (_history.length > 0) { - Draw memory _newestDpr = history[history.length - 1]; - require( - _draw.drawId > _newestDpr.drawId, - "DrawIDBinarySearchHarness/non-sequential-dpr" - ); - } - history.push(_draw); - } -} diff --git a/contracts/prototype/IDBinarySearch.sol b/contracts/prototype/IDBinarySearch.sol deleted file mode 100644 index 551281d..0000000 --- a/contracts/prototype/IDBinarySearch.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; - -/** - * @title PoolTogether V4 IDBinarySearch - * @author PoolTogether Inc Team - * @notice IDBinarySearch creates a binary search tree for ID values in ordered list - Developed as a prototype for simple lookups using just a Draw ID - */ - -contract IDBinarySearch { - uint32[] internal idHistory; - - /** - * @notice constructor - @ @dev When initializing the IDBinarySearch, a ID history can be injected into the contract state. - Injecting history allows the protocol to stay modular in case of updates to the ID history instance in other contracts. - * @param _idHistoryInject uint32[] - Inject a historical DrawID reference history - */ - constructor(uint32[] memory _idHistoryInject) { - idHistory = _idHistoryInject; - } - - function push(uint32 drawId) public { - idHistory.push(drawId); - } - - function getNewestIndex() external view returns (uint32) { - return _getNewestIndex(idHistory); - } - - /* =================================================== */ - /* Internal ========================================== */ - /* =================================================== */ - - function _getIndexForDrawId(uint32 _drawId) internal view returns (uint256) { - return _binarySearchWithRangeChecks(_drawId, idHistory); - } - - function _getNewestIndex(uint32[] memory _idHistory) internal pure returns (uint32) { - return _idHistory[_idHistory.length - 1]; - } - - function _binarySearchWithRangeChecks(uint32 _drawId, uint32[] memory _history) - internal - view - returns (uint32) - { - uint32[] memory _idHistory = _history; - - uint32 cardinality = uint32(_idHistory.length); - require(cardinality > 0, "IDBinarySearch/no-prize-tiers"); - - uint32 leftSide = 0; - uint32 rightSide = cardinality - 1; - uint32 oldestDrawId = _idHistory[leftSide]; - uint32 newestDrawId = _idHistory[rightSide]; - - require(_drawId >= oldestDrawId, "IDBinarySearch/draw-id-out-of-range"); - if (_drawId >= newestDrawId) return _idHistory[rightSide]; - if (_drawId == oldestDrawId) return _idHistory[leftSide]; - return _binarySearch(_drawId, leftSide, rightSide, _idHistory); - } - - function _binarySearch( - uint32 _drawId, - uint32 leftSide, - uint32 rightSide, - uint32[] memory _history - ) internal view returns (uint32) { - return idHistory[_binarySearchIndex(_drawId, leftSide, rightSide, _history)]; - } - - function _binarySearchIndex( - uint32 _drawId, - uint32 _leftSide, - uint32 _rightSide, - uint32[] memory _history - ) internal pure returns (uint32) { - uint32 index; - uint32 leftSide = _leftSide; - uint32 rightSide = _rightSide; - while (true) { - uint32 center = leftSide + (rightSide - leftSide) / 2; - uint32 centerID = _history[center]; - - if (centerID == _drawId) { - index = center; - break; - } - - if (centerID < _drawId) { - leftSide = center + 1; - } else if (centerID > _drawId) { - rightSide = center - 1; - } - - if (leftSide == rightSide) { - if (centerID >= _drawId) { - index = center - 1; - break; - } else { - index = center; - break; - } - } - } - return index; - } -} diff --git a/contracts/test/DrawIDAndStructMappingBinarySearch.sol b/contracts/test/DrawIDAndStructMappingBinarySearch.sol deleted file mode 100644 index d526cbe..0000000 --- a/contracts/test/DrawIDAndStructMappingBinarySearch.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.6; -import "../abstract/DrawIDBinarySearch.sol"; - -contract DrawIDAndStructMappingBinarySearch is DrawIDBinarySearch { - struct Draw { - uint32 drawId; - uint256 randomNumber; - } - - uint32[] internal history; - mapping(uint32 => Draw) internal draws; - - constructor(Draw[] memory _history) { - if (_history.length > 0) { - inject(_history); - } - } - - // @inheritdoc DrawIDBinarySearch - function getNewestIndex() internal view override returns (uint32) { - return uint32(history.length - 1); - } - - // @inheritdoc DrawIDBinarySearch - function getDrawIdForIndex(uint256 index) internal view override returns (uint32) { - return history[index]; - } - - function get(uint32 _drawId) external view returns (Draw memory) { - return draws[history[_binarySearch(_drawId)]]; - } - - function list(uint32[] calldata _drawIds) external view returns (Draw[] memory) { - Draw[] memory _data = new Draw[](_drawIds.length); - for (uint256 index = 0; index < _drawIds.length; index++) { - _data[index] = draws[history[_binarySearch(_drawIds[index])]]; - } - return _data; - } - - function inject(Draw[] memory _timeline) public { - require(history.length == 0, "DrawIDAndStructMappingBinarySearch/history-not-empty"); - require(_timeline.length > 0, "DrawIDAndStructMappingBinarySearch/timeline-empty"); - for (uint256 i = 0; i < _timeline.length; i++) { - _push(_timeline[i]); - } - } - - function _push(Draw memory _draw) internal { - if (history.length > 0) { - uint32 _id = history[history.length - 1]; - require( - _draw.drawId > _id, - "DrawIDAndStructMappingBinarySearch/non-sequential-dpr" - ); - } - history.push(_draw.drawId); - draws[_draw.drawId] = _draw; - } -} diff --git a/test/harness/DrawIDBinarySearchHarness.test.ts b/test/harness/DrawIDBinarySearchHarness.test.ts deleted file mode 100644 index 49800f2..0000000 --- a/test/harness/DrawIDBinarySearchHarness.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -// @ts-ignore -import { ethers } from 'hardhat'; -import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { Contract, ContractFactory } from 'ethers'; - -const { getSigners, utils } = ethers; - -describe('DrawIDBinarySearchHarness', () => { - let wallet1: SignerWithAddress; - - let drawIdBinaryHarness: Contract; - let drawIdBinaryHarnessFactory: ContractFactory; - - const structsWithDrawID = [ - { - drawId: 1, - }, - { - drawId: 6, - }, - { - drawId: 9, - }, - { - drawId: 20, - }, - ]; - - before(async () => { - [wallet1] = await getSigners(); - drawIdBinaryHarnessFactory = await ethers.getContractFactory( - 'DrawIDBinarySearchHarness', - wallet1, - ); - }); - - beforeEach(async () => { - drawIdBinaryHarness = await drawIdBinaryHarnessFactory.deploy([]); - }); - - describe('Getters', () => { - it('should succeed to get Draw ID list from history with 1 struct', async () => { - await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([1]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get Draw ID list from history with 2 structs', async () => { - await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }, { drawId: 4 }]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get 3 structs from history with 3 structs', async () => { - await drawIdBinaryHarness.injectTimeline([{ drawId: 1 }, { drawId: 4 }, { drawId: 7 }]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get Draw ID list from history with 4 structs', async () => { - await drawIdBinaryHarness.injectTimeline(structsWithDrawID); - const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - expect(prizeTierFromHistory[1].drawId).to.equal(6); - expect(prizeTierFromHistory[2].drawId).to.equal(9); - }); - }); -}); diff --git a/test/test/DrawIDAndStructMappingBinarySearch.test.ts b/test/test/DrawIDAndStructMappingBinarySearch.test.ts deleted file mode 100644 index a6789b5..0000000 --- a/test/test/DrawIDAndStructMappingBinarySearch.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -// @ts-ignore -import { ethers } from 'hardhat'; -import { expect } from 'chai'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { Contract, ContractFactory } from 'ethers'; - -const { getSigners, utils } = ethers; - -describe('DrawIDAndStructMappingBinarySearch', () => { - let wallet1: SignerWithAddress; - - let drawIdBinaryHarness: Contract; - let drawIdBinaryHarnessFactory: ContractFactory; - - const structsWithDrawID = [ - { - drawId: 1, - randomNumber: 1, - }, - { - drawId: 6, - randomNumber: 1, - }, - { - drawId: 9, - randomNumber: 1, - }, - { - drawId: 20, - randomNumber: 1, - }, - ]; - - before(async () => { - [wallet1] = await getSigners(); - drawIdBinaryHarnessFactory = await ethers.getContractFactory( - 'DrawIDAndStructMappingBinarySearch', - wallet1, - ); - }); - - beforeEach(async () => { - drawIdBinaryHarness = await drawIdBinaryHarnessFactory.deploy([]); - }); - - describe('Getters', () => { - it('should succeed to get Draw ID list from history with 1 struct', async () => { - await drawIdBinaryHarness.inject([{ drawId: 1, randomNumber: 1 }]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([2]); - console.log(prizeTierFromHistory, 'prizeTierFromHistory'); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get Draw ID list from history with 2 structs', async () => { - await drawIdBinaryHarness.inject([ - { drawId: 1, randomNumber: 1 }, - { drawId: 4, randomNumber: 1 }, - ]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get 3 structs from history with 3 structs', async () => { - await drawIdBinaryHarness.inject([ - { drawId: 1, randomNumber: 1 }, - { drawId: 4, randomNumber: 1 }, - { drawId: 7, randomNumber: 1 }, - ]); - const prizeTierFromHistory = await drawIdBinaryHarness.list([1, 4, 10]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - }); - - it('should succeed to get Draw ID list from history with 4 structs', async () => { - await drawIdBinaryHarness.inject(structsWithDrawID); - const prizeTierFromHistory = await drawIdBinaryHarness.list([3, 7, 15]); - console.log(prizeTierFromHistory, 'prizeTierFromHistory'); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - expect(prizeTierFromHistory[1].drawId).to.equal(6); - expect(prizeTierFromHistory[2].drawId).to.equal(9); - }); - }); -}); From 4336fc9681d29d8dd313c52219d5f4ad6f664b18 Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Wed, 26 Oct 2022 16:31:59 -0500 Subject: [PATCH 27/30] fix(tests): fix TwabRewards fork tests --- hardhat.config.ts | 7 +++---- hardhat.network.ts | 1 + package.json | 2 +- scripts/fork/distribute.ts | 11 ++++++++--- scripts/fork/impersonate.ts | 2 +- scripts/fork/pool.ts | 3 ++- scripts/fork/twabRewards.ts | 24 ++++++++++++------------ 7 files changed, 28 insertions(+), 22 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 584b108..097a028 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,4 +1,4 @@ -import '@nomiclabs/hardhat-ethers' +import '@nomiclabs/hardhat-ethers'; import '@nomiclabs/hardhat-etherscan'; import '@nomiclabs/hardhat-waffle'; import '@typechain/hardhat'; @@ -17,7 +17,7 @@ import networks from './hardhat.network'; const optimizerEnabled = !process.env.OPTIMIZER_DISABLED; -const config: HardhatUserConfig | any = { +const config: HardhatUserConfig = { abiExporter: { path: './abis', clear: true, @@ -65,8 +65,7 @@ const config: HardhatUserConfig | any = { 'node_modules/@pooltogether/aave-yield-source/artifacts/contracts/yield-source/ATokenYieldSource.sol/', }, { - artifacts: - 'node_modules/@pooltogether/v4-core/artifacts/contracts/prize-pool/YieldSourcePrizePool.sol', + artifacts: 'node_modules/@pooltogether/v4-core/artifacts/contracts/', }, ], }, diff --git a/hardhat.network.ts b/hardhat.network.ts index f51cefe..60056fc 100644 --- a/hardhat.network.ts +++ b/hardhat.network.ts @@ -21,6 +21,7 @@ const networks: HardhatUserConfig['networks'] = { if (alchemyUrl && Boolean(process.env.FORK_ENABLED) && mnemonic) { networks.hardhat = { + allowUnlimitedContractSize: true, chainId: 1, forking: { url: alchemyUrl, diff --git a/package.json b/package.json index 332f349..c716970 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "distribute": "hardhat --network localhost fork:distribute", "remove-logs": "yarn run hardhat remove-logs", "twab-rewards-fork": "wait-on tcp:8545 && yarn impersonate && yarn distribute && hardhat --network localhost fork:twab-rewards", - "run-twab-rewards-fork": "npm-run-all -p -r start-fork twab-rewards-fork", + "run-twab-rewards-fork": "OPTIMIZER_DISABLED=true rm -rf deployments/localhost/ && npm-run-all -p -r start-fork twab-rewards-fork", "test": "HIDE_DEPLOY_LOG=true OPTIMIZER_DISABLED=true hardhat test", "prepack": "yarn compile" }, diff --git a/scripts/fork/distribute.ts b/scripts/fork/distribute.ts index 07a5a80..de2d097 100644 --- a/scripts/fork/distribute.ts +++ b/scripts/fork/distribute.ts @@ -1,4 +1,5 @@ import { usdc } from "@studydefi/money-legos/erc20"; +import { Signer } from "ethers"; import { task } from "hardhat/config"; @@ -12,7 +13,7 @@ import { import { action, success } from "../../helpers"; export default task("fork:distribute", "Distribute Ether and USDC").setAction( - async (taskArguments, hre: any) => { + async (taskArguments, hre) => { action("Distributing Ether and USDC..."); const { ethers } = hre; @@ -20,8 +21,12 @@ export default task("fork:distribute", "Distribute Ether and USDC").setAction( const [deployer, attacker] = await getSigners(); const ethHolder = provider.getUncheckedSigner(ETH_HOLDER_ADDRESS_MAINNET); - const poolHolder = provider.getUncheckedSigner(POOL_HOLDER_ADDRESS_MAINNET); - const usdcHolder = provider.getUncheckedSigner(USDC_HOLDER_ADDRESS_MAINNET); + const poolHolder = provider.getUncheckedSigner( + POOL_HOLDER_ADDRESS_MAINNET + ) as unknown as Signer; + const usdcHolder = provider.getUncheckedSigner( + USDC_HOLDER_ADDRESS_MAINNET + ) as unknown as Signer; const usdcContract = await getContractAt(usdc.abi, usdc.address, usdcHolder); const poolContract = await getContractAt(usdc.abi, POOL_TOKEN_ADDRESS_MAINNET, poolHolder); diff --git a/scripts/fork/impersonate.ts b/scripts/fork/impersonate.ts index 6b3865f..ce6319c 100644 --- a/scripts/fork/impersonate.ts +++ b/scripts/fork/impersonate.ts @@ -9,7 +9,7 @@ import { import { action, success } from "../../helpers"; export default task("fork:impersonate", "Impersonate accounts").setAction( - async (taskArguments, hre: any) => { + async (taskArguments, hre) => { action("Impersonate accounts..."); await hre.network.provider.request({ diff --git a/scripts/fork/pool.ts b/scripts/fork/pool.ts index 21cb406..5092545 100644 --- a/scripts/fork/pool.ts +++ b/scripts/fork/pool.ts @@ -16,6 +16,7 @@ export default task("fork:create-pool", "Create pool").setAction( const { deployments: { deploy }, + ethers: { getContractAt }, getNamedAccounts, } = hre; @@ -53,7 +54,7 @@ export default task("fork:create-pool", "Create pool").setAction( ], }); - const yieldSourcePrizePool = await hre.ethers.getContractAt( + const yieldSourcePrizePool = await getContractAt( "YieldSourcePrizePool", yieldSourcePrizePoolAddress ); diff --git a/scripts/fork/twabRewards.ts b/scripts/fork/twabRewards.ts index d05f7bc..506b8ca 100644 --- a/scripts/fork/twabRewards.ts +++ b/scripts/fork/twabRewards.ts @@ -7,7 +7,7 @@ import { action, info, success } from "../../helpers"; import { increaseTime as increaseTimeUtil } from "../../test/utils/increaseTime"; export default task("fork:twab-rewards", "Run TWAB Rewards fork").setAction( - async (taskArguments, hre: any) => { + async (taskArguments, hre) => { action("Run TWAB Rewards fork..."); const { ethers, run } = hre; @@ -76,7 +76,7 @@ export default task("fork:twab-rewards", "Run TWAB Rewards fork").setAction( subtask("deploy-twab-rewards", "Deploy TWAB Rewards") .addParam("ticketAddress", "Prize pool ticket address") - .setAction(async ({ ticketAddress }, hre: any) => { + .setAction(async ({ ticketAddress }, hre) => { action("Deploy TWAB Rewards..."); const { @@ -133,7 +133,7 @@ subtask("create-promotion", "Create TWAB Rewards promotion") const createPromotionTxReceipt = await getTransactionReceipt(createPromotionTx.hash); - const createPromotionTxEvents = createPromotionTxReceipt.logs.map((log: any) => { + const createPromotionTxEvents = createPromotionTxReceipt.logs.map((log) => { try { return twabRewards.interface.parseLog(log); } catch (e) { @@ -142,7 +142,7 @@ subtask("create-promotion", "Create TWAB Rewards promotion") }); const promotionCreatedEvent = createPromotionTxEvents.find( - (event: any) => event && event.name === "PromotionCreated" + (event) => event && event.name === "PromotionCreated" ); success("TWAB Rewards promotion created!"); @@ -153,7 +153,7 @@ subtask("create-promotion", "Create TWAB Rewards promotion") subtask("deposit-into-prize-pool", "Deposit into prize pool") .addParam("prizePoolAddress", "Prize pool address") - .setAction(async ({ prizePoolAddress }, { ethers }: any) => { + .setAction(async ({ prizePoolAddress }, { ethers }) => { action("Deposit into prize pool..."); const { getContractAt, getSigners, utils } = ethers; @@ -183,7 +183,7 @@ subtask("deposit-into-prize-pool", "Deposit into prize pool") subtask("claim-rewards", "Claim rewards") .addParam("twabRewardsAddress", "TWAB Rewards address") .addParam("promotionId", "Id of the promotion", null, types.float) - .setAction(async ({ twabRewardsAddress, promotionId }, { ethers }: any) => { + .setAction(async ({ twabRewardsAddress, promotionId }, { ethers }) => { action("Claim rewards..."); const { getContractAt, getSigners, provider, utils } = ethers; @@ -201,7 +201,7 @@ subtask("claim-rewards", "Claim rewards") const claimRewardsReceipt = await getTransactionReceipt(claimRewardsTx.hash); - const claimRewardsEvents = claimRewardsReceipt.logs.map((log: any) => { + const claimRewardsEvents = claimRewardsReceipt.logs.map((log) => { try { return twabRewards.interface.parseLog(log); } catch (e) { @@ -210,7 +210,7 @@ subtask("claim-rewards", "Claim rewards") }); const rewardsClaimedEvent = claimRewardsEvents.find( - (event: any) => event && event.name === "RewardsClaimed" + (event) => event && event.name === "RewardsClaimed" ); const rewardsClaimedAmount = formatEther(rewardsClaimedEvent?.args["amount"]); @@ -235,7 +235,7 @@ subtask("destroy-promotion", "Destroy promotion") const destroyPromotionReceipt = await getTransactionReceipt(destroyPromotionTx.hash); - const destroyPromotionEvents = destroyPromotionReceipt.logs.map((log: any) => { + const destroyPromotionEvents = destroyPromotionReceipt.logs.map((log) => { try { return twabRewards.interface.parseLog(log); } catch (e) { @@ -244,7 +244,7 @@ subtask("destroy-promotion", "Destroy promotion") }); const promotionDestroyedEvent = destroyPromotionEvents.find( - (event: any) => event && event.name === "PromotionDestroyed" + (event) => event && event.name === "PromotionDestroyed" ); const promotionDestroyedAmount = formatEther(promotionDestroyedEvent?.args["amount"]); @@ -270,7 +270,7 @@ subtask("end-promotion", "End promotion") const endPromotionTx = await twabRewards.endPromotion(promotionId, signer.address); const endPromotionReceipt = await getTransactionReceipt(endPromotionTx.hash); - const endPromotionEvents = endPromotionReceipt.logs.map((log: any) => { + const endPromotionEvents = endPromotionReceipt.logs.map((log) => { try { return twabRewards.interface.parseLog(log); } catch (e) { @@ -279,7 +279,7 @@ subtask("end-promotion", "End promotion") }); const promotionEndedEvent = endPromotionEvents.find( - (event: any) => event && event.name === "PromotionEnded" + (event) => event && event.name === "PromotionEnded" ); const promotionEndedAmount = formatEther(promotionEndedEvent?.args["amount"]); From c6a4611f37a54e6e0e2d44c64d7f94cabb3c3301 Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Wed, 26 Oct 2022 18:17:17 -0500 Subject: [PATCH 28/30] feat(tests): add PrizeTierHistoryV2 tests --- contracts/PrizeDistributionFactoryV2.sol | 6 +- contracts/PrizeTierHistoryV2.sol | 30 +- test/PrizeDistributionFactory.test.ts | 1 - test/PrizeFlush.test.ts | 3 +- test/PrizeTierHistory.test.ts | 105 ++----- test/PrizeTierHistoryV2.test.ts | 372 +++++++++++++++++++++++ test/TwabRewards.test.ts | 1 - 7 files changed, 417 insertions(+), 101 deletions(-) create mode 100644 test/PrizeTierHistoryV2.test.ts diff --git a/contracts/PrizeDistributionFactoryV2.sol b/contracts/PrizeDistributionFactoryV2.sol index cca70f1..5b6b0f0 100644 --- a/contracts/PrizeDistributionFactoryV2.sol +++ b/contracts/PrizeDistributionFactoryV2.sol @@ -213,9 +213,9 @@ contract PrizeDistributionFactoryV2 is Manageable { * @return cardinality and number of picks */ function _calculateCardinalityAndNumberOfPicks( - uint32 _bitRangeSize, + uint8 _bitRangeSize, uint256 _prize, - uint256 _dpr, + uint32 _dpr, uint256 _minPickCost, uint256 _totalSupply ) internal pure returns (uint8 cardinality, uint104 numberOfPicks) { @@ -262,7 +262,7 @@ contract PrizeDistributionFactoryV2 is Manageable { * @param _cardinality Cardinality * @return Total number of picks */ - function _calculateTotalPicks(uint32 _bitRangeSize, uint8 _cardinality) + function _calculateTotalPicks(uint8 _bitRangeSize, uint8 _cardinality) internal pure returns (uint256) diff --git a/contracts/PrizeTierHistoryV2.sol b/contracts/PrizeTierHistoryV2.sol index 2c6f2b9..f80e558 100644 --- a/contracts/PrizeTierHistoryV2.sol +++ b/contracts/PrizeTierHistoryV2.sol @@ -35,10 +35,10 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { mapping(uint32 => PrizeTierV2) internal prizeTiers; /** - * @notice Ceiling for the total sum of tiers from the prize distribution. 1e9 = 100%. + * @notice Ceiling for the dpr and total sum of tiers from the prize distribution. 1e9 = 100%. * @dev It's fixed point 9 because 1e9 is the largest "1" that fits into 2**32 */ - uint256 internal constant TIERS_CEILING = 1e9; + uint256 internal constant CEILING = 1e9; /** * @notice PrizeTierHistoryV2 constructor @@ -63,7 +63,7 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { // @inheritdoc IPrizeTierHistoryV2 function getPrizeTier(uint32 drawId) external view override returns (PrizeTierV2 memory) { - require(drawId > 0, "PrizeTierHistoryV2/draw-id-not-zero"); + require(drawId > 0, "PTH/draw-id-not-zero"); return prizeTiers[history.binarySearch(drawId)]; } @@ -105,8 +105,8 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { returns (uint32) { uint256 length = history.length; - require(length > 0, "PrizeTierHistoryV2/history-empty"); - require(history[length - 1] == newPrizeTier.drawId, "PrizeTierHistoryV2/invalid-draw-id"); + require(length > 0, "PTH/history-empty"); + require(history[length - 1] == newPrizeTier.drawId, "PTH/invalid-draw-id"); _replace(newPrizeTier); return newPrizeTier.drawId; } @@ -116,6 +116,14 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { _replace(newPrizeTier); } + /** + * @notice Check that the Draw Percentage Rate (DPR) is not greater than 1e9 (100%). + * @param _dpr DPR to check + */ + function _checkDPR(uint32 _dpr) internal pure { + require(_dpr <= CEILING, "PTH/dpr-gt-100%"); + } + /** * @notice Check that the total sum of the tiers is not greater than 1e9 (100%). * @param _tiers Array of tiers to check @@ -128,7 +136,7 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { tiersTotalSum += _tiers[index]; } - require(tiersTotalSum <= TIERS_CEILING, "PrizeTierHistoryV2/tiers-gt-100%"); + require(tiersTotalSum <= CEILING, "PTH/tiers-gt-100%"); } /** @@ -142,9 +150,10 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { if (_length > 0) { uint32 _id = history[_length - 1]; - require(_prizeTier.drawId > _id, "PrizeTierHistoryV2/non-sequential-id"); + require(_prizeTier.drawId > _id, "PTH/non-sequential-id"); } + _checkDPR(_prizeTier.dpr); _checkTiersTotalSum(_prizeTier.tiers); history.push(_prizeTier.drawId); @@ -160,14 +169,15 @@ contract PrizeTierHistoryV2 is IPrizeTierHistoryV2, Manageable { */ function _replace(PrizeTierV2 calldata _prizeTier) internal { uint256 cardinality = history.length; - require(cardinality > 0, "PrizeTierHistoryV2/no-prize-tiers"); + require(cardinality > 0, "PTH/no-prize-tiers"); uint32 oldestDrawId = history[0]; - require(_prizeTier.drawId >= oldestDrawId, "PrizeTierHistoryV2/draw-id-out-of-range"); + require(_prizeTier.drawId >= oldestDrawId, "PTH/draw-id-out-of-range"); uint32 index = history.binarySearch(_prizeTier.drawId); - require(history[index] == _prizeTier.drawId, "PrizeTierHistoryV2/draw-id-must-match"); + require(history[index] == _prizeTier.drawId, "PTH/draw-id-must-match"); + _checkDPR(_prizeTier.dpr); _checkTiersTotalSum(_prizeTier.tiers); prizeTiers[index] = _prizeTier; diff --git a/test/PrizeDistributionFactory.test.ts b/test/PrizeDistributionFactory.test.ts index 9d856dc..fb952df 100644 --- a/test/PrizeDistributionFactory.test.ts +++ b/test/PrizeDistributionFactory.test.ts @@ -1,4 +1,3 @@ -// @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; diff --git a/test/PrizeFlush.test.ts b/test/PrizeFlush.test.ts index b59004c..53e769c 100644 --- a/test/PrizeFlush.test.ts +++ b/test/PrizeFlush.test.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -// @ts-ignore import { ethers, artifacts } from 'hardhat'; import { deployMockContract, MockContract } from 'ethereum-waffle'; import { Signer } from '@ethersproject/abstract-signer'; @@ -36,7 +35,7 @@ describe('PrizeFlush', () => { prizeSplitStrategyFactory = await ethers.getContractFactory('PrizeSplitStrategy'); let PrizeSplitStrategy = await artifacts.readArtifact('PrizeSplitStrategy'); - strategy = await deployMockContract(wallet1 as unknown as Signer, PrizeSplitStrategy.abi); + strategy = await deployMockContract(wallet1, PrizeSplitStrategy.abi); }); beforeEach(async () => { diff --git a/test/PrizeTierHistory.test.ts b/test/PrizeTierHistory.test.ts index f8a7a6e..76319d7 100644 --- a/test/PrizeTierHistory.test.ts +++ b/test/PrizeTierHistory.test.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -// @ts-ignore import { ethers } from 'hardhat'; import { Signer } from '@ethersproject/abstract-signer'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; @@ -59,28 +58,16 @@ describe('PrizeTierHistory', () => { ]; const tiersGT1e9 = [ - 141787658, - 0, - 0, - 0, - 85072595, - 0, - 0, - 136116152, - 136116152, - 108892921, - 0, - 0, - 217785843, - 174228675, - 174228675, - 0 + 141787658, 0, 0, 0, 85072595, 0, 0, 136116152, 136116152, 108892921, 0, 0, 217785843, + 174228675, 174228675, 0, ]; const pushPrizeTiers = async () => { - await Promise.all(prizeTiers.map(async (tier) => { - await prizeTierHistory.push(tier); - })); + await Promise.all( + prizeTiers.map(async (tier) => { + await prizeTierHistory.push(tier); + }), + ); }; before(async () => { @@ -125,56 +112,6 @@ describe('PrizeTierHistory', () => { expect(prizeTierFromHistory[2].drawId).to.equal(9); }); - it.skip('should fail to get prize tiers from history', async () => { - const prizeTiersTest = [ - { - bitRangeSize: 5, - drawId: 1, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - }, - { - bitRangeSize: 5, - drawId: 6, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - }, - { - bitRangeSize: 5, - drawId: 9, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - }, - { - bitRangeSize: 5, - drawId: 20, - maxPicksPerUser: 10, - tiers: range(16, 0).map((i) => 0), - expiryDuration: 10000, - prize: toWei('10000'), - endTimestampOffset: 3000, - }, - ]; - - Promise.all(prizeTiersTest.map(async (tier) => { - await prizeTierHistory.push(tier); - })); - - const prizeTierFromHistory = await prizeTierHistory.getPrizeTierList([3, 7, 9]); - expect(prizeTierFromHistory[0].drawId).to.equal(1); - expect(prizeTierFromHistory[1].drawId).to.equal(6); - expect(prizeTierFromHistory[2].drawId).to.equal(9); - }); - it('should return prize tier before our searched draw id', async () => { await pushPrizeTiers(); const prizeTierFromHistory = await prizeTierHistory.getPrizeTier(4); @@ -215,7 +152,7 @@ describe('PrizeTierHistory', () => { it('should fail to push PrizeTier into history because non-sequential-id', async () => { await pushPrizeTiers(); await expect( - prizeTierHistory.push({...prizeTiers[3], drawId: 18}), + prizeTierHistory.push({ ...prizeTiers[3], drawId: 18 }), ).to.be.revertedWith('PrizeTierHistory/non-sequential-id'); }); @@ -228,9 +165,9 @@ describe('PrizeTierHistory', () => { it('should fail to push a PrizeTier if the sum of tiers is greater than 1e9', async () => { prizeTiers[0].tiers = tiersGT1e9; - await expect( - prizeTierHistory.push(prizeTiers[0]), - ).to.be.revertedWith('PrizeTierHistory/tiers-gt-100%'); + await expect(prizeTierHistory.push(prizeTiers[0])).to.be.revertedWith( + 'PrizeTierHistory/tiers-gt-100%', + ); prizeTiers[0].tiers = tiers; }); @@ -285,9 +222,9 @@ describe('PrizeTierHistory', () => { it('should fail to set existing PrizeTier in history from Manager wallet', async () => { await expect( - ( - prizeTierHistory.connect(wallet2 as unknown as Signer) - ).popAndPush(prizeTiers[0]), + prizeTierHistory + .connect(wallet2 as unknown as Signer) + .popAndPush(prizeTiers[0]), ).to.revertedWith('Ownable/caller-not-owner'); }); @@ -296,9 +233,9 @@ describe('PrizeTierHistory', () => { prizeTiers[0].tiers = tiersGT1e9; - await expect( - prizeTierHistory.popAndPush(prizeTiers[0]), - ).to.be.revertedWith('PrizeTierHistory/tiers-gt-100%'); + await expect(prizeTierHistory.popAndPush(prizeTiers[0])).to.be.revertedWith( + 'PrizeTierHistory/tiers-gt-100%', + ); prizeTiers[0].tiers = tiers; }); @@ -320,7 +257,7 @@ describe('PrizeTierHistory', () => { ...prizeTiers[1], bitRangeSize: 12, }; - await prizeTierHistory.replace(prizeTier) + await prizeTierHistory.replace(prizeTier); const prizeTierVal = await prizeTierHistory.getPrizeTier(prizeTier.drawId); expect(prizeTierVal.bitRangeSize).to.equal(12); }); @@ -343,9 +280,9 @@ describe('PrizeTierHistory', () => { prizeTiers[3].tiers = tiersGT1e9; - await expect( - prizeTierHistory.replace(prizeTiers[3]), - ).to.be.revertedWith('PrizeTierHistory/tiers-gt-100%'); + await expect(prizeTierHistory.replace(prizeTiers[3])).to.be.revertedWith( + 'PrizeTierHistory/tiers-gt-100%', + ); prizeTiers[3].tiers = tiers; }); diff --git a/test/PrizeTierHistoryV2.test.ts b/test/PrizeTierHistoryV2.test.ts new file mode 100644 index 0000000..8387688 --- /dev/null +++ b/test/PrizeTierHistoryV2.test.ts @@ -0,0 +1,372 @@ +import { expect } from 'chai'; +import { ethers } from 'hardhat'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { Contract, ContractFactory } from 'ethers'; + +import { IPrizeTierHistoryV2 } from '../types/contracts/interfaces/IPrizeTierHistoryV2'; + +import { range } from './utils/range'; + +const { getSigners, utils } = ethers; +const { parseEther: toWei, parseUnits } = utils; + +describe('PrizeTierHistoryV2', () => { + let wallet1: SignerWithAddress; + let wallet2: SignerWithAddress; + let wallet3: SignerWithAddress; + + let prizeTierHistoryV2: Contract; + let prizeTierHistoryV2Factory: ContractFactory; + + const dpr = parseUnits('0.1', 9); // 10% + const tiers = range(16, 0).map((i) => 0); + + const prizeTiers: IPrizeTierHistoryV2.PrizeTierV2Struct[] = [ + { + bitRangeSize: 5, + drawId: 1, + maxPicksPerUser: 10, + expiryDuration: 10000, + dpr, + endTimestampOffset: 3000, + prize: toWei('10000'), + tiers, + }, + { + bitRangeSize: 5, + drawId: 6, + maxPicksPerUser: 10, + expiryDuration: 10000, + endTimestampOffset: 3000, + dpr, + prize: toWei('10000'), + tiers, + }, + { + bitRangeSize: 5, + drawId: 9, + maxPicksPerUser: 10, + expiryDuration: 10000, + endTimestampOffset: 3000, + dpr, + prize: toWei('10000'), + tiers, + }, + { + bitRangeSize: 5, + drawId: 20, + maxPicksPerUser: 10, + expiryDuration: 10000, + endTimestampOffset: 3000, + dpr, + prize: toWei('10000'), + tiers, + }, + ]; + + const dprGT1e9 = parseUnits('1.1', 9); + + const tiersGT1e9 = [ + 141787658, 0, 0, 0, 85072595, 0, 0, 136116152, 136116152, 108892921, 0, 0, 217785843, + 174228675, 174228675, 0, + ]; + + const pushPrizeTiers = async () => { + await Promise.all( + prizeTiers.map(async (tier) => { + await prizeTierHistoryV2.push(tier); + }), + ); + }; + + before(async () => { + [wallet1, wallet2, wallet3] = await getSigners(); + prizeTierHistoryV2Factory = await ethers.getContractFactory('PrizeTierHistoryV2'); + }); + + beforeEach(async () => { + prizeTierHistoryV2 = await prizeTierHistoryV2Factory.deploy(wallet1.address, []); + }); + + describe('Getters', () => { + it('should succeed to get history length', async () => { + await pushPrizeTiers(); + + expect(await prizeTierHistoryV2.count()).to.equal(4); + }); + + it('should succeed to get oldest Draw Id', async () => { + await pushPrizeTiers(); + + expect(await prizeTierHistoryV2.getOldestDrawId()).to.equal(1); + }); + + it('should succeed to get newest Draw Id', async () => { + await pushPrizeTiers(); + + expect(await prizeTierHistoryV2.getNewestDrawId()).to.equal(20); + }); + + it('should succeed to get a PrizeTier using an index position', async () => { + await pushPrizeTiers(); + + const prizeTier = await prizeTierHistoryV2.getPrizeTierAtIndex(3); + expect(prizeTier.drawId).to.equal(20); + }); + + it('should succeed to get prize tiers from history', async () => { + await pushPrizeTiers(); + + const prizeTierFromHistory = await prizeTierHistoryV2.getPrizeTierList([3, 7, 9]); + + expect(prizeTierFromHistory[0].drawId).to.equal(1); + expect(prizeTierFromHistory[1].drawId).to.equal(6); + expect(prizeTierFromHistory[2].drawId).to.equal(9); + }); + + it('should return prize tier before our searched draw id', async () => { + await pushPrizeTiers(); + + const prizeTierFromHistory = await prizeTierHistoryV2.getPrizeTier(4); + expect(prizeTierFromHistory.drawId).to.equal(prizeTiers[0].drawId); + }); + + it('should fail to get a PrizeTier before history range', async () => { + await pushPrizeTiers(); + + await expect(prizeTierHistoryV2.getPrizeTier(0)).to.revertedWith( + 'PTH/draw-id-not-zero', + ); + }); + + it('should fail to get a PrizeTer after history range', async () => { + await prizeTierHistoryV2.push(prizeTiers[2]); + + await expect(prizeTierHistoryV2.getPrizeTier(4)).to.be.revertedWith( + 'BinarySearchLib/draw-id-out-of-range', + ); + }); + }); + + describe('Setters', () => { + describe('.push()', () => { + it('should succeed to push PrizeTier into history from Owner wallet.', async () => { + await expect(prizeTierHistoryV2.push(prizeTiers[0])).to.emit( + prizeTierHistoryV2, + 'PrizeTierPushed', + ); + }); + + it('should succeed to push PrizeTier into history from Manager wallet', async () => { + await prizeTierHistoryV2.setManager(wallet2.address); + + await expect(prizeTierHistoryV2.connect(wallet2).push(prizeTiers[0])).to.emit( + prizeTierHistoryV2, + 'PrizeTierPushed', + ); + }); + + it('should fail to push PrizeTier into history because non-sequential-id', async () => { + await pushPrizeTiers(); + + await expect( + prizeTierHistoryV2.push({ ...prizeTiers[3], drawId: 18 }), + ).to.be.revertedWith('PTH/non-sequential-id'); + }); + + it('should fail to push PrizeTier into history from Unauthorized wallet', async () => { + await expect( + prizeTierHistoryV2.connect(wallet3).push(prizeTiers[0]), + ).to.be.revertedWith('Manageable/caller-not-manager-or-owner'); + }); + + it('should fail to push a PrizeTier if the sum of tiers is greater than 1e9', async () => { + prizeTiers[0].tiers = tiersGT1e9; + + await expect(prizeTierHistoryV2.push(prizeTiers[0])).to.be.revertedWith( + 'PTH/tiers-gt-100%', + ); + + prizeTiers[0].tiers = tiers; + }); + + it('should fail to push a PrizeTier if the dpr is greater than 1e9', async () => { + prizeTiers[0].dpr = dprGT1e9; + + await expect(prizeTierHistoryV2.push(prizeTiers[0])).to.be.revertedWith( + 'PTH/dpr-gt-100%', + ); + + prizeTiers[0].dpr = dpr; + }); + }); + + describe('.popAndPush()', () => { + it('should succeed to set existing PrizeTier in history from Owner wallet.', async () => { + await pushPrizeTiers(); + + const prizeTier = { + ...prizeTiers[2], + drawId: 20, + bitRangeSize: 16, + }; + + await expect(prizeTierHistoryV2.popAndPush(prizeTier)).to.emit( + prizeTierHistoryV2, + 'PrizeTierSet', + ); + }); + + it('should succeed to set newest PrizeTier in history from Owner wallet.', async () => { + await pushPrizeTiers(); + + const prizeTier = { + ...prizeTiers[2], + drawId: 20, + bitRangeSize: 16, + }; + + await expect(prizeTierHistoryV2.popAndPush(prizeTier)).to.emit( + prizeTierHistoryV2, + 'PrizeTierSet', + ); + }); + + it('should fail to set existing PrizeTier in history due to invalid draw id`.', async () => { + await pushPrizeTiers(); + + const prizeTier = { + ...prizeTiers[0], + drawId: 8, + bitRangeSize: 16, + }; + + await expect(prizeTierHistoryV2.popAndPush(prizeTier)).to.revertedWith( + 'PTH/invalid-draw-id', + ); + }); + + it('should fail to set existing PrizeTier due to empty history', async () => { + await expect(prizeTierHistoryV2.popAndPush(prizeTiers[0])).to.revertedWith( + 'PTH/history-empty', + ); + }); + + it('should fail to set existing PrizeTier in history from Manager wallet', async () => { + await prizeTierHistoryV2.setManager(wallet2.address); + + await expect( + prizeTierHistoryV2.connect(wallet2).popAndPush(prizeTiers[0]), + ).to.revertedWith('Ownable/caller-not-owner'); + }); + + it('should fail to popAndPush a PrizeTier if the sum of tiers is greater than 1e9', async () => { + await prizeTierHistoryV2.push(prizeTiers[0]); + + prizeTiers[0].tiers = tiersGT1e9; + + await expect(prizeTierHistoryV2.popAndPush(prizeTiers[0])).to.be.revertedWith( + 'PTH/tiers-gt-100%', + ); + + prizeTiers[0].tiers = tiers; + }); + + it('should fail to popAndPush a PrizeTier if the dpr is greater than 1e9', async () => { + await prizeTierHistoryV2.push(prizeTiers[0]); + + prizeTiers[0].dpr = dprGT1e9; + + await expect(prizeTierHistoryV2.popAndPush(prizeTiers[0])).to.be.revertedWith( + 'PTH/dpr-gt-100%', + ); + + prizeTiers[0].dpr = dpr; + }); + }); + }); + + describe('replace()', async () => { + it('should successfully emit PrizeTierSet event when replacing an existing PrizeTier', async () => { + await pushPrizeTiers(); + + await expect(await prizeTierHistoryV2.replace(prizeTiers[1])).to.emit( + prizeTierHistoryV2, + 'PrizeTierSet', + ); + }); + + it('should successfully return new values after replacing an existing PrizeTier', async () => { + await pushPrizeTiers(); + + const prizeTier = { + ...prizeTiers[1], + bitRangeSize: 12, + }; + + await prizeTierHistoryV2.replace(prizeTier); + + const prizeTierVal = await prizeTierHistoryV2.getPrizeTier(prizeTier.drawId); + expect(prizeTierVal.bitRangeSize).to.equal(12); + }); + + it('should fail to replace a PrizeTier if not owner', async () => { + await prizeTierHistoryV2.setManager(wallet2.address); + + await expect( + prizeTierHistoryV2.connect(wallet2).replace(prizeTiers[1]), + ).to.be.revertedWith('Ownable/caller-not-owner'); + }); + + it('should fail to replace a PrizeTier because history is empty', async () => { + await expect(prizeTierHistoryV2.replace(prizeTiers[1])).to.be.revertedWith( + 'PTH/no-prize-tiers', + ); + }); + + it('should fail to replace a PrizeTier that is out of range', async () => { + await prizeTierHistoryV2.push(prizeTiers[3]); + + await expect(prizeTierHistoryV2.replace(prizeTiers[0])).to.be.revertedWith( + 'PTH/draw-id-out-of-range', + ); + }); + + it('should fail to replace a PrizeTier if the sum of tiers is greater than 1e9', async () => { + await prizeTierHistoryV2.push(prizeTiers[3]); + + prizeTiers[3].tiers = tiersGT1e9; + + await expect(prizeTierHistoryV2.replace(prizeTiers[3])).to.be.revertedWith( + 'PTH/tiers-gt-100%', + ); + + prizeTiers[3].tiers = tiers; + }); + + it('should fail to replace a PrizeTier if the dpr is greater than 1e9', async () => { + await prizeTierHistoryV2.push(prizeTiers[3]); + + prizeTiers[3].dpr = dprGT1e9; + + await expect(prizeTierHistoryV2.replace(prizeTiers[3])).to.be.revertedWith( + 'PTH/dpr-gt-100%', + ); + + prizeTiers[3].dpr = dpr; + }); + + it('should fail to replace a non-existent PrizeTier', async () => { + await pushPrizeTiers(); + + const prizeTier = { + ...prizeTiers[1], + drawId: 4, + }; + + await expect(prizeTierHistoryV2.replace(prizeTier)).to.be.revertedWith( + 'PTH/draw-id-must-match', + ); + }); + }); +}); diff --git a/test/TwabRewards.test.ts b/test/TwabRewards.test.ts index 5351346..60b87e9 100644 --- a/test/TwabRewards.test.ts +++ b/test/TwabRewards.test.ts @@ -1,4 +1,3 @@ -// @ts-ignore import { ethers } from 'hardhat'; import ERC20MintableInterface from '@pooltogether/v4-core/abis/ERC20Mintable.json'; import TicketInterface from '@pooltogether/v4-core/abis/ITicket.json'; From 28d54f32f2b4c185793ca28645e90e9acaea429d Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Wed, 26 Oct 2022 18:32:35 -0500 Subject: [PATCH 29/30] feat(tests): improve coverage --- contracts/PrizeDistributionFactoryV2.sol | 2 +- contracts/harness/BinarySearchLibHarness.sol | 16 ++--------- test/PrizeFlush.test.ts | 29 ++++++++++++++++---- test/PrizeTierHistory.test.ts | 8 ++++++ 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/contracts/PrizeDistributionFactoryV2.sol b/contracts/PrizeDistributionFactoryV2.sol index 5b6b0f0..9d7db9b 100644 --- a/contracts/PrizeDistributionFactoryV2.sol +++ b/contracts/PrizeDistributionFactoryV2.sol @@ -97,7 +97,7 @@ contract PrizeDistributionFactoryV2 is Manageable { /** * @notice Allows the owner or manager to push a new prize distribution onto the buffer. - * The PrizeTier and Draw for the given draw id will be pulled in, and the total network ticket supply will be used to calculate cardinality. + * The PrizeTier and Draw for the given draw id will be pulled in, and the prize distribution will be computed. * @param _drawId The draw id to compute for * @return The resulting Prize Distribution */ diff --git a/contracts/harness/BinarySearchLibHarness.sol b/contracts/harness/BinarySearchLibHarness.sol index f58dde2..474a1d8 100644 --- a/contracts/harness/BinarySearchLibHarness.sol +++ b/contracts/harness/BinarySearchLibHarness.sol @@ -1,27 +1,17 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.6; + import "../libraries/BinarySearchLib.sol"; contract BinarySearchLibHarness { using BinarySearchLib for uint32[]; uint32[] internal history; - function getIndex(uint32 id) external view returns (uint32) - { + function getIndex(uint32 id) external view returns (uint32) { return history.binarySearch(id); } - - function getIndexes(uint32[] calldata ids) external view returns (uint32[] memory) - { - uint32[] memory data = new uint32[](ids.length); - for (uint256 i = 0; i < ids.length; i++) { - data[i] = history.binarySearch(ids[i]); - } - return data; - } - function set(uint32[] calldata _history) external - { + function set(uint32[] calldata _history) external { history = _history; } } diff --git a/test/PrizeFlush.test.ts b/test/PrizeFlush.test.ts index 53e769c..86b6a2a 100644 --- a/test/PrizeFlush.test.ts +++ b/test/PrizeFlush.test.ts @@ -121,18 +121,37 @@ describe('PrizeFlush', () => { describe('Core', () => { describe('flush()', () => { - it('should fail to call withdrawTo if zero balance on reserve', async () => { - await strategy.mock.distribute.returns(toWei('0')); - await expect(prizeFlush.flush()).to.not.emit(prizeFlush, 'Flushed'); + it('should succeed to flush prizes if positive balance on reserve.', async () => { + await strategy.mock.distribute.returns(toWei('100')); + await ticket.mint(reserve.address, toWei('100')); + await expect(prizeFlush.flush()) + .to.emit(prizeFlush, 'Flushed') + .and.to.emit(reserve, 'Withdrawn'); }); - it('should succeed to call withdrawTo prizes if positive balance on reserve.', async () => { + it('should succeed to flush if manager', async () => { await strategy.mock.distribute.returns(toWei('100')); await ticket.mint(reserve.address, toWei('100')); - await expect(prizeFlush.flush()) + + await prizeFlush.setManager(wallet2.address); + + await expect(prizeFlush.connect(wallet2).flush()) .to.emit(prizeFlush, 'Flushed') .and.to.emit(reserve, 'Withdrawn'); }); + + it('should fail to flush if not manager or owner', async () => { + await prizeFlush.setManager(wallet2.address); + + await expect(prizeFlush.connect(wallet3).flush()).to.be.revertedWith( + 'Manageable/caller-not-manager-or-owner', + ); + }); + + it('should fail to flush if zero balance on reserve', async () => { + await strategy.mock.distribute.returns(toWei('0')); + await expect(prizeFlush.flush()).to.not.emit(prizeFlush, 'Flushed'); + }); }); }); }); diff --git a/test/PrizeTierHistory.test.ts b/test/PrizeTierHistory.test.ts index 76319d7..f1a273c 100644 --- a/test/PrizeTierHistory.test.ts +++ b/test/PrizeTierHistory.test.ts @@ -262,6 +262,14 @@ describe('PrizeTierHistory', () => { expect(prizeTierVal.bitRangeSize).to.equal(12); }); + it('should fail to replace a PrizeTier if not owner', async () => { + await prizeTierHistory.setManager(wallet2.address); + + await expect( + prizeTierHistory.connect(wallet2).replace(prizeTiers[1]), + ).to.be.revertedWith('Ownable/caller-not-owner'); + }); + it('should fail to replace a PrizeTier because history is empty', async () => { await expect(prizeTierHistory.replace(prizeTiers[1])).to.be.revertedWith( 'PrizeTierHistory/no-prize-tiers', From 6282f4c374743553722fd0cf85760ce3d64030bd Mon Sep 17 00:00:00 2001 From: Pierrick Turelier Date: Mon, 7 Nov 2022 15:22:31 -0600 Subject: [PATCH 30/30] fix(contracts): refactor targetPicks calculation --- contracts/PrizeDistributionFactoryV2.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/PrizeDistributionFactoryV2.sol b/contracts/PrizeDistributionFactoryV2.sol index 9d7db9b..8f7f98b 100644 --- a/contracts/PrizeDistributionFactoryV2.sol +++ b/contracts/PrizeDistributionFactoryV2.sol @@ -225,7 +225,12 @@ contract PrizeDistributionFactoryV2 is Manageable { return (cardinality = 1, numberOfPicks); } - uint256 _targetPicks = ((_totalSupply / _minPickCost) * RATE_NORMALIZATION) / _odds; + /** + * maxPicks = totalSupply / minPickCost + * targetPicks = maxPicks / odds = (totalSupply / minPickCost) / ((dpr * totalSupply) / prize) + * targetPicks = (1 / minPickCost) / ((dpr * 1) / prize) = prize / (dpr * minPickCost) + */ + uint256 _targetPicks = (_prize * RATE_NORMALIZATION) / (_dpr * _minPickCost); do { cardinality++;