diff --git a/.env.example b/.env.example index 7757187..63770da 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,3 @@ ETHERSCAN_API_KEY="your-etherscan-api-key" POLYGONSCAN_API_KEY="your-polygonscan-api-key" -MUMBAI_API_KEY="your-alchemy-mumbai-api-key" -MUMBAI_PRIVATE_KEY="0000000000000000000000000000000000000000000000000000000000000000" -IPFS_PINATA_TOKEN="0000000000000000000000000000000000000000000000000000000000000000" \ No newline at end of file +MUMBAI_PRIVATE_KEY="0000000000000000000000000000000000000000000000000000000000000000" \ No newline at end of file diff --git a/.github/workflows/sdk-publish-pipeline.yml b/.github/workflows/sdk-publish-pipeline.yml new file mode 100644 index 0000000..a46ed72 --- /dev/null +++ b/.github/workflows/sdk-publish-pipeline.yml @@ -0,0 +1,65 @@ +name: Diamond Governance SDK publish + +on: + release: + types: [published] + +defaults: + run: + working-directory: ./ + +env: + NODE_VERSION: 18.x + unit-tests: ${{ github.event.inputs.js || true }} + +jobs: + install-dependencies: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - name: Cache node modules + uses: actions/cache@v3 + with: + path: | + **/node_modules + key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build- + + unit-tests: + runs-on: ubuntu-latest + needs: install-dependencies + steps: + - uses: actions/checkout@v3 + - name: Restore cache + uses: actions/cache@v3 + id: restore-node_modules + with: + path: | + **/node_modules + key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }} + - name: Install dependencies + if: steps.restore-node_modules.outputs.cache-hit != 'true' + run: npm install + - name: Install typescript + run: npm i typescript -g + - name: Generate sdk + run: npm run generate-sdk + - name: Enter sdk directory + run: cd sdk + - name: Increment npm package version + run: npm version minor + - name: Compile package + run: tsc --declaration + - name: Publish + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + diff --git a/.github/workflows/unit-test-pipeline.yml b/.github/workflows/unit-test-pipeline.yml index 660a569..00ee093 100644 --- a/.github/workflows/unit-test-pipeline.yml +++ b/.github/workflows/unit-test-pipeline.yml @@ -9,8 +9,6 @@ on: default: true required: false - push: - branches: [ "main", "dev" ] pull_request: branches: [ "main", "dev" ] diff --git a/.gitignore b/.gitignore index c1057fd..ea1b868 100644 --- a/.gitignore +++ b/.gitignore @@ -109,3 +109,7 @@ artifacts/ cache/ typechain-types/ .DS_Store +generated/abis.json +generated/client.ts +generated/functionSelectors.json +generated/variableSelectors.json diff --git a/FACET_DEV.md b/FACET_DEV.md index 8c8293b..1b03903 100644 --- a/FACET_DEV.md +++ b/FACET_DEV.md @@ -6,7 +6,9 @@ This guide assumes you have basic knowledge on Solidity smart contract developme You can follow this [CryptoZombies](https://cryptozombies.io/) course to get started on learning Solidity. Everytime you modify your solidity files and get a type error somewhere, don't forget to run `npm run compile` or `npx hardhat compile`. -If this doesn't work you can try running `npx hardhat clean` (before running the above commands again) and see if that works. +If this doesn't work you can try running `npx hardhat clean` (before running the previous command again) and see if that works. + +The complete example facet (and other files used in this guide) can be found in the [`example-facet`](/example-facet) directory. @@ -20,9 +22,9 @@ If this doesn't work you can try running `npx hardhat clean` (before running the - [Storage access](#counterfacetsol-1) - [Facet initialization](#facet-initialization) - [Write an init function](#write-an-init-function) - - [Add an init call](#add-init-call-in-central-init-function) - - [Deploy your library](#deploy-your-library) - [Add your parameters](#add-your-parameters) +- [Exposing getters/setters](#exposing-getterssetters) +- [Inheriting from interfaces](#inheriting-from-interfaces) - [Testing your facets](#testing-your-facets) - [With the whole diamond](#deploying-the-whole-diamond) - [Isolated testing](#deploying-just-the-base-diamond) @@ -39,12 +41,28 @@ Facet development works as follows: First create a new solidity contract in the `/facets` folder. Let's call this contract `CounterFacet.sol`. This contract should specify a pragma and should ideally also specify an SDPX-license. +Every facet should follow the following structure/template. #### **`CounterFacet.sol`** ```solidity -contract CounterFacet { +contract CounterFacet is IFacet { + /// @inheritdoc IFacet + function init(bytes memory /*_initParams*/) public virtual override { } + + /* This init function is needed for the (typescript) deployment to automatically + * detect the parameters for initialization. + * The naming convention for this function is as follows: + * __[ContractName]_init() + */ + function __CounterFacet_init() public virtual { } + + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); // call the deinit() function of the superclass as convention. + } + /// @notice This function increments a number by 1 - /// @returns uint The new value of our number + /// @return uint The new value of our number function incrementCounter() external returns (uint) { return 0; // This value will be replaced with the new incremented value of our integer later } @@ -52,89 +70,26 @@ contract CounterFacet { ``` ### Deploying the facet contract -This facet can be added to our diamond by cutting it into the diamond. -The deployment scripts (for the diamond) are all located in the `/deployments` folder. -There are a lot of files for deployment but for now the only relevant one is `deploy_DiamondGovernance.ts` (it will become clear later what the other files are for). -3 things must be done to deploy the contract: - -1. Deploying the contract in the function **deployDiamondGovernance()**. - - In order to deploy a contract in (hardhat) ethers, - the contract factory (abi/template) must first be requested using the **ethers.getContractFactory("Your contract name")** method. - The contract can then be deployed by calling the **factory.deploy()** method. - It doesn't really matter where in the function you deploy the contract, but please do stick to the existing naming convention (...FacetContract for the Factory, and ...Facet for the deployed contract). - - Ideally you would also like to log that you've deployed the contract. - - #### **`deploy_DiamondGovernance.ts`** - ```ts - async function deployDiamondGovernance() : Promise { - /* ... */ - - const CounterFacetContract = await ethers.getContractFactory("CounterFacet"); - const CounterFacet = await CounterFacetContract.deploy(); - console.log(`CounterFacet deployed at ${CounterFacet.address}`); - - /* ... */ - } - ``` -2. Add the contract type to the returned object. - - At the end of the **deployDiamondGovernance()** function there is a returned object. - This object should be used to return the deployment of our facet in this object so the facet can later be cut (added) into the diamond. - First import your contract type at the top of the file. - This should be imported from `../typechain-types`. - Next add your type to the Facets field in the return interface called **DiamondDeployedContracts**. - Finally add your facet to the returned object in the **deployDiamondGovernance()** function. - - #### **`deploy_DiamondGovernance.ts`** - ```ts - // Types - import { CounterFacet } from "../typechain-types"; // Import facet type here - - /* ... */ - - interface DiamondDeployedContracts { - /* ... */ - Facets: { - /* ... */ - Counter: CounterFacet; // Change this here - } - } - - /* ... */ - - async function deployDiamondGovernance() : Promise { - /* ... */ - - return { - /* ... */ - Facets: { - /* ... */ - Counter: CounterFacet, // Change this here - } - }; - } - ``` +Your facet will get automatically detected and deployed to the blockchain network. +You don't have to do anything. ### Cutting the facet -In the same `deploy_DiamondGovernance.ts` file you can find a function called **createDiamondGovernanceRepo()**. -At the top of the function there is function a call to **deployDiamondGovernance()**, where our facet was previously deployed and returned. -To add your facet into the diamond, an object must be added/pushed into the "cut" array. This object should have the following structure: +Now that your facet is deployed, it is time to cut it into (add it to) the diamond. + +You can achieve this feat by opening the `Deploy.ts` file in the `scripts` folder, and modifying the cut array as such: -#### **`deploy_DiamondGovernance.ts`** +#### **`Deploy.ts`** ```ts -{ - facetAddress: diamondGovernanceContracts.Facets.YourFacet.address, // Change this to your facet - action: FacetCutAction.Add, - functionSelectors: getSelectors(diamondGovernanceContracts.Facets.YourFacet) // Change this to your facet -} +const cut : DiamondCut[] = [ + // ... + await DiamondCut.All(diamondGovernance.CounterFacet), +]; ``` -Optionally you can also select only specific functions that you want to expose to the diamond. - +It is also possible to pick only a specific subset of functions to expose. You will need need to use either the `Only` or `Except` functions. Some examples: ```ts -functionSelectors: getSelectors(diamondGovernanceContracts.Facets.YourFacet).get(["foo(uint)", "bar(bool)"]).remove("foobar(address)") +await DiamondCut.Only(diamondGovernance.GovernanceERC20DisabledFacet, ERC20Disabled), +await DiamondCut.Except(diamondGovernance.GovernanceERC20BurnableFacet, ERC20Disabled, [erc20Settings]), ``` That's it, you've now successfully added your very basic facet to the diamond. @@ -172,6 +127,8 @@ We can access this storage by importing the contract above and calling getStorag #### **`CounterFacet.sol`** ```solidity contract CounterFacet { + /* ... init related functions */ + /// @notice This function increments our number by 1 /// @returns uint The updated value of our number function incrementCounter() external returns (uint) { @@ -181,7 +138,7 @@ contract CounterFacet { } /// @notice Returns the current value of our number - /// @returns uint The current value of our number + /// @return uint The current value of our number function getCounter() external view returns (uint) { return LibCounterStorage.getStorage().myNumber; } @@ -191,141 +148,132 @@ contract CounterFacet { ## Facet initialization Suppose our facet needs to have an initial number. -It is not possible to simply create a constructor because this constructor will be executed when the facet is deployed (and not cut) and the variables it sets will not be shared with the diamond. +It is not possible to simply create a constructor because this constructor will be executed when the facet is deployed (and not cut) and the variables it sets will not be shared with the diamond (no access to the previously created storage). The diamond also cannot execute the constructor when the facet is cut into the diamond. -The way initialization works in our diamond structure is as follows: -1. Write a "init" function in a separate "library contract". -2. All init functions are called from a central init function. Add a call to your init function here. -3. It is not possible to make a call to a non-deployed library. Add a deployment for your library. -4. Add your parameters to the function call to the central init function. +This is why the CounterFacet implements IFacet and needs to have a unique init function. +1. Create a struct for your init parameters +2. Decode the parameters and sets the storage variables +3. (Optional) Call the init function of the superclass This might seem a bit confusing at first, but it is much simpler than it seems. This guide will show you step-by-step how to add initialization to your facet. ### Write an init function Usually initialization is done in the constructor but for our diamond a separate "init" function is needed. -To do this add a library at the top of your `CounterFacet.sol` file. +For now the **deinit()** function can be ignored, it will be explained in the next section. #### **`CounterFacet.sol`** ```solidity -library CounterFacetInit { - // Put your initialization parameters here as you would for your constructor - struct InitParams { - uint myInitialNumber; - } +contract CounterFacet is IFacet { + struct CounterFacetInitParams { + uint myNumber; + } - // Initialize your storage variables here - function init(InitParams calldata _params) external { - LibCounterStorage.Storage storage s = LibCounterStorage.getStorage(); + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + // Decode the parameters + CounterFacetInitParams memory _params = abi.decode(_initParams, (CounterFacetInitParams)); + // Set the storage variables using the unique init + __CounterFacet_init(_params); + } - s.myNumber = _params.myInitialNumber; - } -} + /* This init function is needed for the (typescript) deployment to automatically + * detect the parameters for initialization. + */ + function __CounterFacet_init(CounterFacetInitParams memory _initParams) public virtual { + LibCounterStorage.Storage storage ds = LibCounterStorage.getStorage(); + ds.myNumber = _initParams.myNumber; + } -contract CounterFacet { ... } + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); // call the deinit() function of the superclass as convention. + } + + /* ... other functions */ +} ``` -### Add init call in central init function -The `DiamondInit.sol` file acts like a central init function that calls all initialization functions. -The **init()** function has been created but it isn't called anywhere. -To call this function the library needs to be added to the `DiamondInit.sol` file. -Add your file import like so: +The deployment script will automatically detect the init parameters and encode them for you. +It will also call the init function upon cutting the facet into the diamond. +You will still need to add the parameters to the deployment script though. -#### **`DiamondInit.sol`** -```solidity -import { CounterFacetInit } from "../facets/CounterFacet.sol"; +### Add your parameters +Now in the **main()** function (in `Deploy.ts`), add your parameters/settings: + +#### **`Deploy.ts`** +```ts +const cut : DiamondCut[] = [ + // ... + const counterSettings = { + myNumber: 0, + }; + + await DiamondCut.All(diamondGovernance.CounterFacet, [counterSettings]), +]; ``` -Then in the **init()** function in the **DiamondInit** contract, -add the InitParams to the parameters for the **init()** function -and at the bottom of the same function add the call to the **init()** function (of the **CounterFacetInit**) with parameters. Like so: +That's about it for the initialization stuff. + +## Exposing getters/setters +It is possible to automatically expose getters/setters (for the storage variables) in your facet through the sdk. +This is done by following the following naming convention (the sdk will automatically detect this): -#### **`DiamondInit.sol`** ```solidity -contract DiamondInit { - function init( - /* ... other settings */ - CounterFacetInit.InitParams memory _counterSettings // Change this here - ) external { - // ... some ERC165 stuff - - CounterFactInit.init(_counterSettings); // Change this here - } -} +function get () external view returns () {} +set ( _) external {} ``` -### Deploy your library -Next the (init) library must be deployed. Add your library to the **deployLibraries()** function in `deploy_Libraries.ts` file. +In our example that would be: -#### **`deploy_Libraries.ts`** -```ts -interface Libraries { - // ... - CounterFacetInit: string; // Change this here -} +```solidity +contract CounterFacet { + /* ... init related functions */ -async function deployLibraries() : Promise { - // ... - const CounterFacetInitContract = await ethers.getContractFactory("CounterFacetInit"); // Change this here - const CounterFacetInit = await CounterFacetInitContract.deploy(); // Change this here + function getMyNumber() external view returns (uint) { + return LibCounterStorage.getStorage().myNumber; + } - return { - // ... - CounterFacetInit: CounterFacetInit.address, // Change this here - }; + function setMyNumber(uint _myNumber) external { + LibCounterStorage.getStorage().myNumber = _myNumber; + } } ``` -Then add the address of the deployed library to the parameters at the top of the **deployDiamondGovernance()** function. +Note that the function name should be camelCase and the first letter of the variable should be capitalized. +The parameter name should be the same as the variable name but with an `_` in front of it. +You can freely add other modifiers to these functions as well. -#### **`deploy_DiamondGovernance.ts`** -```ts -const DiamondInitContract = await ethers.getContractFactory('DiamondInit', { - libraries: { - // ... - CounterFacetInit: libraries.CounterFacetInit, // Change this here - } -}); -``` +These getters/setters are now available through the sdk: -### Add your parameters -Now in the **createDiamondGovernanceRepo()** function, add your parameters/settings: - -#### **`deploy_DiamondGovernance.ts`** ```ts -async function createDiamondGovernanceRepo(/*...*/) { - // ... cutting stuff - - // ... other settings - - const counterSettings = { // Change this here - myInitialNumber: 7, - } - - const constructionArgs = { - _diamondCut: cut, - _init: diamondGovernanceContracts.DiamondInit.address, - _calldata: diamondGovernanceContracts.DiamondInit.interface.encodeFunctionData("init", [/*...other_settings, */ counterSettings]) // Change this here - }; - - // installation stuff -} +const allVariables = await client.sugar.GetVariables(); ``` -That's about it for the initialization stuff. +This function only returns the variable names and relevant interfaces, so you'll still have to call the functions yourself. ## Inheriting from interfaces -Interfaces are really nice. Interfaces create standards and consensus between developers all around the world. Another neat thing about interfaces is that we can fairly easily swap out our current Counter implementation with a new one if we wanted to (as long as they both implement the interface). +Interfaces are really nice. +Interfaces create standards and consensus between developers all around the world. +Another neat thing about interfaces is that we can fairly easily swap out our current Counter implementation with a new one if we wanted to (as long as they both implement the interface). Suppose we have the following interface (we can add this in the same folder as we added `CounterFacet.ts`): -#### **`ICounter.sol`** +#### **`ICounterFacet.sol`** ```solidity -interface ICounter { +interface ICounterFacet { /// @notice This function increments a number by 1 - /// @returns uint The new value of our number + /// @return uint The new value of our number function incrementCounter() external returns (uint); + + /// @notice This function returns our number + /// @return uint The value of our number + function getMyNumber() external view returns (uint); + + /// @notice This function sets our number + /// @param _myNumber The new value of our number + function setMyNumber(uint _myNumber) external; } ``` @@ -333,179 +281,124 @@ We can implement it as follows. #### **`CounterFacet.sol`** ```solidity -contract CounterFacet is ICounter { - /// @inheritdoc CounterInterface - function incrementCounter() external returns (uint) { /*...*/ } +contract CounterFacet is ICounterFacet, IFacet { + /* ... init related functions */ + + /// @inheritdoc ICounterFacet + function incrementCounter() external override returns (uint) { /*...*/ } + + /// @inheritdoc ICounterFacet + function getMyNumber() external view override returns (uint) { /*...*/ } + + /// @inheritdoc ICounterFacet + function setMyNumber(uint _myNumber) external override { /*...*/ } } ``` -Add the interface to the interface ids in `/utils/InterfaceIds.sol`. +To support the interface call the function **registerInterface()** in the init function of your facet. +#### **`CounterFacet.sol`** ```solidity -import { ICounter } from "../facets/ICounter.sol"; +contract CounterFacet is ICounter, IFacet { + /* ... init related functions */ + + function __CounterFacet_init(CounterFacetInitParams memory _initParams) public virtual { + /* ... initialization stuff */ -library InterfaceIds { - // ... other interfaces - bytes4 constant public ICounter = type(ICounter).interfaceId; // Change this here + // This function comes from IFacet, it adds the interface to the supported interfaces + registerInterface(type(ICounter).interfaceId); // Change this here + } + + /* ... other functions */ } ``` -Now we show the world that we implement this interface (ERC165) in the `DiamondInit.sol` file. +When the facet is cut into the diamond, the init will add the interface to the supported interfaces, but the interface will still be supported after the facet is removed from the diamond. +The interface should be unregistered in the deinit function. -#### **`DiamondInit.sol`** +#### **`CounterFacet.sol`** ```solidity -import { ICounter } from "../utils/InterfaceIds.sol"; +contract CounterFacet is ICounterFacet, IFacet { + /* ... init related functions */ -// ... + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); // call the deinit() function of the superclass as convention. -contract DiamondInit { - function init(/* ... */) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(ICounter).interfaceId] = true; // Change this here + // This function comes from IFacet, it removes the interface from the supported interfaces + unregisterInterface(type(ICounterFacet).interfaceId); // Change this here + } - // ... - } + /* ... other functions */ } ``` +Anything else that needs to be run when the facet is removed from the diamond can be added to the deinit function too. + That's about it for interface implementation. ## Testing your facets -All tests must be placed within the `/test` folder. Tests are written in Chai. There are two ways to test your facets. - -1. Using the full fletched diamond with all the other facets. -2. Using the base diamond provided by us and adding the facet on top. (Isolated facet testing) - -It is recommended to use method 2, because this reduces the influence of outside factors (isolated testing is nicer). - -### Deploying the whole diamond -First create a test file `/test/Test_Counter1.ts`. -To get a diamond and the relevant data needed to test your facets, simply call the function **deployAragonDAOWithFramework()** found in `/deployments/deploy_AragonDAO.ts`. -It is however strongly recommended you use the **loadFixture()** functionality, because this will revert the local (hardhat) blockchain to the last saved point. +All tests must be placed within the `/test` folder. +Tests are written in Chai. +The tests are run using the hardhat framework. #### **`Test_Counter1.ts`** ```ts -import { ethers } from "hardhat"; -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + + // The settings for the CounterFacet + const CounterFacetSettings = { // Change this + myNumber: 0, + }; + const cut : DiamondCut[] = [ // Change this + ...await defaultDiamondCut(diamondGovernance), + await DiamondCut.All(diamondGovernance.CounterFacet, [CounterFacetSettings]), + ]; + + const settings : DAOCreationSettings = { + trustedForwarder: ethers.constants.AddressZero, + daoURI: "https://plopmenz.com", + subdomain: "mydao", + metadata: { + name: "Name", + description: "Description", + links: [], + avatar: "Avatar" + }, + diamondCut: cut, + additionalPlugins: [] + }; + const dao = await CreateDAO(settings, owner); + return new DiamondGovernanceClient(dao.diamondGovernance.address, owner); +} -describe("Counter facet", function () { +// Write your test(s) here +describe("CounterFacet", function () { it("should increment a number!", async function () { - const { DiamondGovernance, diamondGovernanceContracts, verificationContractAddress, DAO } = await loadFixture(deployAragonDAOWithFramework); + const client = await loadFixture(getClient); + const ICounter = await client.pure.ICounter(); - const CounterFacet = await ethers.getContractAt("CounterFacet", DiamondGovernance.address); - // Number should be 7 initially (due to init settings) - const myNumber = await CounterFacet.getCounter(); + const myNumber = await ICounter.getCounter(); expect(myNumber).to.be.equal(7); - const incrementedNumber = await CounterFacet.incrementCounter(); + const incrementedNumber = await ICounter.incrementCounter(); expect(incrementedNumber).to.be.equal(8); // Number should be 8 after incrementing - const myNewNumber = await CounterFacet.getCounter(); + const myNewNumber = await ICounter.getCounter(); expect(myNewNumber).to.be.equal(incrementedNumber); }); }); ``` -### Deploying just the base diamond -To get a minimal deploy of the diamond (without all the other facets), a separate init file must be created, our central init doesn't work here because it calls init functions that aren't added to the diamond. -Let's go ahead and create `DICounter.sol` (DI stands for DiamondInit) in `/contracts/upgrade-initializers/single-contract-init`. -The contents of this file should be similar to the contents we talked about in the [Facet Initialization](#facet-initialization) section. - -#### **`DICounter.sol`** -```solidity -contract DICounter { - function init( - CounterFacetInit.InitParams memory _counterSettings // Change this here - ) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(ICounter).interfaceId] = true; // Change this here - - CounterFacetInit.init(_counterSettings); // Change this here - } -} -``` - -Our tests can then be written in `/test/Test_Counter2.ts`. -Note that **deployBaseAragonDAO** is used here and not **deployAragonDAOWithFramework**. - -#### **`Test_Counter2.ts`** -```ts -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { deployBaseAragonDAO } from "../deployments/deploy_BaseAragonDAO"; -import { DiamondDeployedContractsBase, addFacetToDiamondWithInit } from "../deployments/deploy_DGSelection"; - -describe("Counter facet", () => { - it("test some specific counter facet stuff", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - - // Contract names - const contractNames = { - facetContractName: "CounterFacet", - facetInitContractName: "CounterFacetInit", - diamondInitName: "DICounter", - } - - // Deploy facet contract - const counterSettings = { - myInitialNumber: 7, - } - - await addFacetToDiamondWithInit(diamondGovernanceContracts, DiamondGovernance.address, contractNames, counterSettings); - - // We can now access our facet through the diamond - const CounterFacet = await ethers.getContractAt("CounterFacet", DiamondGovernance.address); - // Number should be 7 initially (due to init settings) - const myNumber = await CounterFacet.getCounter(); - expect(myNumber).to.be.equal(7); - }); -}); -``` - -A nice way to structure this is to split the above function up so the facet cutting can then later be reused in other tests. Like this: - -#### **`/test/facet-selection/addSingleFacet.ts`** -```ts -const addCounterFacet = async (diamondGovernanceContracts: DiamondDeployedContractsBase, diamondGovernanceAddress: string) => { - // Contract names - const contractNames = { /* ... */ } - - // Deploy facet contract - const counterSettings = { /* ... */ } - - await addFacetToDiamondWithInit(diamondGovernanceContracts, diamondGovernanceAddress, contractNames, counterSettings); -} -``` - -#### **`Test_Counter2.ts`** -```ts -describe("Counter facet", () => { - it("test some counter facet stuff", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - - // Add CounterFacet to the diamond - await addCounterFacet(diamondGovernanceContracts, DiamondGovernance.address); - - // We can now access our facet through the diamond - const CounterFacet = await ethers.getContractAt("CounterFacet", DiamondGovernance.address); - // Number should be 7 initially (due to init settings) - const myNumber = await CounterFacet.getCounter(); - expect(myNumber).to.be.equal(7); - }); -}); -``` - ### What to do when your function is 'auth'ed? Some functions can only be called from within the diamond. -To test these functions you can create a "mock" facet that exposes a function that calls the private or authed function. -The mock itself should generally not need initialization or storage, and should never be included in the diamond outside of tests. -This mock can then be used to test in the same way as a normal facet. - -We'll leave this as an exercise to the reader. +To be still able to test this functionality you can swap out AuthConsumer for AuthConsumerMock in the tests. +This is done by default so you don't have to worry about it. \ No newline at end of file diff --git a/README.md b/README.md index c13b7d0..9cebf29 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Multiple governance structures have been defined for plugins to interact with ea #### Membership These structures are related to what wallets are considered members of the DAO and other member-related information, such as ranks. ##### Base -All these plugins are based on the IMembership of Aragon. +All these plugins are based on the [`IMembership`](https://github.com/aragon/osx/blob/develop/packages/contracts/src/core/plugin/membership/IMembership.sol) of Aragon. ##### Extended This interface requires the implementer to be able to tell if a wallet is a member at a certain timestamp and be able to provide a list of wallets that have been members at some point. This information can be used to loop over all members at a given timestamp on chain. ##### Tiered @@ -80,7 +80,7 @@ The permission management defines which wallets are allowed to do certain action Currently, this is the only permission provider using the grant functionality of the DAO. However, the implementation allows for more providers to be added easily in the future and also allows members to use their own custom permission provider if wanted. ## Other ### Verification -First plugin to implement [Secure SECO Verification](https://github.com/SecureSECODAO/SecureSECOVerification). Allowing wallets to become members of the DAO by verifying with their 1-year-old GitHub account or proof of humanity. +Diamond Governance is the plugin to implement [Secure SECO Verification](https://github.com/SecureSECODAO/SecureSECOVerification), allowing wallets to become members of the DAO by verifying with their 1-year-old GitHub account or proof of humanity. ### GitHub Pull Request Merger Allows the plugin to merge pull requests on GitHub. This means that DAO members will be able to maintain the GitHub without needing to trust a centralized team of reviewers. This does however require some setup, which can be found on [their GitHub](https://github.com/SecureSECODAO/SecureSECOPullRequestMerger). ## Planned @@ -99,11 +99,13 @@ NodeJS (>=14.x.x)   npm (>=6.x.x)   ## Build process +``` npm i   npm run compile   +``` ## Secrets -Copy the .env.example file to a file called .env (located in the same folder). In this file you are required to add the secrets for any of the features you would like to use (MUMBAI_PRIVATE_KEY if you would like to deploy to Mumbai for example). +Copy the [`.env.example`](./.env.example) file to a file called `.env` (located in the same folder). In this file you are required to add the secrets for any of the features you would like to use (`MUMBAI_PRIVATE_KEY` if you would like to deploy to Mumbai for example). # Commands available ## npm run compile @@ -127,6 +129,9 @@ npm publish ``` Publishing to npm will be done automatically on merging with main in the future. +## npx hardhat run ./scripts/GenerateDiamondCutProposal.ts --network mumbai +Use this command to generate a proposal with a specific diamond cut, please provide the file with the desired cut and proposal metadata before running this command. Also make sure you private key is filled in the .env with a verified DAO member able to create proposals. + ### Facet development To learn more about facet development you can look into the [`FACET_DEV.md`](/FACET_DEV.md) file. diff --git a/contracts/DiamondGovernance.sol b/contracts/DiamondGovernance.sol index 3aac721..ebcda54 100644 --- a/contracts/DiamondGovernance.sol +++ b/contracts/DiamondGovernance.sol @@ -17,10 +17,9 @@ import { LibDiamond } from "./libraries/LibDiamond.sol"; import { IDiamondCut } from "./additional-contracts/IDiamondCut.sol"; contract DiamondGovernance { - - constructor(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) payable { + constructor(IDiamondCut.FacetCut[] memory _diamondCut) payable { LibDiamond.setContractOwner(address(this)); - LibDiamond.diamondCut(_diamondCut, _init, _calldata); + LibDiamond.diamondCut(_diamondCut); } // Find facet for function that is called and execute the diff --git a/contracts/DiamondGovernanceAragon.sol b/contracts/DiamondGovernanceAragon.sol index 209dcb3..f7ce33d 100644 --- a/contracts/DiamondGovernanceAragon.sol +++ b/contracts/DiamondGovernanceAragon.sol @@ -8,10 +8,12 @@ pragma solidity ^0.8.0; import { DiamondGovernance } from "./DiamondGovernance.sol"; import { IDiamondCut } from "./additional-contracts/IDiamondCut.sol"; -import { DAOReferenceFacetInit, IDAO } from "./facets/aragon/DAOReferenceFacet.sol"; +import { IDAO } from "./facets/aragon/DAOReferenceFacet.sol"; + +import { LibDAOReferenceStorage } from "./libraries/storage/LibDAOReferenceStorage.sol"; contract DiamondGovernanceAragon is DiamondGovernance { - constructor(IDAO _dao, IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) payable DiamondGovernance(_diamondCut, _init, _calldata) { - DAOReferenceFacetInit.init(DAOReferenceFacetInit.InitParams(_dao)); + constructor(IDAO _dao, IDiamondCut.FacetCut[] memory _diamondCut) payable DiamondGovernance(_diamondCut) { + LibDAOReferenceStorage.getStorage().dao = _dao; } } \ No newline at end of file diff --git a/contracts/DiamondGovernanceSetup.sol b/contracts/DiamondGovernanceSetup.sol index 4cadb18..bd677f3 100644 --- a/contracts/DiamondGovernanceSetup.sol +++ b/contracts/DiamondGovernanceSetup.sol @@ -4,7 +4,7 @@ * © Copyright Utrecht University (Department of Information and Computing Sciences) */ -pragma solidity 0.8.17; +pragma solidity ^0.8.0; import { PermissionLib } from "@aragon/osx/core/permission/PermissionLib.sol"; import { PluginSetup } from "@aragon/osx/framework/plugin/setup/PluginSetup.sol"; @@ -18,15 +18,8 @@ contract DiamondGovernanceSetup is PluginSetup { bytes memory _data ) external returns (address plugin, PreparedSetupData memory preparedSetupData) { // Decode `_data` to extract the params needed for deploying and initializing `DiamondGovernance` plugin - ( - IDiamondCut.FacetCut[] memory _diamondCut, - address _init, - bytes memory _calldata - ) = abi.decode( - _data, - (IDiamondCut.FacetCut[], address, bytes) - ); - plugin = address(new DiamondGovernanceAragon(DAO(payable(_dao)), _diamondCut, _init, _calldata)); + (IDiamondCut.FacetCut[] memory _diamondCut) = abi.decode(_data, (IDiamondCut.FacetCut[])); + plugin = address(new DiamondGovernanceAragon(DAO(payable(_dao)), _diamondCut)); // Prepare permissions PermissionLib.MultiTargetPermission[] diff --git a/contracts/additional-contracts/IDiamondCut.sol b/contracts/additional-contracts/IDiamondCut.sol index a6c7f90..d4399aa 100644 --- a/contracts/additional-contracts/IDiamondCut.sol +++ b/contracts/additional-contracts/IDiamondCut.sol @@ -13,26 +13,22 @@ pragma solidity ^0.8.0; /******************************************************************************/ interface IDiamondCut { - enum FacetCutAction {Add, Replace, Remove} - // Add=0, Replace=1, Remove=2 + enum FacetCutAction {Add, Replace, Remove, AddWithInit, RemoveWithDeinit} + // Add=0, Replace=1, Remove=2, AddWithInit=3, RemoveWithDeinit=4 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; + bytes initCalldata; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors - /// @param _init The address of the contract or facet to execute _calldata - /// @param _calldata A function call, including function selector and arguments - /// _calldata is executed with delegatecall on _init function diamondCut( - FacetCut[] calldata _diamondCut, - address _init, - bytes calldata _calldata + FacetCut[] calldata _diamondCut ) external; - event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); + event DiamondCut(FacetCut[] _diamondCut); } \ No newline at end of file diff --git a/contracts/build-metadata.json b/contracts/build-metadata.json index 9e8ae01..318c20d 100644 --- a/contracts/build-metadata.json +++ b/contracts/build-metadata.json @@ -3,9 +3,7 @@ "change": "", "pluginSetupABI": { "prepareInstallation": [ - "tuple(address facetAddress, uint8 action, bytes4[] functionSelectors)[] _diamondCut", - "address _init", - "bytes _calldata" + "tuple(address facetAddress, uint8 action, bytes4[] functionSelectors, bytes initCalldata)[] _diamondCut" ], "prepareUpdate": [""], "prepareUninstallation": [""] diff --git a/contracts/deps/deps_Aragon.sol b/contracts/deps/deps_Aragon.sol index 635713f..d452c2e 100644 --- a/contracts/deps/deps_Aragon.sol +++ b/contracts/deps/deps_Aragon.sol @@ -5,16 +5,16 @@ */ -pragma solidity 0.8.17; +pragma solidity ^0.8.0; -import {DAO} from "@aragon/osx/core/dao/DAO.sol"; +import { DAO } from "@aragon/osx/core/dao/DAO.sol"; -import {DAOFactory} from "@aragon/osx/framework/dao/DAOFactory.sol"; -import {DAORegistry} from "@aragon/osx/framework/dao/DAORegistry.sol"; +import { DAOFactory } from "@aragon/osx/framework/dao/DAOFactory.sol"; +import { DAORegistry } from "@aragon/osx/framework/dao/DAORegistry.sol"; -import {PluginRepoFactory} from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol"; -import {PluginRepoRegistry} from "@aragon/osx/framework/plugin/repo/PluginRepoRegistry.sol"; +import { PluginRepoFactory } from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol"; +import { PluginRepoRegistry } from "@aragon/osx/framework/plugin/repo/PluginRepoRegistry.sol"; -import {PluginSetupProcessor} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessor.sol"; +import { PluginSetupProcessor } from "@aragon/osx/framework/plugin/setup/PluginSetupProcessor.sol"; -import {ENSSubdomainRegistrar} from "@aragon/osx/framework/utils/ens/ENSSubdomainRegistrar.sol"; \ No newline at end of file +import { ENSSubdomainRegistrar } from "@aragon/osx/framework/utils/ens/ENSSubdomainRegistrar.sol"; \ No newline at end of file diff --git a/contracts/deps/deps_ENS.sol b/contracts/deps/deps_ENS.sol index 9fde1ee..59d9a97 100644 --- a/contracts/deps/deps_ENS.sol +++ b/contracts/deps/deps_ENS.sol @@ -5,8 +5,8 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.17; +pragma solidity ^0.8.0; -import "@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol"; -import "@ensdomains/ens-contracts/contracts/registry/FIFSRegistrar.sol"; -import "@ensdomains/ens-contracts/contracts/resolvers/PublicResolver.sol"; \ No newline at end of file +import { ENSRegistry } from "@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol"; +import { FIFSRegistrar } from "@ensdomains/ens-contracts/contracts/registry/FIFSRegistrar.sol"; +import { PublicResolver } from "@ensdomains/ens-contracts/contracts/resolvers/PublicResolver.sol"; \ No newline at end of file diff --git a/contracts/deps/deps_Other.sol b/contracts/deps/deps_Other.sol new file mode 100644 index 0000000..bda5dbf --- /dev/null +++ b/contracts/deps/deps_Other.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + + +pragma solidity ^0.8.0; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; \ No newline at end of file diff --git a/contracts/examples/StorageExample.sol b/contracts/examples/StorageExample.sol index c87ff17..0447e0e 100644 --- a/contracts/examples/StorageExample.sol +++ b/contracts/examples/StorageExample.sol @@ -5,7 +5,7 @@ */ -pragma solidity 0.8.17; +pragma solidity ^0.8.0; import "hardhat/console.sol"; diff --git a/contracts/examples/diamond/ExampleDiamond.sol b/contracts/examples/diamond/ExampleDiamond.sol index c6b1ab0..52ddadf 100644 --- a/contracts/examples/diamond/ExampleDiamond.sol +++ b/contracts/examples/diamond/ExampleDiamond.sol @@ -29,9 +29,10 @@ contract ExampleDiamond { cut[0] = IDiamondCut.FacetCut({ facetAddress: _diamondCutFacet, action: IDiamondCut.FacetCutAction.Add, - functionSelectors: functionSelectors + functionSelectors: functionSelectors, + initCalldata: new bytes(0) }); - LibDiamond.diamondCut(cut, address(0), ""); + LibDiamond.diamondCut(cut); } // Find facet for function that is called and execute the diff --git a/contracts/examples/diamond/facets/DiamondCutTestFacet.sol b/contracts/examples/diamond/facets/DiamondCutTestFacet.sol new file mode 100644 index 0000000..357363a --- /dev/null +++ b/contracts/examples/diamond/facets/DiamondCutTestFacet.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +import { IDiamondCut } from "../../../additional-contracts/IDiamondCut.sol"; +import { LibDiamond } from "../../../libraries/LibDiamond.sol"; + +// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. +// The loupe functions are required by the EIP2535 Diamonds standard + +contract DiamondCutTestFacet is IDiamondCut { + function diamondCut(FacetCut[] calldata _diamondCut) external virtual override { + LibDiamond.diamondCut(_diamondCut); + } +} \ No newline at end of file diff --git a/contracts/examples/diamond/upgradeInitializers/ExampleDiamondInit.sol b/contracts/examples/diamond/upgradeInitializers/ExampleDiamondInit.sol deleted file mode 100644 index ff9b409..0000000 --- a/contracts/examples/diamond/upgradeInitializers/ExampleDiamondInit.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol"; - -import { IDiamondLoupe } from "../../../additional-contracts/IDiamondLoupe.sol"; -import { IDiamondCut } from "../../../additional-contracts/IDiamondCut.sol"; -import { IERC173 } from "../../../additional-contracts/IERC173.sol"; - -import { LibDiamond } from "../../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract ExampleDiamondInit { - - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init() external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(IERC165).interfaceId] = true; - ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; - ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; - ds.supportedInterfaces[type(IERC173).interfaceId] = true; - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - } - - -} \ No newline at end of file diff --git a/contracts/facets/IFacet.sol b/contracts/facets/IFacet.sol new file mode 100644 index 0000000..3c7106a --- /dev/null +++ b/contracts/facets/IFacet.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { LibDiamond } from "../libraries/LibDiamond.sol"; + +abstract contract IFacet { + // Should be called by inheritors too, thats why public + function init(bytes memory _initParams) public virtual {} + + function deinit() public virtual {} + + function registerInterface(bytes4 _interfaceId) internal virtual { + LibDiamond.diamondStorage().supportedInterfaces[_interfaceId] = true; + } + + function unregisterInterface(bytes4 _interfaceId) internal virtual { + LibDiamond.diamondStorage().supportedInterfaces[_interfaceId] = false; + } + + modifier onlySelf() { + require(msg.sender == address(this), "LibDiamond: Facet method can only be called by itself"); + _; + } +} diff --git a/contracts/facets/aragon/DAOReferenceFacet.sol b/contracts/facets/aragon/DAOReferenceFacet.sol index acb58d6..4af3f17 100644 --- a/contracts/facets/aragon/DAOReferenceFacet.sol +++ b/contracts/facets/aragon/DAOReferenceFacet.sol @@ -7,23 +7,29 @@ pragma solidity ^0.8.0; import { IDAO } from "@aragon/osx/core/dao/IDAO.sol"; +import { IDAOReferenceFacet } from "./IDAOReferenceFacet.sol"; +import { IFacet } from "../IFacet.sol"; import { LibDAOReferenceStorage } from "../../libraries/storage/LibDAOReferenceStorage.sol"; -library DAOReferenceFacetInit { - struct InitParams { - IDAO dao; +contract DAOReferenceFacet is IDAOReferenceFacet, IFacet { + /// @inheritdoc IDAOReferenceFacet + function dao() external view returns (IDAO) { + return LibDAOReferenceStorage.getStorage().dao; } - function init(InitParams calldata _params) external { - LibDAOReferenceStorage.getStorage().dao = _params.dao; + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __DAOReferenceFacet_init(); } -} -contract DAOReferenceFacet { - /// @notice Returns the DAO contract. - /// @return The DAO contract. - function dao() external view returns (IDAO) { - return LibDAOReferenceStorage.getStorage().dao; + function __DAOReferenceFacet_init() public virtual { + registerInterface(type(IDAOReferenceFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IDAOReferenceFacet).interfaceId); + super.deinit(); } -} \ No newline at end of file +} diff --git a/contracts/facets/aragon/IDAOReferenceFacet.sol b/contracts/facets/aragon/IDAOReferenceFacet.sol new file mode 100644 index 0000000..1496cc3 --- /dev/null +++ b/contracts/facets/aragon/IDAOReferenceFacet.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IDAO } from "@aragon/osx/core/dao/IDAO.sol"; + +interface IDAOReferenceFacet { + /// @notice Returns the DAO contract. + /// @return The DAO contract. + function dao() external view returns (IDAO); +} diff --git a/contracts/facets/aragon/PluginFacet.sol b/contracts/facets/aragon/PluginFacet.sol index 5ef62d7..b93617e 100644 --- a/contracts/facets/aragon/PluginFacet.sol +++ b/contracts/facets/aragon/PluginFacet.sol @@ -7,10 +7,26 @@ pragma solidity ^0.8.0; import { IPlugin } from "@aragon/osx/core/plugin/IPlugin.sol"; +import { IFacet } from "../IFacet.sol"; -contract PluginFacet is IPlugin { +contract PluginFacet is IPlugin, IFacet { /// @inheritdoc IPlugin function pluginType() external pure override returns (PluginType) { return PluginType.Constructable; } + + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __PluginFacet_init(); + } + + function __PluginFacet_init() public virtual { + registerInterface(type(IPlugin).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IPlugin).interfaceId); + super.deinit(); + } } \ No newline at end of file diff --git a/contracts/facets/base/DiamondCutFacet.sol b/contracts/facets/base/DiamondCutFacet.sol index 904f7bf..1e7236c 100644 --- a/contracts/facets/base/DiamondCutFacet.sol +++ b/contracts/facets/base/DiamondCutFacet.sol @@ -12,59 +12,36 @@ pragma solidity ^0.8.0; /******************************************************************************/ import { IDiamondCut } from "../../additional-contracts/IDiamondCut.sol"; +import { AuthConsumer } from "../../utils/AuthConsumer.sol"; import { LibDiamond } from "../../libraries/LibDiamond.sol"; +import { IFacet } from "../IFacet.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard -contract DiamondCutFacet is IDiamondCut { +contract DiamondCutFacet is IDiamondCut, AuthConsumer, IFacet { + // Permission to cut the diamond + bytes32 public constant DIAMOND_CUT_PERMISSION_ID = keccak256("DIAMOND_CUT_PERMISSION"); + + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __DiamondCutFacet_init(); + } + + function __DiamondCutFacet_init() public virtual { + registerInterface(type(IDiamondCut).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IDiamondCut).interfaceId); + super.deinit(); + } + /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors - /// @param _init The address of the contract or facet to execute _calldata - /// @param _calldata A function call, including function selector and arguments - /// _calldata is executed with delegatecall on _init - function diamondCut( - FacetCut[] calldata _diamondCut, - address _init, - bytes calldata _calldata - ) external override { - LibDiamond.enforceIsContractOwner(); - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - uint256 originalSelectorCount = ds.selectorCount; - uint256 selectorCount = originalSelectorCount; - bytes32 selectorSlot; - // Check if last selector slot is not full - // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" - if (selectorCount & 7 > 0) { - // get last selectorSlot - // "selectorCount >> 3" is a gas efficient division by 8 "selectorCount / 8" - selectorSlot = ds.selectorSlots[selectorCount >> 3]; - } - // loop through diamond cut - for (uint256 facetIndex; facetIndex < _diamondCut.length; ) { - (selectorCount, selectorSlot) = LibDiamond.addReplaceRemoveFacetSelectors( - selectorCount, - selectorSlot, - _diamondCut[facetIndex].facetAddress, - _diamondCut[facetIndex].action, - _diamondCut[facetIndex].functionSelectors - ); - - unchecked { - facetIndex++; - } - } - if (selectorCount != originalSelectorCount) { - ds.selectorCount = uint16(selectorCount); - } - // If last selector slot is not full - // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" - if (selectorCount & 7 > 0) { - // "selectorCount >> 3" is a gas efficient division by 8 "selectorCount / 8" - ds.selectorSlots[selectorCount >> 3] = selectorSlot; - } - emit DiamondCut(_diamondCut, _init, _calldata); - LibDiamond.initializeDiamondCut(_init, _calldata); + function diamondCut(FacetCut[] calldata _diamondCut) external virtual override auth(DIAMOND_CUT_PERMISSION_ID) { + LibDiamond.diamondCut(_diamondCut); } } \ No newline at end of file diff --git a/contracts/facets/base/DiamondLoupeFacet.sol b/contracts/facets/base/DiamondLoupeFacet.sol index ab255c4..7029b43 100644 --- a/contracts/facets/base/DiamondLoupeFacet.sol +++ b/contracts/facets/base/DiamondLoupeFacet.sol @@ -13,11 +13,27 @@ pragma solidity ^0.8.0; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { IDiamondLoupe } from "../../additional-contracts/IDiamondLoupe.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; +import { IFacet } from "../IFacet.sol"; // The functions in DiamondLoupeFacet MUST be added to a diamond. // The EIP-2535 Diamond standard requires these functions -contract DiamondLoupeFacet is IDiamondLoupe, IERC165 { +contract DiamondLoupeFacet is IDiamondLoupe, IERC165, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __DiamondLoupeFacet_init(); + } + + function __DiamondLoupeFacet_init() public virtual { + registerInterface(type(IDiamondLoupe).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IDiamondLoupe).interfaceId); + super.deinit(); + } + // Diamond Loupe Functions //////////////////////////////////////////////////////////////////// /// These functions are expected to be called frequently by tools. @@ -160,7 +176,6 @@ contract DiamondLoupeFacet is IDiamondLoupe, IERC165 { // This implements ERC-165. function supportsInterface(bytes4 _interfaceId) external override view returns (bool) { - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - return ds.supportedInterfaces[_interfaceId]; + return LibDiamond.diamondStorage().supportedInterfaces[_interfaceId]; } } \ No newline at end of file diff --git a/contracts/facets/base/OwnershipFacet.sol b/contracts/facets/base/OwnershipFacet.sol index d69e285..3597ccd 100644 --- a/contracts/facets/base/OwnershipFacet.sol +++ b/contracts/facets/base/OwnershipFacet.sol @@ -8,8 +8,24 @@ pragma solidity ^0.8.0; import { LibDiamond } from "../../libraries/LibDiamond.sol"; import { IERC173 } from "../../additional-contracts/IERC173.sol"; +import { IFacet } from "../IFacet.sol"; + +contract OwnershipFacet is IERC173, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __OwnershipFacet_init(); + } + + function __OwnershipFacet_init() public virtual { + registerInterface(type(IERC173).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC173).interfaceId); + super.deinit(); + } -contract OwnershipFacet is IERC173 { function transferOwnership(address _newOwner) external override { LibDiamond.enforceIsContractOwner(); LibDiamond.setContractOwner(_newOwner); diff --git a/contracts/facets/github-pr/GithubPullRequestFacet.sol b/contracts/facets/github-pr/GithubPullRequestFacet.sol deleted file mode 100644 index f3ad453..0000000 --- a/contracts/facets/github-pr/GithubPullRequestFacet.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -import { IGithubPullRequestFacet } from "./IGitHubPullRequestFacet.sol"; -import { AuthConsumer } from "../../utils/AuthConsumer.sol"; - -contract GithubPullRequestFacet is IGithubPullRequestFacet, AuthConsumer { - /// @notice The permission identifier to merge pull requests. - bytes32 public constant MERGE_PR_PERMISSION_ID = keccak256("MERGE_PR_PERMISSION"); - - /// Function that emits an event to merge a pull request - /// @param _owner Owner of the repository - /// @param _repo Name of the repository - /// @param _pull_number Number of the pull request - function merge(string memory _owner, string memory _repo, string memory _pull_number) external override auth(MERGE_PR_PERMISSION_ID) { - emit MergePullRequest(_owner, _repo, _pull_number); - } -} diff --git a/contracts/facets/governance/proposal/IBurnVotingProposalFacet.sol b/contracts/facets/governance/proposal/IBurnVotingProposalFacet.sol new file mode 100644 index 0000000..315d5ad --- /dev/null +++ b/contracts/facets/governance/proposal/IBurnVotingProposalFacet.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// Based on non-facet implementation by Aragon (https://github.com/aragon/osx/blob/develop/packages/contracts/src/core/plugin/proposal/Proposal.sol) + +pragma solidity ^0.8.0; + +interface IBurnVotingProposalFacet { + function getProposalCreationCost() external view returns (uint256); + + function setProposalCreationCost(uint256 _proposalCreationCost) external; +} \ No newline at end of file diff --git a/contracts/facets/governance/proposal/IPartialVotingProposalFacet.sol b/contracts/facets/governance/proposal/IPartialVotingProposalFacet.sol index de0c5e5..d8a9716 100644 --- a/contracts/facets/governance/proposal/IPartialVotingProposalFacet.sol +++ b/contracts/facets/governance/proposal/IPartialVotingProposalFacet.sol @@ -33,7 +33,7 @@ interface IPartialVotingProposalFacet { } /// @notice A container for proposal-related information. - /// @param executed Whether the proposal is executed or not. + /// @param executed The block the proposal executed at, 0 for not executed. /// @param parameters The proposal parameters at the time of the proposal creation. /// @param tally The vote tally of the proposal. /// @param voters The votes casted by the voters. @@ -41,8 +41,10 @@ interface IPartialVotingProposalFacet { /// @param allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. A failure map value of 0 requires every action to not revert. /// @param proposalType keccak256 of the proposal type, can be used by extensions to apply certain rules to proposal created in a certain way. /// @param metadata The IPFS hash of the metadata of the proposal. + /// @param creator The address of the creator the proposal. + /// @param voterList All the addresses that voted on this proposal. struct ProposalData { - bool executed; + uint64 executed; ProposalParameters parameters; Tally tally; mapping(address => IPartialVotingFacet.PartialVote[]) voters; @@ -50,6 +52,9 @@ interface IPartialVotingProposalFacet { uint256 allowFailureMap; bytes32 proposalType; bytes metadata; + address creator; + address[] voterList; + address executor; } /// @notice A container for the proposal parameters at the time of proposal creation. @@ -81,18 +86,70 @@ interface IPartialVotingProposalFacet { uint256 yes; uint256 no; } - + + /// @notice Thrown if a date is out of bounds. + /// @param limit The limit value. + /// @param actual The actual value. + error DateOutOfBounds(uint64 limit, uint64 actual); + + /// @notice Thrown if the minimal duration value is out of bounds (less than one hour or greater than 1 year). + /// @param limit The limit value. + /// @param actual The actual value. + error MinDurationOutOfBounds(uint64 limit, uint64 actual); + + /// @notice Thrown when a sender is not allowed to create a proposal. + /// @param sender The sender address. + error ProposalCreationForbidden(address sender); + + /// @notice Thrown if the proposal execution is forbidden. + /// @param proposalId The ID of the proposal. + error ProposalExecutionForbidden(uint256 proposalId); + + /// @notice Emitted when the voting settings are updated. + /// @param votingSettings The new voting settings. + event VotingSettingsUpdated(VotingSettings votingSettings); + + /// @notice Returns the voting mode parameter stored in the voting settings. + /// @return The voting mode parameter. + function getVotingMode() external view returns (IPartialVotingFacet.VotingMode); + + /// @notice Change the voting mode parameter stored in the voting settings. + function setVotingMode(IPartialVotingFacet.VotingMode _votingMode) external; + /// @notice Returns the support threshold parameter stored in the voting settings. /// @return The support threshold parameter. - function supportThreshold() external view returns (uint32); + function getSupportThreshold() external view returns (uint32); + + /// @notice Change the support threshold parameter stored in the voting settings. + function setSupportThreshold(uint32 _supportThreshold) external; /// @notice Returns the minimum participation parameter stored in the voting settings. /// @return The minimum participation parameter. - function minParticipation() external view returns (uint32); + function getMinParticipation() external view returns (uint32); + + /// @notice Change the minimum participation parameter stored in the voting settings. + function setMinParticipation(uint32 _minParticipation) external; /// @notice Returns the max single wallet power parameter stored in the voting settings. /// @return The max single wallet power parameter. - function maxSingleWalletPower() external view returns (uint32); + function getMaxSingleWalletPower() external view returns (uint32); + + /// @notice Change the max single wallet power parameter stored in the voting settings. + function setMaxSingleWalletPower(uint32 _maxSingleWalletPower) external; + + /// @notice Returns the minimum duration parameter stored in the voting settings. + /// @return The minimum duration parameter. + function getMinDuration() external view returns (uint64); + + /// @notice Change the minimum duration parameter stored in the voting settings. + function setMinDuration(uint64 _minDuration) external; + + /// @notice Returns the minimum voting power required to create a proposal stored in the voting settings. + /// @return The minimum voting power required to create a proposal. + function getMinProposerVotingPower() external view returns (uint256); + + /// @notice Change the minimum voting power required to create a proposal stored in the voting settings. + function setMinProposerVotingPower(uint256 _minProposerVotingPower) external; /// @notice Checks if the support value defined as $$\texttt{support} = \frac{N_\text{yes}}{N_\text{yes}+N_\text{no}}$$ for a proposal vote is greater than the support threshold. /// @param _proposalId The ID of the proposal. @@ -134,12 +191,15 @@ interface IPartialVotingProposalFacet { uint256 _proposalId ) external view returns ( bool open, - bool executed, + uint64 executed, ProposalParameters memory parameters, Tally memory tally, IDAO.Action[] memory actions, uint256 allowFailureMap, - bytes memory metadata + bytes memory metadata, + address creator, + address[] memory voterList, + address executor ); /// @notice Create a new proposal. @@ -158,6 +218,4 @@ interface IPartialVotingProposalFacet { uint64 _endDate, bool _allowEarlyExecution ) external returns (uint256 proposalId); - - function IsProposalOpen(uint256 _proposalId) external view returns (bool); } \ No newline at end of file diff --git a/contracts/facets/governance/proposal/ProposalFacet.sol b/contracts/facets/governance/proposal/IProposalFacet.sol similarity index 92% rename from contracts/facets/governance/proposal/ProposalFacet.sol rename to contracts/facets/governance/proposal/IProposalFacet.sol index 96f9566..e004a7b 100644 --- a/contracts/facets/governance/proposal/ProposalFacet.sol +++ b/contracts/facets/governance/proposal/IProposalFacet.sol @@ -10,15 +10,22 @@ pragma solidity ^0.8.0; import { Counters } from "@openzeppelin/contracts/utils/Counters.sol"; import { IProposal, IDAO } from "@aragon/osx/core/plugin/proposal/IProposal.sol"; +import { IFacet } from "../../IFacet.sol"; import { LibProposalStorage } from "../../../libraries/storage/LibProposalStorage.sol"; /// @title Proposal /// @author Aragon Association - 2022-2023 /// @notice An abstract contract containing the traits and internal functionality to create and execute proposals that can be inherited by non-upgradeable DAO plugins. -abstract contract ProposalFacet is IProposal { +abstract contract IProposalFacet is IProposal, IFacet { using Counters for Counters.Counter; + /// @inheritdoc IFacet + function init(bytes memory initParams) public virtual override { + registerInterface(type(IProposal).interfaceId); + super.init(initParams); + } + /// @inheritdoc IProposal function proposalCount() public view override returns (uint256) { return LibProposalStorage.getStorage().proposalCounter.current(); diff --git a/contracts/facets/governance/proposal/PartialBurnVotingProposalFacet.sol b/contracts/facets/governance/proposal/PartialBurnVotingProposalFacet.sol index 37c1eb9..357ae53 100644 --- a/contracts/facets/governance/proposal/PartialBurnVotingProposalFacet.sol +++ b/contracts/facets/governance/proposal/PartialBurnVotingProposalFacet.sol @@ -6,26 +6,51 @@ pragma solidity ^0.8.0; -import { PartialVotingProposalFacet, IPartialVotingProposalFacet, IDAO, PartialVotingProposalFacetInit } from "./PartialVotingProposalFacet.sol"; +import { PartialVotingProposalFacet, IPartialVotingProposalFacet, IDAO } from "./PartialVotingProposalFacet.sol"; +import { IBurnVotingProposalFacet } from "./IBurnVotingProposalFacet.sol"; import { IBurnableGovernanceStructure } from "../structure/voting-power/IBurnableGovernanceStructure.sol"; import "../shared/IPartialBurnVotingShared.sol"; -import { LibPartialBurnVotingProposalStorage } from "../../../libraries/storage/LibPartialBurnVotingProposalStorage.sol"; +import { LibBurnVotingProposalStorage } from "../../../libraries/storage/LibBurnVotingProposalStorage.sol"; import { LibDiamond } from "../../../libraries/LibDiamond.sol"; +import { IFacet } from "../../IFacet.sol"; -library PartialBurnVotingProposalFacetInit { - struct InitParams { +contract PartialBurnVotingProposalFacet is PartialVotingProposalFacet, IBurnVotingProposalFacet { + struct PartialBurnVotingProposalFacetInitParams { uint256 proposalCreationCost; - PartialVotingProposalFacetInit.InitParams partialVotingProposalInit; + PartialVotingProposalFacetInitParams _PartialVotingProposalFacetInitParams; } - function init(InitParams calldata _params) external { - LibPartialBurnVotingProposalStorage.getStorage().proposalCreationCost = _params.proposalCreationCost; - PartialVotingProposalFacetInit.init(_params.partialVotingProposalInit); + /// @inheritdoc IFacet + function init(bytes memory initParams) public virtual override { + PartialBurnVotingProposalFacetInitParams memory _params = abi.decode(initParams, (PartialBurnVotingProposalFacetInitParams)); + __PartialBurnVotingProposalFacet_init(_params); + } + + function __PartialBurnVotingProposalFacet_init(PartialBurnVotingProposalFacetInitParams memory _params) public virtual { + __PartialVotingProposalFacet_init(_params._PartialVotingProposalFacetInitParams); + + LibBurnVotingProposalStorage.getStorage().proposalCreationCost = _params.proposalCreationCost; + + registerInterface(type(IBurnVotingProposalFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IBurnVotingProposalFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc IBurnVotingProposalFacet + function getProposalCreationCost() external view virtual returns (uint256) { + return LibBurnVotingProposalStorage.getStorage().proposalCreationCost; + } + + /// @inheritdoc IBurnVotingProposalFacet + function setProposalCreationCost(uint256 _proposalCreationCost) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + LibBurnVotingProposalStorage.getStorage().proposalCreationCost = _proposalCreationCost; } -} -contract PartialBurnVotingProposalFacet is PartialVotingProposalFacet { /// @inheritdoc PartialVotingProposalFacet function createProposal( bytes calldata _metadata, @@ -47,9 +72,8 @@ contract PartialBurnVotingProposalFacet is PartialVotingProposalFacet { // Check if the diamond supports burning if (LibDiamond.diamondStorage().supportedInterfaces[type(IBurnableGovernanceStructure).interfaceId]) { - LibPartialBurnVotingProposalStorage.Storage storage s = LibPartialBurnVotingProposalStorage.getStorage(); + LibBurnVotingProposalStorage.Storage storage s = LibBurnVotingProposalStorage.getStorage(); IBurnableGovernanceStructure(address(this)).burnVotingPower(msg.sender, s.proposalCreationCost); - s.proposalCreator[proposalId] = msg.sender; s.proposalCost[proposalId] = s.proposalCreationCost; } } diff --git a/contracts/facets/governance/proposal/PartialVotingProposalFacet.sol b/contracts/facets/governance/proposal/PartialVotingProposalFacet.sol index 6c30113..96b7ed2 100644 --- a/contracts/facets/governance/proposal/PartialVotingProposalFacet.sol +++ b/contracts/facets/governance/proposal/PartialVotingProposalFacet.sol @@ -13,60 +13,53 @@ import { DaoAuthorizable } from "@aragon/osx/core/plugin/dao-authorizable/DaoAut import { IPartialVotingProposalFacet, IPartialVotingFacet, IDAO } from "./IPartialVotingProposalFacet.sol"; import { IGovernanceStructure } from "../structure/voting-power/IGovernanceStructure.sol"; import "../../../utils/Ratio.sol"; -import { ProposalFacet } from "./ProposalFacet.sol"; +import { IProposalFacet, IProposal } from "./IProposalFacet.sol"; import { AuthConsumer } from "../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../IFacet.sol"; import { LibPartialVotingProposalStorage } from "../../../libraries/storage/LibPartialVotingProposalStorage.sol"; -library PartialVotingProposalFacetInit { - struct InitParams { - IPartialVotingProposalFacet.VotingSettings votingSettings; - } - - function init(InitParams calldata _params) external { - LibPartialVotingProposalStorage.getStorage().votingSettings = _params.votingSettings; - } -} - /// @title PartialVotingProposalFacet /// @author Utrecht University - 2023 /// @notice The partial implementation of partial voting proposal plugins. /// @dev This contract implements the `IPartialVotingProposalFacet` interface. -contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFacet, AuthConsumer +contract PartialVotingProposalFacet is IPartialVotingProposalFacet, IProposalFacet, AuthConsumer { using SafeCast for uint256; - + /// @notice The permission identifier to mint new tokens bytes32 public constant UPDATE_VOTING_SETTINGS_PERMISSION_ID = keccak256("UPDATE_VOTING_SETTINGS_PERMISSION"); - /// @notice Thrown if a date is out of bounds. - /// @param limit The limit value. - /// @param actual The actual value. - error DateOutOfBounds(uint64 limit, uint64 actual); + struct PartialVotingProposalFacetInitParams { + IPartialVotingProposalFacet.VotingSettings votingSettings; + } - /// @notice Thrown if the minimal duration value is out of bounds (less than one hour or greater than 1 year). - /// @param limit The limit value. - /// @param actual The actual value. - error MinDurationOutOfBounds(uint64 limit, uint64 actual); + /// @inheritdoc IFacet + function init(bytes memory initParams) public virtual override { + PartialVotingProposalFacetInitParams memory _params = abi.decode(initParams, (PartialVotingProposalFacetInitParams)); + __PartialVotingProposalFacet_init(_params); + } - /// @notice Thrown when a sender is not allowed to create a proposal. - /// @param sender The sender address. - error ProposalCreationForbidden(address sender); + function __PartialVotingProposalFacet_init(PartialVotingProposalFacetInitParams memory _params) public virtual { + LibPartialVotingProposalStorage.getStorage().votingSettings = _params.votingSettings; - /// @notice Thrown if the proposal execution is forbidden. - /// @param proposalId The ID of the proposal. - error ProposalExecutionForbidden(uint256 proposalId); + registerInterface(type(IPartialVotingProposalFacet).interfaceId); + registerInterface(type(IProposal).interfaceId); + } - /// @notice Emitted when the voting settings are updated. - /// @param votingSettings The new voting settings. - event VotingSettingsUpdated(VotingSettings votingSettings); + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IPartialVotingProposalFacet).interfaceId); + unregisterInterface(type(IProposal).interfaceId); + super.deinit(); + } /// @inheritdoc IPartialVotingProposalFacet function execute(uint256 _proposalId) public virtual { if (!_canExecute(_proposalId)) { revert ProposalExecutionForbidden(_proposalId); } - _execute(_proposalId); + _execute(_proposalId, msg.sender); } /// @inheritdoc IPartialVotingProposalFacet @@ -100,8 +93,8 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace ProposalData storage proposal_ = LibPartialVotingProposalStorage.getStorage().proposals[_proposalId]; uint256 noVotesWorstCase = IGovernanceStructure(address(this)).totalVotingPower(proposal_.parameters.snapshotBlock) - - proposal_.tally.yes - - proposal_.tally.abstain; + proposal_.tally.yes; + // Abstain is removed here, as this is increased with not used voting power on partial voting and can still be changed to no later // The code below implements the formula of the early execution support criterion explained in the top of this file. // `(1 - supportThreshold) * N_yes > supportThreshold * N_no,worst-case` @@ -121,40 +114,97 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace proposal_.parameters.minParticipationThresholdPower; } - - /// @notice Returns the vote mode stored in the voting settings. + /// @notice Returns the voting settings. /// @return The vote mode parameter. - function votingMode() public view virtual returns (IPartialVotingFacet.VotingMode) { + /// @inheritdoc IPartialVotingProposalFacet + function getVotingMode() public view virtual returns (IPartialVotingFacet.VotingMode) { return LibPartialVotingProposalStorage.getStorage().votingSettings.votingMode; } /// @inheritdoc IPartialVotingProposalFacet - function supportThreshold() public view virtual returns (uint32) { + function setVotingMode(IPartialVotingFacet.VotingMode _votingMode) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + LibPartialVotingProposalStorage.getStorage().votingSettings.votingMode = _votingMode; + _updateVotingSettings(); + } + + /// @inheritdoc IPartialVotingProposalFacet + function getSupportThreshold() public view virtual returns (uint32) { return LibPartialVotingProposalStorage.getStorage().votingSettings.supportThreshold; } /// @inheritdoc IPartialVotingProposalFacet - function minParticipation() public view virtual returns (uint32) { + function setSupportThreshold(uint32 _supportThreshold) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + // Require the support threshold value to be in the interval [0, 10^6-1], because `>` comparision is used in the support criterion and >100% could never be reached. + if (_supportThreshold > RATIO_BASE - 1) { + revert RatioOutOfBounds({limit: RATIO_BASE - 1, actual: _supportThreshold}); + } + + LibPartialVotingProposalStorage.getStorage().votingSettings.supportThreshold = _supportThreshold; + _updateVotingSettings(); + } + + /// @inheritdoc IPartialVotingProposalFacet + function getMinParticipation() public view virtual returns (uint32) { return LibPartialVotingProposalStorage.getStorage().votingSettings.minParticipation; } /// @inheritdoc IPartialVotingProposalFacet - function maxSingleWalletPower() public view virtual returns (uint32) { + function setMinParticipation(uint32 _minParticipation) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + // Require the minimum participation value to be in the interval [0, 10^6], because `>=` comparision is used in the participation criterion. + if (_minParticipation > RATIO_BASE) { + revert RatioOutOfBounds({limit: RATIO_BASE, actual: _minParticipation}); + } + + LibPartialVotingProposalStorage.getStorage().votingSettings.minParticipation = _minParticipation; + _updateVotingSettings(); + } + + /// @inheritdoc IPartialVotingProposalFacet + function getMaxSingleWalletPower() public view virtual returns (uint32) { return LibPartialVotingProposalStorage.getStorage().votingSettings.maxSingleWalletPower; } + /// @inheritdoc IPartialVotingProposalFacet + function setMaxSingleWalletPower(uint32 _maxSingleWalletPower) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + // Require to be in the interval [0, 10^6] + if (_maxSingleWalletPower > RATIO_BASE) { + revert RatioOutOfBounds({limit: RATIO_BASE, actual: _maxSingleWalletPower}); + } + LibPartialVotingProposalStorage.getStorage().votingSettings.maxSingleWalletPower = _maxSingleWalletPower; + _updateVotingSettings(); + } + /// @notice Returns the minimum duration parameter stored in the voting settings. /// @return The minimum duration parameter. - function minDuration() public view virtual returns (uint64) { + /// @inheritdoc IPartialVotingProposalFacet + function getMinDuration() public view virtual returns (uint64) { return LibPartialVotingProposalStorage.getStorage().votingSettings.minDuration; } + /// @inheritdoc IPartialVotingProposalFacet + function setMinDuration(uint64 _minDuration) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + LibPartialVotingProposalStorage.getStorage().votingSettings.minDuration = _minDuration; + _updateVotingSettings(); + } + /// @notice Returns the minimum voting power required to create a proposa stored in the voting settings. /// @return The minimum voting power required to create a proposal. - function minProposerVotingPower() public view virtual returns (uint256) { + /// @inheritdoc IPartialVotingProposalFacet + function getMinProposerVotingPower() public view virtual returns (uint256) { return LibPartialVotingProposalStorage.getStorage().votingSettings.minProposerVotingPower; } + /// @inheritdoc IPartialVotingProposalFacet + function setMinProposerVotingPower(uint256 _minProposerVotingPower) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { + LibPartialVotingProposalStorage.getStorage().votingSettings.minProposerVotingPower = _minProposerVotingPower; + _updateVotingSettings(); + } + + /// @notice Internal function after voting settings have been updated + function _updateVotingSettings() internal virtual { + emit VotingSettingsUpdated(LibPartialVotingProposalStorage.getStorage().votingSettings); + } + /// @notice Returns all information for a proposal vote by its ID. /// @param _proposalId The ID of the proposal. /// @return open Whether the proposal is open or not. @@ -171,12 +221,15 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace virtual returns ( bool open, - bool executed, + uint64 executed, ProposalParameters memory parameters, Tally memory tally, IDAO.Action[] memory actions, uint256 allowFailureMap, - bytes memory metadata + bytes memory metadata, + address creator, + address[] memory voterList, + address executor ) { ProposalData storage proposal_ = LibPartialVotingProposalStorage.getStorage().proposals[_proposalId]; @@ -188,14 +241,9 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace actions = proposal_.actions; allowFailureMap = proposal_.allowFailureMap; metadata = proposal_.metadata; - } - - /// @notice Updates the voting settings. - /// @param _votingSettings The new voting settings. - function updateVotingSettings( - VotingSettings calldata _votingSettings - ) external virtual auth(UPDATE_VOTING_SETTINGS_PERMISSION_ID) { - _updateVotingSettings(_votingSettings); + creator = proposal_.creator; + voterList = proposal_.voterList; + executor = proposal_.executor; } /// @notice Creates a voting proposal. @@ -248,7 +296,7 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace IGovernanceStructure governance = IGovernanceStructure(address(this)); totalVotingPower_ = governance.totalVotingPower(snapshotBlock); - if (governance.walletVotingPower(msg.sender, snapshotBlock) < minProposerVotingPower()) { + if (governance.walletVotingPower(msg.sender, snapshotBlock) < getMinProposerVotingPower()) { revert ProposalCreationForbidden(msg.sender); } } @@ -265,24 +313,25 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace // Store proposal related information ProposalData storage proposal_ = LibPartialVotingProposalStorage.getStorage().proposals[proposalId]; - proposal_.parameters.votingMode = votingMode(); + proposal_.parameters.votingMode = getVotingMode(); proposal_.parameters.earlyExecution = _allowEarlyExecution; (proposal_.parameters.startDate, proposal_.parameters.endDate) = _validateProposalDates( _startDate, _endDate ); proposal_.parameters.snapshotBlock = snapshotBlock.toUint64(); - proposal_.parameters.supportThreshold = supportThreshold(); + proposal_.parameters.supportThreshold = getSupportThreshold(); proposal_.parameters.minParticipationThresholdPower = _applyRatioCeiled( totalVotingPower_, - minParticipation() + getMinParticipation() ); proposal_.parameters.maxSingleWalletPower = _applyRatioCeiled( totalVotingPower_, - maxSingleWalletPower() + getMaxSingleWalletPower() ); proposal_.proposalType = _proposalType; proposal_.metadata = _metadata; + proposal_.creator = msg.sender; // Reduce costs if (_allowFailureMap != 0) { @@ -299,9 +348,10 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace /// @notice Internal function to execute a vote. It assumes the queried proposal exists. /// @param _proposalId The ID of the proposal. - function _execute(uint256 _proposalId) internal virtual { + function _execute(uint256 _proposalId, address _executor) internal virtual { ProposalData storage proposal_ = LibPartialVotingProposalStorage.getStorage().proposals[_proposalId]; - proposal_.executed = true; + proposal_.executed = block.number.toUint64(); + proposal_.executor = _executor; _executeProposal( DaoAuthorizable(address(this)).dao(), @@ -319,7 +369,7 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace ProposalData storage proposal_ = LibPartialVotingProposalStorage.getStorage().proposals[_proposalId]; // Verify that the vote has not been executed already. - if (proposal_.executed) { + if (proposal_.executed > 0) { return false; } @@ -344,10 +394,6 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace return true; } - function IsProposalOpen(uint256 _proposalId) external view returns (bool) { - return _isProposalOpen(LibPartialVotingProposalStorage.getStorage().proposals[_proposalId]); - } - /// @notice Internal function to check if a proposal vote is still open. /// @param proposal_ The proposal struct. /// @return True if the proposal vote is open, false otherwise. @@ -357,36 +403,7 @@ contract PartialVotingProposalFacet is IPartialVotingProposalFacet, ProposalFace return proposal_.parameters.startDate <= currentTime && currentTime < proposal_.parameters.endDate && - !proposal_.executed; - } - - /// @notice Internal function to update the plugin-wide proposal vote settings. - /// @param _votingSettings The voting settings to be validated and updated. - function _updateVotingSettings(VotingSettings calldata _votingSettings) internal virtual { - // Require the support threshold value to be in the interval [0, 10^6-1], because `>` comparision is used in the support criterion and >100% could never be reached. - if (_votingSettings.supportThreshold > RATIO_BASE - 1) { - revert RatioOutOfBounds({ - limit: RATIO_BASE - 1, - actual: _votingSettings.supportThreshold - }); - } - - // Require the minimum participation value to be in the interval [0, 10^6], because `>=` comparision is used in the participation criterion. - if (_votingSettings.minParticipation > RATIO_BASE) { - revert RatioOutOfBounds({limit: RATIO_BASE, actual: _votingSettings.minParticipation}); - } - - if (_votingSettings.minDuration < 60 minutes) { - revert MinDurationOutOfBounds({limit: 60 minutes, actual: _votingSettings.minDuration}); - } - - if (_votingSettings.minDuration > 365 days) { - revert MinDurationOutOfBounds({limit: 365 days, actual: _votingSettings.minDuration}); - } - - LibPartialVotingProposalStorage.getStorage().votingSettings = _votingSettings; - - emit VotingSettingsUpdated(_votingSettings); + proposal_.executed == 0; } /// @notice Validates and returns the proposal vote dates. diff --git a/contracts/facets/governance/structure/membership/ITieredMembershipStructure.sol b/contracts/facets/governance/structure/membership/ITieredMembershipStructure.sol index a422620..1d8b159 100644 --- a/contracts/facets/governance/structure/membership/ITieredMembershipStructure.sol +++ b/contracts/facets/governance/structure/membership/ITieredMembershipStructure.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; -import { IMembershipExtended } from "./IMembershipExtended.sol"; +import { IMembershipExtended, IMembership } from "./IMembershipExtended.sol"; abstract contract ITieredMembershipStructure is IMembershipExtended { /// @inheritdoc IMembershipExtended diff --git a/contracts/facets/governance/voting/IPartialVotingFacet.sol b/contracts/facets/governance/voting/IPartialVotingFacet.sol index e451058..fcdf5b7 100644 --- a/contracts/facets/governance/voting/IPartialVotingFacet.sol +++ b/contracts/facets/governance/voting/IPartialVotingFacet.sol @@ -34,7 +34,7 @@ interface IPartialVotingFacet { /// @param voter The voter casting the vote. /// @param voteData The casted vote option and the voting power behind this vote. event VoteCast( - uint256 proposalId, + uint256 proposalId, address indexed voter, PartialVote voteData ); @@ -45,6 +45,16 @@ interface IPartialVotingFacet { MultiplePartialVote } + /// @notice Thrown if an account is not allowed to cast a vote. This can be because the vote + /// - has not started, + /// - has ended, + /// - was executed, or + /// - the account doesn't have the chosen voting power or more. + /// @param proposalId The ID of the proposal. + /// @param account The address of the _account. + /// @param voteData The chosen vote option and chosen voting power. + error VoteCastForbidden(uint256 proposalId, address account, PartialVote voteData); + /// @notice Checks if an account can participate on a proposal vote. This can be because the vote /// - has not started, /// - has ended, diff --git a/contracts/facets/governance/voting/PartialBurnVotingFacet.sol b/contracts/facets/governance/voting/PartialBurnVotingFacet.sol index 311924c..61a4c73 100644 --- a/contracts/facets/governance/voting/PartialBurnVotingFacet.sol +++ b/contracts/facets/governance/voting/PartialBurnVotingFacet.sol @@ -6,14 +6,28 @@ pragma solidity ^0.8.0; -import { PartialVotingFacet, IPartialVotingProposalFacet, IGovernanceStructure } from "./PartialVotingFacet.sol"; +import { PartialVotingFacet, IPartialVotingProposalFacet, IGovernanceStructure, IFacet } from "./PartialVotingFacet.sol"; import { IBurnableGovernanceStructure } from "../structure/voting-power/IBurnableGovernanceStructure.sol"; import "../shared/IPartialBurnVotingShared.sol"; import { LibDiamond } from "../../../libraries/LibDiamond.sol"; -import { LibPartialBurnVotingProposalStorage } from "../../../libraries/storage/LibPartialBurnVotingProposalStorage.sol"; +import { LibBurnVotingProposalStorage } from "../../../libraries/storage/LibBurnVotingProposalStorage.sol"; contract PartialBurnVotingFacet is PartialVotingFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __PartialBurnVotingFacet_init(); + } + + function __PartialBurnVotingFacet_init() public virtual { + __PartialVotingFacet_init(); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); + } + /// @inheritdoc PartialVotingFacet function _vote( uint256 _proposalId, @@ -31,7 +45,7 @@ contract PartialBurnVotingFacet is PartialVotingFacet { _voteData.option != VoteOption.Abstain ) { IBurnableGovernanceStructure(address(this)).burnVotingPower(_voter, _voteData.amount); - LibPartialBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_voter] += _voteData.amount; + LibBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_voter] += _voteData.amount; } } diff --git a/contracts/facets/governance/voting/PartialVotingFacet.sol b/contracts/facets/governance/voting/PartialVotingFacet.sol index c46b02c..0b13639 100644 --- a/contracts/facets/governance/voting/PartialVotingFacet.sol +++ b/contracts/facets/governance/voting/PartialVotingFacet.sol @@ -11,6 +11,7 @@ import { IPartialVotingFacet } from "./IPartialVotingFacet.sol"; import { IPartialVotingProposalFacet } from "../proposal/IPartialVotingProposalFacet.sol"; import { IGovernanceStructure } from "../structure/voting-power/IGovernanceStructure.sol"; import { AuthConsumer } from "../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../IFacet.sol"; import { LibPartialVotingProposalStorage } from "../../../libraries/storage/LibPartialVotingProposalStorage.sol"; @@ -18,17 +19,21 @@ import { LibPartialVotingProposalStorage } from "../../../libraries/storage/LibP /// @author Utrecht University - 2023 /// @notice The partial implementation of partial voting plugins. /// @dev This contract implements the `IPartialVotingFacet` interface. -contract PartialVotingFacet is IPartialVotingFacet, AuthConsumer -{ - /// @notice Thrown if an account is not allowed to cast a vote. This can be because the vote - /// - has not started, - /// - has ended, - /// - was executed, or - /// - the account doesn't have the chosen voting power or more. - /// @param proposalId The ID of the proposal. - /// @param account The address of the _account. - /// @param voteData The chosen vote option and chosen voting power. - error VoteCastForbidden(uint256 proposalId, address account, PartialVote voteData); +contract PartialVotingFacet is IPartialVotingFacet, AuthConsumer, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __PartialVotingFacet_init(); + } + + function __PartialVotingFacet_init() public virtual { + registerInterface(type(IPartialVotingFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IPartialVotingFacet).interfaceId); + super.deinit(); + } /// @inheritdoc IPartialVotingFacet function vote( @@ -77,6 +82,18 @@ contract PartialVotingFacet is IPartialVotingFacet, AuthConsumer _proposal.tally.abstain = _proposal.tally.abstain + _voteData.amount; } + if (_proposal.voters[_voter].length == 0) { + // New voter + _proposal.voterList.push(_voter); + + // Increase abstain with not used voting power, to contribute to participation threshold, but not swing the vote + uint256 notUsedPower = IGovernanceStructure(address(this)).walletVotingPower(_voter, _proposal.parameters.snapshotBlock) - _voteData.amount; + _proposal.tally.abstain = _proposal.tally.abstain + notUsedPower; + } + else { + // Decrease the abstain that was increased on first vote + _proposal.tally.abstain = _proposal.tally.abstain - _voteData.amount; + } _proposal.voters[_voter].push(_voteData); emit VoteCast({ @@ -100,7 +117,8 @@ contract PartialVotingFacet is IPartialVotingFacet, AuthConsumer IGovernanceStructure _structure ) internal view virtual returns (bool) { // The proposal vote hasn't started or has already ended. - if (!IPartialVotingProposalFacet(address(this)).IsProposalOpen(_proposalId)) { + (bool open,,,,,,,,,) = IPartialVotingProposalFacet(address(this)).getProposal(_proposalId); + if (!open) { return false; } @@ -120,23 +138,43 @@ contract PartialVotingFacet is IPartialVotingFacet, AuthConsumer return false; } - // The voter is trying to vote with more voting power than they have avaliable. - if (_voteData.amount > votingPower) { - return false; - } - - // In multi vote the voter is not allowed to vote with more voting power than the maximum - if (_voteData.amount > _proposal.parameters.maxSingleWalletPower && - _proposal.parameters.votingMode != VotingMode.SingleVote - ) { - return false; + if (_proposal.parameters.votingMode == VotingMode.MultiplePartialVote) { + uint alreadyUsedPower; + for (uint i; i < _proposal.voters[_voter].length; ) { + alreadyUsedPower += _proposal.voters[_voter][i].amount; + unchecked { + i++; + } + } + + // The voters already voted amount would exceed his voting power after this vote + if (_voteData.amount + alreadyUsedPower > votingPower) { + return false; + } + + // The voters already voted amount would exceed the max single wallet power after this vote + if (_voteData.amount + alreadyUsedPower > _proposal.parameters.maxSingleWalletPower) { + return false; + } } - - // In single vote the voter is required to vote with all their voting power - if (_voteData.amount < votingPower && - _proposal.parameters.votingMode == VotingMode.SingleVote - ) { - return false; + else { + // The voter is trying to vote with more voting power than they have avaliable. + if (_voteData.amount > votingPower) { + return false; + } + + if (_proposal.parameters.votingMode == VotingMode.SingleVote) { + // In single vote the voter is required to vote with all their voting power + if (_voteData.amount < votingPower) { + return false; + } + } + else { + // In partial vote the voter is not allowed to vote with more voting power than the maximum + if (_voteData.amount > _proposal.parameters.maxSingleWalletPower) { + return false; + } + } } return true; diff --git a/contracts/facets/membership/IVerificationFacet.sol b/contracts/facets/membership/IVerificationFacet.sol index 83ed485..d742853 100644 --- a/contracts/facets/membership/IVerificationFacet.sol +++ b/contracts/facets/membership/IVerificationFacet.sol @@ -7,24 +7,31 @@ pragma solidity ^0.8.0; -import { GithubVerification } from "../../verification/GithubVerification.sol"; +import { SignVerification } from "../../other/verification/SignVerification.sol"; /// @title IVerificationFacet /// @author Utrecht University - 2023 /// @notice The interface of the verification plugin. -abstract contract IVerificationFacet { +interface IVerificationFacet { /// @notice Returns all stamps of an account. /// @param _address The address to get stamps from. /// @return stamps The stamps of the account. - function getStamps(address _address) external view virtual returns (GithubVerification.Stamp[] memory); + function getStamps(address _address) external view returns (SignVerification.Stamp[] memory); /// @notice Returns stamps of an account at a given timestamp /// @param _address The address to get stamps from /// @param _timestamp The timestamp to get stamps at /// @return stamps The stamps of the account. - function getStampsAt(address _address, uint _timestamp) public view virtual returns (GithubVerification.Stamp[] memory); + function getStampsAt(address _address, uint _timestamp) external view returns (SignVerification.Stamp[] memory); /// @notice Returns the current verification contract address /// @return address of the verification contract - function getVerificationContractAddress() external view virtual returns (address); + function getVerificationContractAddress() external view returns (address); + + function getTierMapping(string calldata _providerId) external view returns (uint256); + + /// @notice Updates a "tier" score for a given provider. This can be used to either score new providers or update + /// scores of already scored providers + /// @dev This maps a providerId to a uint256 tier + function setTierMapping(string calldata _providerId, uint256 _tier) external; } \ No newline at end of file diff --git a/contracts/facets/membership/VerificationFacet.sol b/contracts/facets/membership/VerificationFacet.sol index e4ffe82..2136eec 100644 --- a/contracts/facets/membership/VerificationFacet.sol +++ b/contracts/facets/membership/VerificationFacet.sol @@ -8,21 +8,34 @@ pragma solidity ^0.8.0; import {IDAO} from "@aragon/osx/core/plugin/Plugin.sol"; import {LibVerificationStorage} from "../../libraries/storage/LibVerificationStorage.sol"; -import { ITieredMembershipStructure } from "../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; +import { ITieredMembershipStructure, IMembershipExtended, IMembership } from "../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; import { IMembershipWhitelisting } from "../../facets/governance/structure/membership/IMembershipWhitelisting.sol"; import { AuthConsumer } from "../../utils/AuthConsumer.sol"; -import { GithubVerification } from "../../verification/GithubVerification.sol"; -import { IVerificationFacet } from "./IVerificationFacet.sol"; +import { IVerificationFacet, SignVerification } from "./IVerificationFacet.sol"; +import { IFacet } from "../IFacet.sol"; -// Used for diamond pattern storage -library VerificationFacetInit { - struct InitParams { +/// @title Verification facet for the Diamond Governance Plugin +/// @author J.S.C.L. & T.Y.M.W. @ UU +/// @notice Additionally to the verification functionality, this includes the whitelisting functionality for the DAO membership +contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelisting, IVerificationFacet, AuthConsumer, IFacet { + // Permission used by the updateTierMapping function + bytes32 public constant UPDATE_TIER_MAPPING_PERMISSION_ID = keccak256("UPDATE_TIER_MAPPING_PERMISSION"); + // Permission used by the whitelist function + bytes32 public constant WHITELIST_MEMBER_PERMISSION_ID = keccak256("WHITELIST_MEMBER_PERMISSION"); + + struct VerificationFacetInitParams { address verificationContractAddress; string[] providers; uint256[] rewards; } - function init(InitParams calldata _params) external { + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + VerificationFacetInitParams memory _params = abi.decode(_initParams, (VerificationFacetInitParams)); + __VerificationFacet_init(_params); + } + + function __VerificationFacet_init(VerificationFacetInitParams memory _params) public virtual { LibVerificationStorage.Storage storage s = LibVerificationStorage.getStorage(); s.verificationContractAddress = _params.verificationContractAddress; @@ -34,21 +47,29 @@ library VerificationFacetInit { i++; } } - } -} -/// @title Verification facet for the Diamond Governance Plugin -/// @author J.S.C.L. & T.Y.M.W. @ UU -/// @notice Additionally to the verification functionality, this includes the whitelisting functionality for the DAO membership -contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelisting, IVerificationFacet, AuthConsumer { - // Permission used by the updateTierMapping function - bytes32 public constant UPDATE_TIER_MAPPING_PERMISSION_ID = keccak256("UPDATE_TIER_MAPPING_PERMISSION"); - // Permission used by the whitelist function - bytes32 public constant WHITELIST_MEMBER_PERMISSION_ID = keccak256("WHITELIST_MEMBER_PERMISSION"); + registerInterface(type(IMembership).interfaceId); + registerInterface(type(IMembershipExtended).interfaceId); + registerInterface(type(ITieredMembershipStructure).interfaceId); + registerInterface(type(IMembershipWhitelisting).interfaceId); + registerInterface(type(IVerificationFacet).interfaceId); + + emit MembershipContractAnnounced(address(this)); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IMembership).interfaceId); + unregisterInterface(type(IMembershipExtended).interfaceId); + unregisterInterface(type(ITieredMembershipStructure).interfaceId); + unregisterInterface(type(IMembershipWhitelisting).interfaceId); + unregisterInterface(type(IVerificationFacet).interfaceId); + super.deinit(); + } /// @notice Whitelist a given account /// @inheritdoc IMembershipWhitelisting - function whitelist(address _address) external auth(WHITELIST_MEMBER_PERMISSION_ID) { + function whitelist(address _address) external virtual override auth(WHITELIST_MEMBER_PERMISSION_ID) { LibVerificationStorage.getStorage().whitelistTimestamps[_address] = uint64(block.timestamp); } @@ -78,10 +99,10 @@ contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelistin function getStampsAt( address _address, uint _timestamp - ) public view override returns (GithubVerification.Stamp[] memory) { + ) public view virtual override returns (SignVerification.Stamp[] memory) { LibVerificationStorage.Storage storage ds = LibVerificationStorage.getStorage(); - GithubVerification verificationContract = GithubVerification(ds.verificationContractAddress); - GithubVerification.Stamp[] memory stamps = verificationContract.getStampsAt( + SignVerification verificationContract = SignVerification(ds.verificationContractAddress); + SignVerification.Stamp[] memory stamps = verificationContract.getStampsAt( _address, _timestamp ); @@ -91,14 +112,14 @@ contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelistin if (whitelistTimestamp == 0) { return stamps; } else { - GithubVerification.Stamp[] memory stamps2 = new GithubVerification.Stamp[]( + SignVerification.Stamp[] memory stamps2 = new SignVerification.Stamp[]( stamps.length + 1 ); uint64[] memory verifiedAt = new uint64[](1); verifiedAt[0] = whitelistTimestamp; - GithubVerification.Stamp memory stamp = GithubVerification.Stamp( + SignVerification.Stamp memory stamp = SignVerification.Stamp( "whitelist", toAsciiString(_address), verifiedAt @@ -115,24 +136,24 @@ contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelistin } /// @inheritdoc IVerificationFacet - function getStamps(address _address) external view override returns (GithubVerification.Stamp[] memory) { + function getStamps(address _address) external view override returns (SignVerification.Stamp[] memory) { LibVerificationStorage.Storage storage ds = LibVerificationStorage.getStorage(); - GithubVerification verificationContract = GithubVerification(ds.verificationContractAddress); - GithubVerification.Stamp[] memory stamps = verificationContract.getStamps(_address); + SignVerification verificationContract = SignVerification(ds.verificationContractAddress); + SignVerification.Stamp[] memory stamps = verificationContract.getStamps(_address); // Check if this account was whitelisted and add a "whitelist" stamp if applicable uint64 whitelistTimestamp = ds.whitelistTimestamps[_address]; if (whitelistTimestamp == 0) { return stamps; } else { - GithubVerification.Stamp[] memory stamps2 = new GithubVerification.Stamp[]( + SignVerification.Stamp[] memory stamps2 = new SignVerification.Stamp[]( stamps.length + 1 ); uint64[] memory verifiedAt = new uint64[](1); verifiedAt[0] = whitelistTimestamp; - GithubVerification.Stamp memory stamp = GithubVerification.Stamp( + SignVerification.Stamp memory stamp = SignVerification.Stamp( "whitelist", toAsciiString(_address), verifiedAt @@ -151,14 +172,14 @@ contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelistin /// @inheritdoc ITieredMembershipStructure function getMembers() external view virtual override returns (address[] memory members) { LibVerificationStorage.Storage storage ds = LibVerificationStorage.getStorage(); - GithubVerification verificationContract = GithubVerification(ds.verificationContractAddress); + SignVerification verificationContract = SignVerification(ds.verificationContractAddress); return verificationContract.getAllMembers(); } /// @inheritdoc ITieredMembershipStructure /// @notice Returns the highest tier included in the stamps of a given account function getTierAt(address _account, uint256 _timestamp) public view virtual override returns (uint256) { - GithubVerification.Stamp[] memory stampsAt = getStampsAt(_account, _timestamp); + SignVerification.Stamp[] memory stampsAt = getStampsAt(_account, _timestamp); LibVerificationStorage.Storage storage ds = LibVerificationStorage.getStorage(); mapping (string => uint256) storage tierMapping = ds.tierMapping; @@ -175,15 +196,18 @@ contract VerificationFacet is ITieredMembershipStructure, IMembershipWhitelistin return tier; } - /// @notice Updates a "tier" score for a given provider. This can be used to either score new providers or update - /// scores of already scored providers - /// @dev This maps a providerId to a uint256 tier - function updateTierMapping(string calldata providerId, uint256 tier) external auth(UPDATE_TIER_MAPPING_PERMISSION_ID) { - LibVerificationStorage.getStorage().tierMapping[providerId] = tier; + /// @inheritdoc IVerificationFacet + function getTierMapping(string calldata _providerId) external view virtual override returns (uint256) { + return LibVerificationStorage.getStorage().tierMapping[_providerId]; + } + + /// @inheritdoc IVerificationFacet + function setTierMapping(string calldata _providerId, uint256 _tier) external virtual override auth(UPDATE_TIER_MAPPING_PERMISSION_ID) { + LibVerificationStorage.getStorage().tierMapping[_providerId] = _tier; } /// @inheritdoc IVerificationFacet - function getVerificationContractAddress() external view override returns (address) { + function getVerificationContractAddress() external view virtual override returns (address) { return LibVerificationStorage.getStorage().verificationContractAddress; } } diff --git a/contracts/facets/mocks/DiamondCutMockFacet.sol b/contracts/facets/mocks/DiamondCutMockFacet.sol deleted file mode 100644 index 057c03c..0000000 --- a/contracts/facets/mocks/DiamondCutMockFacet.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -/******************************************************************************/ - -import { IDiamondCut } from "../../additional-contracts/IDiamondCut.sol"; -import { LibDiamond } from "../../libraries/LibDiamond.sol"; -import { DiamondCutFacet } from "../base/DiamondCutFacet.sol"; - -// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. -// The loupe functions are required by the EIP2535 Diamonds standard - -contract DiamondCutMockFacet { - /// @notice Add/replace/remove any number of functions and optionally execute - /// a function with delegatecall - /// @param _diamondCut Contains the facet addresses and function selectors - /// @param _init The address of the contract or facet to execute _calldata - /// @param _calldata A function call, including function selector and arguments - /// _calldata is executed with delegatecall on _init - function diamondCutMock( - IDiamondCut.FacetCut[] calldata _diamondCut, - address _init, - bytes calldata _calldata - ) external { - DiamondCutFacet dcf = DiamondCutFacet(address(this)); - dcf.diamondCut(_diamondCut, _init, _calldata); - } -} \ No newline at end of file diff --git a/contracts/facets/mocks/GithubPullRequestMockFacet.sol b/contracts/facets/mocks/GithubPullRequestMockFacet.sol deleted file mode 100644 index 9ec07f8..0000000 --- a/contracts/facets/mocks/GithubPullRequestMockFacet.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -import { GithubPullRequestFacet } from "../github-pr/GithubPullRequestFacet.sol"; - -contract GithubPullRequestMockFacet { - /// Mock function that calls the mergePullRequest function - /// @param _owner owner of the repository - /// @param _rep repository name - /// @param _pull_number pull request number - function _merge(string memory _owner, string memory _rep, string memory _pull_number) external { - GithubPullRequestFacet mergePullRequestFacet = GithubPullRequestFacet(address(this)); - mergePullRequestFacet.merge(_owner, _rep, _pull_number); - } -} diff --git a/contracts/facets/multiplier/IRewardMultiplierFacet.sol b/contracts/facets/multiplier/IRewardMultiplierFacet.sol new file mode 100644 index 0000000..b9e720c --- /dev/null +++ b/contracts/facets/multiplier/IRewardMultiplierFacet.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {LibABDKHelper} from "../../libraries/abdk-math/LibABDKHelper.sol"; + +abstract contract IRewardMultiplierFacet { + enum MultiplierType { + NONE, + LINEAR, + EXPONENTIAL, + CONSTANT + } + + /* ========== STRUCTS ========== */ + /* The following structs are used to store the multiplier information for each reward multiplier. */ + struct MultiplierInfo { + uint startBlock; + bytes16 initialAmount; + MultiplierType multiplierType; + } + + struct LinearParams { + bytes16 slope; + } + + struct ExponentialParams { + bytes16 base; + } + + /// @notice This function applies a multiplier to a number while keeping the most precision + /// @dev Returns the multiplier for a given variable name applied to a given amount + /// @param _name Name of the multiplier variable + /// @param _amount Number in 18 precision to apply the multiplier to + /// @return uint Result in 18 precision + function applyMultiplier( + string memory _name, + uint _amount + ) public view virtual returns (uint); + + /// @dev Returns the multiplier for a given reward multiplier variable (name) + /// @param _name The name of the multiplier variable + /// @return uint The multiplier + function getMultiplier( + string memory _name + ) public view virtual returns (uint) { + return LibABDKHelper.to18DecimalsQuad(getMultiplierQuad(_name)); + } + + /// @notice Return multiplier for a variable + /// @param _name Name of the variable + /// @return int128 Multiplier in quad float + function getMultiplierQuad( + string memory _name + ) public view virtual returns (bytes16); + + /* ========== SETTER FUNCTIONS ========== */ + /* The following functions are used to set the multiplier type of a reward multiplier variable. + * The functions follow the same pattern: + * @dev Sets the multiplier type to constant + * @param _name The name of the multiplier + * @param _startBlock The block number at which the multiplier starts + * @param _initialAmount The initial amount of the multiplier + * + any additional parameters for the specific multiplier type + */ + function setMultiplierTypeConstant( + string memory _name, + uint _startBlock, + uint _initialAmount + ) external virtual; + + function setMultiplierTypeLinear( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _slopeN, + uint _slopeD + ) external virtual; + + function setMultiplierTypeExponential( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _baseN, + uint _baseD + ) external virtual; +} diff --git a/contracts/facets/multiplier/LibCalculateGrowth.sol b/contracts/facets/multiplier/LibCalculateGrowth.sol new file mode 100644 index 0000000..4fc6293 --- /dev/null +++ b/contracts/facets/multiplier/LibCalculateGrowth.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {ABDKMathQuad} from "../../libraries/abdk-math/ABDKMathQuad.sol"; + +library LibCalculateGrowth { + /// @notice Calculate linear growth + /// @param _initialAmount b + /// @param _time x + /// @param _slope a + /// @return result in quad float + function calculateLinearGrowth( + bytes16 _initialAmount, + uint _time, + bytes16 _slope + ) internal pure returns (bytes16 result) { + bytes16 growth = ABDKMathQuad.mul( + _slope, + ABDKMathQuad.fromUInt(_time) + ); + + result = ABDKMathQuad.add(_initialAmount, growth); + } + + /// @notice Calculate exponential growth + /// @param _initialAmount b + /// @param _time x + /// @param _base a + /// @return result in quad float + function calculateExponentialGrowth( + bytes16 _initialAmount, + uint _time, + bytes16 _base + ) internal pure returns (bytes16 result) { + bytes16 growth = ABDKMathQuad.exp(ABDKMathQuad.mul(ABDKMathQuad.ln(_base), ABDKMathQuad.fromUInt(_time))); + + result = ABDKMathQuad.mul(_initialAmount, growth); + } +} diff --git a/contracts/facets/multiplier/RewardMultiplierFacet.sol b/contracts/facets/multiplier/RewardMultiplierFacet.sol new file mode 100644 index 0000000..066221f --- /dev/null +++ b/contracts/facets/multiplier/RewardMultiplierFacet.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {IRewardMultiplierFacet} from "./IRewardMultiplierFacet.sol"; +import {LibRewardMultiplierStorage} from "../../libraries/storage/LibRewardMultiplierStorage.sol"; +import {AuthConsumer} from "../../utils/AuthConsumer.sol"; +import {IFacet} from "../IFacet.sol"; +import {ABDKMathQuad} from "../../libraries/abdk-math/ABDKMathQuad.sol"; +import {LibABDKHelper} from "../../libraries/abdk-math/LibABDKHelper.sol"; +import {LibCalculateGrowth} from "./LibCalculateGrowth.sol"; + +contract RewardMultiplierFacet is AuthConsumer, IRewardMultiplierFacet, IFacet { + // Permission used by the setMultiplierType* functions + bytes32 public constant UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION_ID = + keccak256("UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION"); + + struct RewardMultiplierFacetInitParams { + string name; + uint startBlock; + uint initialAmount; + uint slopeN; + uint slopeD; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + RewardMultiplierFacetInitParams memory _params = abi.decode(_initParams, (RewardMultiplierFacetInitParams)); + __RewardMultiplierFacet_init(_params); + } + + function __RewardMultiplierFacet_init(RewardMultiplierFacetInitParams memory _initParams) public virtual { + _setMultiplierTypeLinear( + _initParams.name, + _initParams.startBlock, + _initParams.initialAmount, + _initParams.slopeN, + _initParams.slopeD + ); + registerInterface(type(IRewardMultiplierFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IRewardMultiplierFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc IRewardMultiplierFacet + function applyMultiplier( + string memory _name, + uint _amount + ) public view virtual override returns (uint) { + bytes16 multiplier = getMultiplierQuad(_name); + return + ABDKMathQuad.toUInt( + ABDKMathQuad.mul(multiplier, ABDKMathQuad.fromUInt(_amount)) + ); + } + + /// @inheritdoc IRewardMultiplierFacet + function getMultiplierQuad( + string memory _name + ) public view override returns (bytes16) { + LibRewardMultiplierStorage.Storage + storage s = LibRewardMultiplierStorage.getStorage(); + + MultiplierInfo memory _info = s.rewardMultiplier[_name]; + + uint _numBlocksPassed = block.number - _info.startBlock; + + // If the multiplier has not started yet, return 0 + if (_info.multiplierType == MultiplierType.CONSTANT) { + return _info.initialAmount; + } else if (_info.multiplierType == MultiplierType.LINEAR) { + LinearParams memory params = s.linearParams[_name]; + + return + LibCalculateGrowth.calculateLinearGrowth( + _info.initialAmount, + _numBlocksPassed, + params.slope + ); + } else if (_info.multiplierType == MultiplierType.EXPONENTIAL) { + ExponentialParams memory params = s.exponentialParams[_name]; + return + LibCalculateGrowth.calculateExponentialGrowth( + _info.initialAmount, + _numBlocksPassed, + params.base + ); + } + + return 0; + } + + /// @inheritdoc IRewardMultiplierFacet + function setMultiplierTypeConstant( + string memory _name, + uint _startBlock, + uint _initialAmount + ) external override auth(UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION_ID) { + _setMultiplierTypeConstant(_name, _startBlock, _initialAmount); + } + + /// @inheritdoc IRewardMultiplierFacet + function setMultiplierTypeLinear( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _slopeN, + uint _slopeD + ) external override auth(UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION_ID) { + _setMultiplierTypeLinear( + _name, + _startBlock, + _initialAmount, + _slopeN, + _slopeD + ); + } + + /// @inheritdoc IRewardMultiplierFacet + function setMultiplierTypeExponential( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _baseN, + uint _baseD + ) external override auth(UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION_ID) { + _setMultiplierTypeExponential( + _name, + _startBlock, + _initialAmount, + _baseN, + _baseD + ); + } + + function _setMultiplierTypeConstant( + string memory _name, + uint _startBlock, + uint _initialAmount + ) internal { + LibRewardMultiplierStorage.Storage + storage s = LibRewardMultiplierStorage.getStorage(); + s.rewardMultiplier[_name] = MultiplierInfo( + _startBlock, + LibABDKHelper.from18DecimalsQuad(_initialAmount), + MultiplierType.CONSTANT + ); + } + + function _setMultiplierTypeLinear( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _slopeN, + uint _slopeD + ) internal { + LibRewardMultiplierStorage.Storage + storage s = LibRewardMultiplierStorage.getStorage(); + s.rewardMultiplier[_name] = MultiplierInfo( + _startBlock, + LibABDKHelper.from18DecimalsQuad(_initialAmount), + MultiplierType.LINEAR + ); + bytes16 _slope = ABDKMathQuad.div( + ABDKMathQuad.fromUInt(_slopeN), + ABDKMathQuad.fromUInt(_slopeD) + ); + + s.linearParams[_name] = LinearParams(_slope); + } + + function _setMultiplierTypeExponential( + string memory _name, + uint _startBlock, + uint _initialAmount, + uint _baseN, + uint _baseD + ) internal { + LibRewardMultiplierStorage.Storage + storage s = LibRewardMultiplierStorage.getStorage(); + s.rewardMultiplier[_name] = MultiplierInfo( + _startBlock, + LibABDKHelper.from18DecimalsQuad(_initialAmount), + MultiplierType.EXPONENTIAL + ); + + bytes16 _base = ABDKMathQuad.div( + ABDKMathQuad.fromUInt(_baseN), + ABDKMathQuad.fromUInt(_baseD) + ); + s.exponentialParams[_name] = ExponentialParams(_base); + } +} diff --git a/contracts/facets/other/github-pr/GithubPullRequestFacet.sol b/contracts/facets/other/github-pr/GithubPullRequestFacet.sol new file mode 100644 index 0000000..caa0c6d --- /dev/null +++ b/contracts/facets/other/github-pr/GithubPullRequestFacet.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {IGithubPullRequestFacet} from "./IGitHubPullRequestFacet.sol"; +import {AuthConsumer} from "../../../utils/AuthConsumer.sol"; +import {IFacet} from "../../IFacet.sol"; + +contract GithubPullRequestFacet is + IGithubPullRequestFacet, + AuthConsumer, + IFacet +{ + /// @notice The permission identifier to merge pull requests. + bytes32 public constant MERGE_PR_PERMISSION_ID = + keccak256("MERGE_PR_PERMISSION"); + + /// @inheritdoc IFacet + function init(bytes memory /* _initParams*/) public virtual override { + __GithubPullRequestFacet_init(); + } + + function __GithubPullRequestFacet_init() public virtual { + registerInterface(type(IGithubPullRequestFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IGithubPullRequestFacet).interfaceId); + super.deinit(); + } + + /// Function that emits an event to merge a pull request + /// @param _owner Owner of the repository + /// @param _repo Name of the repository + /// @param _pull_number Number of the pull request + /// @param _sha SHA of the commit to merge + function merge( + string memory _owner, + string memory _repo, + string memory _pull_number, + string memory _sha + ) external virtual override auth(MERGE_PR_PERMISSION_ID) { + emit MergePullRequest(_owner, _repo, _pull_number, _sha); + } +} diff --git a/contracts/facets/github-pr/IGitHubPullRequestFacet.sol b/contracts/facets/other/github-pr/IGitHubPullRequestFacet.sol similarity index 64% rename from contracts/facets/github-pr/IGitHubPullRequestFacet.sol rename to contracts/facets/other/github-pr/IGitHubPullRequestFacet.sol index 88aa4be..a1688e9 100644 --- a/contracts/facets/github-pr/IGitHubPullRequestFacet.sol +++ b/contracts/facets/other/github-pr/IGitHubPullRequestFacet.sol @@ -11,7 +11,17 @@ interface IGithubPullRequestFacet { /// @param owner Owner of the repository /// @param repo Name of the repository /// @param pull_number Number of the pull request - event MergePullRequest(string owner, string repo, string pull_number); + event MergePullRequest( + string owner, + string repo, + string pull_number, + string sha + ); - function merge(string memory _owner, string memory _repo, string memory _pull_number) external; -} \ No newline at end of file + function merge( + string memory _owner, + string memory _repo, + string memory _pull_number, + string memory _sha + ) external; +} diff --git a/contracts/facets/other/secureseco/searchseco/IMiningRewardPoolFacet.sol b/contracts/facets/other/secureseco/searchseco/IMiningRewardPoolFacet.sol new file mode 100644 index 0000000..a8d3a61 --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/IMiningRewardPoolFacet.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +/// @title IMiningRewardPoolFacet +/// @author Utrecht University - 2023 +/// @notice The interface fo the mining reward pool. +interface IMiningRewardPoolFacet { + function getMiningRewardPool() external view returns (uint256); + + function increaseMiningRewardPool(uint _amount) external; + + function decreaseMiningRewardPool(uint _amount) external; + + function rewardCoinsToMiner(address _miner, uint _amount) external; +} diff --git a/contracts/facets/other/secureseco/searchseco/ISearchSECOMonetizationFacet.sol b/contracts/facets/other/secureseco/searchseco/ISearchSECOMonetizationFacet.sol new file mode 100644 index 0000000..3789646 --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/ISearchSECOMonetizationFacet.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +/// @title ISearchSECORewardingFacet +/// @author Utrecht University - 2023 +/// @notice The interface of the rewarding (miners) plugin. +interface ISearchSECOMonetizationFacet { + /// @notice This function is used to pay for hashes. The user builds a credit of hashes. + /// @param _amount Number of hashes the user wants to pay for + function payForHashes(uint _amount, string memory _uniqueId) external; + + /// @notice Retrieve the current cost of a hash + /// @return uint The current hashcost + function getHashCost() external view returns (uint); + + /// @notice Updates the cost of a hash (in the context of SearchSECO) + /// @param _hashCost The new cost of a hash + function setHashCost(uint _hashCost) external; +} diff --git a/contracts/facets/other/secureseco/searchseco/ISearchSECORewardingFacet.sol b/contracts/facets/other/secureseco/searchseco/ISearchSECORewardingFacet.sol new file mode 100644 index 0000000..6a2a7c6 --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/ISearchSECORewardingFacet.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +/// @title ISearchSECORewardingFacet +/// @author Utrecht University - 2023 +/// @notice The interface of the rewarding (miners) plugin. +interface ISearchSECORewardingFacet { + /// @notice Rewards the user for submitting new hashes + /// @param _toReward The address of the user to reward + /// @param _hashCount The (new) total number of hashes the user has submitted + /// @param _nonce A nonce, the current number of hashes the user has submitted + /// @param _proof The proof that the user received from the server + function rewardMinerForHashes( + address _toReward, + uint _hashCount, + uint _nonce, + uint _repFrac, + bytes calldata _proof + ) external; + + /// @notice Returns the hash count for a given user + /// @param _user The address of the user + /// @return The hash count + function getHashCount(address _user) external view returns (uint); + + /// @notice Returns the hash reward (REP), in 18 decimals precision + /// @return The hash reward + function getHashReward() external view returns (uint); + + /// @notice Sets the hash reward (REP) + /// @param _hashReward The new hash reward + function setHashReward(uint _hashReward) external; + + /// @notice Returns the signer used for signature verification + /// @return address signer + function getRewardingSigner() external view returns (address); + + /// @notice Sets the signer used for signature verification + /// @param _rewardingSigner The new signer + function setRewardingSigner(address _rewardingSigner) external; + + /// @notice Sets the percentage of the mining pool that is paid out to the miner (per hash). + /// @return The ratio in 18 decimals + function getMiningRewardPoolPayoutRatio() external view returns (uint); + + /// @notice Sets the percentage of the mining pool that is paid out to the miner (per hash). + /// @dev Stores the devaluation factor as a quad float fraction + /// @param _miningRewardPoolPayoutRatio The new ratio (in 18 decimals) + function setMiningRewardPoolPayoutRatio( + uint _miningRewardPoolPayoutRatio + ) external; + + /// @notice Returns the devaluation factor for hashes + /// @return The devaluation factor (in 18 decimals precision) + function getHashDevaluationFactor() external view returns (uint); + + /// @notice Sets the devaluation factor for hashes + /// @dev Stores the devaluation factor as a quad float fraction + /// @param _hashDevaluationFactor The new devaluation factor (in 18 decimals) + function setHashDevaluationFactor(uint _hashDevaluationFactor) external; +} diff --git a/contracts/facets/other/secureseco/searchseco/MiningRewardPoolFacet.sol b/contracts/facets/other/secureseco/searchseco/MiningRewardPoolFacet.sol new file mode 100644 index 0000000..4f0fba0 --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/MiningRewardPoolFacet.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {IDAO} from "@aragon/osx/core/plugin/Plugin.sol"; +import {IFacet} from "../../../IFacet.sol"; +import {IMiningRewardPoolFacet} from "./IMiningRewardPoolFacet.sol"; +import {LibMiningRewardStorage} from "../../../../libraries/storage/LibMiningRewardStorage.sol"; +import {IChangeableTokenContract} from "../../../token/ERC20/monetary-token/IChangeableTokenContract.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IDAOReferenceFacet} from "../../../aragon/IDAOReferenceFacet.sol"; +import {AuthConsumer} from "../../../../utils/AuthConsumer.sol"; + +contract MiningRewardPoolFacet is IMiningRewardPoolFacet, AuthConsumer, IFacet { + // Permission used by the updateTierMapping function + bytes32 public constant UPDATE_MINING_REWARD_POOL_PERMISSION_ID = + keccak256("UPDATE_MINING_REWARD_POOL_PERMISSION"); + + /// @inheritdoc IFacet + function init(bytes memory /*_initParams*/) public virtual override { + registerInterface(type(IMiningRewardPoolFacet).interfaceId); + } + + function __MiningRewardFacet_init() public virtual {} + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IMiningRewardPoolFacet).interfaceId); + } + + /// @inheritdoc IMiningRewardPoolFacet + function getMiningRewardPool() external view override returns (uint256) { + return LibMiningRewardStorage.getStorage().miningRewardPool; + } + + /// @inheritdoc IMiningRewardPoolFacet + function increaseMiningRewardPool(uint _amount) external override auth(UPDATE_MINING_REWARD_POOL_PERMISSION_ID) { + LibMiningRewardStorage.getStorage().miningRewardPool += _amount; + } + + /// @inheritdoc IMiningRewardPoolFacet + function decreaseMiningRewardPool(uint _amount) external override auth(UPDATE_MINING_REWARD_POOL_PERMISSION_ID) { + LibMiningRewardStorage.getStorage().miningRewardPool -= _amount; + } + + /// @inheritdoc IMiningRewardPoolFacet + function rewardCoinsToMiner(address _miner, uint _amount) external override auth(UPDATE_MINING_REWARD_POOL_PERMISSION_ID) { + IERC20(IChangeableTokenContract(address(this)).getTokenContractAddress()).transferFrom( + address(IDAOReferenceFacet(address(this)).dao()), + _miner, + _amount + ); + LibMiningRewardStorage.getStorage().miningRewardPool -= _amount; + } +} diff --git a/contracts/facets/other/secureseco/searchseco/SearchSECOMonetizationFacet.sol b/contracts/facets/other/secureseco/searchseco/SearchSECOMonetizationFacet.sol new file mode 100644 index 0000000..0acd88f --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/SearchSECOMonetizationFacet.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {IDAO} from "@aragon/osx/core/plugin/Plugin.sol"; +import {LibSearchSECOMonetizationStorage} from "../../../../libraries/storage/LibSearchSECOMonetizationStorage.sol"; +import {ISearchSECOMonetizationFacet} from "./ISearchSECOMonetizationFacet.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IChangeableTokenContract} from "../../../token/ERC20/monetary-token/IChangeableTokenContract.sol"; +import {IFacet} from "../../../IFacet.sol"; +import {IDAOReferenceFacet} from "../../../aragon/IDAOReferenceFacet.sol"; +import {AuthConsumer} from "../../../../utils/AuthConsumer.sol"; +import {IMiningRewardPoolFacet} from "./IMiningRewardPoolFacet.sol"; +import "../../../../utils/Ratio.sol"; + +/// @title SearchSECO monetization facet for the Diamond Governance Plugin +/// @author J.S.C.L. & T.Y.M.W. @ UU +/// @notice This integrates the SearchSECO project into the DAO by monetizing queries and rewarding spiders +contract SearchSECOMonetizationFacet is AuthConsumer, ISearchSECOMonetizationFacet, IFacet { + event PaymentProcessed(address sender, uint amount, string uniqueId); + + // Permission used by the updateTierMapping function + bytes32 public constant UPDATE_HASH_COST_MAPPING_PERMISSION_ID = + keccak256("UPDATE_HASH_COST_MAPPING_PERMISSION"); + + struct SearchSECOMonetizationFacetInitParams { + uint256 hashCost; + uint32 treasuryRatio; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + SearchSECOMonetizationFacetInitParams memory _params = abi.decode(_initParams, (SearchSECOMonetizationFacetInitParams)); + __SearchSECOMonetizationFacet_init(_params); + } + + + function __SearchSECOMonetizationFacet_init( + SearchSECOMonetizationFacetInitParams memory _params + ) public virtual { + LibSearchSECOMonetizationStorage.getStorage().hashCost = _params.hashCost; + LibSearchSECOMonetizationStorage.getStorage().treasuryRatio = _params.treasuryRatio; + + registerInterface(type(ISearchSECOMonetizationFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(ISearchSECOMonetizationFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc ISearchSECOMonetizationFacet + function payForHashes(uint _amount, string memory _uniqueId) external virtual override { + LibSearchSECOMonetizationStorage.Storage + storage s = LibSearchSECOMonetizationStorage.getStorage(); + IMiningRewardPoolFacet miningRewardFacet = IMiningRewardPoolFacet(address(this)); + IChangeableTokenContract monetaryTokenFacet = IChangeableTokenContract(address(this)); + IERC20 tokenContract = IERC20(monetaryTokenFacet.getTokenContractAddress()); + + + // Require that the balance of the sender has sufficient funds for this transaction + // hashCost is the cost of a single hash + require( + tokenContract.balanceOf(msg.sender) > s.hashCost * _amount, + "Insufficient tokens for this transaction" + ); + + // Calculate the amount of tokens that go to the treasury and the mining reward pool + uint ratio = s.treasuryRatio; + + uint totalPayout = s.hashCost * _amount; + uint toMiningRewardPool = _applyRatioCeiled(totalPayout, ratio); + + // Transfer the tokens from the sender to the treasury + tokenContract.transferFrom( + msg.sender, + address(IDAOReferenceFacet(address(this)).dao()), + totalPayout + ); + // "Transfer" to the piggy bank for mining rewards + miningRewardFacet.increaseMiningRewardPool(toMiningRewardPool); + + // Emit event so back-end can verify payment + emit PaymentProcessed(msg.sender, _amount, _uniqueId); + } + + /// @inheritdoc ISearchSECOMonetizationFacet + function getHashCost() external view virtual override returns (uint) { + return LibSearchSECOMonetizationStorage.getStorage().hashCost; + } + + /// @inheritdoc ISearchSECOMonetizationFacet + function setHashCost(uint _hashCost) external virtual override auth(UPDATE_HASH_COST_MAPPING_PERMISSION_ID) { + LibSearchSECOMonetizationStorage.getStorage().hashCost = _hashCost; + } +} diff --git a/contracts/facets/other/secureseco/searchseco/SearchSECORewardingFacet.sol b/contracts/facets/other/secureseco/searchseco/SearchSECORewardingFacet.sol new file mode 100644 index 0000000..739bcf4 --- /dev/null +++ b/contracts/facets/other/secureseco/searchseco/SearchSECORewardingFacet.sol @@ -0,0 +1,297 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {LibSearchSECORewardingStorage} from "../../../../libraries/storage/LibSearchSECORewardingStorage.sol"; +import {AuthConsumer} from "../../../../utils/AuthConsumer.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IFacet} from "../../../IFacet.sol"; +import {ISearchSECORewardingFacet} from "./ISearchSECORewardingFacet.sol"; +import {GenericSignatureHelper} from "../../../../utils/GenericSignatureHelper.sol"; +import {IMiningRewardPoolFacet} from "./IMiningRewardPoolFacet.sol"; +import {ABDKMathQuad} from "../../../../libraries/abdk-math/ABDKMathQuad.sol"; +import {LibABDKHelper} from "../../../../libraries/abdk-math/LibABDKHelper.sol"; +import {IMintableGovernanceStructure} from "../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; +import {IRewardMultiplierFacet} from "../../../multiplier/IRewardMultiplierFacet.sol"; + +/// @title A contract reward SearchSECO Spider users for submitting new hashes +/// @author J.S.C.L & T.Y.M.W. +/// @notice This contract is used to reward users for submitting new hashes +contract SearchSECORewardingFacet is + AuthConsumer, + GenericSignatureHelper, + ISearchSECORewardingFacet, + IFacet +{ + // Permission used by the setHashReward function + bytes32 public constant UPDATE_HASH_REWARD_PERMISSION_ID = + keccak256("UPDATE_HASH_REWARD_PERMISSION_ID"); + + // Permission used by the updateTierMapping function + bytes32 public constant UPDATE_REWARDING_SIGNER_PERMISSION_ID = + keccak256("UPDATE_REWARDING_SIGNER_MAPPING_PERMISSION"); + + struct SearchSECORewardingFacetInitParams { + address signer; + uint miningRewardPoolPayoutRatio; + uint hashDevaluationFactor; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + SearchSECORewardingFacetInitParams memory _params = abi.decode( + _initParams, + (SearchSECORewardingFacetInitParams) + ); + __SearchSECORewardingFacet_init(_params); + } + + function __SearchSECORewardingFacet_init( + SearchSECORewardingFacetInitParams memory _params + ) public virtual { + // Set signer for signature verification + LibSearchSECORewardingStorage.Storage + storage s = LibSearchSECORewardingStorage.getStorage(); + s.signer = _params.signer; + s.hashReward = 1; + _setMiningRewardPoolPayoutRatio(_params.miningRewardPoolPayoutRatio); + _setHashDevaluationFactor(_params.hashDevaluationFactor); + + registerInterface(type(ISearchSECORewardingFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(ISearchSECORewardingFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc ISearchSECORewardingFacet + function rewardMinerForHashes( + address _toReward, + uint _hashCount, + uint _nonce, + uint _repFrac, + bytes calldata _proof + ) external virtual override { + // This is necessary to read from storage + LibSearchSECORewardingStorage.Storage + storage s = LibSearchSECORewardingStorage.getStorage(); + IMiningRewardPoolFacet miningRewardPoolFacet = IMiningRewardPoolFacet( + address(this) + ); + + // Validate the given proof + require( + verify( + s.signer, + keccak256(abi.encodePacked(_toReward, _hashCount, _nonce)), + _proof + ), + "Proof is not valid" + ); + + // Make sure that the nonce is equal to the CURRENT hashCount + require( + s.hashCount[_toReward] == _nonce, + "Hash count does not match with nonce" + ); + + require( + _hashCount > _nonce, + "New hash count must be higher than current hash count" + ); + + // Update (overwrite) the hash count for the given address + s.hashCount[_toReward] = _hashCount; + + require( + _repFrac >= 0 && _repFrac <= 1_000_000, + "REP fraction must be between 0 and 1_000_000" + ); + + // The difference between the nonce and the TOTAL hash count is the amount of NEW hashes mined + uint actualHashCount = _hashCount - _nonce; + + // Calculate the reward + // 1. Split number of hashes up according to the given "repFrac" + bytes16 hashCountQuad = ABDKMathQuad.fromUInt(actualHashCount); + // This is the number of hashes for the REP reward, the rest is for the coin reward + bytes16 numHashDivided = ABDKMathQuad.mul( + hashCountQuad, + ABDKMathQuad.div( + ABDKMathQuad.fromUInt(_repFrac), + ABDKMathQuad.fromUInt(1_000_000) + ) + ); // div by 1_000_000 to get fraction + + // 2. Calculate the reputation reward by multiplying the fraction + // for the REP reward (calculated in step 1) to the hash reward (from storage) + bytes16 repReward = ABDKMathQuad.mul( + numHashDivided, + ABDKMathQuad.fromUInt(s.hashReward) + ); + // Multiply for inflation + repReward = ABDKMathQuad.mul( + IRewardMultiplierFacet(address(this)).getMultiplierQuad( + "inflation" + ), + repReward + ); + + // 3. Calculate the coin reward = 1 - (1 - miningRewardPoolPayoutRatio) ^ coinFrac + // (don't mind the variable name, this is to minimize the amount of variables used) + // coinFrac = (hashCount - numHashDivided) + + // coinReward = (1 - (1 - miningRewardPoolPayoutRatio) ^ coinFrac) * miningRewardPool + bytes16 coinReward = ABDKMathQuad.mul( + // coinReward = 1 - (1 - miningRewardPoolPayoutRatio) ^ coinFrac + ABDKMathQuad.sub( + ABDKMathQuad.fromUInt(1), + // coinReward = (1 - miningRewardPoolPayoutRatio) ^ coinFrac + ABDKMathQuad.exp( + ABDKMathQuad.mul( + // The hash count reserved for the coin reward (coinFrac) + // This is divided by a constant factor: hashDevaluationFactor + ABDKMathQuad.div( + ABDKMathQuad.sub(hashCountQuad, numHashDivided), + s.hashDevaluationFactor + ), + ABDKMathQuad.ln( + ABDKMathQuad.sub( + ABDKMathQuad.fromUInt(1), + s.miningRewardPoolPayoutRatio + ) + ) + ) + ) + ), + ABDKMathQuad.fromUInt(miningRewardPoolFacet.getMiningRewardPool()) + ); + + // Reward the user in REP + // Assume ERC20 token has 18 decimals + IMintableGovernanceStructure(address(this)).mintVotingPower( + _toReward, + 0, + LibABDKHelper.to18DecimalsQuad(repReward) + ); + + // Reward the user in coins + // Assume ERC20 token has 18 decimals + miningRewardPoolFacet.rewardCoinsToMiner( + _toReward, + ABDKMathQuad.toUInt(coinReward) + ); + } + + /// @inheritdoc ISearchSECORewardingFacet + function getHashCount( + address _user + ) public view virtual override returns (uint) { + return LibSearchSECORewardingStorage.getStorage().hashCount[_user]; + } + + /// @inheritdoc ISearchSECORewardingFacet + function getHashReward() external view virtual override returns (uint) { + return LibSearchSECORewardingStorage.getStorage().hashReward; + } + + /// @inheritdoc ISearchSECORewardingFacet + function setHashReward( + uint _hashReward + ) public virtual override auth(UPDATE_HASH_REWARD_PERMISSION_ID) { + LibSearchSECORewardingStorage.getStorage().hashReward = _hashReward; + } + + /// @inheritdoc ISearchSECORewardingFacet + function getRewardingSigner() + external + view + virtual + override + returns (address) + { + return LibSearchSECORewardingStorage.getStorage().signer; + } + + /// @inheritdoc ISearchSECORewardingFacet + function setRewardingSigner( + address _rewardingSigner + ) external virtual override auth(UPDATE_REWARDING_SIGNER_PERMISSION_ID) { + LibSearchSECORewardingStorage.Storage + storage s = LibSearchSECORewardingStorage.getStorage(); + + s.signer = _rewardingSigner; + } + + /// @inheritdoc ISearchSECORewardingFacet + function getMiningRewardPoolPayoutRatio() + external + view + override + returns (uint) + { + // Cast from quad float to dec18 + return + LibABDKHelper.to18DecimalsQuad( + LibSearchSECORewardingStorage + .getStorage() + .miningRewardPoolPayoutRatio + ); + } + + /// @inheritdoc ISearchSECORewardingFacet + function setMiningRewardPoolPayoutRatio( + uint _miningRewardPoolPayoutRatio + ) external override { + _setMiningRewardPoolPayoutRatio(_miningRewardPoolPayoutRatio); + } + + /// @inheritdoc ISearchSECORewardingFacet + function getHashDevaluationFactor() external view override returns (uint) { + // Cast from quad float to dec18 + return + LibABDKHelper.to18DecimalsQuad( + LibSearchSECORewardingStorage.getStorage().hashDevaluationFactor + ); + } + + /// @inheritdoc ISearchSECORewardingFacet + function setHashDevaluationFactor( + uint _hashDevaluationFactor + ) external override { + _setHashDevaluationFactor(_hashDevaluationFactor); + } + + function _setMiningRewardPoolPayoutRatio( + uint _miningRewardPoolPayoutRatio + ) internal { + // No need to waste gas checking >= 0, since it's uint + require( + _miningRewardPoolPayoutRatio <= 1e18, + "Error: invalid mining reward pool payout ratio" + ); + // Cast from dec18 to quad float + LibSearchSECORewardingStorage + .getStorage() + .miningRewardPoolPayoutRatio = LibABDKHelper.from18DecimalsQuad( + _miningRewardPoolPayoutRatio + ); + } + + function _setHashDevaluationFactor(uint _hashDevaluationFactor) internal { + // Cast from uint to quad float, don't multiply or divide by anything. + // This number is used as is to divide the number of hashes by. + LibSearchSECORewardingStorage + .getStorage() + .hashDevaluationFactor = ABDKMathQuad.fromUInt( + _hashDevaluationFactor + ); + } +} diff --git a/contracts/facets/searchseco-monetization/SearchSECOMonetizationFacet.sol b/contracts/facets/searchseco-monetization/SearchSECOMonetizationFacet.sol deleted file mode 100644 index b71b97c..0000000 --- a/contracts/facets/searchseco-monetization/SearchSECOMonetizationFacet.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -import {IDAO} from "@aragon/osx/core/plugin/Plugin.sol"; -import {LibSearchSECOMonetizationStorage} from "../../libraries/storage/LibSearchSECOMonetizationStorage.sol"; -import {AuthConsumer} from "../../utils/AuthConsumer.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -// Used for diamond pattern storage -library SearchSECOMonetizationFacetInit { - struct InitParams { - uint256 hashCost; - } - - function init(InitParams calldata _params) external { - LibSearchSECOMonetizationStorage.getStorage().hashCost = _params - .hashCost; - } -} - -/// @title SearchSECO monetization facet for the Diamond Governance Plugin -/// @author J.S.C.L. & T.Y.M.W. @ UU -/// @notice This integrates the SearchSECO project into the DAO by monetizing queries and rewarding spiders -contract SearchSECOMonetizationFacet is AuthConsumer { - event PaymentProcessed(address sender, uint amount, string uniqueId); - - // Permission used by the updateTierMapping function - bytes32 public constant UPDATE_HASH_COST_MAPPING_PERMISSION_ID = - keccak256("UPDATE_HASH_COST_MAPPING_PERMISSION"); - - /// @notice This function is used to pay for hashes. The user builds a credit of hashes. - /// @param _amount Number of hashes the user wants to pay for - function payForHashes(uint _amount, string memory _uniqueId) external { - LibSearchSECOMonetizationStorage.Storage - storage s = LibSearchSECOMonetizationStorage.getStorage(); - IERC20 tokenContract = IERC20(address(this)); - - // Require that the balance of the sender has sufficient funds for this transaction - // hashCost is the cost of a single hash - require( - tokenContract.balanceOf(msg.sender) > s.hashCost * _amount, - "Insufficient tokens for this transaction" - ); - - tokenContract.transferFrom( - msg.sender, - address(this), - s.hashCost * _amount - ); - - // Emit event so back-end can verify payment - emit PaymentProcessed(msg.sender, _amount, _uniqueId); - } - - /// @notice Updates the cost of a hash (in the context of SearchSECO) - /// @param _newCost The new cost of a hash - function updateHashCost( - uint _newCost - ) external auth(UPDATE_HASH_COST_MAPPING_PERMISSION_ID) { - LibSearchSECOMonetizationStorage.getStorage().hashCost = _newCost; - } - - /// @notice Retrieve the current cost of a hash - /// @return uint The current hashcost - function getHashCost() external view returns (uint) { - return LibSearchSECOMonetizationStorage.getStorage().hashCost; - } -} diff --git a/contracts/facets/searchseco-rewarding/SearchSECORewardingFacet.sol b/contracts/facets/searchseco-rewarding/SearchSECORewardingFacet.sol deleted file mode 100644 index bdeb452..0000000 --- a/contracts/facets/searchseco-rewarding/SearchSECORewardingFacet.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -import {IDAO} from "@aragon/osx/core/plugin/Plugin.sol"; -import {LibSearchSECORewardingStorage} from "../../libraries/storage/LibSearchSECORewardingStorage.sol"; -import {AuthConsumer} from "../../utils/AuthConsumer.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SignatureHelper} from "./SignatureHelper.sol"; - -// Used for diamond pattern storage -library SearchSECORewardingFacetInit { - struct InitParams { - address[] users; - uint[] hashCounts; - } - - function init(InitParams memory _params) external { - LibSearchSECORewardingStorage.Storage - storage s = LibSearchSECORewardingStorage.getStorage(); - - require( - _params.users.length == _params.hashCounts.length, - "Users and hashCounts must be of equal length" - ); - - for (uint i; i < _params.users.length; ) { - s.hashCount[_params.users[i]] = _params.hashCounts[i]; - - unchecked { - i++; - } - } - } -} - -/// @title A contract reward SearchSECO Spider users for submitting new hashes -/// @author J.S.C.L & T.Y.M.W. -/// @notice This contract is used to reward users for submitting new hashes -contract SearchSECORewardingFacet is AuthConsumer, Ownable, SignatureHelper { - /// @notice Rewards the user for submitting new hashes - /// @param _toReward The address of the user to reward - /// @param _hashCount The number of new hashes the user has submitted - /// @param _nonce A nonce - /// @param _proof The proof that the user received from the server - function reward( - address _toReward, - uint _hashCount, - uint _nonce, - bytes calldata _proof - ) public { - // Validate the given proof - require( - verify(owner(), _toReward, _hashCount, _nonce, _proof), - "Proof is not valid" - ); - - // This is necessary to read from storage - LibSearchSECORewardingStorage.Storage - storage s = LibSearchSECORewardingStorage.getStorage(); - - // Make sure that the hashCount is equal - require( - s.hashCount[_toReward] == _nonce, - "Hash count does not match with nonce" - ); - - s.hashCount[_toReward] += _hashCount; - - // TODO: Reward the user - // ... - } - - /// @notice Returns the hash count for a given user - /// @param _user The address of the user - /// @return The hash count - function getHashCount(address _user) public view returns (uint) { - return LibSearchSECORewardingStorage.getStorage().hashCount[_user]; - } -} diff --git a/contracts/facets/searchseco-rewarding/SignatureHelper.sol b/contracts/facets/searchseco-rewarding/SignatureHelper.sol deleted file mode 100644 index 70730eb..0000000 --- a/contracts/facets/searchseco-rewarding/SignatureHelper.sol +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.17; - -// Source: https://solidity-by-example.org/signature/ - -/* Signature Verification - -How to Sign and Verify -# Signing -1. Create message to sign -2. Hash the message -3. Sign the hash (off chain, keep your private key secret) - -# Verify -1. Recreate hash from the original message -2. Recover signer from signature and hash -3. Compare recovered signer to claimed signer -*/ - -contract SignatureHelper { - /* 1. Unlock MetaMask account - ethereum.enable() - */ - - /* 2. Get message hash to sign - getMessageHash( - 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C, - 123, - "coffee and donuts", - 1 - ) - - hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd" - */ - function getMessageHash( - address _toReward, - uint _hashCount, - uint _nonce - ) public pure returns (bytes32) { - bytes memory packedMsg = getPackedMessage( - _toReward, - _hashCount, - _nonce - ); - return keccak256(packedMsg); - } - - function getPackedMessage( - address _toReward, - uint _hashCount, - uint _nonce - ) public pure returns (bytes memory) { - return abi.encodePacked(_toReward, _hashCount, _nonce); - } - - /* 3. Sign message hash - # using browser - account = "copy paste account of signer here" - ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log) - - # using web3 - web3.personal.sign(hash, web3.eth.defaultAccount, console.log) - - Signature will be different for different accounts - 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b - */ - function getEthSignedMessageHash( - bytes32 _messageHash - ) public pure returns (bytes32) { - /* - Signature is produced by signing a keccak256 hash with the following format: - "\x19Ethereum Signed Message\n" + len(msg) + msg - */ - return - keccak256( - abi.encodePacked( - "\x19Ethereum Signed Message:\n32", - _messageHash - ) - ); - } - - /* 4. Verify signature - signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd - to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C - amount = 123 - message = "coffee and donuts" - nonce = 1 - signature = - 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b - */ - function verify( - address _signer, - address _toReward, - uint _hashCount, - uint _nonce, - bytes memory signature - ) public pure returns (bool) { - bytes32 messageHash = getMessageHash(_toReward, _hashCount, _nonce); - bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); - - return recoverSigner(ethSignedMessageHash, signature) == _signer; - } - - function recoverSigner( - bytes32 _ethSignedMessageHash, - bytes memory _signature - ) public pure returns (address) { - (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); - - return ecrecover(_ethSignedMessageHash, v, r, s); - } - - function splitSignature( - bytes memory sig - ) public pure returns (bytes32 r, bytes32 s, uint8 v) { - require(sig.length == 65, "invalid signature length"); - - assembly { - /* - First 32 bytes stores the length of the signature - - add(sig, 32) = pointer of sig + 32 - effectively, skips first 32 bytes of signature - - mload(p) loads next 32 bytes starting at the memory address p into memory - */ - - // first 32 bytes, after the length prefix - r := mload(add(sig, 32)) - // second 32 bytes - s := mload(add(sig, 64)) - // final byte (first byte of the next 32 bytes) - v := byte(0, mload(add(sig, 96))) - } - - // implicitly return (r, s, v) - } -} diff --git a/contracts/utils/auth-providers/AragonAuth.sol b/contracts/facets/testing/AlwaysAcceptAuthFacet.sol similarity index 52% rename from contracts/utils/auth-providers/AragonAuth.sol rename to contracts/facets/testing/AlwaysAcceptAuthFacet.sol index 685ab22..5b6ce10 100644 --- a/contracts/utils/auth-providers/AragonAuth.sol +++ b/contracts/facets/testing/AlwaysAcceptAuthFacet.sol @@ -9,14 +9,12 @@ pragma solidity ^0.8.0; -import { _auth } from "@aragon/osx/core/utils/auth.sol"; +import { IAuthProvider } from "../../utils/auth-providers/IAuthProvider.sol"; +import { IFacet } from "../IFacet.sol"; -import { IAuthProvider } from "./IAuthProvider.sol"; -import { DAOReferenceFacet } from "../../facets/aragon/DAOReferenceFacet.sol"; - -contract AragonAuth is IAuthProvider { +contract AlwaysAcceptAuthFacet is IAuthProvider, IFacet { /// @inheritdoc IAuthProvider - function auth(bytes32 _permissionId) external virtual override { - _auth(DAOReferenceFacet(address(this)).dao(), address(this), msg.sender, _permissionId, msg.data); + function auth(bytes32 _permissionId, address _account) external view virtual override { + } } \ No newline at end of file diff --git a/contracts/facets/testing/AlwaysMemberTier1Facet.sol b/contracts/facets/testing/AlwaysMemberTier1Facet.sol new file mode 100644 index 0000000..d2be9df --- /dev/null +++ b/contracts/facets/testing/AlwaysMemberTier1Facet.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { ITieredMembershipStructure, IMembershipExtended, IMembership } from "../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; +import { IMembershipWhitelisting } from "../../facets/governance/structure/membership/IMembershipWhitelisting.sol"; +import { IFacet } from "../IFacet.sol"; + +library AlwaysMemberTier1FacetStorage { + bytes32 constant STORAGE_POSITION = + keccak256("AlwaysMemberTier1Facet"); + + struct Storage { + address[] members; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +contract AlwaysMemberTier1Facet is ITieredMembershipStructure, IMembershipWhitelisting, IFacet { + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + registerInterface(type(IMembership).interfaceId); + registerInterface(type(IMembershipExtended).interfaceId); + registerInterface(type(ITieredMembershipStructure).interfaceId); + registerInterface(type(IMembershipWhitelisting).interfaceId); + emit MembershipContractAnnounced(address(this)); + super.init(_initParams); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IMembership).interfaceId); + unregisterInterface(type(IMembershipExtended).interfaceId); + unregisterInterface(type(ITieredMembershipStructure).interfaceId); + unregisterInterface(type(IMembershipWhitelisting).interfaceId); + super.deinit(); + } + + /// @inheritdoc IMembershipWhitelisting + function whitelist(address _address) external { + AlwaysMemberTier1FacetStorage.getStorage().members.push(_address); + } + + /// @inheritdoc ITieredMembershipStructure + function getMembers() external view virtual override returns (address[] memory members) { + return AlwaysMemberTier1FacetStorage.getStorage().members; + } + + /// @inheritdoc ITieredMembershipStructure + function getTierAt(address, uint256) public view virtual override returns (uint256) { + return 1; + } +} diff --git a/contracts/facets/testing/AuthConsumerTestFacet.sol b/contracts/facets/testing/AuthConsumerTestFacet.sol new file mode 100644 index 0000000..6ceef75 --- /dev/null +++ b/contracts/facets/testing/AuthConsumerTestFacet.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +pragma solidity ^0.8.0; + +import { AuthConsumer } from "../../utils/AuthConsumer.sol"; +import { IFacet } from "../IFacet.sol"; + +library AuthConsumerTestFacetStorage { + bytes32 constant STORAGE_POSITION = + keccak256("AuthConsumerTestFacet"); + + struct Storage { + bool executed; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +contract AuthConsumerTestFacet is AuthConsumer, IFacet { + bytes32 public constant AUTH_CONSUMER_TEST_PERMISSION_ID = keccak256("AUTH_CONSUMER_TEST_PERMISSION"); + + function Execute() external auth(AUTH_CONSUMER_TEST_PERMISSION_ID) { + AuthConsumerTestFacetStorage.getStorage().executed = true; + } + + function hasExecuted() external view returns (bool) { + return AuthConsumerTestFacetStorage.getStorage().executed; + } +} \ No newline at end of file diff --git a/contracts/facets/testing/ExecuteAnythingFacet.sol b/contracts/facets/testing/ExecuteAnythingFacet.sol new file mode 100644 index 0000000..514e3b6 --- /dev/null +++ b/contracts/facets/testing/ExecuteAnythingFacet.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IProposal, IDAO } from "@aragon/osx/core/plugin/proposal/IProposal.sol"; +import { IFacet } from "../IFacet.sol"; +import { IDAOReferenceFacet } from "../aragon/IDAOReferenceFacet.sol"; + +contract ExecuteAnythingFacet is IFacet { + function executeAnything(IDAO.Action[] memory _actions) external { + IDAOReferenceFacet dao = IDAOReferenceFacet(address(this)); + dao.dao().execute(0, _actions, 0); + } +} diff --git a/contracts/facets/testing/SetMemberTierFacet.sol b/contracts/facets/testing/SetMemberTierFacet.sol new file mode 100644 index 0000000..43fefcf --- /dev/null +++ b/contracts/facets/testing/SetMemberTierFacet.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { ITieredMembershipStructure, IMembershipExtended, IMembership } from "../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; +import { IMembershipWhitelisting } from "../../facets/governance/structure/membership/IMembershipWhitelisting.sol"; +import { IFacet } from "../IFacet.sol"; + +library SetMemberTierFacetStorage { + bytes32 constant STORAGE_POSITION = + keccak256("SetMemberTierFacet"); + + struct Storage { + address[] members; + mapping(address => uint256) tiers; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +contract SetMemberTierFacet is ITieredMembershipStructure, IMembershipWhitelisting, IFacet { + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + registerInterface(type(IMembership).interfaceId); + registerInterface(type(IMembershipExtended).interfaceId); + registerInterface(type(ITieredMembershipStructure).interfaceId); + registerInterface(type(IMembershipWhitelisting).interfaceId); + emit MembershipContractAnnounced(address(this)); + super.init(_initParams); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IMembership).interfaceId); + unregisterInterface(type(IMembershipExtended).interfaceId); + unregisterInterface(type(ITieredMembershipStructure).interfaceId); + unregisterInterface(type(IMembershipWhitelisting).interfaceId); + super.deinit(); + } + + /// @inheritdoc IMembershipWhitelisting + function whitelist(address _address) external { } + + function setMemberTier(address _address, uint256 _tier) external { + SetMemberTierFacetStorage.Storage storage s = SetMemberTierFacetStorage.getStorage(); + s.tiers[_address] = _tier; + s.members.push(_address); + } + + /// @inheritdoc ITieredMembershipStructure + function getMembers() external view virtual override returns (address[] memory members) { + return SetMemberTierFacetStorage.getStorage().members; + } + + /// @inheritdoc ITieredMembershipStructure + function getTierAt(address _account, uint256) public view virtual override returns (uint256) { + return SetMemberTierFacetStorage.getStorage().tiers[_account]; + } +} diff --git a/contracts/facets/token/EIP712/IEIP712Facet.sol b/contracts/facets/token/EIP712/IEIP712Facet.sol new file mode 100644 index 0000000..c802280 --- /dev/null +++ b/contracts/facets/token/EIP712/IEIP712Facet.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { IFacet } from "../../IFacet.sol"; + +import { LibEIP712Storage } from "../../../libraries/storage/LibEIP712Storage.sol"; + +/** + * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. + * + * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, + * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding + * they need in their contracts using a combination of `abi.encode` and `keccak256`. + * + * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding + * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA + * ({_hashTypedDataV4}). + * + * The implementation of the domain separator was designed to be as efficient as possible while still properly updating + * the chain id to protect against replay attacks on an eventual fork of the chain. + * + * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method + * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. + * + * _Available since v3.4._ + */ +abstract contract IEIP712Facet is IFacet { + + struct IEIP712FacetInitParams { + string name; + string version; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + IEIP712FacetInitParams memory _params = abi.decode(_initParams, (IEIP712FacetInitParams)); + __IEIP712Facet_init(_params); + } + + /** + * @dev Initializes the domain separator and parameter caches. + * + * The meaning of `name` and `version` is specified in + * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: + * + * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. + * - `version`: the current major version of the signing domain. + * + * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart + * contract upgrade]. + */ + function __IEIP712Facet_init(IEIP712FacetInitParams memory _params) public virtual { + LibEIP712Storage.Storage storage s = LibEIP712Storage.getStorage(); + bytes32 hashedName = keccak256(bytes(_params.name)); + bytes32 hashedVersion = keccak256(bytes(_params.version)); + bytes32 typeHash = keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ); + s._HASHED_NAME = hashedName; + s._HASHED_VERSION = hashedVersion; + s._CACHED_CHAIN_ID = block.chainid; + s._CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); + s._CACHED_THIS = address(this); + s._TYPE_HASH = typeHash; + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); + } + + /** + * @dev Returns the domain separator for the current chain. + */ + function _domainSeparatorV4() internal view returns (bytes32) { + LibEIP712Storage.Storage storage s = LibEIP712Storage.getStorage(); + if (address(this) == s._CACHED_THIS && block.chainid == s._CACHED_CHAIN_ID) { + return s._CACHED_DOMAIN_SEPARATOR; + } else { + return _buildDomainSeparator(s._TYPE_HASH, s._HASHED_NAME, s._HASHED_VERSION); + } + } + + function _buildDomainSeparator( + bytes32 typeHash, + bytes32 nameHash, + bytes32 versionHash + ) private view returns (bytes32) { + return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); + } + + /** + * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this + * function returns the hash of the fully encoded EIP712 message for this domain. + * + * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: + * + * ```solidity + * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( + * keccak256("Mail(address to,string contents)"), + * mailTo, + * keccak256(bytes(mailContents)) + * ))); + * address signer = ECDSA.recover(digest, signature); + * ``` + */ + function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { + return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); + } +} diff --git a/contracts/facets/token/ERC20/claiming/ERC20ClaimableFacet.sol b/contracts/facets/token/ERC20/claiming/IERC20ClaimableFacet.sol similarity index 88% rename from contracts/facets/token/ERC20/claiming/ERC20ClaimableFacet.sol rename to contracts/facets/token/ERC20/claiming/IERC20ClaimableFacet.sol index 63acf29..89397c3 100644 --- a/contracts/facets/token/ERC20/claiming/ERC20ClaimableFacet.sol +++ b/contracts/facets/token/ERC20/claiming/IERC20ClaimableFacet.sol @@ -7,8 +7,9 @@ pragma solidity ^0.8.0; import { IMintableGovernanceStructure } from "../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; +import { IFacet } from "../../../IFacet.sol"; -abstract contract ERC20ClaimableFacet { +abstract contract IERC20ClaimableFacet is IFacet { function _tokensClaimable(address _claimer) internal view virtual returns (uint256 amount); function _afterClaim(address _claimer) internal virtual; diff --git a/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeRewardFacet.sol b/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeRewardFacet.sol index fc6e481..effc839 100644 --- a/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeRewardFacet.sol +++ b/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeRewardFacet.sol @@ -12,48 +12,65 @@ pragma solidity ^0.8.0; import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { IERC20OneTimeRewardFacet } from "./IERC20OneTimeRewardFacet.sol"; -import { ERC20ClaimableFacet } from "../ERC20ClaimableFacet.sol"; +import { IERC20ClaimableFacet } from "../IERC20ClaimableFacet.sol"; import { AuthConsumer } from "../../../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../../../IFacet.sol"; import { LibERC20OneTimeRewardStorage } from "../../../../../libraries/storage/LibERC20OneTimeRewardStorage.sol"; -library ERC20OneTimeRewardFacetInit { - struct InitParams { +contract ERC20OneTimeRewardFacet is IERC20OneTimeRewardFacet, IERC20ClaimableFacet, AuthConsumer { + /// @notice The permission to update claim reward + bytes32 public constant UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION_ID = keccak256("UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION"); + + struct ERC20OneTimeRewardFacetInitParams { uint256 reward; } - function init(InitParams calldata _params) external { + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20OneTimeRewardFacetInitParams memory _params = abi.decode(_initParams, (ERC20OneTimeRewardFacetInitParams)); + __ERC20OneTimeRewardFacet_init(_params); + } + + function __ERC20OneTimeRewardFacet_init(ERC20OneTimeRewardFacetInitParams memory _params) public virtual { LibERC20OneTimeRewardStorage.getStorage().reward = _params.reward; + + registerInterface(type(IERC20OneTimeRewardFacet).interfaceId); } -} -contract ERC20OneTimeRewardFacet is IERC20OneTimeRewardFacet, ERC20ClaimableFacet, AuthConsumer { - /// @notice The permission to update claim reward and period - bytes32 public constant UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION_ID = keccak256("UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION"); + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20OneTimeRewardFacet).interfaceId); + super.deinit(); + } + /// @inheritdoc IERC20OneTimeRewardFacet function tokensClaimableOneTime() external view virtual returns (uint256 amount) { return _tokensClaimable(msg.sender); } + /// @inheritdoc IERC20OneTimeRewardFacet function claimOneTime() external virtual { _claim(msg.sender); } - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _tokensClaimable(address _claimer) internal view virtual override returns (uint256 amount) { return Math.max(0, LibERC20OneTimeRewardStorage.getStorage().reward - LibERC20OneTimeRewardStorage.getStorage().hasClaimed[_claimer]); } - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _afterClaim(address _claimer) internal virtual override { LibERC20OneTimeRewardStorage.getStorage().hasClaimed[_claimer] = LibERC20OneTimeRewardStorage.getStorage().reward; } - function setOneTimeReward(uint256 _reward) external auth(UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION_ID) { - _setOneTimeReward(_reward); + /// @inheritdoc IERC20OneTimeRewardFacet + function getOneTimeReward() external view virtual override returns (uint256) { + return LibERC20OneTimeRewardStorage.getStorage().reward; } - function _setOneTimeReward(uint256 _reward) internal virtual { - LibERC20OneTimeRewardStorage.getStorage().reward = _reward; + /// @inheritdoc IERC20OneTimeRewardFacet + function setOneTimeReward(uint256 _oneTimeReward) external virtual override auth(UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION_ID) { + LibERC20OneTimeRewardStorage.getStorage().reward = _oneTimeReward; } } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol b/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol index ad01786..42739fa 100644 --- a/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol +++ b/contracts/facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol @@ -12,20 +12,30 @@ pragma solidity ^0.8.0; import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { IERC20OneTimeVerificationRewardFacet } from "./IERC20OneTimeVerificationRewardFacet.sol"; -import { ERC20ClaimableFacet, IMintableGovernanceStructure } from "../ERC20ClaimableFacet.sol"; +import { IERC20ClaimableFacet, IMintableGovernanceStructure } from "../IERC20ClaimableFacet.sol"; import { AuthConsumer } from "../../../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../../../IFacet.sol"; import { LibERC20OneTimeVerificationRewardStorage } from "../../../../../libraries/storage/LibERC20OneTimeVerificationRewardStorage.sol"; -import { GithubVerification } from "../../../../../verification/GithubVerification.sol"; +import { SignVerification } from "../../../../../other/verification/SignVerification.sol"; import { VerificationFacet } from "../../../../membership/VerificationFacet.sol"; -library ERC20OneTimeVerificationRewardFacetInit { - struct InitParams { +contract ERC20OneTimeVerificationRewardFacet is IERC20OneTimeVerificationRewardFacet, IERC20ClaimableFacet, AuthConsumer { + /// @notice The permission to update claim reward + bytes32 public constant UPDATE_ONE_TIME_VERIFICATION_REWARD_SETTINGS_PERMISSION_ID = keccak256("UPDATE_ONE_TIME_VERIFICATION_REWARD_SETTINGS_PERMISSION"); + + struct ERC20OneTimeVerificationRewardFacetInitParams { string[] providers; uint256[] rewards; } - function init(InitParams calldata _params) external { + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20OneTimeVerificationRewardFacetInitParams memory _params = abi.decode(_initParams, (ERC20OneTimeVerificationRewardFacetInitParams)); + __ERC20OneTimeVerificationRewardFacet_init(_params); + } + + function __ERC20OneTimeVerificationRewardFacet_init(ERC20OneTimeVerificationRewardFacetInitParams memory _params) public virtual { require(_params.providers.length == _params.rewards.length, "Providers and rewards array length doesnt match"); LibERC20OneTimeVerificationRewardStorage.Storage storage s = LibERC20OneTimeVerificationRewardStorage.getStorage(); @@ -35,14 +45,20 @@ library ERC20OneTimeVerificationRewardFacetInit { i++; } } + + registerInterface(type(IERC20OneTimeVerificationRewardFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20OneTimeVerificationRewardFacet).interfaceId); + super.deinit(); } -} -contract ERC20OneTimeVerificationRewardFacet is IERC20OneTimeVerificationRewardFacet, ERC20ClaimableFacet, AuthConsumer { - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _tokensClaimable(address _claimer) internal view virtual override returns (uint256 amount) { // Get data from storage - GithubVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(_claimer, block.timestamp); + SignVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(_claimer, block.timestamp); for (uint i; i < stampsAt.length; ) { uint amountClaimable = _tokensClaimableStamp(_claimer, stampsAt[i].providerId, stampsAt[i].userHash); @@ -56,10 +72,10 @@ contract ERC20OneTimeVerificationRewardFacet is IERC20OneTimeVerificationRewardF } } - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _afterClaim(address _claimer) internal virtual override { // Get data from storage - GithubVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(_claimer, block.timestamp); + SignVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(_claimer, block.timestamp); for (uint i; i < stampsAt.length; ) { _afterClaimStamp(_claimer, stampsAt[i].providerId, stampsAt[i].userHash); @@ -70,26 +86,39 @@ contract ERC20OneTimeVerificationRewardFacet is IERC20OneTimeVerificationRewardF } } + /// @inheritdoc IERC20OneTimeVerificationRewardFacet function tokensClaimableVerificationRewardAll() external view virtual returns (uint256 amount) { return _tokensClaimable(msg.sender); } + /// @inheritdoc IERC20OneTimeVerificationRewardFacet function claimVerificationRewardAll() external virtual { _claim(msg.sender); } - - function tokensClaimableVerificationRewardStamp(uint256 stampIndex) external view virtual returns (uint256 amount) { - GithubVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(msg.sender, block.timestamp); - require(stampIndex < stampsAt.length, "Stamp index out of bound"); - return _tokensClaimableStamp(msg.sender, stampsAt[stampIndex].providerId, stampsAt[stampIndex].userHash); + /// @inheritdoc IERC20OneTimeVerificationRewardFacet + function tokensClaimableVerificationRewardStamp(uint256 _stampIndex) external view virtual returns (uint256 amount) { + SignVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(msg.sender, block.timestamp); + require(_stampIndex < stampsAt.length, "Stamp index out of bound"); + return _tokensClaimableStamp(msg.sender, stampsAt[_stampIndex].providerId, stampsAt[_stampIndex].userHash); + } + + /// @inheritdoc IERC20OneTimeVerificationRewardFacet + function claimVerificationRewardStamp(uint256 _stampIndex) external virtual { + SignVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(msg.sender, block.timestamp); + require(_stampIndex < stampsAt.length, "Stamp index out of bound"); + IMintableGovernanceStructure(address(this)).mintVotingPower(msg.sender, 0, _tokensClaimableStamp(msg.sender, stampsAt[_stampIndex].providerId, stampsAt[_stampIndex].userHash)); + _afterClaimStamp(msg.sender, stampsAt[_stampIndex].providerId, stampsAt[_stampIndex].userHash); + } + + /// @inheritdoc IERC20OneTimeVerificationRewardFacet + function getProviderReward(string calldata _provider) external view virtual override returns (uint256) { + return LibERC20OneTimeVerificationRewardStorage.getStorage().providerReward[_provider]; } - function claimVerificationRewardStamp(uint256 stampIndex) external virtual { - GithubVerification.Stamp[] memory stampsAt = VerificationFacet(address(this)).getStampsAt(msg.sender, block.timestamp); - require(stampIndex < stampsAt.length, "Stamp index out of bound"); - IMintableGovernanceStructure(address(this)).mintVotingPower(msg.sender, 0, _tokensClaimableStamp(msg.sender, stampsAt[stampIndex].providerId, stampsAt[stampIndex].userHash)); - _afterClaimStamp(msg.sender, stampsAt[stampIndex].providerId, stampsAt[stampIndex].userHash); + /// @inheritdoc IERC20OneTimeVerificationRewardFacet + function setProviderReward(string calldata _provider, uint256 _reward) external virtual override auth(UPDATE_ONE_TIME_VERIFICATION_REWARD_SETTINGS_PERMISSION_ID) { + LibERC20OneTimeVerificationRewardStorage.getStorage().providerReward[_provider] = _reward; } function _afterClaimStamp(address _claimer, string memory _provider, string memory _stamp) internal virtual { diff --git a/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeRewardFacet.sol b/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeRewardFacet.sol index b172ec0..657ad00 100644 --- a/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeRewardFacet.sol +++ b/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeRewardFacet.sol @@ -1,16 +1,20 @@ // SPDX-License-Identifier: MIT /** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + pragma solidity ^0.8.0; interface IERC20OneTimeRewardFacet { function tokensClaimableOneTime() external view returns (uint256 amount); function claimOneTime() external; -} \ No newline at end of file + + function getOneTimeReward() external view returns (uint256); + + function setOneTimeReward(uint256 _oneTimeReward) external; +} diff --git a/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeVerificationRewardFacet.sol b/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeVerificationRewardFacet.sol index 67eef96..898c2f6 100644 --- a/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeVerificationRewardFacet.sol +++ b/contracts/facets/token/ERC20/claiming/one-time/IERC20OneTimeVerificationRewardFacet.sol @@ -13,4 +13,12 @@ interface IERC20OneTimeVerificationRewardFacet { function tokensClaimableVerificationRewardAll() external view returns (uint256 amount); function claimVerificationRewardAll() external; + + function tokensClaimableVerificationRewardStamp(uint256 _stampIndex) external view returns (uint256 amount); + + function claimVerificationRewardStamp(uint256 _stampIndex) external; + + function getProviderReward(string calldata _provider) external view returns (uint256); + + function setProviderReward(string calldata _provider, uint256 _reward) external; } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingProposalRefundFacet.sol b/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingProposalRefundFacet.sol index 39fe90e..8a98762 100644 --- a/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingProposalRefundFacet.sol +++ b/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingProposalRefundFacet.sol @@ -11,26 +11,43 @@ pragma solidity ^0.8.0; import { IERC20PartialBurnVotingProposalRefundFacet } from "./IERC20PartialBurnVotingProposalRefundFacet.sol"; import { IMintableGovernanceStructure } from "../../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; -import { PartialVotingProposalFacet } from "../../../../governance/proposal/PartialVotingProposalFacet.sol"; +import { IPartialVotingProposalFacet } from "../../../../governance/proposal/IPartialVotingProposalFacet.sol"; -import { LibPartialBurnVotingProposalStorage } from "../../../../../libraries/storage/LibPartialBurnVotingProposalStorage.sol"; +import { LibPartialVotingProposalStorage } from "../../../../../libraries/storage/LibPartialVotingProposalStorage.sol"; +import { LibBurnVotingProposalStorage } from "../../../../../libraries/storage/LibBurnVotingProposalStorage.sol"; +import { IFacet } from "../../../../IFacet.sol"; + +contract ERC20PartialBurnVotingProposalRefundFacet is IERC20PartialBurnVotingProposalRefundFacet, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __ERC20PartialBurnVotingProposalRefundFacet_init(); + } + + function __ERC20PartialBurnVotingProposalRefundFacet_init() public virtual { + registerInterface(type(IERC20PartialBurnVotingProposalRefundFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20PartialBurnVotingProposalRefundFacet).interfaceId); + super.deinit(); + } -contract ERC20PartialBurnVotingProposalRefundFacet is IERC20PartialBurnVotingProposalRefundFacet { function tokensRefundableFromProposalCreation(uint256 _proposalId, address _claimer) public view virtual returns (uint256) { if (!_proposalRefundable(_proposalId)) return 0; - LibPartialBurnVotingProposalStorage.Storage storage s = LibPartialBurnVotingProposalStorage.getStorage(); + if (_claimer != LibPartialVotingProposalStorage.getStorage().proposals[_proposalId].creator) return 0; - return _claimer == s.proposalCreator[_proposalId] ? s.proposalCost[_proposalId] : 0; + return LibBurnVotingProposalStorage.getStorage().proposalCost[_proposalId]; } function _proposalRefundable(uint256 _proposalId) internal view virtual returns (bool) { - PartialVotingProposalFacet proposalFacet = PartialVotingProposalFacet(address(this)); - (bool open, , , , , , ) = proposalFacet.getProposal(_proposalId); + IPartialVotingProposalFacet proposalFacet = IPartialVotingProposalFacet(address(this)); + (bool open,,,,,,,,,) = proposalFacet.getProposal(_proposalId); return !open && proposalFacet.isSupportThresholdReached(_proposalId); } function _afterClaim(uint256 _proposalId, address/* _claimer*/) internal virtual { - LibPartialBurnVotingProposalStorage.getStorage().proposalCost[_proposalId] = 0; + LibBurnVotingProposalStorage.getStorage().proposalCost[_proposalId] = 0; } function refundTokensFromProposalCreation(uint256 _proposalId) external virtual { diff --git a/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingRefundFacet.sol b/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingRefundFacet.sol index 079f43c..896f0ab 100644 --- a/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingRefundFacet.sol +++ b/contracts/facets/token/ERC20/claiming/refund/ERC20PartialBurnVotingRefundFacet.sol @@ -11,25 +11,41 @@ pragma solidity ^0.8.0; import { IERC20PartialBurnVotingRefundFacet } from "./IERC20PartialBurnVotingRefundFacet.sol"; import { IMintableGovernanceStructure } from "../../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; -import { PartialVotingProposalFacet } from "../../../../governance/proposal/PartialVotingProposalFacet.sol"; +import { IPartialVotingProposalFacet } from "../../../../governance/proposal/IPartialVotingProposalFacet.sol"; -import { LibPartialBurnVotingProposalStorage } from "../../../../../libraries/storage/LibPartialBurnVotingProposalStorage.sol"; +import { LibBurnVotingProposalStorage } from "../../../../../libraries/storage/LibBurnVotingProposalStorage.sol"; +import { IFacet } from "../../../../IFacet.sol"; + +contract ERC20PartialBurnVotingRefundFacet is IERC20PartialBurnVotingRefundFacet, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __ERC20PartialBurnVotingRefundFacet_init(); + } + + function __ERC20PartialBurnVotingRefundFacet_init() public virtual { + registerInterface(type(IERC20PartialBurnVotingRefundFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20PartialBurnVotingRefundFacet).interfaceId); + super.deinit(); + } -contract ERC20PartialBurnVotingRefundFacet is IERC20PartialBurnVotingRefundFacet { function tokensRefundableFromProposal(uint256 _proposalId, address _claimer) public view virtual returns (uint256) { if (!_proposalRefundable(_proposalId)) return 0; - return LibPartialBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_claimer]; + return LibBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_claimer]; } function _proposalRefundable(uint256 _proposalId) internal view virtual returns (bool) { - PartialVotingProposalFacet proposalFacet = PartialVotingProposalFacet(address(this)); - (bool open, , , , , , ) = proposalFacet.getProposal(_proposalId); + IPartialVotingProposalFacet proposalFacet = IPartialVotingProposalFacet(address(this)); + (bool open,,,,,,,,,) = proposalFacet.getProposal(_proposalId); return !open && !proposalFacet.isMinParticipationReached(_proposalId); } function _afterClaim(uint256 _proposalId, address _claimer) internal virtual { - LibPartialBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_claimer] = 0; + LibBurnVotingProposalStorage.getStorage().proposalBurnData[_proposalId][_claimer] = 0; } function refundTokensFromProposal(uint256 _proposalId) external virtual { diff --git a/contracts/facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol b/contracts/facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol index 9c48ab6..68aa1c0 100644 --- a/contracts/facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol +++ b/contracts/facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol @@ -10,19 +10,28 @@ pragma solidity ^0.8.0; import { IERC20TieredTimeClaimableFacet } from "./IERC20TieredTimeClaimableFacet.sol"; -import { ERC20TimeClaimableFacet, ERC20TimeClaimableFacetInit } from "./ERC20TimeClaimableFacet.sol"; +import { ERC20TimeClaimableFacet } from "./ERC20TimeClaimableFacet.sol"; import { ITieredMembershipStructure } from "../../../../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; import { LibERC20TieredTimeClaimableStorage } from "../../../../../libraries/storage/LibERC20TieredTimeClaimableStorage.sol"; +import { IFacet } from "../../../../../facets/IFacet.sol"; -library ERC20TieredTimeClaimableFacetInit { - struct InitParams { +contract ERC20TieredTimeClaimableFacet is IERC20TieredTimeClaimableFacet, ERC20TimeClaimableFacet { + struct ERC20TieredTimeClaimableFacetInitParams { uint256[] tiers; uint256[] rewards; - ERC20TimeClaimableFacetInit.InitParams timeClaimableInit; + ERC20TimeClaimableFacetInitParams _ERC20TimeClaimableFacetInitParams; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20TieredTimeClaimableFacetInitParams memory _params = abi.decode(_initParams, (ERC20TieredTimeClaimableFacetInitParams)); + __ERC20TieredTimeClaimableFacet_init(_params); } - function init(InitParams calldata _params) external { + function __ERC20TieredTimeClaimableFacet_init(ERC20TieredTimeClaimableFacetInitParams memory _params) public virtual { + __ERC20TimeClaimableFacet_init(_params._ERC20TimeClaimableFacetInitParams); + require (_params.tiers.length == _params.rewards.length, "Tiers and rewards should be same length"); for (uint i; i < _params.tiers.length; ) { @@ -31,16 +40,23 @@ library ERC20TieredTimeClaimableFacetInit { i++; } } - ERC20TimeClaimableFacetInit.init(_params.timeClaimableInit); + + registerInterface(type(IERC20TieredTimeClaimableFacet).interfaceId); } -} -contract ERC20TieredTimeClaimableFacet is IERC20TieredTimeClaimableFacet, ERC20TimeClaimableFacet { - function setClaimReward(uint256 _tier, uint256 _reward) external auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { - _setClaimReward(_tier, _reward); + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20TieredTimeClaimableFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc IERC20TieredTimeClaimableFacet + function getClaimReward(uint256 _tier) external view virtual override returns (uint256) { + return LibERC20TieredTimeClaimableStorage.getStorage().rewardForTier[_tier]; } - function _setClaimReward(uint256 _tier, uint256 _reward) internal virtual { + /// @inheritdoc IERC20TieredTimeClaimableFacet + function setClaimReward(uint256 _tier, uint256 _reward) external virtual override auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { LibERC20TieredTimeClaimableStorage.getStorage().rewardForTier[_tier] = _reward; } diff --git a/contracts/facets/token/ERC20/claiming/time/ERC20TimeClaimableFacet.sol b/contracts/facets/token/ERC20/claiming/time/ERC20TimeClaimableFacet.sol index a9ac069..998c495 100644 --- a/contracts/facets/token/ERC20/claiming/time/ERC20TimeClaimableFacet.sol +++ b/contracts/facets/token/ERC20/claiming/time/ERC20TimeClaimableFacet.sol @@ -12,27 +12,42 @@ pragma solidity ^0.8.0; import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { IERC20TimeClaimableFacet } from "./IERC20TimeClaimableFacet.sol"; -import { ERC20ClaimableFacet } from "../ERC20ClaimableFacet.sol"; +import { IERC20ClaimableFacet } from "../IERC20ClaimableFacet.sol"; import { ITieredMembershipStructure } from "../../../../../facets/governance/structure/membership/ITieredMembershipStructure.sol"; import { AuthConsumer } from "../../../../../utils/AuthConsumer.sol"; +import { IRewardMultiplierFacet } from "../../../../multiplier/IRewardMultiplierFacet.sol"; import { LibERC20TimeClaimableStorage } from "../../../../../libraries/storage/LibERC20TimeClaimableStorage.sol"; +import { IFacet } from "../../../../../facets/IFacet.sol"; -library ERC20TimeClaimableFacetInit { - struct InitParams { +contract ERC20TimeClaimableFacet is IERC20TimeClaimableFacet, IERC20ClaimableFacet, AuthConsumer { + /// @notice The permission to update claim reward and period + bytes32 public constant UPDATE_CLAIM_SETTINGS_PERMISSION_ID = keccak256("UPDATE_CLAIM_SETTINGS_PERMISSION"); + + struct ERC20TimeClaimableFacetInitParams { uint256 timeTillReward; uint256 maxTimeRewarded; } - function init(InitParams calldata _params) external { - LibERC20TimeClaimableStorage.getStorage().timeTillReward = _params.timeTillReward; - LibERC20TimeClaimableStorage.getStorage().maxTimeRewarded = _params.maxTimeRewarded; + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20TimeClaimableFacetInitParams memory _params = abi.decode(_initParams, (ERC20TimeClaimableFacetInitParams)); + __ERC20TimeClaimableFacet_init(_params); } -} -contract ERC20TimeClaimableFacet is IERC20TimeClaimableFacet, ERC20ClaimableFacet, AuthConsumer { - /// @notice The permission to update claim reward and period - bytes32 public constant UPDATE_CLAIM_SETTINGS_PERMISSION_ID = keccak256("UPDATE_CLAIM_SETTINGS_PERMISSION"); + function __ERC20TimeClaimableFacet_init(ERC20TimeClaimableFacetInitParams memory _params) public virtual { + LibERC20TimeClaimableStorage.Storage storage s = LibERC20TimeClaimableStorage.getStorage(); + s.timeTillReward = _params.timeTillReward; + s.maxTimeRewarded = _params.maxTimeRewarded; + + registerInterface(type(IERC20TimeClaimableFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20TimeClaimableFacet).interfaceId); + super.deinit(); + } function tokensClaimableTime() external view virtual returns (uint256 amount) { return _tokensClaimable(msg.sender); @@ -42,30 +57,34 @@ contract ERC20TimeClaimableFacet is IERC20TimeClaimableFacet, ERC20ClaimableFace _claim(msg.sender); } - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _tokensClaimable(address _claimer) internal view virtual override returns (uint256 amount) { return _tokensClaimableAt(_claimer, block.timestamp); } - /// @inheritdoc ERC20ClaimableFacet + /// @inheritdoc IERC20ClaimableFacet function _afterClaim(address _claimer) internal virtual override { LibERC20TimeClaimableStorage.getStorage().lastClaim[_claimer] = block.timestamp; } - function setClaimPeriodInterval(uint256 _timeTillReward) external auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { - _setClaimPeriodInterval(_timeTillReward); + /// @inheritdoc IERC20TimeClaimableFacet + function getClaimPeriodInterval() external view virtual override returns (uint256) { + return LibERC20TimeClaimableStorage.getStorage().timeTillReward; } - function _setClaimPeriodInterval(uint256 _timeTillReward) internal virtual { - LibERC20TimeClaimableStorage.getStorage().timeTillReward = _timeTillReward; + /// @inheritdoc IERC20TimeClaimableFacet + function setClaimPeriodInterval(uint256 _claimPeriodInterval) external auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { + LibERC20TimeClaimableStorage.getStorage().timeTillReward = _claimPeriodInterval; } - function setClaimPeriodMax(uint256 _maxTimeRewarded) external auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { - _setClaimPeriodMax(_maxTimeRewarded); + /// @inheritdoc IERC20TimeClaimableFacet + function getClaimPeriodMax() external view virtual override returns (uint256) { + return LibERC20TimeClaimableStorage.getStorage().maxTimeRewarded; } - function _setClaimPeriodMax(uint256 _maxTimeRewarded) internal virtual { - LibERC20TimeClaimableStorage.getStorage().maxTimeRewarded = _maxTimeRewarded; + /// @inheritdoc IERC20TimeClaimableFacet + function setClaimPeriodMax(uint256 _claimPeriodMax) external auth(UPDATE_CLAIM_SETTINGS_PERMISSION_ID) { + LibERC20TimeClaimableStorage.getStorage().maxTimeRewarded = _claimPeriodMax; } function _tokensClaimableAt(address _claimer, uint256 _timeStamp) internal view virtual returns (uint256 amount) { @@ -73,6 +92,8 @@ contract ERC20TimeClaimableFacet is IERC20TimeClaimableFacet, ERC20ClaimableFace // uint256 timePassed = _timeStamp - s.lastClaim[_claimer]; // uint256 timeRewarded = Math.min(s.maxTimeRewarded, timePassed); // return timeRewarded / s.timeTillReward; - return (Math.min(s.maxTimeRewarded, _timeStamp - s.lastClaim[_claimer]) / s.timeTillReward); + + // Apply (inflation) multiplier to the amount of tokens claimable (based on time passed since last claim) + return IRewardMultiplierFacet(address(this)).applyMultiplier("inflation", Math.min(s.maxTimeRewarded, _timeStamp - s.lastClaim[_claimer]) / s.timeTillReward); } } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/claiming/time/IERC20TieredTimeClaimableFacet.sol b/contracts/facets/token/ERC20/claiming/time/IERC20TieredTimeClaimableFacet.sol index f2b39be..ca2b067 100644 --- a/contracts/facets/token/ERC20/claiming/time/IERC20TieredTimeClaimableFacet.sol +++ b/contracts/facets/token/ERC20/claiming/time/IERC20TieredTimeClaimableFacet.sol @@ -10,5 +10,7 @@ pragma solidity ^0.8.0; interface IERC20TieredTimeClaimableFacet { + function getClaimReward(uint256 _tier) external view returns (uint256); + function setClaimReward(uint256 _tier, uint256 _reward) external; } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/claiming/time/IERC20TimeClaimableFacet.sol b/contracts/facets/token/ERC20/claiming/time/IERC20TimeClaimableFacet.sol index 1267bfe..1d4518c 100644 --- a/contracts/facets/token/ERC20/claiming/time/IERC20TimeClaimableFacet.sol +++ b/contracts/facets/token/ERC20/claiming/time/IERC20TimeClaimableFacet.sol @@ -14,7 +14,11 @@ interface IERC20TimeClaimableFacet { function claimTime() external; - function setClaimPeriodInterval(uint256 _timeTillReward) external; + function getClaimPeriodInterval() external view returns (uint256); - function setClaimPeriodMax(uint256 _maxTimeRewarded) external; + function setClaimPeriodInterval(uint256 _claimPeriodInterval) external; + + function getClaimPeriodMax() external view returns (uint256); + + function setClaimPeriodMax(uint256 _claimPeriodMax) external; } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/core/ERC20Facet.sol b/contracts/facets/token/ERC20/core/ERC20Facet.sol index d0a9327..1cfd77f 100644 --- a/contracts/facets/token/ERC20/core/ERC20Facet.sol +++ b/contracts/facets/token/ERC20/core/ERC20Facet.sol @@ -10,6 +10,7 @@ pragma solidity ^0.8.0; import { Context } from "@openzeppelin/contracts/utils/Context.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { IFacet } from "../../../IFacet.sol"; import { LibERC20Storage } from "../../../../libraries/storage/LibERC20Storage.sol"; @@ -41,17 +42,36 @@ import { LibERC20Storage } from "../../../../libraries/storage/LibERC20Storage.s * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ -contract ERC20Facet is Context, IERC20, IERC20Metadata { +contract ERC20Facet is Context, IERC20, IERC20Metadata, IFacet { /** * @dev Sets the values for {name} and {symbol}. - * - * All two of these values are immutable: they can only be set once during - * construction. */ - constructor(string memory name_, string memory symbol_) { + + struct ERC20FacetInitParams { + string name; + string symbol; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20FacetInitParams memory _params = abi.decode(_initParams, (ERC20FacetInitParams)); + __ERC20Facet_init(_params); + } + + function __ERC20Facet_init(ERC20FacetInitParams memory _params) public virtual { LibERC20Storage.Storage storage s = LibERC20Storage.getStorage(); - s.name = name_; - s.symbol = symbol_; + s.name = _params.name; + s.symbol = _params.symbol; + + registerInterface(type(IERC20).interfaceId); + registerInterface(type(IERC20Metadata).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20).interfaceId); + unregisterInterface(type(IERC20Metadata).interfaceId); + super.deinit(); } /** diff --git a/contracts/facets/token/ERC20/core/ERC20PermitFacet.sol b/contracts/facets/token/ERC20/core/ERC20PermitFacet.sol index 473d3b5..2f8fa8f 100644 --- a/contracts/facets/token/ERC20/core/ERC20PermitFacet.sol +++ b/contracts/facets/token/ERC20/core/ERC20PermitFacet.sol @@ -9,12 +9,14 @@ pragma solidity ^0.8.0; import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +// import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import { IEIP712Facet } from "../../EIP712/IEIP712Facet.sol"; import { Counters } from "@openzeppelin/contracts/utils/Counters.sol"; import { ERC20Facet } from "./ERC20Facet.sol"; import { LibERC20PermitStorage } from "../../../../libraries/storage/LibERC20PermitStorage.sol"; +import { IFacet } from "../../../../facets/IFacet.sol"; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in @@ -26,27 +28,35 @@ import { LibERC20PermitStorage } from "../../../../libraries/storage/LibERC20Per * * _Available since v3.4._ */ -contract ERC20PermitFacet is ERC20Facet, IERC20Permit, EIP712 { +contract ERC20PermitFacet is ERC20Facet, IERC20Permit, IEIP712Facet { using Counters for Counters.Counter; - // solhint-disable-next-line var-name-mixedcase bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - /** - * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. - * However, to ensure consistency with the upgradeable transpiler, we will continue - * to reserve a slot. - * @custom:oz-renamed-from _PERMIT_TYPEHASH - */ - // solhint-disable-next-line var-name-mixedcase - bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; - /** - * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. - * - * It's a good idea to use the same `name` that is defined as the ERC20 token name. - */ - constructor(string memory name_, string memory symbol_) EIP712(name_, "1") ERC20Facet(name_, symbol_) {} + struct ERC20PermitFacetInitParams { + ERC20FacetInitParams _ERC20FacetInitParams; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override(ERC20Facet, IEIP712Facet) { + ERC20PermitFacetInitParams memory _params = abi.decode(_initParams, (ERC20PermitFacetInitParams)); + __ERC20PermitFacet_init(_params); + } + + function __ERC20PermitFacet_init(ERC20PermitFacetInitParams memory _params) public virtual { + __ERC20Facet_init(_params._ERC20FacetInitParams); + __IEIP712Facet_init(IEIP712FacetInitParams(_params._ERC20FacetInitParams.name, "1")); + + registerInterface(type(IERC20Permit).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override(ERC20Facet, IEIP712Facet) { + unregisterInterface(type(IERC20Permit).interfaceId); + ERC20Facet.deinit(); + IEIP712Facet.deinit(); + } /** * @dev See {IERC20Permit-permit}. diff --git a/contracts/facets/token/ERC20/core/ERC20VotesFacet.sol b/contracts/facets/token/ERC20/core/ERC20VotesFacet.sol index 3d228a0..62735a2 100644 --- a/contracts/facets/token/ERC20/core/ERC20VotesFacet.sol +++ b/contracts/facets/token/ERC20/core/ERC20VotesFacet.sol @@ -12,9 +12,10 @@ import "@openzeppelin/contracts/utils/math/Math.sol"; import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import { ERC20PermitFacet, ECDSA, ERC20Facet } from "./ERC20PermitFacet.sol"; -import { IERC5805 } from "../../../../additional-contracts/IERC5805.sol"; +import { IERC5805, IERC6372, IVotes } from "../../../../additional-contracts/IERC5805.sol"; import { LibERC20VotesStorage } from "../../../../libraries/storage/LibERC20VotesStorage.sol"; +import { IFacet } from "../../../../facets/IFacet.sol"; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, @@ -40,7 +41,29 @@ contract ERC20VotesFacet is ERC20PermitFacet, IERC5805 { bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - constructor(string memory name_, string memory symbol_) ERC20PermitFacet(name_, symbol_) {} + struct ERC20VotesFacetInitParams { + ERC20PermitFacetInitParams _ERC20PermitFacetInitParams; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ERC20VotesFacetInitParams memory _params = abi.decode(_initParams, (ERC20VotesFacetInitParams)); + __ERC20VotesFacet_init(_params); + } + + function __ERC20VotesFacet_init(ERC20VotesFacetInitParams memory _params) public virtual { + __ERC20PermitFacet_init(_params._ERC20PermitFacetInitParams); + + registerInterface(type(IERC6372).interfaceId); + registerInterface(type(IVotes).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC6372).interfaceId); + unregisterInterface(type(IVotes).interfaceId); + super.deinit(); + } /** * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). diff --git a/contracts/facets/token/ERC20/core/disabled/ERC20DisabledFacet.sol b/contracts/facets/token/ERC20/core/disabled/ERC20DisabledFacet.sol index 0e00931..ce4c78d 100644 --- a/contracts/facets/token/ERC20/core/disabled/ERC20DisabledFacet.sol +++ b/contracts/facets/token/ERC20/core/disabled/ERC20DisabledFacet.sol @@ -10,8 +10,9 @@ pragma solidity ^0.8.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IFacet } from "../../../../IFacet.sol"; -contract ERC20DisabledFacet is IERC20 { +contract ERC20DisabledFacet is IERC20, IFacet { /// @inheritdoc IERC20 function totalSupply() external pure override returns (uint256) { revert("Disabled"); diff --git a/contracts/facets/token/ERC20/core/disabled/ERC20PermitDisabledFacet.sol b/contracts/facets/token/ERC20/core/disabled/ERC20PermitDisabledFacet.sol index ad4582e..4eac401 100644 --- a/contracts/facets/token/ERC20/core/disabled/ERC20PermitDisabledFacet.sol +++ b/contracts/facets/token/ERC20/core/disabled/ERC20PermitDisabledFacet.sol @@ -11,6 +11,7 @@ pragma solidity ^0.8.0; import { ERC20DisabledFacet } from "./ERC20DisabledFacet.sol"; import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; +import { IFacet } from "../../../../IFacet.sol"; contract ERC20PermitDisabledFacet is ERC20DisabledFacet, IERC20Permit { /// @inheritdoc IERC20Permit diff --git a/contracts/facets/token/ERC20/core/disabled/ERC20VotesDisabledFacet.sol b/contracts/facets/token/ERC20/core/disabled/ERC20VotesDisabledFacet.sol index e978561..dc7cb54 100644 --- a/contracts/facets/token/ERC20/core/disabled/ERC20VotesDisabledFacet.sol +++ b/contracts/facets/token/ERC20/core/disabled/ERC20VotesDisabledFacet.sol @@ -12,6 +12,7 @@ pragma solidity ^0.8.0; import { ERC20PermitDisabledFacet } from "./ERC20PermitDisabledFacet.sol"; import { IERC5805, IERC6372, IVotes } from "../../../../../additional-contracts/IERC5805.sol"; import { ERC20VotesFacet } from "../ERC20VotesFacet.sol"; +import { IFacet } from "../../../../IFacet.sol"; contract ERC20VotesDisabledFacet is ERC20PermitDisabledFacet, IERC5805 { /// @inheritdoc IERC6372 diff --git a/contracts/facets/token/ERC20/governance/GovernanceERC20BurnableFacet.sol b/contracts/facets/token/ERC20/governance/GovernanceERC20BurnableFacet.sol index d03cd9d..38a2a90 100644 --- a/contracts/facets/token/ERC20/governance/GovernanceERC20BurnableFacet.sol +++ b/contracts/facets/token/ERC20/governance/GovernanceERC20BurnableFacet.sol @@ -8,12 +8,33 @@ pragma solidity ^0.8.0; import { GovernanceERC20Facet } from "./GovernanceERC20Facet.sol"; import { IBurnableGovernanceStructure } from "../../../governance/structure/voting-power/IBurnableGovernanceStructure.sol"; +import { IFacet } from "../../../../facets/IFacet.sol"; contract GovernanceERC20BurnableFacet is GovernanceERC20Facet, IBurnableGovernanceStructure { /// @notice The permission identifier to burn tokens (from any wallet) bytes32 public constant BURN_PERMISSION_ID = keccak256("BURN_PERMISSION"); - constructor(string memory name_, string memory symbol_) GovernanceERC20Facet(name_, symbol_) { } + struct GovernanceERC20BurnableFacetInitParams { + GovernanceERC20FacetInitParams _GovernanceERC20FacetInitParams; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + GovernanceERC20BurnableFacetInitParams memory _params = abi.decode(_initParams, (GovernanceERC20BurnableFacetInitParams)); + __GovernanceERC20BurnableFacet_init(_params); + } + + function __GovernanceERC20BurnableFacet_init(GovernanceERC20BurnableFacetInitParams memory _params) public virtual { + __GovernanceERC20Facet_init(_params._GovernanceERC20FacetInitParams); + + registerInterface(type(IBurnableGovernanceStructure).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IBurnableGovernanceStructure).interfaceId); + super.deinit(); + } /// @inheritdoc IBurnableGovernanceStructure function burnVotingPower(address _wallet, uint256 _amount) external virtual override auth(BURN_PERMISSION_ID) { diff --git a/contracts/facets/token/ERC20/governance/GovernanceERC20DisabledFacet.sol b/contracts/facets/token/ERC20/governance/GovernanceERC20DisabledFacet.sol index 7dc2334..b35504b 100644 --- a/contracts/facets/token/ERC20/governance/GovernanceERC20DisabledFacet.sol +++ b/contracts/facets/token/ERC20/governance/GovernanceERC20DisabledFacet.sol @@ -9,5 +9,4 @@ pragma solidity ^0.8.0; import { ERC20VotesDisabledFacet } from "../core/disabled/ERC20VotesDisabledFacet.sol"; contract GovernanceERC20DisabledFacet is ERC20VotesDisabledFacet { - } \ No newline at end of file diff --git a/contracts/facets/token/ERC20/governance/GovernanceERC20Facet.sol b/contracts/facets/token/ERC20/governance/GovernanceERC20Facet.sol index 33919b0..5ba45c7 100644 --- a/contracts/facets/token/ERC20/governance/GovernanceERC20Facet.sol +++ b/contracts/facets/token/ERC20/governance/GovernanceERC20Facet.sol @@ -9,13 +9,35 @@ pragma solidity ^0.8.0; import { ERC20VotesFacet, ERC20PermitFacet, ERC20Facet } from "../core/ERC20VotesFacet.sol"; import { IMintableGovernanceStructure, IGovernanceStructure } from "../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; import { AuthConsumer } from "../../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../../../facets/IFacet.sol"; contract GovernanceERC20Facet is ERC20VotesFacet, AuthConsumer, IMintableGovernanceStructure { /// @notice The permission identifier to mint new tokens bytes32 public constant MINT_PERMISSION_ID = keccak256("MINT_PERMISSION"); - constructor(string memory name_, string memory symbol_) ERC20VotesFacet(name_, symbol_) {} + struct GovernanceERC20FacetInitParams { + ERC20VotesFacetInitParams _ERC20VotesFacetInitParams; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + GovernanceERC20FacetInitParams memory _params = abi.decode(_initParams, (GovernanceERC20FacetInitParams)); + __GovernanceERC20Facet_init(_params); + } + + function __GovernanceERC20Facet_init(GovernanceERC20FacetInitParams memory _params) public virtual { + __ERC20VotesFacet_init(_params._ERC20VotesFacetInitParams); + registerInterface(type(IGovernanceStructure).interfaceId); + registerInterface(type(IMintableGovernanceStructure).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IGovernanceStructure).interfaceId); + unregisterInterface(type(IMintableGovernanceStructure).interfaceId); + super.deinit(); + } /// @inheritdoc IGovernanceStructure function totalVotingPower(uint256 _blockNumber) external view returns (uint256) { diff --git a/contracts/facets/token/ERC20/minting/ERC20MultiMinterFacet.sol b/contracts/facets/token/ERC20/minting/ERC20MultiMinterFacet.sol new file mode 100644 index 0000000..b5044f2 --- /dev/null +++ b/contracts/facets/token/ERC20/minting/ERC20MultiMinterFacet.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IMintableGovernanceStructure } from "../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; +import { IERC20MultiMinterFacet } from "./IERC20MultiMinterFacet.sol"; +import { AuthConsumer } from "../../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../../IFacet.sol"; + +contract ERC20MultiMinterFacet is IERC20MultiMinterFacet, AuthConsumer, IFacet { + // Permission to multimint + bytes32 public constant MULTIMINT_PERMISSION_ID = keccak256("MULTIMINT_PERMISSION"); + + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __ERC20MultiMinterFacet_init(); + } + + function __ERC20MultiMinterFacet_init() public virtual { + registerInterface(type(IERC20MultiMinterFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IERC20MultiMinterFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc IERC20MultiMinterFacet + function multimint(address[] calldata _addresses, uint256[] calldata _amounts) external virtual auth(MULTIMINT_PERMISSION_ID) { + IMintableGovernanceStructure mintable = IMintableGovernanceStructure(address(this)); + require (_addresses.length == _amounts.length, "Addresses and amount are not the same length"); + for (uint i; i < _addresses.length;) { + mintable.mintVotingPower(_addresses[i], 0, _amounts[i]); + + unchecked { + i++; + } + } + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/minting/IERC20MultiMinterFacet.sol b/contracts/facets/token/ERC20/minting/IERC20MultiMinterFacet.sol new file mode 100644 index 0000000..3e27da0 --- /dev/null +++ b/contracts/facets/token/ERC20/minting/IERC20MultiMinterFacet.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +interface IERC20MultiMinterFacet { + function multimint(address[] calldata _addresses, uint256[] calldata _amounts) external; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/Source.md b/contracts/facets/token/ERC20/monetary-token/ABC/Source.md new file mode 100644 index 0000000..a56987c --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/Source.md @@ -0,0 +1,3 @@ +# Source +Massive shoutout to liquid-protocol from DAOBox! (https://github.com/DAObox/liquid-protocol) +All of the code in this directory is based on their implementation. \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/core/ERC20BondedToken.sol b/contracts/facets/token/ERC20/monetary-token/ABC/core/ERC20BondedToken.sol new file mode 100644 index 0000000..a5be2a9 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/core/ERC20BondedToken.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ +pragma solidity ^0.8.0; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { PluginStandalone } from "../standalone/PluginStandalone.sol"; +import { IBondedToken } from "../interfaces/IBondedToken.sol"; + +contract ERC20BondedToken is ERC20, PluginStandalone, IBondedToken { + /// @notice The permission identifier to mint new tokens + bytes32 public constant MINT_PERMISSION_ID = keccak256("MINT_PERMISSION"); + + /// @notice The permission identifier to burn existing tokens + bytes32 public constant BURN_PERMISSION_ID = keccak256("BURN_PERMISSION"); + + constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { + + } + + function mint(address to, uint256 amount) external virtual override auth(MINT_PERMISSION_ID) { + _mint(to, amount); + } + + function burn(address from, uint256 amount) external virtual override auth(BURN_PERMISSION_ID) { + _burn(from, amount); + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/core/MarketMaker.sol b/contracts/facets/token/ERC20/monetary-token/ABC/core/MarketMaker.sol new file mode 100644 index 0000000..fff8e76 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/core/MarketMaker.sol @@ -0,0 +1,339 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/core/MarketMaker.sol +pragma solidity >=0.8.17; + +import { SafeMath } from "@openzeppelin/contracts/utils/math/SafeMath.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { PluginStandalone } from "../standalone/PluginStandalone.sol"; + +import { IBondingCurve } from "../interfaces/IBondingCurve.sol"; +import { IBondedToken } from "../interfaces/IBondedToken.sol"; + +import { Errors } from "../lib/Errors.sol"; +import { Events } from "../lib/Events.sol"; +import { Modifiers } from "../modifiers/MarketMaker.sol"; +import { CurveParameters } from "../lib/Types.sol"; + +/** + * @title DAO Market Maker with Adjustable Bonding Curve + * @author DAOBox | (@pythonpete32) + * @dev This contract is an non-upgradeable Aragon OSx Plugin + * It enables continuous minting and burning of tokens on an Augmented Bonding Curve, with part of the funds going + * to the DAO and the rest being added to a reserve. + * The adjustable bonding curve formula is provided at initialization and determines the reward for minting and the + * refund for burning. + * The DAO can also receive a sponsored mint, where another address pays to boost the reserve and the owner obtains + * the minted tokens. + * Users can also perform a sponsored burn, where they burn their own tokens to enhance the value of the remaining + * tokens. + * The DAO can set certain governance parameters like the theta (funding rate), or friction(exit fee) + * + * @notice This contract uses several external contracts and libraries from OpenZeppelin. Please review and understand + * those before using this contract. + * Also, consider the effects of the adjustable bonding curve and continuous minting/burning on your token's economics. + * Use this contract responsibly. + */ +contract MarketMaker is PluginStandalone, Modifiers { + using SafeMath for uint256; + + // =============================================================== // + // ========================== CONSTANTS ========================== // + // =============================================================== // + + /// @dev The identifier of the permission that allows an address to conduct the hatch. + bytes32 public constant HATCH_PERMISSION_ID = keccak256("HATCH_PERMISSION"); + + /// @dev The identifier of the permission that allows an address to configure the contract. + bytes32 public constant CONFIGURE_PERMISSION_ID = keccak256("CONFIGURE_PERMISSION"); + + /// @dev 100% represented in PPM (parts per million) + uint32 public constant DENOMINATOR_PPM = 1_000_000; + + // =============================================================== // + // =========================== STROAGE =========================== // + // =============================================================== // + + /// @notice The bonded token + IBondedToken private _bondedToken; + + /// @notice The external token used to purchase the bonded token + IERC20 private _externalToken; + + /// @notice The parameters for the _curve + CurveParameters private _curve; + + /// @notice is the contract post hatching + bool private _hatched; + + // =============================================================== // + // ========================= INITIALIZE ========================== // + // =============================================================== // + + /** + * @dev Sets the values for {owner}, {fundingRate}, {exitFee}, {reserveRatio}, {formula}, and {reserve}. + * Governance cannot arbitrarily mint tokens after deployment. deployer must send some ETH + * in the constructor to initialize the reserve. + * Emits a {Transfer} event for the minted tokens. + * + * @param bondedToken_ The bonded token. + * @param externalToken_ The external token used to purchace the bonded token. + * @param curve_ The parameters for the curve_. This includes: + * {fundingRate} - The percentage of funds that go to the owner. Maximum value is 10000 (i.e., 100%). + * {exitFee} - The percentage of funds that are taken as fee when tokens are burned. Maximum value is 5000 (i.e., 50%). + * {reserveRatio} - The ratio for the reserve in the BancorBondingCurve. + * {formula} - The implementation of the bonding curve_. + */ + constructor( + IBondedToken bondedToken_, + IERC20 externalToken_, + CurveParameters memory curve_ + ) { + _externalToken = externalToken_; + _bondedToken = bondedToken_; + _curve = curve_; + } + + function hatch( + uint256 initialSupply, + address hatchTo + ) + external + preHatch(_hatched) + auth(HATCH_PERMISSION_ID) + { + _hatched = true; + + // get the balance of the marketmaker and send theta to the DAO + uint256 amount = _externalToken.balanceOf(address(this)); + + // validate there is Liquidity to hatch with + if (amount == 0) revert Errors.InitialReserveCannotBeZero(); + + uint256 theta = calculateFee(amount); // Calculate the funding amount + _externalToken.transfer(dao(), theta); + + // mint the hatched tokens to the hatcher + if (hatchTo != address(0)) _bondedToken.mint(hatchTo, initialSupply); + emit Events.Hatch(hatchTo, hatchTo == address(0) ? 0 : initialSupply); + + // this event parameters are not consistent and confusing, change them + emit Events.ContinuousMint(hatchTo, initialSupply, amount, theta); + } + + // =============================================================== // + // ======================== BONDING CURVE ======================== // + // =============================================================== // + + /** + * @dev Mints tokens continuously, adding a portion of the minted amount to the reserve. + * Reverts if the sender is the contract owner or if no ether is sent. + * Emits a {ContinuousMint} event. + * @param _amount The amount of external tokens used to mint. + * @param _minAmountReceived The amount of bonded tokens to receive at least, otherwise the transaction will be reverted. + */ + function mint(uint256 _amount, uint256 _minAmountReceived) public isDepositZero(_amount) postHatch(_hatched) { + if (msg.sender == dao()) + revert Errors.OwnerCanNotContinuousMint(); + + // Calculate the reward amount and mint the tokens + uint256 rewardAmount = calculateMint(_amount); // Calculate the reward amount + + _externalToken.transferFrom(msg.sender, address(this), _amount); + + // Calculate the funding portion and the reserve portion + uint256 fundingAmount = calculateFee(_amount); // Calculate the funding amount + + // transfer the funding amount to the funding pool + // could the DAO reenter? 🧐 + _externalToken.transfer(dao(), fundingAmount); + + if (rewardAmount < _minAmountReceived) + revert Errors.WouldRecieveLessThanMinRecieve(); + // Mint the tokens to the sender + // but this is being called with static call + _bondedToken.mint(msg.sender, rewardAmount); + + // Emit the ContinuousMint event + emit Events.ContinuousMint(msg.sender, rewardAmount, _amount, fundingAmount); + } + + /** + * @dev Burns tokens continuously, deducting a portion of the burned amount from the reserve. + * Reverts if the sender is the contract owner, if no tokens are burned, if the sender's balance is insufficient, + * or if the reserve is insufficient to cover the refund amount. + * Emits a {ContinuousBurn} event. + * + * @param _amount The amount of tokens to burn. + * @param _minAmountReceived The amount of bonded tokens to receive at least, otherwise the transaction will be reverted. + */ + function burn(uint256 _amount, uint256 _minAmountReceived) public isDepositZero(_amount) postHatch(_hatched) { + if (msg.sender == dao()) + revert Errors.OwnerCanNotContinuousBurn(); + + // Calculate the refund amount + uint256 refundAmount = calculateBurn(_amount); + + _bondedToken.burn(msg.sender, _amount); + + // Calculate the exit fee + uint256 exitFeeAmount = calculateFee(refundAmount); + + // Calculate the refund amount minus the exit fee + uint256 refundAmountLessFee = refundAmount - exitFeeAmount; + + if (refundAmountLessFee < _minAmountReceived) + revert Errors.WouldRecieveLessThanMinRecieve(); + // transfer the refund amount minus the exit fee to the sender + _externalToken.transfer(msg.sender, refundAmountLessFee); + + // Emit the ContinuousBurn event + emit Events.ContinuousBurn(msg.sender, _amount, refundAmountLessFee, exitFeeAmount); + } + + /** + * @notice Mints tokens to the owner's address and adds the sent ether to the reserve. + * @dev This function is referred to as "sponsored" mint because the sender of the transaction sponsors + * the increase of the reserve but the minted tokens are sent to the owner of the contract. This can be + * useful in scenarios where a third-party entity (e.g., a user, an investor, or another contract) wants + * to increase the reserve and, indirectly, the value of the token, without receiving any tokens in return. + * The function reverts if no ether is sent along with the transaction. + * Emits a {SponsoredMint} event. + * @return mintedTokens The amount of tokens minted to the owner's address. + */ + function sponsoredMint(uint256 _amount) + external + payable + isDepositZero(_amount) + postHatch(_hatched) + returns (uint256) + { + // Transfer the specified amount of tokens from the sender to the contract + _externalToken.transferFrom(msg.sender, address(this), _amount); + + // Calculate the number of tokens to be minted based on the deposited amount + uint256 mintedTokens = calculateMint(_amount); + + // Mint the calculated amount of tokens to the owner's address + _bondedToken.mint(address(dao()), mintedTokens); + + // Emit the SponsoredMint event, which logs the details of the minting transaction + emit Events.SponsoredMint(msg.sender, _amount, mintedTokens); + + // Return the amount of tokens minted + return mintedTokens; + } + + /** + * @notice Burns a specific amount of tokens from the caller's balance. + * @dev This function is referred to as "sponsored" burn because the caller of the function burns + * their own tokens, effectively reducing the total supply and, indirectly, increasing the value of + * remaining tokens. The function reverts if the caller tries to burn more tokens than their balance + * or tries to burn zero tokens. Emits a {SponsoredBurn} event. + * @param _amount The amount of tokens to burn. + */ + function sponsoredBurn(uint256 _amount) external isDepositZero(_amount) postHatch(_hatched) { + // Burn the specified amount of tokens from the caller's balance + _bondedToken.burn(msg.sender, _amount); + + // Emit the SponsoredBurn event, which logs the details of the burn transaction + emit Events.SponsoredBurn(msg.sender, _amount); + } + + // =============================================================== // + // ===================== GOVERNANCE FUNCTIONS ==================== // + // =============================================================== // + + /** + * @notice Set governance parameters. + * @dev Allows the owner to modify the funding rate, exit fee, or owner address of the contract. + * The value parameter is a bytes type and should be decoded to the appropriate type based on + * the parameter being modified. + * @param what The name of the governance parameter to modify + * @param value The new value for the specified governance parameter. + * Must be ABI-encoded before passing it to the function. + */ + function setGovernance(bytes32 what, bytes memory value) external auth(CONFIGURE_PERMISSION_ID) { + if (what == "theta") _curve.theta = (abi.decode(value, (uint32))); + else if (what == "friction") _curve.friction = (abi.decode(value, (uint32))); + else if (what == "reserveRatio") _curve.reserveRatio = (abi.decode(value, (uint32))); + else if (what == "formula") _curve.formula = (abi.decode(value, (IBondingCurve))); + else revert Errors.InvalidGovernanceParameter(what); + } + + // =============================================================== // + // ======================== VIEW FUNCTIONS ======================= // + // =============================================================== // + + /** + * @notice Calculates and returns the amount of tokens that can be minted with {_amount}. + * @dev The price calculation is based on the current bonding _curve and reserve ratio. + * @return uint The amount of tokens that can be minted with {_amount}. + */ + function calculateMint(uint256 _amount) public view returns (uint256) { + return _curve.formula.getContinuousMintReward({ + depositAmount: _amount, + continuousSupply: totalSupply(), + reserveBalance: reserveBalance(), + reserveRatio: reserveRatio() + }); + } + + /** + * @notice Calculates and returns the amount of Ether that can be refunded by burning {_amount} Continuous + * Governance Token. + * @dev The price calculation is based on the current bonding _curve and reserve ratio. + * @return uint The amount of Ether that can be refunded by burning {_amount} token. + */ + function calculateBurn(uint256 _amount) public view returns (uint256) { + return _curve.formula.getContinuousBurnRefund(_amount, totalSupply(), reserveBalance(), reserveRatio()); + } + + function calculateFee(uint256 _burnAmount) public view returns (uint256) { + return (_burnAmount * _curve.friction) / DENOMINATOR_PPM; + } + + /** + * @notice Returns the current implementation of the bonding _curve used by the contract. + * @dev This is an internal property and cannot be modified directly. Use the appropriate function to modify it. + * @return The current implementation of the bonding _curve. + */ + function getCurveParameters() public view returns (CurveParameters memory) { + return _curve; + } + + /** + * @notice Returns the current reserve balance of the contract. + * @dev This function is necessary to calculate the buy and sell price of the tokens. The reserve + * balance represents the amount of ether held by the contract, and is used in the Bancor algorithm + * to determine the price _curve of the token. + * @return The current reserve balance of the contract. + */ + function reserveBalance() public view returns (uint256) { + return _externalToken.balanceOf(address(this)); + } + + function totalSupply() public view returns (uint256) { + return _bondedToken.totalSupply(); + } + + function externalToken() public view returns (IERC20) { + return _externalToken; + } + + function bondedToken() public view returns (IBondedToken) { + return _bondedToken; + } + + function isHatched() public view returns (bool) { + return _hatched; + } + + function reserveRatio() public view returns (uint32) { + return _curve.reserveRatio; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/core/SimpleHatch.sol b/contracts/facets/token/ERC20/monetary-token/ABC/core/SimpleHatch.sol new file mode 100644 index 0000000..630274e --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/core/SimpleHatch.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/core/SimpleHatch.sol +pragma solidity >=0.8.17; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { PluginStandalone } from "../standalone/PluginStandalone.sol"; + +import { MarketMaker } from "./MarketMaker.sol"; +import { Vesting } from "./Vesting.sol"; +import { Errors } from "../lib/Errors.sol"; +import { HatchParameters, HatchStatus, HatchState, VestingSchedule } from "../lib/Types.sol"; +import { Modifiers } from "../modifiers/SimpleHatch.sol"; + +contract SimpleHatch is PluginStandalone, Modifiers { + HatchState internal _state; + + VestingSchedule internal _schedule; + + mapping(address => uint256) internal _contributions; + + mapping(address => Vesting) internal vestingContracts; + + event Contribute(address indexed contributor, uint256 amount); + + event Refund(address indexed contributor, uint256 amount); + + constructor( + HatchParameters memory params_, + VestingSchedule memory schedule_ + ) { + _state = HatchState(params_, HatchStatus.OPEN, 0); + _schedule = schedule_; + } + + function contribute(uint256 _amount) external validateContribution(_state, _amount) { + _state.params.externalToken.transferFrom(msg.sender, address(this), _amount); + + emit Contribute(msg.sender, _amount); + + _state.raised += _amount; + _contributions[msg.sender] += _amount; + } + + function refund() external validateRefund(_state, _contributions[msg.sender]) { + _state.params.externalToken.transferFrom(msg.sender, address(this), _contributions[msg.sender]); + + emit Refund(msg.sender, _contributions[msg.sender]); + + // _state.raised -= _contributions[msg.sender] (not actually needed) + _contributions[msg.sender] = 0; + } + + function claimVesting() external validateClaimVesting(_state, _contributions[msg.sender]) { + Vesting vesting = new Vesting(dao(), msg.sender, _state.params.bondedToken, _schedule, _contributions[msg.sender] * _state.params.initialPrice); + + _state.params.bondedToken.transfer(address(vesting), _contributions[msg.sender] * _state.params.initialPrice); + + _contributions[msg.sender] = 0; + + vestingContracts[msg.sender] = vesting; + } + + function viewVesting() external view returns (Vesting) { + return vestingContracts[msg.sender]; + } + + function hatch() external validateHatch(_state) { + if (block.timestamp < _state.params.hatchDeadline) { + // Early hatch + _schedule.start = block.timestamp; + } + _state.params.externalToken.transfer(address(_state.params.pool), _state.raised); + _state.params.pool.hatch(_state.raised * _state.params.initialPrice, address(this)); + _state.status = HatchStatus.HATCHED; + } + + function cancel() external validateCancel(_state) { + _state.status = HatchStatus.CANCELED; + } + + function getState() external view returns (HatchState memory) { + return _state; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/core/Vesting.sol b/contracts/facets/token/ERC20/monetary-token/ABC/core/Vesting.sol new file mode 100644 index 0000000..4061ce6 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/core/Vesting.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/core/Vesting.sol +pragma solidity >= 0.8.17; + +// OpenZeppelin dependencies +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IVotes } from "@openzeppelin/contracts/governance/utils/IVotes.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; + +import { Errors } from "../lib/Errors.sol"; +import { VestingState, VestingSchedule } from "../lib/Types.sol"; +import { Modifiers } from "../modifiers/Vesting.sol"; + +/** + * @title Vesting + * @author DAOBox | (@pythonpete32) + * @dev This contract enables vesting of tokens over a certain period of time. It is upgradeable and protected against + * reentrancy attacks. + * The contract allows an admin to initialize the vesting schedule and the beneficiary of the vested tokens. Once + * the vesting starts, the beneficiary + * can claim the releasable tokens at any time. If the vesting is revocable, the admin can revoke the remaining + * tokens and send them to a specified address. + * The beneficiary can also delegate their voting power to another address. + */ +contract Vesting is ReentrancyGuard, Modifiers { + /// @notice The token being vested + IERC20 private _token; + + /// @notice The vesting state + VestingState private _state; + + /// @notice The beneficiary of the vested tokens + address private _beneficiary; + + /// @notice The admin address + address private _admin; + + /** + * @dev Initializes the vesting contract with the provided parameters. + * The admin, beneficiary, token, and vesting schedule are all set during initialization. + * Additionally, voting power for the vested tokens is delegated to the beneficiary. + * + * @param admin_ The address of the admin + * @param beneficiary_ The address of the beneficiary + * @param token_ The address of the token + * @param schedule_ The vesting schedule + */ + constructor( + address admin_, + address beneficiary_, + IERC20 token_, + VestingSchedule memory schedule_, + uint256 amountTotal_ + ) { + _admin = admin_; + + _token = token_; + _beneficiary = beneficiary_; + _state = VestingState(schedule_, amountTotal_, 0, false); + } + + /** + * @dev Revokes the vesting schedule, if it is revocable. + * Any tokens that are vested but not yet released are sent to the beneficiary, + * and the remaining tokens are transferred to the specified address. + * + * @param revokeTo The address to send the remaining tokens to + */ + function revoke(address revokeTo) external validateRevoke(_state, _admin) { + if (!_state.schedule.revocable) revert Errors.VestingScheduleNotRevocable(); + uint256 vestedAmount = computeReleasableAmount(); + if (vestedAmount > 0) release(vestedAmount); + uint256 unreleased = _state.amountTotal - _state.released; + _token.transfer(revokeTo, unreleased); + _state.revoked = true; + } + + /** + * @dev Releases a specified amount of tokens to the beneficiary. + * The amount of tokens to be released must be less than or equal to the releasable amount. + * + * @param amount The amount of tokens to release + */ + function release(uint256 amount) public validateRelease(amount, computeReleasableAmount(), _state) { + _state.released += amount; + + _token.transfer(_beneficiary, amount); + } + + /** + * @dev Transfers the vesting schedule to a new beneficiary. + * + * @param newBeneficiary_ The address of the new beneficiary + */ + function transferVesting(address newBeneficiary_) external onlyBeneficiary(_beneficiary) { + _beneficiary = newBeneficiary_; + } + + /** + * @dev Returns the token being vested. + * + * @return The token + */ + function getToken() external view returns (IERC20) { + return _token; + } + + /** + * @dev Returns the vesting state. + * + * @return The vesting state + */ + function getState() external view returns (VestingState memory) { + return _state; + } + + /** + * @dev Returns the amount of tokens that can be withdrawn by the owner if they revoke vesting + * + * @return The withdrawable amount + */ + + function getWithdrawableAmount() public view returns (uint256) { + return _token.balanceOf(address(this)) - computeReleasableAmount(); + } + + /** + * @dev Computes the amount of tokens that can be released to the beneficiary. + * The releasable amount is dependent on the vesting schedule and the current time. + * + * @return The releasable amount + */ + function computeReleasableAmount() public view returns (uint256) { + // If the current time is before the cliff, no tokens are releasable. + if ((block.timestamp < _state.schedule.start + _state.schedule.cliff) || _state.revoked) { + return 0; + } + // If the current time is after the vesting period, all tokens are releasable, + // minus the amount already released. + else if (block.timestamp >= _state.schedule.start + _state.schedule.duration) { + return _state.amountTotal - _state.released; + } + // Otherwise, some tokens are releasable. + else { + // Compute the number of full vesting periods that have elapsed. + uint256 timeFromStart = block.timestamp - _state.schedule.start; + // Compute the amount of tokens that are vested. + uint256 vestedAmount = (_state.amountTotal * timeFromStart) / _state.schedule.duration; + // Subtract the amount already released and return. + return vestedAmount - _state.released; + } + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/facets/ABCConfigureFacet.sol b/contracts/facets/token/ERC20/monetary-token/ABC/facets/ABCConfigureFacet.sol new file mode 100644 index 0000000..5e1ab9d --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/facets/ABCConfigureFacet.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IABCConfigureFacet } from "./IABCConfigureFacet.sol"; +import { AuthConsumer } from "../../../../../../utils/AuthConsumer.sol"; +import { IFacet } from "../../../../../IFacet.sol"; + +import { IMarketMaker } from "../interfaces/IMarketMaker.sol"; +import { IBondingCurve } from "../interfaces/IBondingCurve.sol"; +import { LibABCConfigureStorage } from "../../../../../../libraries/storage/LibABCConfigureStorage.sol"; + +contract ABCConfigureFacet is IABCConfigureFacet, AuthConsumer, IFacet { + /// @notice The permission identifier to merge pull requests. + bytes32 public constant CONFIGURE_ABC_PERMISSION_ID = keccak256("CONFIGURE_ABC_PERMISSION"); + + struct ABCConfigureFacetInitParams { + address marketMaker; + address hatcher; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + ABCConfigureFacetInitParams memory _params = abi.decode(_initParams, (ABCConfigureFacetInitParams)); + __ABCConfigureFacet_init(_params); + } + + function __ABCConfigureFacet_init(ABCConfigureFacetInitParams memory _params) public virtual { + LibABCConfigureStorage.Storage storage s = LibABCConfigureStorage.getStorage(); + s.marketMaker = _params.marketMaker; + s.hatcher = _params.hatcher; + + registerInterface(type(IABCConfigureFacet).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IABCConfigureFacet).interfaceId); + super.deinit(); + } + + /// @inheritdoc IABCConfigureFacet + function getMarketMaker() external view virtual override returns (address) { + return LibABCConfigureStorage.getStorage().marketMaker; + } + + /// @inheritdoc IABCConfigureFacet + function setMarketMaker(address _marketMaker) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + LibABCConfigureStorage.getStorage().marketMaker = _marketMaker; + } + + /// @inheritdoc IABCConfigureFacet + function getHatcher() external view virtual override returns (address) { + return LibABCConfigureStorage.getStorage().hatcher; + } + + /// @inheritdoc IABCConfigureFacet + function setHatcher(address _hatcher) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + LibABCConfigureStorage.getStorage().hatcher = _hatcher; + } + + /// @inheritdoc IABCConfigureFacet + function getThetaABC() external view virtual override returns (uint32) { + return IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).getCurveParameters().theta; + } + + /// @inheritdoc IABCConfigureFacet + function setThetaABC(uint32 _thetaABC) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).setGovernance("theta", abi.encode(_thetaABC)); + } + + /// @inheritdoc IABCConfigureFacet + function getFrictionABC() external view virtual override returns (uint32) { + return IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).getCurveParameters().friction; + } + + /// @inheritdoc IABCConfigureFacet + function setFrictionABC(uint32 _frictionABC) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).setGovernance("friction", abi.encode(_frictionABC)); + } + + /// @inheritdoc IABCConfigureFacet + function getReserveRatioABC() external view virtual override returns (uint32) { + return IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).getCurveParameters().reserveRatio; + } + + /// @inheritdoc IABCConfigureFacet + function setReserveRatioABC(uint32 _reserveRatioABC) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).setGovernance("reserveRatio", abi.encode(_reserveRatioABC)); + } + + /// @inheritdoc IABCConfigureFacet + function getFormulaABC() external view virtual override returns (address) { + return address(IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).getCurveParameters().formula); + } + + /// @inheritdoc IABCConfigureFacet + function setFormulaABC(address _formulaABC) external virtual override auth(CONFIGURE_ABC_PERMISSION_ID) { + IMarketMaker(LibABCConfigureStorage.getStorage().marketMaker).setGovernance("formula", abi.encode(IBondingCurve(_formulaABC))); + } +} diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/facets/IABCConfigureFacet.sol b/contracts/facets/token/ERC20/monetary-token/ABC/facets/IABCConfigureFacet.sol new file mode 100644 index 0000000..7fb23a2 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/facets/IABCConfigureFacet.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +interface IABCConfigureFacet { + function getMarketMaker() external view returns (address); + function setMarketMaker(address _marketMaker) external; + + function getHatcher() external view returns (address); + function setHatcher(address _hatcher) external; + + function getThetaABC() external view returns (uint32); + function setThetaABC(uint32 _thetaABC) external; + + function getFrictionABC() external view returns (uint32); + function setFrictionABC(uint32 _frictionABC) external; + + function getReserveRatioABC() external view returns (uint32); + function setReserveRatioABC(uint32 _reserveRatioABC) external; + + function getFormulaABC() external view returns (address); + function setFormulaABC(address _formulaABC) external; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondedToken.sol b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondedToken.sol new file mode 100644 index 0000000..7e3f8ba --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondedToken.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/interfaces/IBondedToken.sol +pragma solidity >=0.8.17; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/** + * @title IBonded Token + * @author DAOBox | (@pythonpete32) + * @dev + */ +interface IBondedToken is IERC20 { + function mint(address to, uint256 amount) external; + function burn(address from, uint256 amount) external; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondingCurve.sol b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondingCurve.sol new file mode 100644 index 0000000..76fea6f --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IBondingCurve.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/interfaces/IBondingCurve.sol +pragma solidity >=0.8.17; + +/** + * @title IBondingCurve + * @author DAOBox | (@pythonpete32) + * @dev This interface defines the necessary methods for implementing a bonding curve. + * Bonding curves are price functions used for automated market makers. + * This specific interface is used to calculate rewards for minting and refunds for burning continuous tokens. + */ +interface IBondingCurve { + /** + * @notice Calculates the amount of continuous tokens that can be minted for a given reserve token amount. + * @dev Implements the bonding curve formula to calculate the mint reward. + * @param depositAmount The amount of reserve tokens to be provided for minting. + * @param continuousSupply The current supply of continuous tokens. + * @param reserveBalance The current balance of reserve tokens in the contract. + * @param reserveRatio The reserve ratio, represented in ppm (parts per million), ranging from 1 to 1,000,000. + * @return The amount of continuous tokens that can be minted. + */ + function getContinuousMintReward( + uint256 depositAmount, + uint256 continuousSupply, + uint256 reserveBalance, + uint32 reserveRatio + ) + external + view + returns (uint256); + + /** + * @notice Calculates the amount of reserve tokens that can be refunded for a given amount of continuous tokens. + * @dev Implements the bonding curve formula to calculate the burn refund. + * @param sellAmount The amount of continuous tokens to be burned. + * @param continuousSupply The current supply of continuous tokens. + * @param reserveBalance The current balance of reserve tokens in the contract. + * @param reserveRatio The reserve ratio, represented in ppm (parts per million), ranging from 1 to 1,000,000. + * @return The amount of reserve tokens that can be refunded. + */ + function getContinuousBurnRefund( + uint256 sellAmount, + uint256 continuousSupply, + uint256 reserveBalance, + uint32 reserveRatio + ) + external + view + returns (uint256); +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IMarketMaker.sol b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IMarketMaker.sol new file mode 100644 index 0000000..4745405 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/interfaces/IMarketMaker.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ +pragma solidity ^0.8.0; + +import { CurveParameters } from "../lib/Types.sol"; + +interface IMarketMaker { + function hatch(uint256 initialSupply, address hatchTo) external; + function getCurveParameters() external view returns (CurveParameters memory); + function setGovernance(bytes32 what, bytes memory value) external; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/lib/Errors.sol b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Errors.sol new file mode 100644 index 0000000..0e5d505 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Errors.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/lib/Errors.sol +pragma solidity >=0.8.17; + +library Errors { + /// @notice Error thrown when the market is already open + error TradingAlreadyOpened(); + + /// @notice Error thrown when the initial reserve for the token contract is zero. + error InitialReserveCannotBeZero(); + + /// @notice Error thrown when the funding rate provided is greater than 10000 (100%). + /// @param fundingRate The value of the funding rate provided. + error FundingRateError(uint16 fundingRate); + + /// @notice Error thrown when the exit fee provided is greater than 5000 (50%). + /// @param exitFee The value of the exit fee provided. + error ExitFeeError(uint16 exitFee); + + /// @notice Error thrown when the initial supply for the token contract is zero. + error InitialSupplyCannotBeZero(); + + /// @notice Error thrown when the funding amount for the token contract is higher than it's balance. + error FundingAmountHigherThanBalance(); + + /// @notice Error thrown when the owner of the contract tries to mint tokens continuously. + error OwnerCanNotContinuousMint(); + + /// @notice Error thrown when the caller would receive less tokens then they specified to recieve at least. + error WouldRecieveLessThanMinRecieve(); + + /// @notice Error thrown when the owner of the contract tries to burn tokens continuously. + error OwnerCanNotContinuousBurn(); + + /// @notice Error thrown when the deposit amount provided is zero. + error DepositAmountCannotBeZero(); + + /// @notice Error thrown when the burn amount provided is zero. + error BurnAmountCannotBeZero(); + + /// @notice Error thrown when the reserve balance is less than the amount requested to burn. + /// @param requested The amount of tokens requested to burn. + /// @param available The available balance in the reserve. + error InsufficientReserve(uint256 requested, uint256 available); + + /// @notice Error thrown when the balance of the sender is less than the amount requested to burn. + /// @param sender The address of the sender. + /// @param balance The balance of the sender. + /// @param amount The amount requested to burn. + error InsufficentBalance(address sender, uint256 balance, uint256 amount); + + /// @notice Error thrown when a function that requires ownership is called by an address other than the owner. + /// @param caller The address of the caller. + /// @param owner The address of the owner. + error OnlyOwner(address caller, address owner); + + /// @notice Error thrown when a transfer of ether fails. + /// @param recipient The address of the recipient. + /// @param amount The amount of ether to transfer. + error TransferFailed(address recipient, uint256 amount); + + /// @notice Error thrown when an invalid governance parameter is set. + /// @param what The invalid governance parameter. + error InvalidGovernanceParameter(bytes32 what); + + /// @notice Error thrown when addresses and values provided are not equal. + /// @param addresses The number of addresses provided. + /// @param values The number of values provided. + error AddressesAmountMismatch(uint256 addresses, uint256 values); + + error AddressCannotBeZero(); + + error InvalidPPMValue(uint32 value); + + error HatchingNotStarted(); + + error HatchingAlreadyStarted(); + + error HatchNotOpen(); + + error VestingScheduleNotInitialized(); + + error VestingScheduleRevoked(); + + error VestingScheduleNotRevocable(); + + error OnlyBeneficiary(address caller, address beneficiary); + + error NotEnoughVestedTokens(uint256 requested, uint256 available); + + error DurationCannotBeZero(); + + error SlicePeriodCannotBeZero(); + + error DurationCannotBeLessThanCliff(); + + error ContributionWindowClosed(); + + error MaxContributionReached(); + + error HatchNotCanceled(); + + error NoContribution(); + + error NotEnoughRaised(); + + error HatchOngoing(); + + error MinRaiseMet(); +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/lib/Events.sol b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Events.sol new file mode 100644 index 0000000..f0ca2ac --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Events.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/lib/Events.sol +pragma solidity >=0.8.17; + +library Events { + /** + * @dev Emitted when tokens are minted continuously (the normal minting process). + * @param buyer The address of the account that initiated the minting process. + * @param minted The amount of tokens that were minted. + * @param depositAmount The amount of ether that was deposited to mint the tokens. + * @param fundingAmount The amount of ether that was sent to the owner as funding. + */ + event ContinuousMint(address indexed buyer, uint256 minted, uint256 depositAmount, uint256 fundingAmount); + + /** + * @dev Emitted when tokens are burned continuously (the normal burning process). + * @param burner The address of the account that initiated the burning process. + * @param burned The amount of tokens that were burned. + * @param reimburseAmount The amount of ether that was reimbursed to the burner. + * @param exitFee The amount of ether that was deducted as an exit fee. + */ + event ContinuousBurn(address indexed burner, uint256 burned, uint256 reimburseAmount, uint256 exitFee); + + /** + * @dev Emitted when tokens are minted in a sponsored process. + * @param sender The address of the account that initiated the minting process. + * @param depositAmount The amount of ether that was deposited to mint the tokens. + * @param minted The amount of tokens that were minted. + */ + event SponsoredMint(address indexed sender, uint256 depositAmount, uint256 minted); + + /** + * @dev Emitted when tokens are burned in a sponsored process. + * @param sender The address of the account that initiated the burning process. + * @param burnAmount The amount of tokens that were burned. + */ + event SponsoredBurn(address indexed sender, uint256 burnAmount); + + /** + * @dev Emitted when the MarketMaker has been Hatched. + * @param hatcher The address of the account recieved the hatch tokens. + * @param amount The amount of bonded tokens that was minted to the hatcher. + */ + event Hatch(address indexed hatcher, uint256 amount); +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/lib/Types.sol b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Types.sol new file mode 100644 index 0000000..4d94124 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/lib/Types.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/lib/Types.sol +pragma solidity >=0.8.17; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IBondedToken } from "../interfaces/IBondedToken.sol"; +import { IBondingCurve } from "../interfaces/IBondingCurve.sol"; +import { IMarketMaker } from "../interfaces/IMarketMaker.sol"; + +/// @notice This struct holds the key parameters that define a bonding curve for a token. +/// @dev These parameters can be updated over time to change the behavior of the bonding curve. +struct CurveParameters { + /// @notice fraction of buy funds that go to the DAO. + /// @dev This value is represented in fraction (in PPM) + /// The funds collected here could be used for various purposes like development, marketing, etc., depending on the + /// DAO's decisions. + uint32 theta; + /// @notice fraction of sell funds that are redistributed to the Pool. + /// @dev This value is represented in fraction (in PPM) + /// This "friction" is used to discourage burning and maintain stability in the token's price. + uint32 friction; + /// @notice The reserve ratio of the bonding curve, represented in parts per million (ppm), ranging from 1 to + /// 1,000,000. + /// @dev The reserve ratio corresponds to different formulas in the bonding curve: + /// - 1/3 corresponds to y = multiple * x^2 (exponential curve) + /// - 1/2 corresponds to y = multiple * x (linear curve) + /// - 2/3 corresponds to y = multiple * x^(1/2) (square root curve) + /// The reserve ratio determines the price sensitivity of the token to changes in supply. + uint32 reserveRatio; + /// @notice The implementation of the curve. + /// @dev This is the interface of the bonding curve contract. + /// Different implementations can be used to change the behavior of the curve, such as linear, exponential, etc. + IBondingCurve formula; +} + +struct VestingSchedule { + // cliff period in seconds + uint256 cliff; + // start time of the vesting period + uint256 start; + // duration of the vesting period in seconds + uint256 duration; + // whether or not the vesting is revocable + bool revocable; +} + +struct VestingState { + VestingSchedule schedule; + // total amount of tokens to be released at the end of the vesting + uint256 amountTotal; + // amount of tokens released + uint256 released; + // whether or not the vesting has been revoked + bool revoked; +} + +enum HatchStatus { + OPEN, + HATCHED, + CANCELED +} + +struct HatchParameters { + // External token contract (Stablecurrency e.g. DAI). + IERC20 externalToken; + IBondedToken bondedToken; + IMarketMaker pool; + uint256 initialPrice; + uint256 minimumRaise; + uint256 maximumRaise; + // Time (in seconds) by which the curve must be hatched since initialization. + uint256 hatchDeadline; +} + +struct HatchState { + HatchParameters params; + HatchStatus status; + uint256 raised; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorBondingCurve.sol b/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorBondingCurve.sol new file mode 100644 index 0000000..7a67cbe --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorBondingCurve.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/math/BancorBondingCurve.sol +pragma solidity >=0.8.17; + +import { BancorFormula } from "../math/BancorFormula.sol"; +import { IBondingCurve } from "../interfaces/IBondingCurve.sol"; + +/** + * @title BancorBondingCurve + * @author DAOBox | (@pythonpete32) + * @dev This contract implements the Bancor Formula for a bonding curve. The Bancor Formula provides + * a way to calculate the price and the return of tokens for continuous token models. + * + * The contract provides two main functionalities: + * 1. Calculating the reward for minting continuous tokens. + * 2. Calculating the refund for burning continuous tokens. + * + * @notice Please use this contract responsibly and understand the implications of the bonding curve + * and continuous minting/burning on your token's economics. + */ +contract BancorBondingCurve is IBondingCurve, BancorFormula { + /// @inheritdoc IBondingCurve + function getContinuousMintReward( + uint256 depositAmount, + uint256 continuousSupply, + uint256 reserveBalance, + uint32 reserveRatio + ) + public + view + returns (uint256) + { + return calculatePurchaseReturn({ + _supply: continuousSupply, + _reserveBalance: reserveBalance, + _reserveRatio: reserveRatio, + _depositAmount: depositAmount + }); + } + + /// @inheritdoc IBondingCurve + function getContinuousBurnRefund( + uint256 _continuousTokenAmount, + uint256 _continuousSupply, + uint256 _reserveBalance, + uint32 _reserveRatio + ) + public + view + returns (uint256) + { + return calculateSaleReturn(_continuousSupply, _reserveBalance, _reserveRatio, _continuousTokenAmount); + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorFormula.sol b/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorFormula.sol new file mode 100644 index 0000000..ce7fcbe --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/math/BancorFormula.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: Apache 2.0 +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/math/BancorFormula.sol +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.0 <0.9.0; + +import "@openzeppelin/contracts/utils/math/SafeMath.sol"; +import "./Power.sol"; // Efficient power function. + +/** + * @title Bancor formula by Bancor + * + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements; + * and to You under the Apache License, Version 2.0. " + */ +contract BancorFormula is Power { + using SafeMath for uint256; + + uint32 private constant MAX_RESERVE_RATIO = 1_000_000; + + /** + * @dev given a continuous token supply, reserve token balance, reserve ratio, and a deposit amount (in the reserve + * token), + * calculates the return for a given conversion (in the continuous token) + * + * Formula: + * Return = _supply * ((1 + _depositAmount / _reserveBalance) ^ (_reserveRatio / MAX_RESERVE_RATIO) - 1) + * + * @param _supply continuous token total supply + * @param _reserveBalance total reserve token balance + * @param _reserveRatio reserve ratio, represented in ppm, 1-1000000 + * @param _depositAmount deposit amount, in reserve token + * + * @return purchase return amount + */ + function calculatePurchaseReturn( + uint256 _supply, + uint256 _reserveBalance, + uint32 _reserveRatio, + uint256 _depositAmount + ) + public + view + returns (uint256) + { + // validate input + require( + _supply > 0 && _reserveBalance > 0 && _reserveRatio > 0 && _reserveRatio <= MAX_RESERVE_RATIO, + "Invalid inputs." + ); + // special case for 0 deposit amount + if (_depositAmount == 0) { + return 0; + } + // special case if the ratio = 100% + if (_reserveRatio == MAX_RESERVE_RATIO) { + return _supply.mul(_depositAmount).div(_reserveBalance); + } + uint256 result; + uint8 precision; + uint256 baseN = _depositAmount.add(_reserveBalance); + (result, precision) = power(baseN, _reserveBalance, _reserveRatio, MAX_RESERVE_RATIO); + uint256 newTokenSupply = _supply.mul(result) >> precision; + return newTokenSupply.sub(_supply); + } + + /** + * @dev given a continuous token supply, reserve token balance, reserve ratio and a sell amount (in the continuous + * token), + * calculates the return for a given conversion (in the reserve token) + * + * Formula: + * Return = _reserveBalance * (1 - (1 - _sellAmount / _supply) ^ (1 / (_reserveRatio / MAX_RESERVE_RATIO))) + * + * @param _supply continuous token total supply + * @param _reserveBalance total reserve token balance + * @param _reserveRatio constant reserve ratio, represented in ppm, 1-1000000 + * @param _sellAmount sell amount, in the continuous token itself + * + * @return sale return amount + */ + function calculateSaleReturn( + uint256 _supply, + uint256 _reserveBalance, + uint32 _reserveRatio, + uint256 _sellAmount + ) + public + view + returns (uint256) + { + // validate input + require( + _supply > 0 && _reserveBalance > 0 && _reserveRatio > 0 && _reserveRatio <= MAX_RESERVE_RATIO + && _sellAmount <= _supply, + "Invalid inputs." + ); + // special case for 0 sell amount + if (_sellAmount == 0) { + return 0; + } + // special case for selling the entire supply + if (_sellAmount == _supply) { + return _reserveBalance; + } + // special case if the ratio = 100% + if (_reserveRatio == MAX_RESERVE_RATIO) { + return _reserveBalance.mul(_sellAmount).div(_supply); + } + uint256 result; + uint8 precision; + uint256 baseD = _supply.sub(_sellAmount); + (result, precision) = power(_supply, baseD, MAX_RESERVE_RATIO, _reserveRatio); + uint256 oldBalance = _reserveBalance.mul(result); + uint256 newBalance = _reserveBalance << precision; + return oldBalance.sub(newBalance).div(result); + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/math/Power.sol b/contracts/facets/token/ERC20/monetary-token/ABC/math/Power.sol new file mode 100644 index 0000000..8353f12 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/math/Power.sol @@ -0,0 +1,533 @@ +// SPDX-License-Identifier: Apache 2.0 +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/math/Power.sol +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.0 <0.9.0; + +/** + * @title Power function by Bancor + * @dev https://github.com/bancorprotocol/contracts + * + * Modified from the original by Slava Balasanov & Tarrence van As + * + * Split Power.sol out from BancorFormula.sol + * https://github.com/bancorprotocol/contracts/blob/c9adc95e82fdfb3a0ada102514beb8ae00147f5d/solidity/contracts/converter/BancorFormula.sol + * + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements; + * and to You under the Apache License, Version 2.0. " + */ +contract Power { + string public version = "0.3"; + + uint256 private constant ONE = 1; + uint32 private constant MAX_WEIGHT = 1_000_000; + uint8 private constant MIN_PRECISION = 32; + uint8 private constant MAX_PRECISION = 127; + + /** + * The values below depend on MAX_PRECISION. If you choose to change it: + * Apply the same change in file 'PrintIntScalingFactors.py', run it and paste the results below. + */ + uint256 private constant FIXED_1 = 0x080000000000000000000000000000000; + uint256 private constant FIXED_2 = 0x100000000000000000000000000000000; + uint256 private constant MAX_NUM = 0x200000000000000000000000000000000; + + /** + * Auto-generated via 'PrintLn2ScalingFactors.py' + */ + uint256 private constant LN2_NUMERATOR = 0x3f80fe03f80fe03f80fe03f80fe03f8; + uint256 private constant LN2_DENOMINATOR = 0x5b9de1d10bf4103d647b0955897ba80; + + /** + * Auto-generated via 'PrintFunctionOptimalLog.py' and 'PrintFunctionOptimalExp.py' + */ + uint256 private constant OPT_LOG_MAX_VAL = 0x15bf0a8b1457695355fb8ac404e7a79e3; + uint256 private constant OPT_EXP_MAX_VAL = 0x800000000000000000000000000000000; + + /** + * The values below depend on MIN_PRECISION and MAX_PRECISION. If you choose to change either one of them: + * Apply the same change in file 'PrintFunctionBancorFormula.py', run it and paste the results below. + */ + uint256[128] private maxExpArray; + + constructor() { + // maxExpArray[0] = 0x6bffffffffffffffffffffffffffffffff; + // maxExpArray[1] = 0x67ffffffffffffffffffffffffffffffff; + // maxExpArray[2] = 0x637fffffffffffffffffffffffffffffff; + // maxExpArray[3] = 0x5f6fffffffffffffffffffffffffffffff; + // maxExpArray[4] = 0x5b77ffffffffffffffffffffffffffffff; + // maxExpArray[5] = 0x57b3ffffffffffffffffffffffffffffff; + // maxExpArray[6] = 0x5419ffffffffffffffffffffffffffffff; + // maxExpArray[7] = 0x50a2ffffffffffffffffffffffffffffff; + // maxExpArray[8] = 0x4d517fffffffffffffffffffffffffffff; + // maxExpArray[9] = 0x4a233fffffffffffffffffffffffffffff; + // maxExpArray[10] = 0x47165fffffffffffffffffffffffffffff; + // maxExpArray[11] = 0x4429afffffffffffffffffffffffffffff; + // maxExpArray[12] = 0x415bc7ffffffffffffffffffffffffffff; + // maxExpArray[13] = 0x3eab73ffffffffffffffffffffffffffff; + // maxExpArray[14] = 0x3c1771ffffffffffffffffffffffffffff; + // maxExpArray[15] = 0x399e96ffffffffffffffffffffffffffff; + // maxExpArray[16] = 0x373fc47fffffffffffffffffffffffffff; + // maxExpArray[17] = 0x34f9e8ffffffffffffffffffffffffffff; + // maxExpArray[18] = 0x32cbfd5fffffffffffffffffffffffffff; + // maxExpArray[19] = 0x30b5057fffffffffffffffffffffffffff; + // maxExpArray[20] = 0x2eb40f9fffffffffffffffffffffffffff; + // maxExpArray[21] = 0x2cc8340fffffffffffffffffffffffffff; + // maxExpArray[22] = 0x2af09481ffffffffffffffffffffffffff; + // maxExpArray[23] = 0x292c5bddffffffffffffffffffffffffff; + // maxExpArray[24] = 0x277abdcdffffffffffffffffffffffffff; + // maxExpArray[25] = 0x25daf6657fffffffffffffffffffffffff; + // maxExpArray[26] = 0x244c49c65fffffffffffffffffffffffff; + // maxExpArray[27] = 0x22ce03cd5fffffffffffffffffffffffff; + // maxExpArray[28] = 0x215f77c047ffffffffffffffffffffffff; + // maxExpArray[29] = 0x1fffffffffffffffffffffffffffffffff; + // maxExpArray[30] = 0x1eaefdbdabffffffffffffffffffffffff; + // maxExpArray[31] = 0x1d6bd8b2ebffffffffffffffffffffffff; + maxExpArray[32] = 0x1c35fedd14ffffffffffffffffffffffff; + maxExpArray[33] = 0x1b0ce43b323fffffffffffffffffffffff; + maxExpArray[34] = 0x19f0028ec1ffffffffffffffffffffffff; + maxExpArray[35] = 0x18ded91f0e7fffffffffffffffffffffff; + maxExpArray[36] = 0x17d8ec7f0417ffffffffffffffffffffff; + maxExpArray[37] = 0x16ddc6556cdbffffffffffffffffffffff; + maxExpArray[38] = 0x15ecf52776a1ffffffffffffffffffffff; + maxExpArray[39] = 0x15060c256cb2ffffffffffffffffffffff; + maxExpArray[40] = 0x1428a2f98d72ffffffffffffffffffffff; + maxExpArray[41] = 0x13545598e5c23fffffffffffffffffffff; + maxExpArray[42] = 0x1288c4161ce1dfffffffffffffffffffff; + maxExpArray[43] = 0x11c592761c666fffffffffffffffffffff; + maxExpArray[44] = 0x110a688680a757ffffffffffffffffffff; + maxExpArray[45] = 0x1056f1b5bedf77ffffffffffffffffffff; + maxExpArray[46] = 0x0faadceceeff8bffffffffffffffffffff; + maxExpArray[47] = 0x0f05dc6b27edadffffffffffffffffffff; + maxExpArray[48] = 0x0e67a5a25da4107fffffffffffffffffff; + maxExpArray[49] = 0x0dcff115b14eedffffffffffffffffffff; + maxExpArray[50] = 0x0d3e7a392431239fffffffffffffffffff; + maxExpArray[51] = 0x0cb2ff529eb71e4fffffffffffffffffff; + maxExpArray[52] = 0x0c2d415c3db974afffffffffffffffffff; + maxExpArray[53] = 0x0bad03e7d883f69bffffffffffffffffff; + maxExpArray[54] = 0x0b320d03b2c343d5ffffffffffffffffff; + maxExpArray[55] = 0x0abc25204e02828dffffffffffffffffff; + maxExpArray[56] = 0x0a4b16f74ee4bb207fffffffffffffffff; + maxExpArray[57] = 0x09deaf736ac1f569ffffffffffffffffff; + maxExpArray[58] = 0x0976bd9952c7aa957fffffffffffffffff; + maxExpArray[59] = 0x09131271922eaa606fffffffffffffffff; + maxExpArray[60] = 0x08b380f3558668c46fffffffffffffffff; + maxExpArray[61] = 0x0857ddf0117efa215bffffffffffffffff; + maxExpArray[62] = 0x07ffffffffffffffffffffffffffffffff; + maxExpArray[63] = 0x07abbf6f6abb9d087fffffffffffffffff; + maxExpArray[64] = 0x075af62cbac95f7dfa7fffffffffffffff; + maxExpArray[65] = 0x070d7fb7452e187ac13fffffffffffffff; + maxExpArray[66] = 0x06c3390ecc8af379295fffffffffffffff; + maxExpArray[67] = 0x067c00a3b07ffc01fd6fffffffffffffff; + maxExpArray[68] = 0x0637b647c39cbb9d3d27ffffffffffffff; + maxExpArray[69] = 0x05f63b1fc104dbd39587ffffffffffffff; + maxExpArray[70] = 0x05b771955b36e12f7235ffffffffffffff; + maxExpArray[71] = 0x057b3d49dda84556d6f6ffffffffffffff; + maxExpArray[72] = 0x054183095b2c8ececf30ffffffffffffff; + maxExpArray[73] = 0x050a28be635ca2b888f77fffffffffffff; + maxExpArray[74] = 0x04d5156639708c9db33c3fffffffffffff; + maxExpArray[75] = 0x04a23105873875bd52dfdfffffffffffff; + maxExpArray[76] = 0x0471649d87199aa990756fffffffffffff; + maxExpArray[77] = 0x04429a21a029d4c1457cfbffffffffffff; + maxExpArray[78] = 0x0415bc6d6fb7dd71af2cb3ffffffffffff; + maxExpArray[79] = 0x03eab73b3bbfe282243ce1ffffffffffff; + maxExpArray[80] = 0x03c1771ac9fb6b4c18e229ffffffffffff; + maxExpArray[81] = 0x0399e96897690418f785257fffffffffff; + maxExpArray[82] = 0x0373fc456c53bb779bf0ea9fffffffffff; + maxExpArray[83] = 0x034f9e8e490c48e67e6ab8bfffffffffff; + maxExpArray[84] = 0x032cbfd4a7adc790560b3337ffffffffff; + maxExpArray[85] = 0x030b50570f6e5d2acca94613ffffffffff; + maxExpArray[86] = 0x02eb40f9f620fda6b56c2861ffffffffff; + maxExpArray[87] = 0x02cc8340ecb0d0f520a6af58ffffffffff; + maxExpArray[88] = 0x02af09481380a0a35cf1ba02ffffffffff; + maxExpArray[89] = 0x0292c5bdd3b92ec810287b1b3fffffffff; + maxExpArray[90] = 0x0277abdcdab07d5a77ac6d6b9fffffffff; + maxExpArray[91] = 0x025daf6654b1eaa55fd64df5efffffffff; + maxExpArray[92] = 0x0244c49c648baa98192dce88b7ffffffff; + maxExpArray[93] = 0x022ce03cd5619a311b2471268bffffffff; + maxExpArray[94] = 0x0215f77c045fbe885654a44a0fffffffff; + maxExpArray[95] = 0x01ffffffffffffffffffffffffffffffff; + maxExpArray[96] = 0x01eaefdbdaaee7421fc4d3ede5ffffffff; + maxExpArray[97] = 0x01d6bd8b2eb257df7e8ca57b09bfffffff; + maxExpArray[98] = 0x01c35fedd14b861eb0443f7f133fffffff; + maxExpArray[99] = 0x01b0ce43b322bcde4a56e8ada5afffffff; + maxExpArray[100] = 0x019f0028ec1fff007f5a195a39dfffffff; + maxExpArray[101] = 0x018ded91f0e72ee74f49b15ba527ffffff; + maxExpArray[102] = 0x017d8ec7f04136f4e5615fd41a63ffffff; + maxExpArray[103] = 0x016ddc6556cdb84bdc8d12d22e6fffffff; + maxExpArray[104] = 0x015ecf52776a1155b5bd8395814f7fffff; + maxExpArray[105] = 0x015060c256cb23b3b3cc3754cf40ffffff; + maxExpArray[106] = 0x01428a2f98d728ae223ddab715be3fffff; + maxExpArray[107] = 0x013545598e5c23276ccf0ede68034fffff; + maxExpArray[108] = 0x01288c4161ce1d6f54b7f61081194fffff; + maxExpArray[109] = 0x011c592761c666aa641d5a01a40f17ffff; + maxExpArray[110] = 0x0110a688680a7530515f3e6e6cfdcdffff; + maxExpArray[111] = 0x01056f1b5bedf75c6bcb2ce8aed428ffff; + maxExpArray[112] = 0x00faadceceeff8a0890f3875f008277fff; + maxExpArray[113] = 0x00f05dc6b27edad306388a600f6ba0bfff; + maxExpArray[114] = 0x00e67a5a25da41063de1495d5b18cdbfff; + maxExpArray[115] = 0x00dcff115b14eedde6fc3aa5353f2e4fff; + maxExpArray[116] = 0x00d3e7a3924312399f9aae2e0f868f8fff; + maxExpArray[117] = 0x00cb2ff529eb71e41582cccd5a1ee26fff; + maxExpArray[118] = 0x00c2d415c3db974ab32a51840c0b67edff; + maxExpArray[119] = 0x00bad03e7d883f69ad5b0a186184e06bff; + maxExpArray[120] = 0x00b320d03b2c343d4829abd6075f0cc5ff; + maxExpArray[121] = 0x00abc25204e02828d73c6e80bcdb1a95bf; + maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df; + maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f; + maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037; + maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf; + maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9; + maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6; + } + + /** + * General Description: + * Determine a value of precision. + * Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) * 2 ^ precision. + * Return the result along with the precision used. + * Detailed Description: + * Instead of calculating "base ^ exp", we calculate "e ^ (log(base) * exp)". + * The value of "log(base)" is represented with an integer slightly smaller than "log(base) * 2 ^ precision". + * The larger "precision" is, the more accurately this value represents the real value. + * However, the larger "precision" is, the more bits are required in order to store this value. + * And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent + * (maximum value of "x"). + * This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> + * (MAX_PRECISION - precision)". + * Hence we need to determine the highest precision which can be used for the given input, before calling the + * exponentiation function. + * This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the + * intermediate computations. + * This functions assumes that "_expN < 2 ^ 256 / log(MAX_NUM - 1)", otherwise the multiplication should be + * replaced with a "safeMul". + */ + function power(uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD) internal view returns (uint256, uint8) { + require(_baseN < MAX_NUM, "baseN exceeds max value."); + require(_baseN >= _baseD, "Bases < 1 are not supported."); + + uint256 baseLog; + uint256 base = (_baseN * FIXED_1) / _baseD; + if (base < OPT_LOG_MAX_VAL) { + baseLog = optimalLog(base); + } else { + baseLog = generalLog(base); + } + + uint256 baseLogTimesExp = (baseLog * _expN) / _expD; + if (baseLogTimesExp < OPT_EXP_MAX_VAL) { + return (optimalExp(baseLogTimesExp), MAX_PRECISION); + } else { + uint8 precision = findPositionInMaxExpArray(baseLogTimesExp); + return (generalExp(baseLogTimesExp >> (MAX_PRECISION - precision), precision), precision); + } + } + + /** + * Compute log(x / FIXED_1) * FIXED_1. + * This functions assumes that "x >= FIXED_1", because the output would be negative otherwise. + */ + function generalLog(uint256 _x) internal pure returns (uint256) { + uint256 res = 0; + uint256 x = _x; + + // If x >= 2, then we compute the integer part of log2(x), which is larger than 0. + if (x >= FIXED_2) { + uint8 count = floorLog2(x / FIXED_1); + x >>= count; // now x < 2 + res = count * FIXED_1; + } + + // If x > 1, then we compute the fraction part of log2(x), which is larger than 0. + if (x > FIXED_1) { + for (uint8 i = MAX_PRECISION; i > 0; --i) { + x = (x * x) / FIXED_1; // now 1 < x < 4 + if (x >= FIXED_2) { + x >>= 1; // now 1 < x < 2 + res += ONE << (i - 1); + } + } + } + + return (res * LN2_NUMERATOR) / LN2_DENOMINATOR; + } + + /** + * Compute the largest integer smaller than or equal to the binary logarithm of the input. + */ + function floorLog2(uint256 _n) internal pure returns (uint8) { + uint8 res = 0; + uint256 n = _n; + + if (n < 256) { + // At most 8 iterations + while (n > 1) { + n >>= 1; + res += 1; + } + } else { + // Exactly 8 iterations + for (uint8 s = 128; s > 0; s >>= 1) { + if (n >= (ONE << s)) { + n >>= s; + res |= s; + } + } + } + + return res; + } + + /** + * The global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent: + * - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"] + * - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"] + */ + function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8) { + uint8 lo = MIN_PRECISION; + uint8 hi = MAX_PRECISION; + + while (lo + 1 < hi) { + uint8 mid = (lo + hi) / 2; + if (maxExpArray[mid] >= _x) lo = mid; + else hi = mid; + } + + if (maxExpArray[hi] >= _x) return hi; + if (maxExpArray[lo] >= _x) return lo; + + assert(false); + return 0; + } + + /* solhint-disable */ + /** + * This function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. + * It approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!". + * It returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy. + * The global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - + * 1". + * The maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - + * precision)". + */ + function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256) { + uint256 xi = _x; + uint256 res = 0; + + xi = (xi * _x) >> _precision; + res += xi * 0x3442c4e6074a82f1797f72ac0000000; // add x^02 * (33! / 02!) + xi = (xi * _x) >> _precision; + res += xi * 0x116b96f757c380fb287fd0e40000000; // add x^03 * (33! / 03!) + xi = (xi * _x) >> _precision; + res += xi * 0x045ae5bdd5f0e03eca1ff4390000000; // add x^04 * (33! / 04!) + xi = (xi * _x) >> _precision; + res += xi * 0x00defabf91302cd95b9ffda50000000; // add x^05 * (33! / 05!) + xi = (xi * _x) >> _precision; + res += xi * 0x002529ca9832b22439efff9b8000000; // add x^06 * (33! / 06!) + xi = (xi * _x) >> _precision; + res += xi * 0x00054f1cf12bd04e516b6da88000000; // add x^07 * (33! / 07!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000a9e39e257a09ca2d6db51000000; // add x^08 * (33! / 08!) + xi = (xi * _x) >> _precision; + res += xi * 0x000012e066e7b839fa050c309000000; // add x^09 * (33! / 09!) + xi = (xi * _x) >> _precision; + res += xi * 0x000001e33d7d926c329a1ad1a800000; // add x^10 * (33! / 10!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000002bee513bdb4a6b19b5f800000; // add x^11 * (33! / 11!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000003a9316fa79b88eccf2a00000; // add x^12 * (33! / 12!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000048177ebe1fa812375200000; // add x^13 * (33! / 13!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000005263fe90242dcbacf00000; // add x^14 * (33! / 14!) + xi = (xi * _x) >> _precision; + res += xi * 0x000000000057e22099c030d94100000; // add x^15 * (33! / 15!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000057e22099c030d9410000; // add x^16 * (33! / 16!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000052b6b54569976310000; // add x^17 * (33! / 17!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000004985f67696bf748000; // add x^18 * (33! / 18!) + xi = (xi * _x) >> _precision; + res += xi * 0x000000000000003dea12ea99e498000; // add x^19 * (33! / 19!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000000031880f2214b6e000; // add x^20 * (33! / 20!) + xi = (xi * _x) >> _precision; + res += xi * 0x000000000000000025bcff56eb36000; // add x^21 * (33! / 21!) + xi = (xi * _x) >> _precision; + res += xi * 0x000000000000000001b722e10ab1000; // add x^22 * (33! / 22!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000001317c70077000; // add x^23 * (33! / 23!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000000000000cba84aafa00; // add x^24 * (33! / 24!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000000000000082573a0a00; // add x^25 * (33! / 25!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000000000000005035ad900; // add x^26 * (33! / 26!) + xi = (xi * _x) >> _precision; + res += xi * 0x000000000000000000000002f881b00; // add x^27 * (33! / 27!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000000000001b29340; // add x^28 * (33! / 28!) + xi = (xi * _x) >> _precision; + res += xi * 0x00000000000000000000000000efc40; // add x^29 * (33! / 29!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000000000000007fe0; // add x^30 * (33! / 30!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000000000000000420; // add x^31 * (33! / 31!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000000000000000021; // add x^32 * (33! / 32!) + xi = (xi * _x) >> _precision; + res += xi * 0x0000000000000000000000000000001; // add x^33 * (33! / 33!) + + return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / + // 1! + x^0 / 0! + } + + /** + * Return log(x / FIXED_1) * FIXED_1 + * Input range: FIXED_1 <= x <= LOG_EXP_MAX_VAL - 1 + * Auto-generated via 'PrintFunctionOptimalLog.py' + */ + function optimalLog(uint256 x) internal pure returns (uint256) { + uint256 res = 0; + + uint256 y; + uint256 z; + uint256 w; + + if (x >= 0xd3094c70f034de4b96ff7d5b6f99fcd8) { + res += 0x40000000000000000000000000000000; + x = (x * FIXED_1) / 0xd3094c70f034de4b96ff7d5b6f99fcd8; + } + if (x >= 0xa45af1e1f40c333b3de1db4dd55f29a7) { + res += 0x20000000000000000000000000000000; + x = (x * FIXED_1) / 0xa45af1e1f40c333b3de1db4dd55f29a7; + } + if (x >= 0x910b022db7ae67ce76b441c27035c6a1) { + res += 0x10000000000000000000000000000000; + x = (x * FIXED_1) / 0x910b022db7ae67ce76b441c27035c6a1; + } + if (x >= 0x88415abbe9a76bead8d00cf112e4d4a8) { + res += 0x08000000000000000000000000000000; + x = (x * FIXED_1) / 0x88415abbe9a76bead8d00cf112e4d4a8; + } + if (x >= 0x84102b00893f64c705e841d5d4064bd3) { + res += 0x04000000000000000000000000000000; + x = (x * FIXED_1) / 0x84102b00893f64c705e841d5d4064bd3; + } + if (x >= 0x8204055aaef1c8bd5c3259f4822735a2) { + res += 0x02000000000000000000000000000000; + x = (x * FIXED_1) / 0x8204055aaef1c8bd5c3259f4822735a2; + } + if (x >= 0x810100ab00222d861931c15e39b44e99) { + res += 0x01000000000000000000000000000000; + x = (x * FIXED_1) / 0x810100ab00222d861931c15e39b44e99; + } + if (x >= 0x808040155aabbbe9451521693554f733) { + res += 0x00800000000000000000000000000000; + x = (x * FIXED_1) / 0x808040155aabbbe9451521693554f733; + } + + z = y = x - FIXED_1; + w = (y * y) / FIXED_1; + res += (z * (0x100000000000000000000000000000000 - y)) / 0x100000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - y)) / 0x200000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x099999999999999999999999999999999 - y)) / 0x300000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x092492492492492492492492492492492 - y)) / 0x400000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x08e38e38e38e38e38e38e38e38e38e38e - y)) / 0x500000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x08ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b - y)) / 0x600000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x089d89d89d89d89d89d89d89d89d89d89 - y)) / 0x700000000000000000000000000000000; + z = (z * w) / FIXED_1; + res += (z * (0x088888888888888888888888888888888 - y)) / 0x800000000000000000000000000000000; + + return res; + } + + /** + * Return e ^ (x / FIXED_1) * FIXED_1 + * Input range: 0 <= x <= OPT_EXP_MAX_VAL - 1 + * Auto-generated via 'PrintFunctionOptimalExp.py' + */ + function optimalExp(uint256 x) internal pure returns (uint256) { + uint256 res = 0; + + uint256 y; + uint256 z; + + z = y = x % 0x10000000000000000000000000000000; + z = (z * y) / FIXED_1; + res += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!) + z = (z * y) / FIXED_1; + res += z * 0x05a0913f6b1e0000; // add y^03 * (20! / 03!) + z = (z * y) / FIXED_1; + res += z * 0x0168244fdac78000; // add y^04 * (20! / 04!) + z = (z * y) / FIXED_1; + res += z * 0x004807432bc18000; // add y^05 * (20! / 05!) + z = (z * y) / FIXED_1; + res += z * 0x000c0135dca04000; // add y^06 * (20! / 06!) + z = (z * y) / FIXED_1; + res += z * 0x0001b707b1cdc000; // add y^07 * (20! / 07!) + z = (z * y) / FIXED_1; + res += z * 0x000036e0f639b800; // add y^08 * (20! / 08!) + z = (z * y) / FIXED_1; + res += z * 0x00000618fee9f800; // add y^09 * (20! / 09!) + z = (z * y) / FIXED_1; + res += z * 0x0000009c197dcc00; // add y^10 * (20! / 10!) + z = (z * y) / FIXED_1; + res += z * 0x0000000e30dce400; // add y^11 * (20! / 11!) + z = (z * y) / FIXED_1; + res += z * 0x000000012ebd1300; // add y^12 * (20! / 12!) + z = (z * y) / FIXED_1; + res += z * 0x0000000017499f00; // add y^13 * (20! / 13!) + z = (z * y) / FIXED_1; + res += z * 0x0000000001a9d480; // add y^14 * (20! / 14!) + z = (z * y) / FIXED_1; + res += z * 0x00000000001c6380; // add y^15 * (20! / 15!) + z = (z * y) / FIXED_1; + res += z * 0x000000000001c638; // add y^16 * (20! / 16!) + z = (z * y) / FIXED_1; + res += z * 0x0000000000001ab8; // add y^17 * (20! / 17!) + z = (z * y) / FIXED_1; + res += z * 0x000000000000017c; // add y^18 * (20! / 18!) + z = (z * y) / FIXED_1; + res += z * 0x0000000000000014; // add y^19 * (20! / 19!) + z = (z * y) / FIXED_1; + res += z * 0x0000000000000001; // add y^20 * (20! / 20!) + res = res / 0x21c3677c82b40000 + y + FIXED_1; // divide by 20! and then add y^1 / 1! + y^0 / 0! + + if ((x & 0x010000000000000000000000000000000) != 0) { + res = (res * 0x1c3d6a24ed82218787d624d3e5eba95f9) / 0x18ebef9eac820ae8682b9793ac6d1e776; + } + if ((x & 0x020000000000000000000000000000000) != 0) { + res = (res * 0x18ebef9eac820ae8682b9793ac6d1e778) / 0x1368b2fc6f9609fe7aceb46aa619baed4; + } + if ((x & 0x040000000000000000000000000000000) != 0) { + res = (res * 0x1368b2fc6f9609fe7aceb46aa619baed5) / 0x0bc5ab1b16779be3575bd8f0520a9f21f; + } + if ((x & 0x080000000000000000000000000000000) != 0) { + res = (res * 0x0bc5ab1b16779be3575bd8f0520a9f21e) / 0x0454aaa8efe072e7f6ddbab84b40a55c9; + } + if ((x & 0x100000000000000000000000000000000) != 0) { + res = (res * 0x0454aaa8efe072e7f6ddbab84b40a55c5) / 0x00960aadc109e7a3bf4578099615711ea; + } + if ((x & 0x200000000000000000000000000000000) != 0) { + res = (res * 0x00960aadc109e7a3bf4578099615711d7) / 0x0002bf84208204f5977f9a8cf01fdce3d; + } + if ((x & 0x400000000000000000000000000000000) != 0) { + res = (res * 0x0002bf84208204f5977f9a8cf01fdc307) / 0x0000003c6ab775dd0b95b4cbee7e65d11; + } + + return res; + } + /* solhint-enable */ +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/MarketMaker.sol b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/MarketMaker.sol new file mode 100644 index 0000000..c772063 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/MarketMaker.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/modifiers/MarketMaker.sol +pragma solidity >=0.8.17; + +import { Errors } from "../lib/Errors.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +abstract contract Modifiers { + modifier nonZeroAddress(address _address) { + if (_address == address(0)) revert Errors.AddressCannotBeZero(); + _; + } + + modifier isPPM(uint32 _amount) { + if (_amount == 1_000_000) revert Errors.InvalidPPMValue(_amount); + _; + } + + modifier validateReserve(IERC20 token) { + if (token.balanceOf(address(this)) == 0) revert Errors.InitialReserveCannotBeZero(); + _; + } + + modifier isTradingOpen(bool _isTradingOpen) { + if (_isTradingOpen) revert Errors.TradingAlreadyOpened(); + _; + } + + modifier isDepositZero(uint256 _amount) { + if (_amount == 0) revert Errors.DepositAmountCannotBeZero(); + _; + } + + modifier postHatch(bool _hatched) { + if (!_hatched) revert Errors.HatchingNotStarted(); + _; + } + + modifier preHatch(bool _hatched) { + if (_hatched) revert Errors.HatchingAlreadyStarted(); + _; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/SimpleHatch.sol b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/SimpleHatch.sol new file mode 100644 index 0000000..a48767a --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/SimpleHatch.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/modifiers/SimpleHatch.sol +pragma solidity >=0.8.17; + +import { Errors } from "../lib/Errors.sol"; +import { HatchStatus, HatchState } from "../lib/Types.sol"; + +abstract contract Modifiers { + modifier validateContribution(HatchState memory state, uint256 amount) { + if (state.status != HatchStatus.OPEN) revert Errors.HatchNotOpen(); + if (state.raised + amount > state.params.maximumRaise) revert Errors.MaxContributionReached(); + if (block.timestamp > state.params.hatchDeadline) revert Errors.ContributionWindowClosed(); + _; + } + + modifier validateRefund(HatchState memory state, uint256 amount) { + if (state.status != HatchStatus.CANCELED) revert Errors.HatchNotCanceled(); + if (amount == 0) revert Errors.NoContribution(); + _; + } + + modifier validateClaimVesting(HatchState memory state, uint256 amount) { + if (state.status != HatchStatus.HATCHED) revert Errors.HatchingNotStarted(); + if (amount == 0) revert Errors.NoContribution(); + _; + } + + modifier validateHatch(HatchState memory state) { + if (state.status != HatchStatus.OPEN) revert Errors.HatchNotOpen(); + if (block.timestamp < state.params.hatchDeadline) { + // Check if early hatching is possible + if (state.raised < state.params.maximumRaise) revert Errors.NotEnoughRaised(); + } + else { + // Check if normal hatching is possbile + if (state.raised < state.params.minimumRaise) revert Errors.NotEnoughRaised(); + } + _; + } + + modifier validateCancel(HatchState memory state) { + if (state.status != HatchStatus.OPEN) revert Errors.HatchNotOpen(); + if (block.timestamp < state.params.hatchDeadline) revert Errors.HatchOngoing(); + if (state.raised >= state.params.minimumRaise) revert Errors.MinRaiseMet(); + _; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/Vesting.sol b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/Vesting.sol new file mode 100644 index 0000000..f910c5b --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/modifiers/Vesting.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +// https://github.com/DAObox/liquid-protocol/blob/main/src/modifiers/Vesting.sol +pragma solidity >=0.8.17; + +import { Errors } from "../lib/Errors.sol"; +import { VestingState, VestingSchedule } from "../lib/Types.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +abstract contract Modifiers { + /** + * @dev This modifier checks if the vesting schedule is not revoked. + * It reverts if the vesting schedule is revoked. + */ + modifier onlyIfVestingScheduleNotRevoked(VestingState memory state) { + if (state.revoked) revert Errors.VestingScheduleRevoked(); + _; + } + + /** + * @dev This modifier checks if the caller is the owner and if the vesting schedule is revocable and not already + * revoked. + * It reverts if the caller is not the owner, the vesting schedule is not revocable, or the vesting schedule is + * already revoked. + * + * @param state The vesting state + * @param owner The owner's address + */ + modifier validateRevoke(VestingState memory state, address owner) { + if (msg.sender != owner) revert Errors.OnlyOwner(msg.sender, owner); + if (!state.schedule.revocable) revert Errors.VestingScheduleNotRevocable(); + if (state.revoked) revert Errors.VestingScheduleRevoked(); + _; + } + + /** + * @dev This modifier checks if the caller is the beneficiary. + * It reverts if the caller is not the beneficiary. + * + * @param beneficiary The beneficiary's address + */ + modifier onlyBeneficiary(address beneficiary) { + if (msg.sender != beneficiary) revert Errors.OnlyBeneficiary(msg.sender, beneficiary); + _; + } + + /** + * @dev This modifier checks if the vesting schedule is not revoked, and if the requested amount is + * less than or equal to the releasable amount. + * It reverts if the vesting schedule is not initialized or revoked, or if the requested amount is greater than + * the releasable amount. + * + * @param requested The requested amount + * @param releasable The releasable amount + * @param state The vesting state + */ + modifier validateRelease(uint256 requested, uint256 releasable, VestingState memory state) { + if (state.revoked) revert Errors.VestingScheduleRevoked(); + if (requested > releasable) { + revert Errors.NotEnoughVestedTokens({ requested: requested, available: releasable }); + } + _; + } + + /** + * @dev This modifier checks if the beneficiary and token addresses are not the zero address, + * if the duration and slice period of the vesting schedule are not zero, + * if the duration is not less than the cliff, + * if the total amount of the vesting schedule is not greater than the token balance of this contract. + * It reverts if any of these conditions are not met. + * + * @param beneficiary The beneficiary's address + * @param token The token's address + * @param schedule The vesting schedule + */ + modifier validateInitialize(address beneficiary, IERC20 token, VestingSchedule memory schedule, uint256 amountTotal) { + if (schedule.duration == 0) revert Errors.DurationCannotBeZero(); + if (schedule.duration < schedule.cliff) revert Errors.DurationCannotBeLessThanCliff(); + if (amountTotal > token.balanceOf(address(this))) { + revert Errors.InsufficientReserve({ + requested: amountTotal, + available: token.balanceOf(address(this)) + }); + } + _; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ABC/standalone/PluginStandalone.sol b/contracts/facets/token/ERC20/monetary-token/ABC/standalone/PluginStandalone.sol new file mode 100644 index 0000000..212541f --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ABC/standalone/PluginStandalone.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ +pragma solidity ^0.8.0; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +abstract contract PluginStandalone is Ownable { + address private dao_; + mapping(bytes32 => mapping(address => bool)) private permissions_; + + error NotPermitted(bytes32 _permissionId); + + constructor() { + dao_ = msg.sender; + } + + function dao() public view returns (address) { + return dao_; + } + + function setDao(address _dao) external onlyOwner { + dao_ = _dao; + } + + function grantPermission(bytes32 _permissionId, address _to) external onlyOwner { + permissions_[_permissionId][_to] = true; + } + + function revokePermission(bytes32 _permissionId, address _to) external onlyOwner { + permissions_[_permissionId][_to] = false; + } + + modifier auth(bytes32 _permissionId) { + if (!permissions_[_permissionId][msg.sender]) { + revert NotPermitted(_permissionId); + } + _; + } +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/ERC20MonetaryToken.sol b/contracts/facets/token/ERC20/monetary-token/ERC20MonetaryToken.sol new file mode 100644 index 0000000..7cd98df --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/ERC20MonetaryToken.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract ERC20MonetaryToken is ERC20 { + bool private isInited = false; + + constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { + + } + + function init(address _address, uint256 _amount) external virtual { + require(!isInited, "Already inited"); + + _mint(_address, _amount); + isInited = true; + } +} diff --git a/contracts/facets/token/ERC20/monetary-token/IChangeableTokenContract.sol b/contracts/facets/token/ERC20/monetary-token/IChangeableTokenContract.sol new file mode 100644 index 0000000..4de9af8 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/IChangeableTokenContract.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + + +pragma solidity ^0.8.0; + +/// @title IChangeableTokenContract +/// @author Utrecht University - 2023 +/// @notice The interface for getting and setting the monetary token contract address. +interface IChangeableTokenContract { + /// @notice This returns the contract address of the token contract used + /// @return address The contract address of the token contract + function getTokenContractAddress() external view returns (address); + + /// @notice Sets the contract address of the token contract used + /// @param _tokenContractAddress The contract address of the token contract + function setTokenContractAddress(address _tokenContractAddress) external; +} \ No newline at end of file diff --git a/contracts/facets/token/ERC20/monetary-token/MonetaryTokenFacet.sol b/contracts/facets/token/ERC20/monetary-token/MonetaryTokenFacet.sol new file mode 100644 index 0000000..36d3525 --- /dev/null +++ b/contracts/facets/token/ERC20/monetary-token/MonetaryTokenFacet.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {ERC20VotesFacet, ERC20PermitFacet, ERC20Facet} from "../core/ERC20VotesFacet.sol"; +import {IMintableGovernanceStructure, IGovernanceStructure} from "../../../governance/structure/voting-power/IMintableGovernanceStructure.sol"; +import {AuthConsumer} from "../../../../utils/AuthConsumer.sol"; +import {LibMonetaryTokenStorage} from "../../../../libraries/storage/LibMonetaryTokenStorage.sol"; +import {IChangeableTokenContract} from "./IChangeableTokenContract.sol"; +import {IFacet} from "../../../IFacet.sol"; + +contract MonetaryTokenFacet is IChangeableTokenContract, AuthConsumer, IFacet { + // Permission used by the setERC20ContractAddress function + bytes32 public constant SET_MONETARY_TOKEN_CONTRACT_PERMISSION_ID = + keccak256("SET_MONETARY_TOKEN_CONTRACT_PERMISSION"); + // Permission used by the mint function + bytes32 public constant SECOIN_MINT_PERMISSION_ID = + keccak256("SECOIN_MINT_PERMISSION"); + + struct MonetaryTokenFacetInitParams { + address monetaryTokenContractAddress; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + MonetaryTokenFacetInitParams memory _params = abi.decode(_initParams, (MonetaryTokenFacetInitParams)); + __MonetaryTokenFacet_init(_params); + } + + function __MonetaryTokenFacet_init(MonetaryTokenFacetInitParams memory _params) public virtual { + LibMonetaryTokenStorage.getStorage().monetaryTokenContractAddress = _params.monetaryTokenContractAddress; + + registerInterface(type(IChangeableTokenContract).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IChangeableTokenContract).interfaceId); + super.deinit(); + } + + /// @inheritdoc IChangeableTokenContract + function getTokenContractAddress() external view virtual override returns (address) { + return LibMonetaryTokenStorage.getStorage().monetaryTokenContractAddress; + } + + /// @inheritdoc IChangeableTokenContract + function setTokenContractAddress(address _tokenContractAddress) external virtual override auth(SET_MONETARY_TOKEN_CONTRACT_PERMISSION_ID) { + LibMonetaryTokenStorage.getStorage().monetaryTokenContractAddress = _tokenContractAddress; + } +} diff --git a/contracts/libraries/LibDiamond.sol b/contracts/libraries/LibDiamond.sol index de101c4..3fa0e13 100644 --- a/contracts/libraries/LibDiamond.sol +++ b/contracts/libraries/LibDiamond.sol @@ -11,6 +11,7 @@ pragma solidity ^0.8.0; * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import { IDiamondCut } from "../additional-contracts/IDiamondCut.sol"; +import { IFacet } from "../facets/IFacet.sol"; // Remember to add the loupe functions from DiamondLoupeFacet to the diamond. // The loupe functions are required by the EIP2535 Diamonds standard @@ -61,21 +62,13 @@ library LibDiamond { require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner"); } - event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); + event DiamondCut(IDiamondCut.FacetCut[] _diamondCut); bytes32 constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff)); bytes32 constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224)); - // Internal function version of diamondCut - // This code is almost the same as the external diamondCut, - // except it is using 'Facet[] memory _diamondCut' instead of - // 'Facet[] calldata _diamondCut'. - // The code is duplicated to prevent copying calldata to memory which - // causes an error for a two dimensional array. function diamondCut( - IDiamondCut.FacetCut[] memory _diamondCut, - address _init, - bytes memory _calldata + IDiamondCut.FacetCut[] memory _diamondCut ) internal { DiamondStorage storage ds = diamondStorage(); uint256 originalSelectorCount = ds.selectorCount; @@ -93,9 +86,7 @@ library LibDiamond { (selectorCount, selectorSlot) = addReplaceRemoveFacetSelectors( selectorCount, selectorSlot, - _diamondCut[facetIndex].facetAddress, - _diamondCut[facetIndex].action, - _diamondCut[facetIndex].functionSelectors + _diamondCut[facetIndex] ); unchecked { @@ -111,27 +102,42 @@ library LibDiamond { // "selectorSlot >> 3" is a gas efficient division by 8 "selectorSlot / 8" ds.selectorSlots[selectorCount >> 3] = selectorSlot; } - emit DiamondCut(_diamondCut, _init, _calldata); - initializeDiamondCut(_init, _calldata); + emit DiamondCut(_diamondCut); } function addReplaceRemoveFacetSelectors( uint256 _selectorCount, bytes32 _selectorSlot, - address _newFacetAddress, - IDiamondCut.FacetCutAction _action, - bytes4[] memory _selectors + IDiamondCut.FacetCut memory _facetCut ) internal returns (uint256, bytes32) { DiamondStorage storage ds = diamondStorage(); - require(_selectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); - if (_action == IDiamondCut.FacetCutAction.Add) { - enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Add facet has no code"); - for (uint256 selectorIndex; selectorIndex < _selectors.length; ) { - bytes4 selector = _selectors[selectorIndex]; + require(_facetCut.functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); + + if (_facetCut.action == IDiamondCut.FacetCutAction.AddWithInit || _facetCut.action == IDiamondCut.FacetCutAction.RemoveWithDeinit) { + // Call IFacet (de)init function on diamond cut add/remove action + (bool success, bytes memory error) = _facetCut.facetAddress.delegatecall(_facetCut.initCalldata); + if (!success) { + if (error.length > 0) { + // bubble up error + /// @solidity memory-safe-assembly + assembly { + let returndata_size := mload(error) + revert(add(32, error), returndata_size) + } + } else { + revert InitializationFunctionReverted(_facetCut.facetAddress, _facetCut.initCalldata); + } + } + } + + if (_facetCut.action == IDiamondCut.FacetCutAction.Add || _facetCut.action == IDiamondCut.FacetCutAction.AddWithInit) { + enforceHasContractCode(_facetCut.facetAddress, "LibDiamondCut: Add facet has no code"); + for (uint256 selectorIndex; selectorIndex < _facetCut.functionSelectors.length; ) { + bytes4 selector = _facetCut.functionSelectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) == address(0), "LibDiamondCut: Can't add function that already exists"); // add facet for selector - ds.facets[selector] = bytes20(_newFacetAddress) | bytes32(_selectorCount); + ds.facets[selector] = bytes20(_facetCut.facetAddress) | bytes32(_selectorCount); // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" // " << 5 is the same as multiplying by 32 ( * 32) uint256 selectorInSlotPosition = (_selectorCount & 7) << 5; @@ -149,30 +155,31 @@ library LibDiamond { selectorIndex++; } } - } else if (_action == IDiamondCut.FacetCutAction.Replace) { - enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Replace facet has no code"); - for (uint256 selectorIndex; selectorIndex < _selectors.length; ) { - bytes4 selector = _selectors[selectorIndex]; + } else if (_facetCut.action == IDiamondCut.FacetCutAction.Replace) { + enforceHasContractCode(_facetCut.facetAddress, "LibDiamondCut: Replace facet has no code"); + for (uint256 selectorIndex; selectorIndex < _facetCut.functionSelectors.length; ) { + bytes4 selector = _facetCut.functionSelectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; address oldFacetAddress = address(bytes20(oldFacet)); // only useful if immutable functions exist require(oldFacetAddress != address(this), "LibDiamondCut: Can't replace immutable function"); - require(oldFacetAddress != _newFacetAddress, "LibDiamondCut: Can't replace function with same function"); + require(oldFacetAddress != _facetCut.facetAddress, "LibDiamondCut: Can't replace function with same function"); require(oldFacetAddress != address(0), "LibDiamondCut: Can't replace function that doesn't exist"); // replace old facet address - ds.facets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(_newFacetAddress); + ds.facets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(_facetCut.facetAddress); unchecked { selectorIndex++; } } - } else if (_action == IDiamondCut.FacetCutAction.Remove) { - require(_newFacetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); + } else if (_facetCut.action == IDiamondCut.FacetCutAction.Remove || _facetCut.action == IDiamondCut.FacetCutAction.RemoveWithDeinit) { + require(_facetCut.facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); + // "_selectorCount >> 3" is a gas efficient division by 8 "_selectorCount / 8" uint256 selectorSlotCount = _selectorCount >> 3; // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" uint256 selectorInSlotIndex = _selectorCount & 7; - for (uint256 selectorIndex; selectorIndex < _selectors.length; ) { + for (uint256 selectorIndex; selectorIndex < _facetCut.functionSelectors.length; ) { if (_selectorSlot == 0) { // get last selectorSlot selectorSlotCount--; @@ -186,7 +193,7 @@ library LibDiamond { uint256 oldSelectorInSlotPosition; // adding a block here prevents stack too deep error { - bytes4 selector = _selectors[selectorIndex]; + bytes4 selector = _facetCut.functionSelectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // only useful if immutable functions exist @@ -237,26 +244,6 @@ library LibDiamond { return (_selectorCount, _selectorSlot); } - function initializeDiamondCut(address _init, bytes memory _calldata) internal { - if (_init == address(0)) { - return; - } - enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); - (bool success, bytes memory error) = _init.delegatecall(_calldata); - if (!success) { - if (error.length > 0) { - // bubble up error - /// @solidity memory-safe-assembly - assembly { - let returndata_size := mload(error) - revert(add(32, error), returndata_size) - } - } else { - revert InitializationFunctionReverted(_init, _calldata); - } - } - } - function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { uint256 contractSize; assembly { diff --git a/contracts/libraries/abdk-math/ABDKMathQuad.sol b/contracts/libraries/abdk-math/ABDKMathQuad.sol new file mode 100644 index 0000000..dcc3fc8 --- /dev/null +++ b/contracts/libraries/abdk-math/ABDKMathQuad.sol @@ -0,0 +1,1215 @@ +// SPDX-License-Identifier: BSD-4-Clause +/* + * ABDK Math Quad Smart Contract Library. Copyright © 2019 by ABDK Consulting. + * Author: Mikhail Vladimirov + */ +pragma solidity ^0.8.0; + +/** + * Smart contract library of mathematical functions operating with IEEE 754 + * quadruple-precision binary floating-point numbers (quadruple precision + * numbers). As long as quadruple precision numbers are 16-bytes long, they are + * represented by bytes16 type. + */ +library ABDKMathQuad { + /* + * 0. + */ + bytes16 private constant POSITIVE_ZERO = 0x00000000000000000000000000000000; + + /* + * -0. + */ + bytes16 private constant NEGATIVE_ZERO = 0x80000000000000000000000000000000; + + /* + * +Infinity. + */ + bytes16 private constant POSITIVE_INFINITY = 0x7FFF0000000000000000000000000000; + + /* + * -Infinity. + */ + bytes16 private constant NEGATIVE_INFINITY = 0xFFFF0000000000000000000000000000; + + /* + * Canonical NaN value. + */ + bytes16 private constant NaN = 0x7FFF8000000000000000000000000000; + + /** + * Convert signed 256-bit integer number into quadruple precision number. + * + * @param x signed 256-bit integer number + * @return quadruple precision number + */ + function fromInt (int256 x) internal pure returns (bytes16) { + unchecked { + if (x == 0) return bytes16 (0); + else { + // We rely on overflow behavior here + uint256 result = uint256 (x > 0 ? x : -x); + + uint256 msb = mostSignificantBit (result); + if (msb < 112) result <<= 112 - msb; + else if (msb > 112) result >>= msb - 112; + + result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16383 + msb << 112; + if (x < 0) result |= 0x80000000000000000000000000000000; + + return bytes16 (uint128 (result)); + } + } + } + + /** + * Convert quadruple precision number into signed 256-bit integer number + * rounding towards zero. Revert on overflow. + * + * @param x quadruple precision number + * @return signed 256-bit integer number + */ + function toInt (bytes16 x) internal pure returns (int256) { + unchecked { + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + + require (exponent <= 16638); // Overflow + if (exponent < 16383) return 0; // Underflow + + uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | + 0x10000000000000000000000000000; + + if (exponent < 16495) result >>= 16495 - exponent; + else if (exponent > 16495) result <<= exponent - 16495; + + if (uint128 (x) >= 0x80000000000000000000000000000000) { // Negative + require (result <= 0x8000000000000000000000000000000000000000000000000000000000000000); + return -int256 (result); // We rely on overflow behavior here + } else { + require (result <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return int256 (result); + } + } + } + + /** + * Convert unsigned 256-bit integer number into quadruple precision number. + * + * @param x unsigned 256-bit integer number + * @return quadruple precision number + */ + function fromUInt (uint256 x) internal pure returns (bytes16) { + unchecked { + if (x == 0) return bytes16 (0); + else { + uint256 result = x; + + uint256 msb = mostSignificantBit (result); + if (msb < 112) result <<= 112 - msb; + else if (msb > 112) result >>= msb - 112; + + result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16383 + msb << 112; + + return bytes16 (uint128 (result)); + } + } + } + + /** + * Convert quadruple precision number into unsigned 256-bit integer number + * rounding towards zero. Revert on underflow. Note, that negative floating + * point numbers in range (-1.0 .. 0.0) may be converted to unsigned integer + * without error, because they are rounded to zero. + * + * @param x quadruple precision number + * @return unsigned 256-bit integer number + */ + function toUInt (bytes16 x) internal pure returns (uint256) { + unchecked { + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + + if (exponent < 16383) return 0; // Underflow + + require (uint128 (x) < 0x80000000000000000000000000000000); // Negative + + require (exponent <= 16638); // Overflow + uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | + 0x10000000000000000000000000000; + + if (exponent < 16495) result >>= 16495 - exponent; + else if (exponent > 16495) result <<= exponent - 16495; + + return result; + } + } + + /** + * Convert signed 128.128 bit fixed point number into quadruple precision + * number. + * + * @param x signed 128.128 bit fixed point number + * @return quadruple precision number + */ + function from128x128 (int256 x) internal pure returns (bytes16) { + unchecked { + if (x == 0) return bytes16 (0); + else { + // We rely on overflow behavior here + uint256 result = uint256 (x > 0 ? x : -x); + + uint256 msb = mostSignificantBit (result); + if (msb < 112) result <<= 112 - msb; + else if (msb > 112) result >>= msb - 112; + + result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16255 + msb << 112; + if (x < 0) result |= 0x80000000000000000000000000000000; + + return bytes16 (uint128 (result)); + } + } + } + + /** + * Convert quadruple precision number into signed 128.128 bit fixed point + * number. Revert on overflow. + * + * @param x quadruple precision number + * @return signed 128.128 bit fixed point number + */ + function to128x128 (bytes16 x) internal pure returns (int256) { + unchecked { + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + + require (exponent <= 16510); // Overflow + if (exponent < 16255) return 0; // Underflow + + uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | + 0x10000000000000000000000000000; + + if (exponent < 16367) result >>= 16367 - exponent; + else if (exponent > 16367) result <<= exponent - 16367; + + if (uint128 (x) >= 0x80000000000000000000000000000000) { // Negative + require (result <= 0x8000000000000000000000000000000000000000000000000000000000000000); + return -int256 (result); // We rely on overflow behavior here + } else { + require (result <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return int256 (result); + } + } + } + + /** + * Convert signed 64.64 bit fixed point number into quadruple precision + * number. + * + * @param x signed 64.64 bit fixed point number + * @return quadruple precision number + */ + function from64x64 (int128 x) internal pure returns (bytes16) { + unchecked { + if (x == 0) return bytes16 (0); + else { + // We rely on overflow behavior here + uint256 result = uint128 (x > 0 ? x : -x); + + uint256 msb = mostSignificantBit (result); + if (msb < 112) result <<= 112 - msb; + else if (msb > 112) result >>= msb - 112; + + result = result & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | 16319 + msb << 112; + if (x < 0) result |= 0x80000000000000000000000000000000; + + return bytes16 (uint128 (result)); + } + } + } + + /** + * Convert quadruple precision number into signed 64.64 bit fixed point + * number. Revert on overflow. + * + * @param x quadruple precision number + * @return signed 64.64 bit fixed point number + */ + function to64x64 (bytes16 x) internal pure returns (int128) { + unchecked { + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + + require (exponent <= 16446); // Overflow + if (exponent < 16319) return 0; // Underflow + + uint256 result = uint256 (uint128 (x)) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF | + 0x10000000000000000000000000000; + + if (exponent < 16431) result >>= 16431 - exponent; + else if (exponent > 16431) result <<= exponent - 16431; + + if (uint128 (x) >= 0x80000000000000000000000000000000) { // Negative + require (result <= 0x80000000000000000000000000000000); + return -int128 (int256 (result)); // We rely on overflow behavior here + } else { + require (result <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return int128 (int256 (result)); + } + } + } + + /** + * Convert octuple precision number into quadruple precision number. + * + * @param x octuple precision number + * @return quadruple precision number + */ + function fromOctuple (bytes32 x) internal pure returns (bytes16) { + unchecked { + bool negative = x & 0x8000000000000000000000000000000000000000000000000000000000000000 > 0; + + uint256 exponent = uint256 (x) >> 236 & 0x7FFFF; + uint256 significand = uint256 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + if (exponent == 0x7FFFF) { + if (significand > 0) return NaN; + else return negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY; + } + + if (exponent > 278526) + return negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY; + else if (exponent < 245649) + return negative ? NEGATIVE_ZERO : POSITIVE_ZERO; + else if (exponent < 245761) { + significand = (significand | 0x100000000000000000000000000000000000000000000000000000000000) >> 245885 - exponent; + exponent = 0; + } else { + significand >>= 124; + exponent -= 245760; + } + + uint128 result = uint128 (significand | exponent << 112); + if (negative) result |= 0x80000000000000000000000000000000; + + return bytes16 (result); + } + } + + /** + * Convert quadruple precision number into octuple precision number. + * + * @param x quadruple precision number + * @return octuple precision number + */ + function toOctuple (bytes16 x) internal pure returns (bytes32) { + unchecked { + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + + uint256 result = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + if (exponent == 0x7FFF) exponent = 0x7FFFF; // Infinity or NaN + else if (exponent == 0) { + if (result > 0) { + uint256 msb = mostSignificantBit (result); + result = result << 236 - msb & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + exponent = 245649 + msb; + } + } else { + result <<= 124; + exponent += 245760; + } + + result |= exponent << 236; + if (uint128 (x) >= 0x80000000000000000000000000000000) + result |= 0x8000000000000000000000000000000000000000000000000000000000000000; + + return bytes32 (result); + } + } + + /** + * Convert double precision number into quadruple precision number. + * + * @param x double precision number + * @return quadruple precision number + */ + function fromDouble (bytes8 x) internal pure returns (bytes16) { + unchecked { + uint256 exponent = uint64 (x) >> 52 & 0x7FF; + + uint256 result = uint64 (x) & 0xFFFFFFFFFFFFF; + + if (exponent == 0x7FF) exponent = 0x7FFF; // Infinity or NaN + else if (exponent == 0) { + if (result > 0) { + uint256 msb = mostSignificantBit (result); + result = result << 112 - msb & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + exponent = 15309 + msb; + } + } else { + result <<= 60; + exponent += 15360; + } + + result |= exponent << 112; + if (x & 0x8000000000000000 > 0) + result |= 0x80000000000000000000000000000000; + + return bytes16 (uint128 (result)); + } + } + + /** + * Convert quadruple precision number into double precision number. + * + * @param x quadruple precision number + * @return double precision number + */ + function toDouble (bytes16 x) internal pure returns (bytes8) { + unchecked { + bool negative = uint128 (x) >= 0x80000000000000000000000000000000; + + uint256 exponent = uint128 (x) >> 112 & 0x7FFF; + uint256 significand = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + if (exponent == 0x7FFF) { + if (significand > 0) return 0x7FF8000000000000; // NaN + else return negative ? + bytes8 (0xFFF0000000000000) : // -Infinity + bytes8 (0x7FF0000000000000); // Infinity + } + + if (exponent > 17406) + return negative ? + bytes8 (0xFFF0000000000000) : // -Infinity + bytes8 (0x7FF0000000000000); // Infinity + else if (exponent < 15309) + return negative ? + bytes8 (0x8000000000000000) : // -0 + bytes8 (0x0000000000000000); // 0 + else if (exponent < 15361) { + significand = (significand | 0x10000000000000000000000000000) >> 15421 - exponent; + exponent = 0; + } else { + significand >>= 60; + exponent -= 15360; + } + + uint64 result = uint64 (significand | exponent << 52); + if (negative) result |= 0x8000000000000000; + + return bytes8 (result); + } + } + + /** + * Test whether given quadruple precision number is NaN. + * + * @param x quadruple precision number + * @return true if x is NaN, false otherwise + */ + function isNaN (bytes16 x) internal pure returns (bool) { + unchecked { + return uint128 (x) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF > + 0x7FFF0000000000000000000000000000; + } + } + + /** + * Test whether given quadruple precision number is positive or negative + * infinity. + * + * @param x quadruple precision number + * @return true if x is positive or negative infinity, false otherwise + */ + function isInfinity (bytes16 x) internal pure returns (bool) { + unchecked { + return uint128 (x) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == + 0x7FFF0000000000000000000000000000; + } + } + + /** + * Calculate sign of x, i.e. -1 if x is negative, 0 if x if zero, and 1 if x + * is positive. Note that sign (-0) is zero. Revert if x is NaN. + * + * @param x quadruple precision number + * @return sign of x + */ + function sign (bytes16 x) internal pure returns (int8) { + unchecked { + uint128 absoluteX = uint128 (x) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + require (absoluteX <= 0x7FFF0000000000000000000000000000); // Not NaN + + if (absoluteX == 0) return 0; + else if (uint128 (x) >= 0x80000000000000000000000000000000) return -1; + else return 1; + } + } + + /** + * Calculate sign (x - y). Revert if either argument is NaN, or both + * arguments are infinities of the same sign. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return sign (x - y) + */ + function cmp (bytes16 x, bytes16 y) internal pure returns (int8) { + unchecked { + uint128 absoluteX = uint128 (x) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + require (absoluteX <= 0x7FFF0000000000000000000000000000); // Not NaN + + uint128 absoluteY = uint128 (y) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + require (absoluteY <= 0x7FFF0000000000000000000000000000); // Not NaN + + // Not infinities of the same sign + require (x != y || absoluteX < 0x7FFF0000000000000000000000000000); + + if (x == y) return 0; + else { + bool negativeX = uint128 (x) >= 0x80000000000000000000000000000000; + bool negativeY = uint128 (y) >= 0x80000000000000000000000000000000; + + if (negativeX) { + if (negativeY) return absoluteX > absoluteY ? -1 : int8 (1); + else return -1; + } else { + if (negativeY) return 1; + else return absoluteX > absoluteY ? int8 (1) : -1; + } + } + } + } + + /** + * Test whether x equals y. NaN, infinity, and -infinity are not equal to + * anything. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return true if x equals to y, false otherwise + */ + function eq (bytes16 x, bytes16 y) internal pure returns (bool) { + unchecked { + if (x == y) { + return uint128 (x) & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF < + 0x7FFF0000000000000000000000000000; + } else return false; + } + } + + /** + * Calculate x + y. Special values behave in the following way: + * + * NaN + x = NaN for any x. + * Infinity + x = Infinity for any finite x. + * -Infinity + x = -Infinity for any finite x. + * Infinity + Infinity = Infinity. + * -Infinity + -Infinity = -Infinity. + * Infinity + -Infinity = -Infinity + Infinity = NaN. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return quadruple precision number + */ + function add (bytes16 x, bytes16 y) internal pure returns (bytes16) { + unchecked { + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + uint256 yExponent = uint128 (y) >> 112 & 0x7FFF; + + if (xExponent == 0x7FFF) { + if (yExponent == 0x7FFF) { + if (x == y) return x; + else return NaN; + } else return x; + } else if (yExponent == 0x7FFF) return y; + else { + bool xSign = uint128 (x) >= 0x80000000000000000000000000000000; + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xExponent == 0) xExponent = 1; + else xSignifier |= 0x10000000000000000000000000000; + + bool ySign = uint128 (y) >= 0x80000000000000000000000000000000; + uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (yExponent == 0) yExponent = 1; + else ySignifier |= 0x10000000000000000000000000000; + + if (xSignifier == 0) return y == NEGATIVE_ZERO ? POSITIVE_ZERO : y; + else if (ySignifier == 0) return x == NEGATIVE_ZERO ? POSITIVE_ZERO : x; + else { + int256 delta = int256 (xExponent) - int256 (yExponent); + + if (xSign == ySign) { + if (delta > 112) return x; + else if (delta > 0) ySignifier >>= uint256 (delta); + else if (delta < -112) return y; + else if (delta < 0) { + xSignifier >>= uint256 (-delta); + xExponent = yExponent; + } + + xSignifier += ySignifier; + + if (xSignifier >= 0x20000000000000000000000000000) { + xSignifier >>= 1; + xExponent += 1; + } + + if (xExponent == 0x7FFF) + return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY; + else { + if (xSignifier < 0x10000000000000000000000000000) xExponent = 0; + else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + return bytes16 (uint128 ( + (xSign ? 0x80000000000000000000000000000000 : 0) | + (xExponent << 112) | + xSignifier)); + } + } else { + if (delta > 0) { + xSignifier <<= 1; + xExponent -= 1; + } else if (delta < 0) { + ySignifier <<= 1; + xExponent = yExponent - 1; + } + + if (delta > 112) ySignifier = 1; + else if (delta > 1) ySignifier = (ySignifier - 1 >> uint256 (delta - 1)) + 1; + else if (delta < -112) xSignifier = 1; + else if (delta < -1) xSignifier = (xSignifier - 1 >> uint256 (-delta - 1)) + 1; + + if (xSignifier >= ySignifier) xSignifier -= ySignifier; + else { + xSignifier = ySignifier - xSignifier; + xSign = ySign; + } + + if (xSignifier == 0) + return POSITIVE_ZERO; + + uint256 msb = mostSignificantBit (xSignifier); + + if (msb == 113) { + xSignifier = xSignifier >> 1 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + xExponent += 1; + } else if (msb < 112) { + uint256 shift = 112 - msb; + if (xExponent > shift) { + xSignifier = xSignifier << shift & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + xExponent -= shift; + } else { + xSignifier <<= xExponent - 1; + xExponent = 0; + } + } else xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + if (xExponent == 0x7FFF) + return xSign ? NEGATIVE_INFINITY : POSITIVE_INFINITY; + else return bytes16 (uint128 ( + (xSign ? 0x80000000000000000000000000000000 : 0) | + (xExponent << 112) | + xSignifier)); + } + } + } + } + } + + /** + * Calculate x - y. Special values behave in the following way: + * + * NaN - x = NaN for any x. + * Infinity - x = Infinity for any finite x. + * -Infinity - x = -Infinity for any finite x. + * Infinity - -Infinity = Infinity. + * -Infinity - Infinity = -Infinity. + * Infinity - Infinity = -Infinity - -Infinity = NaN. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return quadruple precision number + */ + function sub (bytes16 x, bytes16 y) internal pure returns (bytes16) { + unchecked { + return add (x, y ^ 0x80000000000000000000000000000000); + } + } + + /** + * Calculate x * y. Special values behave in the following way: + * + * NaN * x = NaN for any x. + * Infinity * x = Infinity for any finite positive x. + * Infinity * x = -Infinity for any finite negative x. + * -Infinity * x = -Infinity for any finite positive x. + * -Infinity * x = Infinity for any finite negative x. + * Infinity * 0 = NaN. + * -Infinity * 0 = NaN. + * Infinity * Infinity = Infinity. + * Infinity * -Infinity = -Infinity. + * -Infinity * Infinity = -Infinity. + * -Infinity * -Infinity = Infinity. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return quadruple precision number + */ + function mul (bytes16 x, bytes16 y) internal pure returns (bytes16) { + unchecked { + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + uint256 yExponent = uint128 (y) >> 112 & 0x7FFF; + + if (xExponent == 0x7FFF) { + if (yExponent == 0x7FFF) { + if (x == y) return x ^ y & 0x80000000000000000000000000000000; + else if (x ^ y == 0x80000000000000000000000000000000) return x | y; + else return NaN; + } else { + if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN; + else return x ^ y & 0x80000000000000000000000000000000; + } + } else if (yExponent == 0x7FFF) { + if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN; + else return y ^ x & 0x80000000000000000000000000000000; + } else { + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xExponent == 0) xExponent = 1; + else xSignifier |= 0x10000000000000000000000000000; + + uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (yExponent == 0) yExponent = 1; + else ySignifier |= 0x10000000000000000000000000000; + + xSignifier *= ySignifier; + if (xSignifier == 0) + return (x ^ y) & 0x80000000000000000000000000000000 > 0 ? + NEGATIVE_ZERO : POSITIVE_ZERO; + + xExponent += yExponent; + + uint256 msb = + xSignifier >= 0x200000000000000000000000000000000000000000000000000000000 ? 225 : + xSignifier >= 0x100000000000000000000000000000000000000000000000000000000 ? 224 : + mostSignificantBit (xSignifier); + + if (xExponent + msb < 16496) { // Underflow + xExponent = 0; + xSignifier = 0; + } else if (xExponent + msb < 16608) { // Subnormal + if (xExponent < 16496) + xSignifier >>= 16496 - xExponent; + else if (xExponent > 16496) + xSignifier <<= xExponent - 16496; + xExponent = 0; + } else if (xExponent + msb > 49373) { + xExponent = 0x7FFF; + xSignifier = 0; + } else { + if (msb > 112) + xSignifier >>= msb - 112; + else if (msb < 112) + xSignifier <<= 112 - msb; + + xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + xExponent = xExponent + msb - 16607; + } + + return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) | + xExponent << 112 | xSignifier)); + } + } + } + + /** + * Calculate x / y. Special values behave in the following way: + * + * NaN / x = NaN for any x. + * x / NaN = NaN for any x. + * Infinity / x = Infinity for any finite non-negative x. + * Infinity / x = -Infinity for any finite negative x including -0. + * -Infinity / x = -Infinity for any finite non-negative x. + * -Infinity / x = Infinity for any finite negative x including -0. + * x / Infinity = 0 for any finite non-negative x. + * x / -Infinity = -0 for any finite non-negative x. + * x / Infinity = -0 for any finite non-negative x including -0. + * x / -Infinity = 0 for any finite non-negative x including -0. + * + * Infinity / Infinity = NaN. + * Infinity / -Infinity = -NaN. + * -Infinity / Infinity = -NaN. + * -Infinity / -Infinity = NaN. + * + * Division by zero behaves in the following way: + * + * x / 0 = Infinity for any finite positive x. + * x / -0 = -Infinity for any finite positive x. + * x / 0 = -Infinity for any finite negative x. + * x / -0 = Infinity for any finite negative x. + * 0 / 0 = NaN. + * 0 / -0 = NaN. + * -0 / 0 = NaN. + * -0 / -0 = NaN. + * + * @param x quadruple precision number + * @param y quadruple precision number + * @return quadruple precision number + */ + function div (bytes16 x, bytes16 y) internal pure returns (bytes16) { + unchecked { + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + uint256 yExponent = uint128 (y) >> 112 & 0x7FFF; + + if (xExponent == 0x7FFF) { + if (yExponent == 0x7FFF) return NaN; + else return x ^ y & 0x80000000000000000000000000000000; + } else if (yExponent == 0x7FFF) { + if (y & 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF != 0) return NaN; + else return POSITIVE_ZERO | (x ^ y) & 0x80000000000000000000000000000000; + } else if (y & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) { + if (x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) return NaN; + else return POSITIVE_INFINITY | (x ^ y) & 0x80000000000000000000000000000000; + } else { + uint256 ySignifier = uint128 (y) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (yExponent == 0) yExponent = 1; + else ySignifier |= 0x10000000000000000000000000000; + + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xExponent == 0) { + if (xSignifier != 0) { + uint shift = 226 - mostSignificantBit (xSignifier); + + xSignifier <<= shift; + + xExponent = 1; + yExponent += shift - 114; + } + } + else { + xSignifier = (xSignifier | 0x10000000000000000000000000000) << 114; + } + + xSignifier = xSignifier / ySignifier; + if (xSignifier == 0) + return (x ^ y) & 0x80000000000000000000000000000000 > 0 ? + NEGATIVE_ZERO : POSITIVE_ZERO; + + assert (xSignifier >= 0x1000000000000000000000000000); + + uint256 msb = + xSignifier >= 0x80000000000000000000000000000 ? mostSignificantBit (xSignifier) : + xSignifier >= 0x40000000000000000000000000000 ? 114 : + xSignifier >= 0x20000000000000000000000000000 ? 113 : 112; + + if (xExponent + msb > yExponent + 16497) { // Overflow + xExponent = 0x7FFF; + xSignifier = 0; + } else if (xExponent + msb + 16380 < yExponent) { // Underflow + xExponent = 0; + xSignifier = 0; + } else if (xExponent + msb + 16268 < yExponent) { // Subnormal + if (xExponent + 16380 > yExponent) + xSignifier <<= xExponent + 16380 - yExponent; + else if (xExponent + 16380 < yExponent) + xSignifier >>= yExponent - xExponent - 16380; + + xExponent = 0; + } else { // Normal + if (msb > 112) + xSignifier >>= msb - 112; + + xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + xExponent = xExponent + msb + 16269 - yExponent; + } + + return bytes16 (uint128 (uint128 ((x ^ y) & 0x80000000000000000000000000000000) | + xExponent << 112 | xSignifier)); + } + } + } + + /** + * Calculate -x. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function neg (bytes16 x) internal pure returns (bytes16) { + unchecked { + return x ^ 0x80000000000000000000000000000000; + } + } + + /** + * Calculate |x|. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function abs (bytes16 x) internal pure returns (bytes16) { + unchecked { + return x & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + } + } + + /** + * Calculate square root of x. Return NaN on negative x excluding -0. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function sqrt (bytes16 x) internal pure returns (bytes16) { + unchecked { + if (uint128 (x) > 0x80000000000000000000000000000000) return NaN; + else { + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + if (xExponent == 0x7FFF) return x; + else { + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xExponent == 0) xExponent = 1; + else xSignifier |= 0x10000000000000000000000000000; + + if (xSignifier == 0) return POSITIVE_ZERO; + + bool oddExponent = xExponent & 0x1 == 0; + xExponent = xExponent + 16383 >> 1; + + if (oddExponent) { + if (xSignifier >= 0x10000000000000000000000000000) + xSignifier <<= 113; + else { + uint256 msb = mostSignificantBit (xSignifier); + uint256 shift = (226 - msb) & 0xFE; + xSignifier <<= shift; + xExponent -= shift - 112 >> 1; + } + } else { + if (xSignifier >= 0x10000000000000000000000000000) + xSignifier <<= 112; + else { + uint256 msb = mostSignificantBit (xSignifier); + uint256 shift = (225 - msb) & 0xFE; + xSignifier <<= shift; + xExponent -= shift - 112 >> 1; + } + } + + uint256 r = 0x10000000000000000000000000000; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; + r = (r + xSignifier / r) >> 1; // Seven iterations should be enough + uint256 r1 = xSignifier / r; + if (r1 < r) r = r1; + + return bytes16 (uint128 (xExponent << 112 | r & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF)); + } + } + } + } + + /** + * Calculate binary logarithm of x. Return NaN on negative x excluding -0. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function log_2 (bytes16 x) internal pure returns (bytes16) { + unchecked { + if (uint128 (x) > 0x80000000000000000000000000000000) return NaN; + else if (x == 0x3FFF0000000000000000000000000000) return POSITIVE_ZERO; + else { + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + if (xExponent == 0x7FFF) return x; + else { + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xExponent == 0) xExponent = 1; + else xSignifier |= 0x10000000000000000000000000000; + + if (xSignifier == 0) return NEGATIVE_INFINITY; + + bool resultNegative; + uint256 resultExponent = 16495; + uint256 resultSignifier; + + if (xExponent >= 0x3FFF) { + resultNegative = false; + resultSignifier = xExponent - 0x3FFF; + xSignifier <<= 15; + } else { + resultNegative = true; + if (xSignifier >= 0x10000000000000000000000000000) { + resultSignifier = 0x3FFE - xExponent; + xSignifier <<= 15; + } else { + uint256 msb = mostSignificantBit (xSignifier); + resultSignifier = 16493 - msb; + xSignifier <<= 127 - msb; + } + } + + if (xSignifier == 0x80000000000000000000000000000000) { + if (resultNegative) resultSignifier += 1; + uint256 shift = 112 - mostSignificantBit (resultSignifier); + resultSignifier <<= shift; + resultExponent -= shift; + } else { + uint256 bb = resultNegative ? 1 : 0; + while (resultSignifier < 0x10000000000000000000000000000) { + resultSignifier <<= 1; + resultExponent -= 1; + + xSignifier *= xSignifier; + uint256 b = xSignifier >> 255; + resultSignifier += b ^ bb; + xSignifier >>= 127 + b; + } + } + + return bytes16 (uint128 ((resultNegative ? 0x80000000000000000000000000000000 : 0) | + resultExponent << 112 | resultSignifier & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF)); + } + } + } + } + + /** + * Calculate natural logarithm of x. Return NaN on negative x excluding -0. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function ln (bytes16 x) internal pure returns (bytes16) { + unchecked { + return mul (log_2 (x), 0x3FFE62E42FEFA39EF35793C7673007E5); + } + } + + /** + * Calculate 2^x. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function pow_2 (bytes16 x) internal pure returns (bytes16) { + unchecked { + bool xNegative = uint128 (x) > 0x80000000000000000000000000000000; + uint256 xExponent = uint128 (x) >> 112 & 0x7FFF; + uint256 xSignifier = uint128 (x) & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + if (xExponent == 0x7FFF && xSignifier != 0) return NaN; + else if (xExponent > 16397) + return xNegative ? POSITIVE_ZERO : POSITIVE_INFINITY; + else if (xExponent < 16255) + return 0x3FFF0000000000000000000000000000; + else { + if (xExponent == 0) xExponent = 1; + else xSignifier |= 0x10000000000000000000000000000; + + if (xExponent > 16367) + xSignifier <<= xExponent - 16367; + else if (xExponent < 16367) + xSignifier >>= 16367 - xExponent; + + if (xNegative && xSignifier > 0x406E00000000000000000000000000000000) + return POSITIVE_ZERO; + + if (!xNegative && xSignifier > 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + return POSITIVE_INFINITY; + + uint256 resultExponent = xSignifier >> 128; + xSignifier &= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + if (xNegative && xSignifier != 0) { + xSignifier = ~xSignifier; + resultExponent += 1; + } + + uint256 resultSignifier = 0x80000000000000000000000000000000; + if (xSignifier & 0x80000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128; + if (xSignifier & 0x40000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128; + if (xSignifier & 0x20000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128; + if (xSignifier & 0x10000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10B5586CF9890F6298B92B71842A98363 >> 128; + if (xSignifier & 0x8000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1059B0D31585743AE7C548EB68CA417FD >> 128; + if (xSignifier & 0x4000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128; + if (xSignifier & 0x2000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128; + if (xSignifier & 0x1000000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128; + if (xSignifier & 0x800000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128; + if (xSignifier & 0x400000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128; + if (xSignifier & 0x200000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100162F3904051FA128BCA9C55C31E5DF >> 128; + if (xSignifier & 0x100000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000B175EFFDC76BA38E31671CA939725 >> 128; + if (xSignifier & 0x80000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128; + if (xSignifier & 0x40000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128; + if (xSignifier & 0x20000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000162E525EE054754457D5995292026 >> 128; + if (xSignifier & 0x10000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000B17255775C040618BF4A4ADE83FC >> 128; + if (xSignifier & 0x8000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128; + if (xSignifier & 0x4000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128; + if (xSignifier & 0x2000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000162E43F4F831060E02D839A9D16D >> 128; + if (xSignifier & 0x1000000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000B1721BCFC99D9F890EA06911763 >> 128; + if (xSignifier & 0x800000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128; + if (xSignifier & 0x400000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128; + if (xSignifier & 0x200000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000162E430E5A18F6119E3C02282A5 >> 128; + if (xSignifier & 0x100000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000B1721835514B86E6D96EFD1BFE >> 128; + if (xSignifier & 0x80000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128; + if (xSignifier & 0x40000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000002C5C8601CC6B9E94213C72737A >> 128; + if (xSignifier & 0x20000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000162E42FFF037DF38AA2B219F06 >> 128; + if (xSignifier & 0x10000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000B17217FBA9C739AA5819F44F9 >> 128; + if (xSignifier & 0x8000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128; + if (xSignifier & 0x4000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128; + if (xSignifier & 0x2000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000162E42FF0999CE3541B9FFFCF >> 128; + if (xSignifier & 0x1000000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000B17217F80F4EF5AADDA45554 >> 128; + if (xSignifier & 0x800000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000058B90BFBF8479BD5A81B51AD >> 128; + if (xSignifier & 0x400000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128; + if (xSignifier & 0x200000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000162E42FEFB2FED257559BDAA >> 128; + if (xSignifier & 0x100000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128; + if (xSignifier & 0x80000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128; + if (xSignifier & 0x40000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128; + if (xSignifier & 0x20000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000162E42FEFA494F1478FDE05 >> 128; + if (xSignifier & 0x10000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000B17217F7D20CF927C8E94C >> 128; + if (xSignifier & 0x8000000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128; + if (xSignifier & 0x4000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000002C5C85FDF477B662B26945 >> 128; + if (xSignifier & 0x2000000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000162E42FEFA3AE53369388C >> 128; + if (xSignifier & 0x1000000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000B17217F7D1D351A389D40 >> 128; + if (xSignifier & 0x800000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128; + if (xSignifier & 0x400000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000002C5C85FDF4741BEA6E77E >> 128; + if (xSignifier & 0x200000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000162E42FEFA39FE95583C2 >> 128; + if (xSignifier & 0x100000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000B17217F7D1CFB72B45E1 >> 128; + if (xSignifier & 0x80000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128; + if (xSignifier & 0x40000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000002C5C85FDF473E242EA38 >> 128; + if (xSignifier & 0x20000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000162E42FEFA39F02B772C >> 128; + if (xSignifier & 0x10000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000B17217F7D1CF7D83C1A >> 128; + if (xSignifier & 0x8000000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128; + if (xSignifier & 0x4000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000002C5C85FDF473DEA871F >> 128; + if (xSignifier & 0x2000000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000162E42FEFA39EF44D91 >> 128; + if (xSignifier & 0x1000000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000B17217F7D1CF79E949 >> 128; + if (xSignifier & 0x800000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000058B90BFBE8E7BCE544 >> 128; + if (xSignifier & 0x400000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000002C5C85FDF473DE6ECA >> 128; + if (xSignifier & 0x200000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000162E42FEFA39EF366F >> 128; + if (xSignifier & 0x100000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000B17217F7D1CF79AFA >> 128; + if (xSignifier & 0x80000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000058B90BFBE8E7BCD6D >> 128; + if (xSignifier & 0x40000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000002C5C85FDF473DE6B2 >> 128; + if (xSignifier & 0x20000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000162E42FEFA39EF358 >> 128; + if (xSignifier & 0x10000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000B17217F7D1CF79AB >> 128; + if (xSignifier & 0x8000000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000058B90BFBE8E7BCD5 >> 128; + if (xSignifier & 0x4000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000002C5C85FDF473DE6A >> 128; + if (xSignifier & 0x2000000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000162E42FEFA39EF34 >> 128; + if (xSignifier & 0x1000000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000B17217F7D1CF799 >> 128; + if (xSignifier & 0x800000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000058B90BFBE8E7BCC >> 128; + if (xSignifier & 0x400000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000002C5C85FDF473DE5 >> 128; + if (xSignifier & 0x200000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000162E42FEFA39EF2 >> 128; + if (xSignifier & 0x100000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000B17217F7D1CF78 >> 128; + if (xSignifier & 0x80000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000058B90BFBE8E7BB >> 128; + if (xSignifier & 0x40000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000002C5C85FDF473DD >> 128; + if (xSignifier & 0x20000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000162E42FEFA39EE >> 128; + if (xSignifier & 0x10000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000B17217F7D1CF6 >> 128; + if (xSignifier & 0x8000000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000058B90BFBE8E7A >> 128; + if (xSignifier & 0x4000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000002C5C85FDF473C >> 128; + if (xSignifier & 0x2000000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000162E42FEFA39D >> 128; + if (xSignifier & 0x1000000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000B17217F7D1CE >> 128; + if (xSignifier & 0x800000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000058B90BFBE8E6 >> 128; + if (xSignifier & 0x400000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000002C5C85FDF472 >> 128; + if (xSignifier & 0x200000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000162E42FEFA38 >> 128; + if (xSignifier & 0x100000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000B17217F7D1B >> 128; + if (xSignifier & 0x80000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000058B90BFBE8D >> 128; + if (xSignifier & 0x40000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000002C5C85FDF46 >> 128; + if (xSignifier & 0x20000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000162E42FEFA2 >> 128; + if (xSignifier & 0x10000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000B17217F7D0 >> 128; + if (xSignifier & 0x8000000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000058B90BFBE7 >> 128; + if (xSignifier & 0x4000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000002C5C85FDF3 >> 128; + if (xSignifier & 0x2000000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000162E42FEF9 >> 128; + if (xSignifier & 0x1000000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000B17217F7C >> 128; + if (xSignifier & 0x800000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000058B90BFBD >> 128; + if (xSignifier & 0x400000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000002C5C85FDE >> 128; + if (xSignifier & 0x200000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000162E42FEE >> 128; + if (xSignifier & 0x100000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000B17217F6 >> 128; + if (xSignifier & 0x80000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000058B90BFA >> 128; + if (xSignifier & 0x40000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000002C5C85FC >> 128; + if (xSignifier & 0x20000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000162E42FD >> 128; + if (xSignifier & 0x10000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000B17217E >> 128; + if (xSignifier & 0x8000000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000058B90BE >> 128; + if (xSignifier & 0x4000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000002C5C85E >> 128; + if (xSignifier & 0x2000000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000162E42E >> 128; + if (xSignifier & 0x1000000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000B17216 >> 128; + if (xSignifier & 0x800000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000058B90A >> 128; + if (xSignifier & 0x400000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000002C5C84 >> 128; + if (xSignifier & 0x200000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000162E41 >> 128; + if (xSignifier & 0x100000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000B1720 >> 128; + if (xSignifier & 0x80000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000058B8F >> 128; + if (xSignifier & 0x40000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000002C5C7 >> 128; + if (xSignifier & 0x20000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000162E3 >> 128; + if (xSignifier & 0x10000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000B171 >> 128; + if (xSignifier & 0x8000 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000058B8 >> 128; + if (xSignifier & 0x4000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000002C5B >> 128; + if (xSignifier & 0x2000 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000162D >> 128; + if (xSignifier & 0x1000 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000B16 >> 128; + if (xSignifier & 0x800 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000058A >> 128; + if (xSignifier & 0x400 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000002C4 >> 128; + if (xSignifier & 0x200 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000161 >> 128; + if (xSignifier & 0x100 > 0) resultSignifier = resultSignifier * 0x1000000000000000000000000000000B0 >> 128; + if (xSignifier & 0x80 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000057 >> 128; + if (xSignifier & 0x40 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000002B >> 128; + if (xSignifier & 0x20 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000015 >> 128; + if (xSignifier & 0x10 > 0) resultSignifier = resultSignifier * 0x10000000000000000000000000000000A >> 128; + if (xSignifier & 0x8 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000004 >> 128; + if (xSignifier & 0x4 > 0) resultSignifier = resultSignifier * 0x100000000000000000000000000000001 >> 128; + + if (!xNegative) { + resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + resultExponent += 0x3FFF; + } else if (resultExponent <= 0x3FFE) { + resultSignifier = resultSignifier >> 15 & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + resultExponent = 0x3FFF - resultExponent; + } else { + resultSignifier = resultSignifier >> resultExponent - 16367; + resultExponent = 0; + } + + return bytes16 (uint128 (resultExponent << 112 | resultSignifier)); + } + } + } + + /** + * Calculate e^x. + * + * @param x quadruple precision number + * @return quadruple precision number + */ + function exp (bytes16 x) internal pure returns (bytes16) { + unchecked { + return pow_2 (mul (x, 0x3FFF71547652B82FE1777D0FFDA0D23A)); + } + } + + /** + * Get index of the most significant non-zero bit in binary representation of + * x. Reverts if x is zero. + * + * @return index of the most significant non-zero bit in binary representation + * of x + */ + function mostSignificantBit (uint256 x) private pure returns (uint256) { + unchecked { + require (x > 0); + + uint256 result = 0; + + if (x >= 0x100000000000000000000000000000000) { x >>= 128; result += 128; } + if (x >= 0x10000000000000000) { x >>= 64; result += 64; } + if (x >= 0x100000000) { x >>= 32; result += 32; } + if (x >= 0x10000) { x >>= 16; result += 16; } + if (x >= 0x100) { x >>= 8; result += 8; } + if (x >= 0x10) { x >>= 4; result += 4; } + if (x >= 0x4) { x >>= 2; result += 2; } + if (x >= 0x2) result += 1; // No need to shift x anymore + + return result; + } + } +} diff --git a/contracts/libraries/abdk-math/LibABDKHelper.sol b/contracts/libraries/abdk-math/LibABDKHelper.sol new file mode 100644 index 0000000..b390964 --- /dev/null +++ b/contracts/libraries/abdk-math/LibABDKHelper.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import {ABDKMathQuad} from "./ABDKMathQuad.sol"; + +library LibABDKHelper { + // This is a precalculated value of 1e18 in quad float fixed point + bytes16 constant DECIMALS_18_QUAD = 0x403abc16d674ec800000000000000000; + + function from18DecimalsQuad( + uint _input + ) internal pure returns (bytes16 output) { + output = ABDKMathQuad.div( + ABDKMathQuad.fromUInt(_input), + DECIMALS_18_QUAD + ); + } + + function to18DecimalsQuad( + bytes16 input + ) internal pure returns (uint amount) { + amount = ABDKMathQuad.toUInt(ABDKMathQuad.mul(input, DECIMALS_18_QUAD)); + } +} diff --git a/contracts/libraries/storage/LibABCConfigureStorage.sol b/contracts/libraries/storage/LibABCConfigureStorage.sol new file mode 100644 index 0000000..cd3beff --- /dev/null +++ b/contracts/libraries/storage/LibABCConfigureStorage.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { Counters } from "@openzeppelin/contracts/utils/Counters.sol"; + +library LibABCConfigureStorage { + using Counters for Counters.Counter; + + bytes32 constant ABC_CONFIGURE_STORAGE_POSITION = + keccak256("configure.abc.diamond.storage.position"); + + struct Storage { + address marketMaker; + address hatcher; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = ABC_CONFIGURE_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/contracts/libraries/storage/LibPartialBurnVotingProposalStorage.sol b/contracts/libraries/storage/LibBurnVotingProposalStorage.sol similarity index 67% rename from contracts/libraries/storage/LibPartialBurnVotingProposalStorage.sol rename to contracts/libraries/storage/LibBurnVotingProposalStorage.sol index 507f1da..19dac7e 100644 --- a/contracts/libraries/storage/LibPartialBurnVotingProposalStorage.sol +++ b/contracts/libraries/storage/LibBurnVotingProposalStorage.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -library LibPartialBurnVotingProposalStorage { - bytes32 constant PARTIAL_BURN_VOTING_PROPOSAL_STORAGE_POSITION = - keccak256("proposal.burn.partialvoting.diamond.storage.position"); +library LibBurnVotingProposalStorage { + bytes32 constant BURN_VOTING_PROPOSAL_STORAGE_POSITION = + keccak256("proposal.burn.voting.diamond.storage.position"); struct Storage { /// @notice Voting power that will be burned upon proposal creation. @@ -11,15 +11,13 @@ library LibPartialBurnVotingProposalStorage { /// @notice A mapping between proposal IDs and how much voting power a wallet has burned on this proposal. /// @dev Used for refunds when the proposal doesnt hit the participation threshold. mapping(uint256 => mapping(address => uint256)) proposalBurnData; - /// @notice A mapping between proposal IDs and who created it. - mapping(uint256 => address) proposalCreator; /// @notice A mapping between proposal IDs and how much was paid to create it. /// @dev Used for refunding the proposal creator when the proposal passed. mapping(uint256 => uint256) proposalCost; } function getStorage() internal pure returns (Storage storage ds) { - bytes32 position = PARTIAL_BURN_VOTING_PROPOSAL_STORAGE_POSITION; + bytes32 position = BURN_VOTING_PROPOSAL_STORAGE_POSITION; assembly { ds.slot := position } diff --git a/contracts/libraries/storage/LibEIP712Storage.sol b/contracts/libraries/storage/LibEIP712Storage.sol new file mode 100644 index 0000000..692ac87 --- /dev/null +++ b/contracts/libraries/storage/LibEIP712Storage.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +library LibEIP712Storage { + bytes32 constant EIP712_STORAGE_POSITION = + keccak256("eip712.diamond.storage.position"); + + struct Storage { + /* solhint-disable var-name-mixedcase */ + // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to + // invalidate the cached domain separator if the chain id changes. + bytes32 _CACHED_DOMAIN_SEPARATOR; + uint256 _CACHED_CHAIN_ID; + address _CACHED_THIS; + + bytes32 _HASHED_NAME; + bytes32 _HASHED_VERSION; + bytes32 _TYPE_HASH; + + /* solhint-enable var-name-mixedcase */ + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = EIP712_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/contracts/libraries/storage/LibMiningRewardStorage.sol b/contracts/libraries/storage/LibMiningRewardStorage.sol new file mode 100644 index 0000000..f5d47c2 --- /dev/null +++ b/contracts/libraries/storage/LibMiningRewardStorage.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +library LibMiningRewardStorage { + bytes32 constant MINING_REWARD_PIGGY_BANK_STORAGE_POSITION = + keccak256("mining.reward.piggy.bank.storage.position"); + + struct Storage { + /// @notice Represents the piggy bank for rewarding the miners. + uint256 miningRewardPool; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = MINING_REWARD_PIGGY_BANK_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts/libraries/storage/LibMonetaryTokenStorage.sol b/contracts/libraries/storage/LibMonetaryTokenStorage.sol new file mode 100644 index 0000000..efe2bb8 --- /dev/null +++ b/contracts/libraries/storage/LibMonetaryTokenStorage.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +library LibMonetaryTokenStorage { + bytes32 constant ERC20_SEARCHSECO_STORAGE_POSITION = + keccak256("searchseco.erc20.diamond.storage.position"); + + struct Storage { + address monetaryTokenContractAddress; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = ERC20_SEARCHSECO_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/contracts/libraries/storage/LibRewardMultiplierStorage.sol b/contracts/libraries/storage/LibRewardMultiplierStorage.sol new file mode 100644 index 0000000..b234121 --- /dev/null +++ b/contracts/libraries/storage/LibRewardMultiplierStorage.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IRewardMultiplierFacet } from "../../facets/multiplier/IRewardMultiplierFacet.sol"; + +library LibRewardMultiplierStorage { + bytes32 constant REWARD_MULTIPLIER_STORAGE_POSITION = + keccak256("reward.multiplier.diamond.storage.position"); + + struct Storage { + // Should be called by inheritors too, thats why public + mapping (string => IRewardMultiplierFacet.MultiplierInfo) rewardMultiplier; + + mapping (string => IRewardMultiplierFacet.LinearParams) linearParams; + mapping (string => IRewardMultiplierFacet.ExponentialParams) exponentialParams; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = REWARD_MULTIPLIER_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/contracts/libraries/storage/LibSearchSECOMonetizationStorage.sol b/contracts/libraries/storage/LibSearchSECOMonetizationStorage.sol index cecb6fb..f5d592f 100644 --- a/contracts/libraries/storage/LibSearchSECOMonetizationStorage.sol +++ b/contracts/libraries/storage/LibSearchSECOMonetizationStorage.sol @@ -13,6 +13,9 @@ library LibSearchSECOMonetizationStorage { struct Storage { /// @notice how much a single hash costs uint256 hashCost; + + /// @notice Defines the ratio between what goes to the treasury and what goes to rewarding the miners. + uint32 treasuryRatio; // ppm } function getStorage() internal pure returns (Storage storage ds) { diff --git a/contracts/libraries/storage/LibSearchSECORewardingStorage.sol b/contracts/libraries/storage/LibSearchSECORewardingStorage.sol index 0f3ad96..396f074 100644 --- a/contracts/libraries/storage/LibSearchSECORewardingStorage.sol +++ b/contracts/libraries/storage/LibSearchSECORewardingStorage.sol @@ -13,6 +13,15 @@ library LibSearchSECORewardingStorage { struct Storage { /// @notice The total number of hashes a user has submitted mapping(address => uint) hashCount; + address signer; + /// @notice The reward that is given to a user for submitting a new hash + uint hashReward; + + /// @notice Defines the percentage of the pool that is paid out to the miner. + bytes16 miningRewardPoolPayoutRatio; // quad float + + /// @notice Defines the constant factor by which the hash reward is devaluated (divided). + bytes16 hashDevaluationFactor; // quad float } function getStorage() internal pure returns (Storage storage ds) { diff --git a/contracts/verification/GithubVerification.sol b/contracts/other/verification/SignVerification.sol similarity index 76% rename from contracts/verification/GithubVerification.sol rename to contracts/other/verification/SignVerification.sol index 4fba2b9..1c32045 100644 --- a/contracts/verification/GithubVerification.sol +++ b/contracts/other/verification/SignVerification.sol @@ -1,21 +1,24 @@ // SPDX-License-Identifier: MIT /** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ pragma solidity ^0.8.0; -import "./SignatureHelper.sol"; +import {GenericSignatureHelper} from "../../utils/GenericSignatureHelper.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; /// @title A contract to verify addresses -/// @author JSC LEE +/// @author Utrecht University /// @notice You can use this contract to verify addresses -contract GithubVerification is SignatureHelper { +contract SignVerification is GenericSignatureHelper, Ownable { // Map from user to their stamps mapping(address => Stamp[]) internal stamps; // Map from userhash to address to make sure the userhash isn't already used by another address mapping(string => address) internal stampHashMap; + // Map to show if an address has ever been verified + mapping(address => bool) internal isMember; address[] allMembers; /// @notice The thresholdHistory array stores the history of the verifyDayThreshold variable. This is needed because we might want to check if some stamps were valid in the past. @@ -24,9 +27,6 @@ contract GithubVerification is SignatureHelper { /// @notice The reverifyThreshold determines how long a user has to wait before they can re-verify their address, in days uint64 public reverifyThreshold; - /// @notice Owner of the contract, can call specific functions to manage variables like the reverifyThreshold - address private immutable _owner; - /// @notice A stamp defines proof of verification for a user on a specific platform at a specific date struct Stamp { string providerId; // Unique id for the provider (github, proofofhumanity, etc.) @@ -40,14 +40,13 @@ contract GithubVerification is SignatureHelper { uint64 threshold; // Number of days for which a stamp is valid } - /// @notice This constructor sets the owner of the contract + /// @notice Initializes the owner of the contract constructor(uint64 _threshold, uint64 _reverifyThreshold) { thresholdHistory.push(Threshold(uint64(block.timestamp), _threshold)); reverifyThreshold = _reverifyThreshold; - _owner = msg.sender; } - /// @notice This function can only be called by the owner, and it verifies an address. It's not possible to re-verofuy an address before half the verifyDayThreshold has passed. + /// @notice This function can only be called by the owner, and it verifies an address. It's not possible to re-verify an address before half the verifyDayThreshold has passed. /// @dev Verifies an address /// @param _toVerify The address to verify /// @param _timestamp in seconds @@ -71,15 +70,15 @@ contract GithubVerification is SignatureHelper { ); require( - verify(_owner, _toVerify, _userHash, _timestamp, _proofSignature), + verify(owner(), keccak256(abi.encodePacked(_toVerify, _userHash, uint(_timestamp))), _proofSignature), "Proof is not valid" ); // Check if there is existing stamp with providerId - bool found = false; - uint foundIndex = 0; + bool found; // = false; + uint foundIndex; // = 0; - for (uint i = 0; i < stamps[_toVerify].length; i++) { + for (uint i; i < stamps[_toVerify].length; ) { if ( keccak256(abi.encodePacked(stamps[_toVerify][i].providerId)) == keccak256(abi.encodePacked(_providerId)) @@ -88,11 +87,16 @@ contract GithubVerification is SignatureHelper { foundIndex = i; break; } + + unchecked { + i++; + } } if (!found) { // Check if this is the first time this user has verified so we can add them to the allMembers list - if (stamps[_toVerify].length == 0) { + if (!isMember[_toVerify]) { + isMember[_toVerify] = true; allMembers.push(_toVerify); } @@ -124,12 +128,14 @@ contract GithubVerification is SignatureHelper { } } + /// @notice Unverifies a provider from the sender + /// @param _providerId Unique id for the provider (github, proofofhumanity, etc.) to be removed function unverify(string calldata _providerId) external { // Assume all is good in the world Stamp[] storage stampsAt = stamps[msg.sender]; // Look up the corresponding stamp for the provider - for (uint8 i = 0; i < stampsAt.length; i++) { + for (uint i; i < stampsAt.length; ) { if (stringsAreEqual(stampsAt[i].providerId, _providerId)) { // Remove the mapping from userhash to address stampHashMap[stampsAt[i].userHash] = address(0); @@ -139,13 +145,25 @@ contract GithubVerification is SignatureHelper { stampsAt.pop(); return; } + + unchecked { + i++; + } } - revert("Could not find this provider amongst your stamps; are you sure you're verified with this provider?"); + revert( + "Could not find this provider among your stamps; are you sure you're verified with this provider?" + ); } - function stringsAreEqual(string memory str1, string memory str2) public pure returns (bool) { - return keccak256(abi.encodePacked(str1)) == keccak256(abi.encodePacked(str2)); + /// @dev Solidity doesn't support string comparison, so we use keccak256 to compare strings + function stringsAreEqual( + string memory str1, + string memory str2 + ) internal pure returns (bool) { + return + keccak256(abi.encodePacked(str1)) == + keccak256(abi.encodePacked(str2)); } /// @notice Creates a stamp for a user @@ -174,7 +192,7 @@ contract GithubVerification is SignatureHelper { return stamps[_toCheck]; } - /// @notice This function returns the *valid* stamps of an address at a specific timestamp + /// @notice Returns the *valid* stamps of an address at a specific timestamp /// @param _toCheck The address to check /// @param _timestamp The timestamp to check (seconds) function getStampsAt( @@ -182,14 +200,14 @@ contract GithubVerification is SignatureHelper { uint _timestamp ) external view returns (Stamp[] memory) { Stamp[] memory stampsAt = new Stamp[](stamps[_toCheck].length); - uint count = 0; + uint count; // = 0; // Loop through all the user's stamps - for (uint i = 0; i < stamps[_toCheck].length; i++) { + for (uint i; i < stamps[_toCheck].length; ) { // Get the list of all verification timestamps uint64[] storage verifiedAt = stamps[_toCheck][i].verifiedAt; - // // Get the threshold at _timestamp + // Get the threshold at _timestamp uint currentTimestampIndex = thresholdHistory.length - 1; while ( currentTimestampIndex > 0 && @@ -219,6 +237,10 @@ contract GithubVerification is SignatureHelper { break; } } + + unchecked { + i++; + } } Stamp[] memory stampsAtTrimmed = new Stamp[](count); @@ -245,7 +267,7 @@ contract GithubVerification is SignatureHelper { thresholdHistory.push(Threshold(uint64(block.timestamp), _days)); } - /// @notice This function returns the full threshold history + /// @notice Returns the full threshold history /// @return An array of Threshold structs function getThresholdHistory() external view returns (Threshold[] memory) { return thresholdHistory; @@ -255,16 +277,17 @@ contract GithubVerification is SignatureHelper { return allMembers; } + /// @notice Returns whether or not the caller is or was a member at any time + /// @dev Loop through the array of all members and return true if the caller is found + /// @return bool Whether or not the caller is or was a member at any time + function isOrWasMember(address _toCheck) external view returns (bool) { + return isMember[_toCheck]; + } + /// @notice This function can only be called by the owner to set the reverifyThreshold /// @dev Sets the reverifyThreshold /// @param _days The number of days to set the reverifyThreshold to function setReverifyThreshold(uint64 _days) external onlyOwner { reverifyThreshold = _days; } - - /// @notice This modifier makes it so that only the owner can call a function - modifier onlyOwner() { - require(msg.sender == _owner, "Ownable: caller is not the owner"); - _; - } -} +} \ No newline at end of file diff --git a/contracts/upgrade-initializers/DiamondInit.sol b/contracts/upgrade-initializers/DiamondInit.sol deleted file mode 100644 index a637204..0000000 --- a/contracts/upgrade-initializers/DiamondInit.sol +++ /dev/null @@ -1,127 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { - IERC165, - IERC20, - IERC20Metadata, - IERC20Permit, - - IERC173, - IERC6372, - IVotes, - IDiamondLoupe, - - IPlugin, - IAuthProvider, - IProposal, - - IGovernanceStructure, - IMintableGovernanceStructure, - IBurnableGovernanceStructure, - - IMembership, - IMembershipExtended, - ITieredMembershipStructure, - IMembershipWhitelisting, - - IVerificationFacet, - - IPartialVotingProposalFacet, - IPartialVotingFacet, - - IGithubPullRequestFacet, - - IERC20OneTimeVerificationRewardFacet, - IERC20TieredTimeClaimableFacet -} from "../utils/InterfaceIds.sol"; - - -import {PartialBurnVotingProposalFacetInit} from "../facets/governance/proposal/PartialBurnVotingProposalFacet.sol"; -import {VerificationFacetInit} from "../facets/membership/VerificationFacet.sol"; -import {ERC20TieredTimeClaimableFacetInit} from "../facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol"; -import {ERC20OneTimeVerificationRewardFacetInit} from "../facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol"; -import {SearchSECOMonetizationFacetInit} from "../facets/searchseco-monetization/SearchSECOMonetizationFacet.sol"; -import {SearchSECORewardingFacetInit} from "../facets/searchseco-rewarding/SearchSECORewardingFacet.sol"; -import { LibDiamond } from "../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DiamondInit { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - PartialBurnVotingProposalFacetInit.InitParams memory _votingSettings, - VerificationFacetInit.InitParams memory _verificationSettings, - ERC20TieredTimeClaimableFacetInit.InitParams memory _timeClaimSettings, - ERC20OneTimeVerificationRewardFacetInit.InitParams - memory _onetimeClaimSettings, - SearchSECOMonetizationFacetInit.InitParams - memory _searchSECOMonetizationSettings, - SearchSECORewardingFacetInit.InitParams - memory _searchSECORewardingSettings - ) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(IERC165).interfaceId] = true; - ds.supportedInterfaces[type(IERC20).interfaceId] = true; - ds.supportedInterfaces[type(IERC20Metadata).interfaceId] = true; - ds.supportedInterfaces[type(IERC20Permit).interfaceId] = true; - - ds.supportedInterfaces[type(IERC173).interfaceId] = true; - ds.supportedInterfaces[type(IERC6372).interfaceId] = true; - ds.supportedInterfaces[type(IVotes).interfaceId] = true; - ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; - - ds.supportedInterfaces[type(IPlugin).interfaceId] = true; - ds.supportedInterfaces[type(IAuthProvider).interfaceId] = true; - ds.supportedInterfaces[type(IProposal).interfaceId] = true; - - ds.supportedInterfaces[type(IGovernanceStructure).interfaceId] = true; - ds.supportedInterfaces[type(IMintableGovernanceStructure).interfaceId] = true; - ds.supportedInterfaces[type(IBurnableGovernanceStructure).interfaceId] = true; - - ds.supportedInterfaces[type(IMembership).interfaceId] = true; - ds.supportedInterfaces[type(IMembershipExtended).interfaceId] = true; - ds.supportedInterfaces[type(ITieredMembershipStructure).interfaceId] = true; - ds.supportedInterfaces[type(IMembershipWhitelisting).interfaceId] = true; - - ds.supportedInterfaces[type(IVerificationFacet).interfaceId] = true; - - ds.supportedInterfaces[type(IPartialVotingProposalFacet).interfaceId] = true; - ds.supportedInterfaces[type(IPartialVotingFacet).interfaceId] = true; - - ds.supportedInterfaces[type(IGithubPullRequestFacet).interfaceId] = true; - - ds.supportedInterfaces[type(IERC20OneTimeVerificationRewardFacet).interfaceId] = true; - ds.supportedInterfaces[type(IERC20TieredTimeClaimableFacet).interfaceId] = true; - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - - PartialBurnVotingProposalFacetInit.init(_votingSettings); - VerificationFacetInit.init(_verificationSettings); - ERC20TieredTimeClaimableFacetInit.init(_timeClaimSettings); - ERC20OneTimeVerificationRewardFacetInit.init(_onetimeClaimSettings); - SearchSECOMonetizationFacetInit.init(_searchSECOMonetizationSettings); - SearchSECORewardingFacetInit.init(_searchSECORewardingSettings); - } -} diff --git a/contracts/upgrade-initializers/single-contract-init/DIERC20OneTimeVerificationReward.sol b/contracts/upgrade-initializers/single-contract-init/DIERC20OneTimeVerificationReward.sol deleted file mode 100644 index 23aa609..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DIERC20OneTimeVerificationReward.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { ERC20OneTimeVerificationRewardFacetInit } from "../../facets/token/ERC20/claiming/one-time/ERC20OneTimeVerificationRewardFacet.sol"; - -// import { LibDiamond } from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DIERC20OneTimeVerificationReward { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - ERC20OneTimeVerificationRewardFacetInit.InitParams memory _onetimeClaimSettings - ) external { - // adding ERC165 data - // LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - - ERC20OneTimeVerificationRewardFacetInit.init(_onetimeClaimSettings); - } -} \ No newline at end of file diff --git a/contracts/upgrade-initializers/single-contract-init/DIERC20TieredTimeClaimable.sol b/contracts/upgrade-initializers/single-contract-init/DIERC20TieredTimeClaimable.sol deleted file mode 100644 index 93e4957..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DIERC20TieredTimeClaimable.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { ERC20TieredTimeClaimableFacetInit } from "../../facets/token/ERC20/claiming/time/ERC20TieredTimeClaimableFacet.sol"; - -// import { LibDiamond } from "../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DIERC20TieredTimeClaimable { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - ERC20TieredTimeClaimableFacetInit.InitParams memory _timeClaimSettings - ) external { - // adding ERC165 data - // LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - - ERC20TieredTimeClaimableFacetInit.init(_timeClaimSettings); - } -} \ No newline at end of file diff --git a/contracts/upgrade-initializers/single-contract-init/DIInterfaces.sol b/contracts/upgrade-initializers/single-contract-init/DIInterfaces.sol deleted file mode 100644 index b447429..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DIInterfaces.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { - IERC165, - IERC20, - IERC20Metadata, - IERC20Permit, - - IERC173, - IERC6372, - IVotes, - IDiamondLoupe, - - IPlugin, - IAuthProvider, - - IGovernanceStructure, - IMintableGovernanceStructure, - IBurnableGovernanceStructure -} from "../../utils/InterfaceIds.sol"; - -import { LibDiamond } from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DIInterfaces { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - ) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(IERC165).interfaceId] = true; - ds.supportedInterfaces[type(IERC20).interfaceId] = true; - ds.supportedInterfaces[type(IERC20Metadata).interfaceId] = true; - ds.supportedInterfaces[type(IERC20Permit).interfaceId] = true; - - ds.supportedInterfaces[type(IERC173).interfaceId] = true; - ds.supportedInterfaces[type(IERC6372).interfaceId] = true; - ds.supportedInterfaces[type(IVotes).interfaceId] = true; - ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; - - ds.supportedInterfaces[type(IPlugin).interfaceId] = true; - ds.supportedInterfaces[type(IAuthProvider).interfaceId] = true; - - ds.supportedInterfaces[type(IGovernanceStructure).interfaceId] = true; - ds.supportedInterfaces[type(IMintableGovernanceStructure).interfaceId] = true; - ds.supportedInterfaces[type(IBurnableGovernanceStructure).interfaceId] = true; - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - } -} \ No newline at end of file diff --git a/contracts/upgrade-initializers/single-contract-init/DIPartialBurnVotingProposal.sol b/contracts/upgrade-initializers/single-contract-init/DIPartialBurnVotingProposal.sol deleted file mode 100644 index 4bbdeb6..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DIPartialBurnVotingProposal.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { - IERC165, - IERC20, - IERC20Metadata, - IERC20Permit, - - IERC173, - IERC6372, - IVotes, - IDiamondLoupe, - - IPlugin, - IAuthProvider, - - IGovernanceStructure, - IMintableGovernanceStructure, - IBurnableGovernanceStructure, - - IMembership, - IMembershipExtended, - ITieredMembershipStructure, - - IPartialVotingProposalFacet, - IPartialVotingFacet -} from "../../utils/InterfaceIds.sol"; - -import { PartialBurnVotingProposalFacetInit } from "../../facets/governance/proposal/PartialBurnVotingProposalFacet.sol"; - -import { LibDiamond } from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DIPartialBurnVotingProposal { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - PartialBurnVotingProposalFacetInit.InitParams memory _votingSettings - ) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - - ds.supportedInterfaces[type(IPartialVotingProposalFacet).interfaceId] = true; - ds.supportedInterfaces[type(IPartialVotingFacet).interfaceId] = true; - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - - PartialBurnVotingProposalFacetInit.init(_votingSettings); - } -} \ No newline at end of file diff --git a/contracts/upgrade-initializers/single-contract-init/DISearchSECORewarding.sol b/contracts/upgrade-initializers/single-contract-init/DISearchSECORewarding.sol deleted file mode 100644 index 76bda24..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DISearchSECORewarding.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import {IMembership, IMembershipExtended, ITieredMembershipStructure} from "../../utils/InterfaceIds.sol"; - -import {SearchSECORewardingFacetInit} from "../../facets/searchseco-rewarding/SearchSECORewardingFacet.sol"; - -import {LibDiamond} from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DISearchSECORewarding { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - SearchSECORewardingFacetInit.InitParams memory _rewardingSettings - ) external { - SearchSECORewardingFacetInit.init(_rewardingSettings); - } -} diff --git a/contracts/upgrade-initializers/single-contract-init/DISearchSecoMonetization.sol b/contracts/upgrade-initializers/single-contract-init/DISearchSecoMonetization.sol deleted file mode 100644 index d36a225..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DISearchSecoMonetization.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import {SearchSECOMonetizationFacetInit} from "../../facets/searchseco-monetization/SearchSECOMonetizationFacet.sol"; - -// import { LibDiamond } from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DISearchSECOMonetization { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - SearchSECOMonetizationFacetInit.InitParams - memory _searchSECOMonetizationSettings - ) external { - // adding ERC165 data - // LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - SearchSECOMonetizationFacetInit.init(_searchSECOMonetizationSettings); - } -} diff --git a/contracts/upgrade-initializers/single-contract-init/DIVerification.sol b/contracts/upgrade-initializers/single-contract-init/DIVerification.sol deleted file mode 100644 index d21ccce..0000000 --- a/contracts/upgrade-initializers/single-contract-init/DIVerification.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.0; - -/******************************************************************************\ -* Author: Nick Mudge (https://twitter.com/mudgen) -* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 -* -* Implementation of a diamond. -/******************************************************************************/ - -import { - IMembership, - IMembershipExtended, - ITieredMembershipStructure, - IMembershipWhitelisting, - IVerificationFacet -} from "../../utils/InterfaceIds.sol"; - -import { VerificationFacetInit } from "../../facets/membership/VerificationFacet.sol"; - -import { LibDiamond } from "../../libraries/LibDiamond.sol"; - -// It is expected that this contract is customized if you want to deploy your diamond -// with data from a deployment script. Use the init function to initialize state variables -// of your diamond. Add parameters to the init funciton if you need to. - -contract DIVerification { - // You can add parameters to this function in order to pass in - // data to set your own state variables - function init( - VerificationFacetInit.InitParams memory _verificationSettings - ) external { - // adding ERC165 data - LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); - ds.supportedInterfaces[type(IMembership).interfaceId] = true; - ds.supportedInterfaces[type(IMembershipExtended).interfaceId] = true; - ds.supportedInterfaces[type(ITieredMembershipStructure).interfaceId] = true; - ds.supportedInterfaces[type(IMembershipWhitelisting).interfaceId] = true; - - ds.supportedInterfaces[type(IVerificationFacet).interfaceId] = true; - - // add your own state variables - // EIP-2535 specifies that the `diamondCut` function takes two optional - // arguments: address _init and bytes calldata _calldata - // These arguments are used to execute an arbitrary function using delegatecall - // in order to set state variables in the diamond during deployment or an upgrade - // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface - - VerificationFacetInit.init(_verificationSettings); - } -} \ No newline at end of file diff --git a/contracts/utils/AuthConsumer.sol b/contracts/utils/AuthConsumer.sol index c95492d..b33b2d2 100644 --- a/contracts/utils/AuthConsumer.sol +++ b/contracts/utils/AuthConsumer.sol @@ -16,7 +16,7 @@ abstract contract AuthConsumer { /// @param _permissionId The permission identifier required to call the method this modifier is applied to. modifier auth(bytes32 _permissionId) { if (msg.sender != address(this)) { - IAuthProvider(address(this)).auth(_permissionId); + IAuthProvider(address(this)).auth(_permissionId, msg.sender); } _; } diff --git a/contracts/utils/GenericSignatureHelper.sol b/contracts/utils/GenericSignatureHelper.sol new file mode 100644 index 0000000..c75f40a --- /dev/null +++ b/contracts/utils/GenericSignatureHelper.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +// Modified source from: https://solidity-by-example.org/signature/ + +/* Signature Verification + +How to Sign and Verify +# Signing +1. Create message to sign +2. Hash the message +3. Sign the hash (off chain, keep your private key secret) + +# Verify +1. Recreate hash from the original message +2. Recover signer from signature and hash +3. Compare recovered signer to claimed signer +*/ + +/// @title Set of (helper) functions for signature verification +contract GenericSignatureHelper { + /// @notice Signs the messageHash with a standard prefix + /// @param _messageHash The hash of the packed message (messageHash) to be signed + /// @return bytes32 Returns the signed messageHash + function getEthSignedMessageHash( + bytes32 _messageHash + ) internal pure returns (bytes32) { + /* + Signature is produced by signing a keccak256 hash with the following format: + "\x19Ethereum Signed Message\n" + len(msg) + msg + */ + return + keccak256( + abi.encodePacked( + "\x19Ethereum Signed Message:\n32", + _messageHash + ) + ); + } + + /// @notice Verify a signature + /// @dev Generate the signed messageHash from the parameters to verify the signature against + /// @param _signer The signer of the signature (the owner of the contract) + /// @param _messageHash The hash of the packed message (messageHash) to be signed + /// @param _signature The signature of the proof signed by the signer + /// @return bool Returns the result of the verification, where true indicates success and false indicates failure + function verify( + address _signer, + bytes32 _messageHash, + bytes memory _signature + ) internal pure returns (bool) { + bytes32 ethSignedMessageHash = getEthSignedMessageHash(_messageHash); + + return recoverSigner(ethSignedMessageHash, _signature) == _signer; + } + + /// @notice Recover the signer from the signed messageHash and the signature + /// @dev This uses ecrecover + /// @param _ethSignedMessageHash The signed messageHash created from the parameters + /// @param _signature The signature of the proof signed by the signer + /// @return address Returns the recovered address + function recoverSigner( + bytes32 _ethSignedMessageHash, + bytes memory _signature + ) internal pure returns (address) { + (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); + + return ecrecover(_ethSignedMessageHash, v, r, s); + } + + /// @notice Splits the signature into r, s, and v + /// @dev This is necessary for the ecrecover function + /// @param sig The signature + /// @return r Returns the first 32 bytes of the signature + /// @return s Returns the second 32 bytes of the signature + /// @return v Returns the last byte of the signature + function splitSignature( + bytes memory sig + ) internal pure returns (bytes32 r, bytes32 s, uint8 v) { + require(sig.length == 65, "invalid signature length"); + + assembly { + /* + First 32 bytes stores the length of the signature + + add(sig, 32) = pointer of sig + 32 + effectively, skips first 32 bytes of signature + + mload(p) loads next 32 bytes starting at the memory address p into memory + */ + + // first 32 bytes, after the length prefix + r := mload(add(sig, 32)) + // second 32 bytes + s := mload(add(sig, 64)) + // final byte (first byte of the next 32 bytes) + v := byte(0, mload(add(sig, 96))) + } + + // implicitly return (r, s, v) + } +} \ No newline at end of file diff --git a/contracts/utils/InterfaceIds.sol b/contracts/utils/InterfaceIds.sol index f3e9347..c322bf1 100644 --- a/contracts/utils/InterfaceIds.sol +++ b/contracts/utils/InterfaceIds.sol @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; +// Defines the interfaces that will be used to auto generate the pure SDK + import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; @@ -15,14 +17,17 @@ import { IERC173 } from "../additional-contracts/IERC173.sol"; import { IERC6372 } from "../additional-contracts/IERC6372.sol"; import { IVotes } from "@openzeppelin/contracts/governance/utils/IVotes.sol"; import { IDiamondLoupe } from "../additional-contracts/IDiamondLoupe.sol"; +import { IDiamondCut } from "../additional-contracts/IDiamondCut.sol"; import { IPlugin } from "@aragon/osx/core/plugin/IPlugin.sol"; +import { IDAOReferenceFacet } from "../facets/aragon/IDAOReferenceFacet.sol"; import { IAuthProvider } from "./auth-providers/IAuthProvider.sol"; import { IProposal } from "@aragon/osx/core/plugin/proposal/IProposal.sol"; import { IGovernanceStructure } from "../facets/governance/structure/voting-power/IGovernanceStructure.sol"; import { IMintableGovernanceStructure } from "../facets/governance/structure/voting-power/IMintableGovernanceStructure.sol"; import { IBurnableGovernanceStructure } from "../facets/governance/structure/voting-power/IBurnableGovernanceStructure.sol"; +import { IERC20MultiMinterFacet } from "../facets/token/ERC20/minting/IERC20MultiMinterFacet.sol"; import { IMembership } from "@aragon/osx/core/plugin/membership/IMembership.sol"; import { IMembershipExtended } from "../facets/governance/structure/membership/IMembershipExtended.sol"; @@ -33,8 +38,9 @@ import { IVerificationFacet } from "../facets/membership/IVerificationFacet.sol" import { IPartialVotingProposalFacet } from "../facets/governance/proposal/IPartialVotingProposalFacet.sol"; import { IPartialVotingFacet } from "../facets/governance/voting/IPartialVotingFacet.sol"; +import { IBurnVotingProposalFacet } from "../facets/governance/proposal/IBurnVotingProposalFacet.sol"; -import { IGithubPullRequestFacet } from "../facets/github-pr/IGitHubPullRequestFacet.sol"; +import { IGithubPullRequestFacet } from "../facets/other/github-pr/IGitHubPullRequestFacet.sol"; import { IERC20OneTimeRewardFacet } from "../facets/token/ERC20/claiming/one-time/IERC20OneTimeRewardFacet.sol"; import { IERC20OneTimeVerificationRewardFacet } from "../facets/token/ERC20/claiming/one-time/IERC20OneTimeVerificationRewardFacet.sol"; @@ -45,6 +51,16 @@ import { IERC20PartialBurnVotingProposalRefundFacet } from "../facets/token/ERC2 import { IERC20TimeClaimableFacet } from "../facets/token/ERC20/claiming/time/IERC20TimeClaimableFacet.sol"; import { IERC20TieredTimeClaimableFacet } from "../facets/token/ERC20/claiming/time/IERC20TieredTimeClaimableFacet.sol"; +import { IChangeableTokenContract } from "../facets/token/ERC20/monetary-token/IChangeableTokenContract.sol"; + +import { IRewardMultiplierFacet } from "../facets/multiplier/IRewardMultiplierFacet.sol"; + +import { ISearchSECOMonetizationFacet } from "../facets/other/secureseco/searchseco/ISearchSECOMonetizationFacet.sol"; +import { ISearchSECORewardingFacet } from "../facets/other/secureseco/searchseco/ISearchSECORewardingFacet.sol"; +import { IMiningRewardPoolFacet } from "../facets/other/secureseco/searchseco/IMiningRewardPoolFacet.sol"; + +import { IABCConfigureFacet } from "../facets/token/ERC20/monetary-token/ABC/facets/IABCConfigureFacet.sol"; + library InterfaceIds { bytes4 constant public IERC165_ID = type(IERC165).interfaceId; bytes4 constant public IERC20_ID = type(IERC20).interfaceId; @@ -55,14 +71,17 @@ library InterfaceIds { bytes4 constant public IERC6372_ID = type(IERC6372).interfaceId; bytes4 constant public IVotes_ID = type(IVotes).interfaceId; bytes4 constant public IDiamondLoupe_ID = type(IDiamondLoupe).interfaceId; + bytes4 constant public IDiamondCut_ID = type(IDiamondCut).interfaceId; bytes4 constant public IPlugin_ID = type(IPlugin).interfaceId; + bytes4 constant public IDAOReferenceFacet_ID = type(IDAOReferenceFacet).interfaceId; bytes4 constant public IAuthProvider_ID = type(IAuthProvider).interfaceId; bytes4 constant public IProposal_ID = type(IProposal).interfaceId; bytes4 constant public IGovernanceStructure_ID = type(IGovernanceStructure).interfaceId; bytes4 constant public IMintableGovernanceStructure_ID = type(IMintableGovernanceStructure).interfaceId; bytes4 constant public IBurnableGovernanceStructure_ID = type(IBurnableGovernanceStructure).interfaceId; + bytes4 constant public IERC20MultiMinterFacet_ID = type(IERC20MultiMinterFacet).interfaceId; bytes4 constant public IMembership_ID = type(IMembership).interfaceId; bytes4 constant public IMembershipExtended_ID = type(IMembershipExtended).interfaceId; @@ -73,6 +92,7 @@ library InterfaceIds { bytes4 constant public IPartialVotingProposalFacet_ID = type(IPartialVotingProposalFacet).interfaceId; bytes4 constant public IPartialVotingFacet_ID = type(IPartialVotingFacet).interfaceId; + bytes4 constant public IBurnVotingProposalFacet_ID = type(IBurnVotingProposalFacet).interfaceId; bytes4 constant public IGithubPullRequestFacet_ID = type(IGithubPullRequestFacet).interfaceId; @@ -84,4 +104,14 @@ library InterfaceIds { bytes4 constant public IERC20TimeClaimableFacet_ID = type(IERC20TimeClaimableFacet).interfaceId; bytes4 constant public IERC20TieredTimeClaimableFacet_ID = type(IERC20TieredTimeClaimableFacet).interfaceId; + + bytes4 constant public IChangeableTokenContract_ID = type(IChangeableTokenContract).interfaceId; + + bytes4 constant public IRewardMultiplierFacet_ID = type(IRewardMultiplierFacet).interfaceId; + + bytes4 constant public ISearchSECOMonetizationFacet_ID = type(ISearchSECOMonetizationFacet).interfaceId; + bytes4 constant public ISearchSECORewardingFacet_ID = type(ISearchSECORewardingFacet).interfaceId; + bytes4 constant public IMiningRewardPoolFacet_ID = type(IMiningRewardPoolFacet).interfaceId; + + bytes4 constant public IABCConfigureFacet_ID = type(IABCConfigureFacet).interfaceId; } \ No newline at end of file diff --git a/contracts/utils/Ratio.sol b/contracts/utils/Ratio.sol index 10913ef..e777126 100644 --- a/contracts/utils/Ratio.sol +++ b/contracts/utils/Ratio.sol @@ -5,7 +5,7 @@ */ -pragma solidity 0.8.17; +pragma solidity ^0.8.0; // The base value to encode real-valued ratios on the interval `[0,1]` as integers on the interval `[0, 10**6]`. uint256 constant RATIO_BASE = 10 ** 6; diff --git a/contracts/utils/auth-providers/AragonAuthFacet.sol b/contracts/utils/auth-providers/AragonAuthFacet.sol new file mode 100644 index 0000000..a7f07e3 --- /dev/null +++ b/contracts/utils/auth-providers/AragonAuthFacet.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +pragma solidity ^0.8.0; + +import { _auth, IDAO } from "@aragon/osx/core/utils/auth.sol"; + +import { IAuthProvider } from "./IAuthProvider.sol"; +import { DAOReferenceFacet } from "../../facets/aragon/DAOReferenceFacet.sol"; +import { IFacet } from "../../facets/IFacet.sol"; + +contract AragonAuthFacet is IAuthProvider, IFacet { + /// @inheritdoc IFacet + function init(bytes memory/* _initParams*/) public virtual override { + __AragonAuthFacet_init(); + } + + function __AragonAuthFacet_init() public virtual { + registerInterface(type(IAuthProvider).interfaceId); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + unregisterInterface(type(IAuthProvider).interfaceId); + super.deinit(); + } + + /// @inheritdoc IAuthProvider + function auth(bytes32 _permissionId, address _account) external view virtual override { + IDAO dao = DAOReferenceFacet(address(this)).dao(); + if (_account != address(dao)) { + _auth(dao, address(this), msg.sender, _permissionId, msg.data); + } + } +} \ No newline at end of file diff --git a/contracts/utils/auth-providers/IAuthProvider.sol b/contracts/utils/auth-providers/IAuthProvider.sol index 0c5e393..e426c27 100644 --- a/contracts/utils/auth-providers/IAuthProvider.sol +++ b/contracts/utils/auth-providers/IAuthProvider.sol @@ -10,5 +10,5 @@ pragma solidity ^0.8.0; interface IAuthProvider { - function auth(bytes32 _permissionId) external; + function auth(bytes32 _permissionId, address _account) external view; } \ No newline at end of file diff --git a/contracts/verification/SignatureHelper.sol b/contracts/verification/SignatureHelper.sol deleted file mode 100644 index 0810b99..0000000 --- a/contracts/verification/SignatureHelper.sol +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: MIT -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - */ - -pragma solidity ^0.8.17; - -// Source: https://solidity-by-example.org/signature/ - -/* Signature Verification - -How to Sign and Verify -# Signing -1. Create message to sign -2. Hash the message -3. Sign the hash (off chain, keep your private key secret) - -# Verify -1. Recreate hash from the original message -2. Recover signer from signature and hash -3. Compare recovered signer to claimed signer -*/ - -contract SignatureHelper { - /* 1. Unlock MetaMask account - ethereum.enable() - */ - - /* 2. Get message hash to sign - getMessageHash( - 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C, - 123, - "coffee and donuts", - 1 - ) - - hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd" - */ - function getMessageHash( - address _toVerify, - string memory _userHash, - uint _timestamp - ) public pure returns (bytes32) { - bytes memory packedMsg = getPackedMessage(_toVerify, _userHash, _timestamp); - return keccak256(packedMsg); - } - - function getPackedMessage( - address _toVerify, - string memory _userHash, - uint _timestamp - ) public pure returns (bytes memory) { - return abi.encodePacked(_toVerify, _userHash, _timestamp); - } - - /* 3. Sign message hash - # using browser - account = "copy paste account of signer here" - ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log) - - # using web3 - web3.personal.sign(hash, web3.eth.defaultAccount, console.log) - - Signature will be different for different accounts - 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b - */ - function getEthSignedMessageHash( - bytes32 _messageHash - ) public pure returns (bytes32) { - /* - Signature is produced by signing a keccak256 hash with the following format: - "\x19Ethereum Signed Message\n" + len(msg) + msg - */ - return - keccak256( - abi.encodePacked( - "\x19Ethereum Signed Message:\n32", - _messageHash - ) - ); - } - - /* 4. Verify signature - signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd - to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C - amount = 123 - message = "coffee and donuts" - nonce = 1 - signature = - 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b - */ - function verify( - address _signer, - address _toVerify, - string calldata _userHash, - uint _timestamp, - bytes memory signature - ) public pure returns (bool) { - bytes32 messageHash = getMessageHash(_toVerify, _userHash, _timestamp); - bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); - - return recoverSigner(ethSignedMessageHash, signature) == _signer; - } - - function recoverSigner( - bytes32 _ethSignedMessageHash, - bytes memory _signature - ) public pure returns (address) { - (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); - - return ecrecover(_ethSignedMessageHash, v, r, s); - } - - function splitSignature( - bytes memory sig - ) public pure returns (bytes32 r, bytes32 s, uint8 v) { - require(sig.length == 65, "invalid signature length"); - - assembly { - /* - First 32 bytes stores the length of the signature - - add(sig, 32) = pointer of sig + 32 - effectively, skips first 32 bytes of signature - - mload(p) loads next 32 bytes starting at the memory address p into memory - */ - - // first 32 bytes, after the length prefix - r := mload(add(sig, 32)) - // second 32 bytes - s := mload(add(sig, 64)) - // final byte (first byte of the next 32 bytes) - v := byte(0, mload(add(sig, 96))) - } - - // implicitly return (r, s, v) - } -} \ No newline at end of file diff --git a/deployments/deploy.ts b/deployments/deploy.ts deleted file mode 100644 index 2900cdd..0000000 --- a/deployments/deploy.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { deployAragonDAO } from "./deploy_AragonDAO"; -import { AragonOSxFrameworkContracts, ENSFrameworkContracts } from "./deploy_AragonOSxFramework"; -import { ethers, network } from "hardhat"; -import fs from "fs"; - -async function main() { - console.log("Deploying to ", network.name); - const ensFramework = await getExistingENSFramework(); - const aragonOSxFramework = await getExistingAragonOSxFramework(); - const deploy = await deployAragonDAO(aragonOSxFramework); - console.log("DAO at: ", deploy.DAO.address); - console.log("Diamond Governance at: ", deploy.DiamondGovernance.address); - console.log("Deploy finished!"); -} - -/** - * @returns The existing ENSFramework contracts - */ -async function getExistingENSFramework() : Promise { - const path = "./deployments/existing-contracts/existing_ENSFramework.json"; - const fileContent = fs.readFileSync(path, "utf-8"); - const fileContentParsed = JSON.parse(fileContent); - if (!fileContentParsed.hasOwnProperty(network.name)) { - throw new Error(`Network ${network.name} doesnt exist in ${path}`); - } - const existingContractAddresses = fileContentParsed[network.name]; - return { - ens: await ethers.getContractAt("ENS", existingContractAddresses.ens), - daoResolver: await ethers.getContractAt("PublicResolver", existingContractAddresses.daoResolver), - pluginResolver: await ethers.getContractAt("PublicResolver", existingContractAddresses.pluginResolver), - } -} - -/** - * @returns The existing AragonOSxFramework contracts - */ -async function getExistingAragonOSxFramework() : Promise { - const path = "./deployments/existing-contracts/existing_AragonOSxFramework.json"; - const fileContent = fs.readFileSync(path, "utf-8"); - const fileContentParsed = JSON.parse(fileContent); - if (!fileContentParsed.hasOwnProperty(network.name)) { - throw new Error(`Network ${network.name} doesnt exist in ${path}`); - } - const existingContractAddresses = fileContentParsed[network.name]; - return { - ManagingDAO: await ethers.getContractAt("DAO", existingContractAddresses.managingDAO), - DAO_ENSSubdomainRegistrar: await ethers.getContractAt("ENSSubdomainRegistrar", existingContractAddresses.DAO_ENSSubdomainRegistrar), - Plugin_ENSSubdomainRegistrar: await ethers.getContractAt("ENSSubdomainRegistrar", existingContractAddresses.Plugin_ENSSubdomainRegistrar), - DAORegistry: await ethers.getContractAt("DAORegistry", existingContractAddresses.DAORegistry), - PluginRepoRegistry: await ethers.getContractAt("PluginRepoRegistry", existingContractAddresses.PluginRepoRegistry), - PluginRepoFactory: await ethers.getContractAt("PluginRepoFactory", existingContractAddresses.PluginRepoFactory), - PluginSetupProcessor: await ethers.getContractAt("PluginSetupProcessor", existingContractAddresses.PluginSetupProcessor), - DAOFactory: await ethers.getContractAt("DAOFactory", existingContractAddresses.DAOFactory), - } -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); \ No newline at end of file diff --git a/deployments/deploy_AragonDAO.ts b/deployments/deploy_AragonDAO.ts deleted file mode 100644 index 6e1613b..0000000 --- a/deployments/deploy_AragonDAO.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers, network } from "hardhat"; - -// Utils -import { addToIpfs } from "../utils/ipfsHelper"; -import { toBytes, getEvents } from "../utils/utils"; - -// Types - -// Other -import { deployAragonFrameworkWithEns, AragonOSxFrameworkContracts } from "./deploy_AragonOSxFramework"; -import { createDiamondGovernanceRepo } from "./deploy_DiamondGovernance"; -import {deployStandaloneVerificationContract} from "./deploy_StandaloneVerificationContract"; - -/** - * Deploys both the AragonOSxFramework and the Aragon DAO - * @returns The newly created DAO - */ -async function deployAragonDAOWithFramework() { - const { aragonOSxFramework } = await deployAragonFrameworkWithEns(); - return await deployAragonDAO(aragonOSxFramework); -} - -/** - * Creates a new Aragon DAO - * This DAO has the Plugins: DiamondGovernance - * @returns The newly created DAO - */ -async function deployAragonDAO(aragonOSxFramework: AragonOSxFrameworkContracts) { - // Deploy verification contract - const { address: standaloneVerificationContractAddress } = await deployStandaloneVerificationContract(); - - const { diamondGovernancePluginSettings, diamondGovernanceContracts, verificationContractAddress } = - await createDiamondGovernanceRepo(aragonOSxFramework.PluginRepoFactory, aragonOSxFramework.PluginRepoRegistry, standaloneVerificationContractAddress); - const DAOSettings = await GetDaoCreationParams(); - - // Create DAO - const tx = await aragonOSxFramework.DAOFactory.createDao(DAOSettings, [diamondGovernancePluginSettings]); - const receipt = await tx.wait(); - - // Retrieve addresses from DAO creation log - const DAORegistryContract = await ethers.getContractFactory("DAORegistry"); - const DAOAddress = getEvents(DAORegistryContract, "DAORegistered", receipt)[0].args.dao; - - const PluginSetupProcessorContract = await ethers.getContractFactory("PluginSetupProcessor"); - const pluginAddresses = getEvents(PluginSetupProcessorContract, "InstallationApplied", receipt).map((log : any) => log.args.plugin); - - // Retrieve DAO address with ENS - const DAOConctract = await ethers.getContractFactory("DAO"); - const DAO = await DAOConctract.attach(DAOAddress); - - // Link plugin addresses to Contracts - const DiamondGovernanceContract = await ethers.getContractFactory("DiamondGovernance"); - const DiamondGovernance = await DiamondGovernanceContract.attach(pluginAddresses[0]); - return { DAO, DiamondGovernance, diamondGovernanceContracts, verificationContractAddress }; -} - -/** - * @returns The parameters/settings needed to create a DAO - */ -async function GetDaoCreationParams() { - let metadataUri = "https://plopmenz.com/daoMetadata"; - if (network.name != "hardhat") { - const metadata = { - name: "Diamond Governance DAO", - description: "This DAO was created using the Diamond Governance project", - links: [{ - name: "Diamond Governance GitHub", - url: "https://github.com/SecureSECODAO/diamond-governance" - }], - avatar: "https://secureseco.org/wp-content/uploads/2020/07/Asset-14.png" - }; - const cid = await addToIpfs(JSON.stringify(metadata)); - console.log(`Uploaded DAO metadata to ipfs://${cid}`); - metadataUri = `ipfs://${cid}`; - } - - const DAOSettings = { - trustedForwarder: ethers.constants.AddressZero, //address - daoURI: "https://plopmenz.com", //string - subdomain: "my-dao" + Math.round(Math.random() * 100000), //string - metadata: toBytes(metadataUri) //bytes - }; - - return DAOSettings; -} - -export { deployAragonDAO, deployAragonDAOWithFramework } \ No newline at end of file diff --git a/deployments/deploy_AragonOSxFramework.ts b/deployments/deploy_AragonOSxFramework.ts index 70923f8..b04ce36 100644 --- a/deployments/deploy_AragonOSxFramework.ts +++ b/deployments/deploy_AragonOSxFramework.ts @@ -7,34 +7,18 @@ */ // Framework -import { ethers, upgrades } from "hardhat"; +import { ethers, upgrades } from "hardhat"; // Utils import { toEnsNode } from "../utils/ensHelper"; // Types -import { DAO, DAOFactory, DAORegistry, ENS, ENSRegistry, ENSSubdomainRegistrar, PluginRepoFactory, PluginRepoRegistry, PluginSetupProcessor, PublicResolver } from "../typechain-types"; +import { DAO, DAORegistry, ENSRegistry, ENSSubdomainRegistrar, PluginRepoRegistry } from "../typechain-types"; +import { ENSFrameworkContracts, AragonOSxFrameworkContracts } from "./deploymentTypes"; // Other import { deployENS, deployResolver } from "./deploy_ENS"; -interface AragonOSxFrameworkContracts { - ManagingDAO : DAO; - DAO_ENSSubdomainRegistrar: ENSSubdomainRegistrar; - Plugin_ENSSubdomainRegistrar: ENSSubdomainRegistrar; - DAORegistry: DAORegistry; - PluginRepoRegistry: PluginRepoRegistry; - PluginRepoFactory : PluginRepoFactory; - PluginSetupProcessor: PluginSetupProcessor; - DAOFactory: DAOFactory; -} - -interface ENSFrameworkContracts { - ens: ENS; - daoResolver: PublicResolver; - pluginResolver: PublicResolver; -} - async function setupENS() : Promise { const ens = await deployENS(); const [owner] = await ethers.getSigners(); @@ -54,7 +38,6 @@ async function setupENS() : Promise { */ async function grant(dao : DAO, where : any, who : any, permissionId : string) { await dao.grant(where.address, who.address, ethers.utils.keccak256(ethers.utils.toUtf8Bytes(permissionId))); - console.log(`Granted ${permissionId} to ${who.address} at ${where.address}`); } /** @@ -62,7 +45,7 @@ async function grant(dao : DAO, where : any, who : any, permissionId : string) { * @param ens Deployed ENSRegistry * @returns Deployed AragonOSxFramework contracts */ -async function deployAragonFramework(ens : ENSRegistry) : Promise { +export async function deployAragonFramework(ens : ENSRegistry) : Promise { const [owner] = await ethers.getSigners(); // ManagingDAO: "0x005098056a837c2c4F99C7eCeE976F8D90bdFFF8", https://github.com/aragon/osx/blob/develop/packages/contracts/src/core/dao/DAO.sol @@ -72,7 +55,6 @@ async function deployAragonFramework(ens : ENSRegistry) : Promise log.args.plugin); - - // Retrieve DAO address with ENS - const DAOConctract = await ethers.getContractFactory("DAO"); - const DAO = await DAOConctract.attach(DAOAddress); - - // Link plugin addresses to Contracts - const DiamondGovernanceContract = await ethers.getContractFactory("DiamondGovernance"); - const DiamondGovernance = await DiamondGovernanceContract.attach(pluginAddresses[0]); - return { DAO, DiamondGovernance, diamondGovernanceContracts }; -} - -async function GetDaoCreationParams() { - const DAOSettings = { - trustedForwarder: ethers.constants.AddressZero, //address - daoURI: "https://plopmenz.com", //string - subdomain: "my-dao", //string - metadata: toBytes("https://plopmenz.com/daoMetadata") //bytes - }; - - return DAOSettings; -} - -export { deployBaseAragonDAO } \ No newline at end of file diff --git a/deployments/deploy_DGSelection.ts b/deployments/deploy_DGSelection.ts deleted file mode 100644 index ec583ed..0000000 --- a/deployments/deploy_DGSelection.ts +++ /dev/null @@ -1,325 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers } from "hardhat"; -import fs from "fs"; - -// Utils -import { getSelectors, FacetCutAction } from "../utils/diamondHelper"; -import { resolveENS } from "../utils/ensHelper"; -import { days } from "../utils/timeUnits"; -import { getEvents, toBytes } from "../utils/utils"; - -// Types -import { - AragonAuth, - DAOReferenceFacet, - DiamondGovernanceSetup, - DIInterfaces, - DiamondLoupeFacet, - DiamondCutFacet, - DiamondCutMockFacet, - PluginFacet, - PluginRepoFactory, - PublicResolver, - PluginRepoRegistry, -} from "../typechain-types"; - -// Other -import { deployLibraries } from "./deploy_Libraries"; - -interface DiamondDeployedContractsBase { - DiamondGovernanceSetup: DiamondGovernanceSetup; - DIInterfaces: DIInterfaces; - Facets: { - DiamondLoupe: DiamondLoupeFacet; - DiamondCut: DiamondCutFacet; - DiamondCutMock: DiamondCutMockFacet; - DAOReference: DAOReferenceFacet; - Plugin: PluginFacet; - AragonAuth: AragonAuth; - AdditionalFacets: any[]; - }; -} - -/** - * Deploys the PartialTokenBurnVotingSetup contract and registers it with the pluginRepoFactory - * @param pluginRepoFactory The PluginRepoFactory to register with - * @param pluginResolver The ENS resolver to get the plugin contract from afterwards - * @returns The PluginSettings for installation in a DAO - */ -async function createDGBaseRepo( - pluginRepoFactory: PluginRepoFactory, - pluginRepoRegistry: PluginRepoRegistry -) { - const buildMetadata = fs.readFileSync( - "./contracts/build-metadata.json", - "utf8" - ); - const releaseMetadata = fs.readFileSync( - "./contracts/release-metadata.json", - "utf8" - ); - const diamondGovernanceContracts = await deployDGBase(); - const [owner] = await ethers.getSigners(); - - const tx = await pluginRepoFactory.createPluginRepoWithFirstVersion( - "my-plugin", - diamondGovernanceContracts.DiamondGovernanceSetup.address, - owner.address, - toBytes("https://plopmenz.com/buildMetadata"), - toBytes("https://plopmenz.com/releaseMetadata") - ); - // const PluginRepoAddress = await resolveENS(pluginResolver, "plugin", "my-plugin"); - const receipt = await tx.wait(); - const PluginRepoAddress = getEvents( - pluginRepoRegistry, - "PluginRepoRegistered", - receipt - )[0].args.pluginRepo; - - let cut = []; - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DiamondLoupe.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DiamondLoupe - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DiamondCut.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DiamondCut - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DiamondCutMock.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DiamondCutMock - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DAOReference.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DAOReference - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.AragonAuth.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.AragonAuth - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.Plugin.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors(diamondGovernanceContracts.Facets.Plugin), - }); - - const constructionArgs = { - _diamondCut: cut, - _init: diamondGovernanceContracts.DIInterfaces.address, - _calldata: - diamondGovernanceContracts.DIInterfaces.interface.encodeFunctionData( - "init" - ), - }; - const constructionFormat = - JSON.parse(buildMetadata).pluginSetupABI.prepareInstallation; - const pluginConstructionBytes = ethers.utils.defaultAbiCoder.encode( - constructionFormat, - [ - constructionArgs._diamondCut, - constructionArgs._init, - constructionArgs._calldata, - ] - ); - - const tag = { - release: 1, //uint8 - build: 1, //uint16 - }; - - const pluginSetupRef = { - versionTag: tag, //PluginRepo.Tag - pluginSetupRepo: PluginRepoAddress, //PluginRepo - }; - - const diamondGovernancePluginSettings = { - pluginSetupRef: pluginSetupRef, //PluginSetupRef - data: pluginConstructionBytes, //bytes - }; - - return { diamondGovernancePluginSettings, diamondGovernanceContracts }; -} - -async function deployDGBase(): Promise { - // TODO: Change this later - const libraries = await deployLibraries(); - - const DiamondGovernanceSetupContract = await ethers.getContractFactory( - "DiamondGovernanceSetup", - { - libraries: { - DAOReferenceFacetInit: libraries.DAOReferenceFacetInit, - }, - } - ); - const DiamondGovernanceSetup = await DiamondGovernanceSetupContract.deploy(); - console.log( - `DiamondGovernanceSetup deployed at ${DiamondGovernanceSetup.address}` - ); - - // Deploy base DiamondInit (for the unimplemented interfaces) - // This is a placeholder contract and should not be used in production - // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables - // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions - const DIInterfacesContract = await ethers.getContractFactory("DIInterfaces"); - const DIInterfaces = await DIInterfacesContract.deploy(); - console.log(`DIInterfaces deployed at ${DIInterfaces.address}`); - - // Facets - const DiamondLoupeFacetContract = await ethers.getContractFactory( - "DiamondLoupeFacet" - ); - const DiamondLoupeFacet = await DiamondLoupeFacetContract.deploy(); - console.log(`DiamondLoupeFacet deployed at ${DiamondLoupeFacet.address}`); - - const DiamondCutFacetContract = await ethers.getContractFactory( - "DiamondCutFacet" - ); - const DiamondCutFacet = await DiamondCutFacetContract.deploy(); - console.log(`DiamondCutFacet deployed at ${DiamondCutFacet.address}`); - - const DiamondCutMockFacetContract = await ethers.getContractFactory( - "DiamondCutMockFacet" - ); - const DiamondCutMockFacet = await DiamondCutMockFacetContract.deploy(); - console.log(`DiamondCutMockFacet deployed at ${DiamondCutFacet.address}`); - - const DAOReferenceFacetContract = await ethers.getContractFactory( - "DAOReferenceFacet" - ); - const DAOReferenceFacet = await DAOReferenceFacetContract.deploy(); - console.log(`DAOReferenceFacet deployed at ${DAOReferenceFacet.address}`); - - const PluginFacetContract = await ethers.getContractFactory("PluginFacet"); - const PluginFacet = await PluginFacetContract.deploy(); - console.log(`PluginFacet deployed at ${PluginFacet.address}`); - - const AragonAuthContract = await ethers.getContractFactory("AragonAuth"); - const AragonAuth = await AragonAuthContract.deploy(); - console.log(`AragonAuth deployed at ${AragonAuth.address}`); - - return { - DiamondGovernanceSetup: DiamondGovernanceSetup, - DIInterfaces: DIInterfaces, - Facets: { - DiamondLoupe: DiamondLoupeFacet, - DiamondCut: DiamondCutFacet, - DiamondCutMock: DiamondCutMockFacet, - DAOReference: DAOReferenceFacet, - Plugin: PluginFacet, - AragonAuth: AragonAuth, - AdditionalFacets: [], - }, - }; -} - -async function addFacetToDiamond( - diamondGovernanceContracts: DiamondDeployedContractsBase, - diamondGovernanceAddress: string, - facetContractName: string, - _init = ethers.constants.AddressZero, - _calldata = ethers.constants.AddressZero -) { - // Catch error if contractName is invalid - // Deploy facet contract - const facetContract = await ethers.getContractFactory(facetContractName); - const facet = await facetContract.deploy(); - console.log(`${facetContractName} deployed at ${facet.address}`); - - // Cut facet into diamond - let cut = []; - cut.push({ - facetAddress: facet.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors(facet), - }); - const constructionArgs = { - _diamondCut: cut, - _init: _init, - _calldata: _calldata, - }; - - const DiamondCutMock = await ethers.getContractAt( - "DiamondCutMockFacet", - diamondGovernanceAddress - ); - await DiamondCutMock.diamondCutMock( - constructionArgs._diamondCut, - constructionArgs._init, - constructionArgs._calldata - ); - - diamondGovernanceContracts.Facets.AdditionalFacets.push(facet); -} - -interface ContractNames { - facetContractName: string; - facetInitContractName: string; - diamondInitName: string; -} - -async function addFacetToDiamondWithInit( - diamondGovernanceContracts: DiamondDeployedContractsBase, - diamondGovernanceAddress: string, - contractNames: ContractNames, - settings: { - [key: string]: any; - } -) { - const { facetContractName, facetInitContractName, diamondInitName } = - contractNames; - - // Deploy library for init - const facetInitContract = await ethers.getContractFactory( - facetInitContractName - ); - const facetInit = await facetInitContract.deploy(); - - // Deploy init contract - const DiamondInitContract = await ethers.getContractFactory(diamondInitName, { - libraries: { - [facetInitContractName]: facetInit.address, - }, - }); - const DiamondInit = await DiamondInitContract.deploy(); - console.log(`${diamondInitName} deployed at ${DiamondInit.address}`); - - await addFacetToDiamond( - diamondGovernanceContracts, - diamondGovernanceAddress, - facetContractName, - DiamondInit.address, - DiamondInitContract.interface.encodeFunctionData("init", [settings]) - ); -} - -export { - DiamondDeployedContractsBase, - deployDGBase, - createDGBaseRepo, - addFacetToDiamond, - addFacetToDiamondWithInit, -}; diff --git a/deployments/deploy_DiamondGovernance.ts b/deployments/deploy_DiamondGovernance.ts index acbc85e..1b0d1d1 100644 --- a/deployments/deploy_DiamondGovernance.ts +++ b/deployments/deploy_DiamondGovernance.ts @@ -7,504 +7,204 @@ */ // Framework -import { ethers } from "hardhat"; +import hre from "hardhat"; +import { ethers, network } from "hardhat"; import fs from "fs"; +import { createDiamondGovernanceRepo } from "../utils/diamondGovernanceHelper"; // Utils -import { getSelectors, FacetCutAction } from "../utils/diamondHelper"; -import { resolveENS } from "../utils/ensHelper"; -import { days } from "../utils/timeUnits"; -import { toBytes, getEvents } from "../utils/utils"; // Types -import { - AragonAuth, - DAOReferenceFacet, - DiamondGovernanceSetup, - DiamondInit, - DiamondLoupeFacet, - GithubPullRequestFacet, - ERC20OneTimeVerificationRewardFacet, - ERC20PartialBurnVotingProposalRefundFacet, - ERC20PartialBurnVotingRefundFacet, - ERC20TieredTimeClaimableFacet, - GovernanceERC20BurnableFacet, - GovernanceERC20DisabledFacet, - PartialBurnVotingFacet, - PartialBurnVotingProposalFacet, - PluginFacet, - PluginRepoFactory, - PluginRepoRegistry, - SearchSECOMonetizationFacet, - VerificationFacet, - SearchSECORewardingFacet, -} from "../typechain-types"; // Other -import { deployLibraries } from "./deploy_Libraries"; - -interface DiamondDeployedContracts { - DiamondGovernanceSetup: DiamondGovernanceSetup; - DiamondInit: DiamondInit; - Facets: { - DiamondLoupe: DiamondLoupeFacet; - DAOReference: DAOReferenceFacet; - Plugin: PluginFacet; - AragonAuth: AragonAuth; - PartialBurnVotingProposal: PartialBurnVotingProposalFacet; - PartialBurnVoting: PartialBurnVotingFacet; - GithubPullRequest: GithubPullRequestFacet; - GovernanceERC20Disabled: GovernanceERC20DisabledFacet; - GovernanceERC20Burnable: GovernanceERC20BurnableFacet; - ERC20PartialBurnVotingRefund: ERC20PartialBurnVotingRefundFacet; - ERC20PartialBurnVotingProposalRefund: ERC20PartialBurnVotingProposalRefundFacet; - ERC20TieredTimeClaimable: ERC20TieredTimeClaimableFacet; - Verification: VerificationFacet; - ERC20OneTimeVerificationReward: ERC20OneTimeVerificationRewardFacet; - SearchSECOMonetization: SearchSECOMonetizationFacet; - SearchSECORewarding: SearchSECORewardingFacet; - }; +import deployedDiamondGovernanceJson from "../generated/deployed_DiamondGovernance.json"; +import diamondGovernanceRepoJson from "../generated/diamondGovernanceRepo.json"; + +const deployJsonFile = "./generated/deployed_DiamondGovernance.json"; +const repoJsonFile = "./generated/diamondGovernanceRepo.json"; + +const additionalContracts : string[] = [ + "DiamondGovernanceSetup", + "SignVerification", +]; + +const alwaysRedeploy : string[] = [ + +]; + +const specialDeployment : { [contractName : string]: () => Promise } = +{ + SignVerification: async () => { + const SignVerificationContract = await ethers.getContractFactory("SignVerification"); + const SignVerification = await SignVerificationContract.deploy(60, 30); + await SignVerification.deployed(); + + if (!testing()) { + console.log("Starting verification"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: SignVerification.address, + constructorArguments: [60, 30], + }); + } + + return SignVerification.address; + }, } -/** - * Deploys the PartialTokenBurnVotingSetup contract and registers it with the pluginRepoFactory - * @param pluginRepoFactory The PluginRepoFactory to register with - * @param pluginResolver The ENS resolver to get the plugin contract from afterwards - * @returns The PluginSettings for installation in a DAO - */ -async function createDiamondGovernanceRepo( - pluginRepoFactory: PluginRepoFactory, - pluginRepoRegistry: PluginRepoRegistry, - verificationContractAddress: string -) { - const buildMetadata = fs.readFileSync( - "./contracts/build-metadata.json", - "utf8" - ); - const releaseMetadata = fs.readFileSync( - "./contracts/release-metadata.json", - "utf8" - ); - const diamondGovernanceContracts = await deployDiamondGovernance(); - const [owner] = await ethers.getSigners(); +export async function deployDiamondGovernance() : Promise<{ [contractName: string]: { address: string, fileHash: number } }> { + const testDeploy = testing(); + const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); + const contractsToDeploy = artifactNames.filter(name => shouldDeploy(name)); + let allDeployments = getDeployment(); + let deployments : { [contractName : string]: { address: string, fileHash: number } } = { }; + if (allDeployments.hasOwnProperty(network.name)) { + deployments = allDeployments[network.name]; + } + for (let i = 0; i < contractsToDeploy.length; i++) { + const contractName = getContractName(contractsToDeploy[i]); + if (!testDeploy) { + console.log("Deploying", contractName); + } + + let address = ethers.constants.AddressZero; + if (specialDeployment.hasOwnProperty(contractName)) { + address = await specialDeployment[contractName](); + } + else { + const contract = await ethers.getContractFactory(contractName); + const deployment = await contract.deploy(); + await deployment.deployed(); + address = deployment.address; + + if (!testDeploy) { + console.log("Starting verification"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + try { + await hre.run("verify:verify", { + address: deployment.address, + constructorArguments: [], + contract: contractsToDeploy[i], + }); + } catch { } + } + } + + const artifact = await hre.artifacts.readArtifact(contractsToDeploy[i]); + deployments[contractName] = { address: address, fileHash: getHash(artifact.bytecode) }; - const tx = await pluginRepoFactory.createPluginRepoWithFirstVersion( - "my-plugin" + Math.round(Math.random() * 100000), - diamondGovernanceContracts.DiamondGovernanceSetup.address, - owner.address, - toBytes("https://plopmenz.com/buildMetadata"), - toBytes("https://plopmenz.com/releaseMetadata") - ); - const receipt = await tx.wait(); - const PluginRepoAddress = getEvents( - pluginRepoRegistry, - "PluginRepoRegistered", - receipt - )[0].args.pluginRepo; - - const ERC20Disabled = [ - "transfer(address, uint256)", - "approve(address, uint256)", - "transferFrom(address, address, uint256)", - "increaseAllowance(address, uint256)", - "decreaseAllowance(address, uint256)", - "permit(address, address, uint256, uint256, uint8, bytes32, bytes32)", - "delegate(address)", - "delegateBySig(address, uint256, uint256, uint8, bytes32, bytes32)", - ]; - let cut = []; - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DiamondLoupe.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DiamondLoupe - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.DAOReference.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.DAOReference - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.AragonAuth.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.AragonAuth - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.Plugin.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors(diamondGovernanceContracts.Facets.Plugin), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.PartialBurnVotingProposal.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.PartialBurnVotingProposal - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.PartialBurnVoting.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.PartialBurnVoting - ), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.GovernanceERC20Disabled.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.GovernanceERC20Disabled - ).get(ERC20Disabled), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.GovernanceERC20Burnable.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.GovernanceERC20Burnable - ).remove(ERC20Disabled), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.ERC20PartialBurnVotingRefund.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.ERC20PartialBurnVotingRefund - ), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.ERC20PartialBurnVotingProposalRefund - .address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.ERC20PartialBurnVotingProposalRefund - ), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.ERC20TieredTimeClaimable.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.ERC20TieredTimeClaimable - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.Verification.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.Verification - ), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.ERC20OneTimeVerificationReward.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.ERC20OneTimeVerificationReward - ), - }); - cut.push({ - facetAddress: - diamondGovernanceContracts.Facets.SearchSECOMonetization.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.SearchSECOMonetization - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.GithubPullRequest.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.GithubPullRequest - ), - }); - cut.push({ - facetAddress: diamondGovernanceContracts.Facets.SearchSECORewarding.address, - action: FacetCutAction.Add, - functionSelectors: getSelectors( - diamondGovernanceContracts.Facets.SearchSECORewarding - ), - }); - - enum VotingMode { - SingleVote, - SinglePartialVote, - MultiplePartialVote, + if (!testDeploy) { + console.log("Deployed", contractName, "at", address); + + allDeployments[network.name] = deployments; + fs.writeFileSync(deployJsonFile, JSON.stringify(allDeployments)); + } } - const votingSettings = { - proposalCreationCost: 1, - partialVotingProposalInit: { - votingSettings: { - votingMode: VotingMode.MultiplePartialVote, //IPartialVotingFacet.VotingMode - supportThreshold: 1, //uint32 - minParticipation: 1, //uint32 - maxSingleWalletPower: 10**6, //uint32 - minDuration: 1, //uint64 - minProposerVotingPower: 1, //uint256 - }, - }, - }; - const verificationSettings = { - verificationContractAddress: verificationContractAddress, //address - providers: ["github", "proofofhumanity"], //string[] - rewards: [3, 10], //uint256[] - }; - const timeClaimSettings = { - tiers: [1, 2, 3], //uint256[] - rewards: [50, 100, 1], //uint256[] - timeClaimableInit: { - timeTillReward: 1 * days, //uint256 - maxTimeRewarded: 10 * days, //uint256 - }, - }; - const onetimeClaimSettings = { - providers: ["github", "proofofhumanity"], //string[] - rewards: [20, 50], //uint256[] - }; - const searchSECOMonetizationSettings = { - hashCost: 1, - }; - const searchSECORewardingSettings = { - users: [], - hashCounts: [], - }; - const constructionArgs = { - _diamondCut: cut, - _init: diamondGovernanceContracts.DiamondInit.address, - _calldata: - diamondGovernanceContracts.DiamondInit.interface.encodeFunctionData( - "init", - [ - votingSettings, - verificationSettings, - timeClaimSettings, - onetimeClaimSettings, - searchSECOMonetizationSettings, - searchSECORewardingSettings, - ] - ), - }; - const constructionFormat = - JSON.parse(buildMetadata).pluginSetupABI.prepareInstallation; - const pluginConstructionBytes = ethers.utils.defaultAbiCoder.encode( - constructionFormat, - [ - constructionArgs._diamondCut, - constructionArgs._init, - constructionArgs._calldata, - ] - ); - - const tag = { - release: 1, //uint8 - build: 1, //uint16 - }; - - const pluginSetupRef = { - versionTag: tag, //PluginRepo.Tag - pluginSetupRepo: PluginRepoAddress, //PluginRepo - }; - - const diamondGovernancePluginSettings = { - pluginSetupRef: pluginSetupRef, //PluginSetupRef - data: pluginConstructionBytes, //bytes - }; - - return { - diamondGovernancePluginSettings, - diamondGovernanceContracts, - verificationContractAddress, - }; + return deployments; } -async function deployDiamondGovernance(): Promise { - const libraries = await deployLibraries(); +export async function createDiamondGovernanceRepoIfNotExists() { + let existingRepos: { [networkName: string]: { repo: string } } = diamondGovernanceRepoJson; + if (existingRepos.hasOwnProperty(network.name)) { return; } - const DiamondGovernanceSetupContract = await ethers.getContractFactory( - "DiamondGovernanceSetup", - { - libraries: { - DAOReferenceFacetInit: libraries.DAOReferenceFacetInit, - }, - } - ); - const DiamondGovernanceSetup = await DiamondGovernanceSetupContract.deploy(); - console.log( - `DiamondGovernanceSetup deployed at ${DiamondGovernanceSetup.address}` - ); - - // Deploy DiamondInit - // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables - // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions - const DiamondInitContract = await ethers.getContractFactory("DiamondInit", { - libraries: { - PartialBurnVotingProposalFacetInit: - libraries.PartialBurnVotingProposalFacetInit, - VerificationFacetInit: libraries.VerificationFacetInit, - ERC20TieredTimeClaimableFacetInit: - libraries.ERC20TieredTimeClaimableFacetInit, - ERC20OneTimeVerificationRewardFacetInit: - libraries.ERC20OneTimeVerificationRewardFacetInit, - SearchSECOMonetizationFacetInit: - libraries.SearchSECOMonetizationFacetInit, - SearchSECORewardingFacetInit: libraries.SearchSECORewardingFacetInit, - }, - }); - const DiamondInit = await DiamondInitContract.deploy(); - console.log(`DiamondInit deployed at ${DiamondInit.address}`); - - // Facets - const DiamondLoupeFacetContract = await ethers.getContractFactory( - "DiamondLoupeFacet" - ); - const DiamondLoupeFacet = await DiamondLoupeFacetContract.deploy(); - console.log(`DiamondLoupeFacet deployed at ${DiamondLoupeFacet.address}`); - - const DAOReferenceFacetContract = await ethers.getContractFactory( - "DAOReferenceFacet" - ); - const DAOReferenceFacet = await DAOReferenceFacetContract.deploy(); - console.log(`DAOReferenceFacet deployed at ${DAOReferenceFacet.address}`); - - const PluginFacetContract = await ethers.getContractFactory("PluginFacet"); - const PluginFacet = await PluginFacetContract.deploy(); - console.log(`PluginFacet deployed at ${PluginFacet.address}`); - - const AragonAuthContract = await ethers.getContractFactory("AragonAuth"); - const AragonAuth = await AragonAuthContract.deploy(); - console.log(`AragonAuth deployed at ${AragonAuth.address}`); - - const PartialBurnVotingProposalFacetContract = - await ethers.getContractFactory("PartialBurnVotingProposalFacet"); - const PartialBurnVotingProposalFacet = - await PartialBurnVotingProposalFacetContract.deploy(); - console.log( - `PartialBurnVotingProposalFacet deployed at ${PartialBurnVotingProposalFacet.address}` - ); - - const PartialBurnVotingFacetContract = await ethers.getContractFactory( - "PartialBurnVotingFacet" - ); - const PartialBurnVotingFacet = await PartialBurnVotingFacetContract.deploy(); - console.log( - `PartialBurnVotingFacet deployed at ${PartialBurnVotingFacet.address}` - ); - - const GovernanceERC20DisabledFacetContract = await ethers.getContractFactory( - "GovernanceERC20DisabledFacet" - ); - const GovernanceERC20DisabledFacet = - await GovernanceERC20DisabledFacetContract.deploy(); - console.log( - `GovernanceERC20DisabledFacet deployed at ${GovernanceERC20DisabledFacet.address}` - ); - - const GovernanceERC20BurnableFacetContract = await ethers.getContractFactory( - "GovernanceERC20BurnableFacet" - ); - const GovernanceERC20BurnableFacet = - await GovernanceERC20BurnableFacetContract.deploy("my-token", "TOK"); - console.log( - `GovernanceERC20BurnableFacet deployed at ${GovernanceERC20BurnableFacet.address}` - ); - - const ERC20PartialBurnVotingRefundFacetContract = - await ethers.getContractFactory("ERC20PartialBurnVotingRefundFacet"); - const ERC20PartialBurnVotingRefundFacet = - await ERC20PartialBurnVotingRefundFacetContract.deploy(); - console.log( - `ERC20PartialBurnVotingRefundFacet deployed at ${ERC20PartialBurnVotingRefundFacet.address}` - ); - - const ERC20PartialBurnVotingProposalRefundFacetContract = - await ethers.getContractFactory( - "ERC20PartialBurnVotingProposalRefundFacet" - ); - const ERC20PartialBurnVotingProposalRefundFacet = - await ERC20PartialBurnVotingProposalRefundFacetContract.deploy(); - console.log( - `ERC20PartialBurnVotingProposalRefundFacet deployed at ${ERC20PartialBurnVotingProposalRefundFacet.address}` - ); - - const ERC20TieredTimeClaimableFacetContract = await ethers.getContractFactory( - "ERC20TieredTimeClaimableFacet" - ); - const ERC20TieredTimeClaimableFacet = - await ERC20TieredTimeClaimableFacetContract.deploy(); - console.log( - `ERC20TieredTimeClaimableFacet deployed at ${ERC20TieredTimeClaimableFacet.address}` - ); - - const VerificationFacetContract = await ethers.getContractFactory( - "VerificationFacet" - ); - const VerificationFacet = await VerificationFacetContract.deploy(); - console.log(`VerificationFacet deployed at ${VerificationFacet.address}`); - - const ERC20OneTimeVerificationRewardFacetContract = - await ethers.getContractFactory("ERC20OneTimeVerificationRewardFacet"); - const ERC20OneTimeVerificationRewardFacet = - await ERC20OneTimeVerificationRewardFacetContract.deploy(); - console.log( - `ERC20OneTimeVerificationRewardFacet deployed at ${ERC20OneTimeVerificationRewardFacet.address}` - ); - - const SearchSECOMonetizationFacetContract = await ethers.getContractFactory( - "SearchSECOMonetizationFacet" - ); - const SearchSECOMonetizationFacet = - await SearchSECOMonetizationFacetContract.deploy(); - console.log( - `SearchSECOMonetizationFacet deployed at ${SearchSECOMonetizationFacet.address}` - ); - - const GithubPullRequestFacetContract = await ethers.getContractFactory( - "GithubPullRequestFacet" - ); - const GithubPullRequestFacet = await GithubPullRequestFacetContract.deploy(); - console.log( - `GithubPullRequestFacet deployed at ${GithubPullRequestFacet.address}` - ); - - const SearchSECORewardingFacetContract = await ethers.getContractFactory( - "SearchSECORewardingFacet" - ); - const SearchSECORewardingFacet = - await SearchSECORewardingFacetContract.deploy(); - console.log( - `SearchSECORewardingFacet deployed at ${SearchSECORewardingFacet.address}` - ); - - return { - DiamondGovernanceSetup: DiamondGovernanceSetup, - DiamondInit: DiamondInit, - Facets: { - DiamondLoupe: DiamondLoupeFacet, - DAOReference: DAOReferenceFacet, - Plugin: PluginFacet, - AragonAuth: AragonAuth, - PartialBurnVotingProposal: PartialBurnVotingProposalFacet, - PartialBurnVoting: PartialBurnVotingFacet, - GithubPullRequest: GithubPullRequestFacet, - GovernanceERC20Disabled: GovernanceERC20DisabledFacet, - GovernanceERC20Burnable: GovernanceERC20BurnableFacet, - ERC20PartialBurnVotingRefund: ERC20PartialBurnVotingRefundFacet, - ERC20PartialBurnVotingProposalRefund: - ERC20PartialBurnVotingProposalRefundFacet, - ERC20TieredTimeClaimable: ERC20TieredTimeClaimableFacet, - ERC20OneTimeVerificationReward: ERC20OneTimeVerificationRewardFacet, - Verification: VerificationFacet, - SearchSECOMonetization: SearchSECOMonetizationFacet, - SearchSECORewarding: SearchSECORewardingFacet, - }, - }; + const [owner] = await ethers.getSigners(); + const repo = await createDiamondGovernanceRepo("plugin" + Math.round(Math.random() * 100000), owner); + existingRepos[network.name] = { repo: repo }; + fs.writeFileSync(repoJsonFile, JSON.stringify(existingRepos)); +} + +function testing() { + return network.name == "hardhat"; +} + +function getDeployment() : { [networkName: string]: { [contractName : string]: { address: string, fileHash: number } } } { + return deployedDiamondGovernanceJson; } -export { deployDiamondGovernance, createDiamondGovernanceRepo }; +// source: https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript +function getHash(str : string) : number { + return str.split('').reduce((prevHash, currVal) => + (((prevHash << 5) - prevHash) + currVal.charCodeAt(0))|0, 0); +} + +function getContractName(artifactName : string) : string { + return artifactName.split(":")[1]; +} + +function shouldDeploy(artifactName : string) : boolean { + return ( + ( + isDeployable(artifactName) && + isFacet(artifactName) && + !isExample(artifactName) && + (testing() || !isTestOnly(artifactName)) + ) + || additionalContracts.includes(getContractName(artifactName)) + ) && + (!alreadyDeployed(artifactName) || isChanged(artifactName)); +} + +function isFacet(artifactName : string) : boolean { + return artifactName.endsWith("Facet"); +} + +// Examples should not be deployed in DiamondGoverance, in case they need to be deployed for testing, create your onw deploy script +function isExample(artifactName : string) : boolean { + return artifactName.includes("examples"); +} + +function isTestOnly(artifactNames : string) : boolean { + return artifactNames.includes("testing"); +} + +// Interfaces and abstract contract should start with an I followed by a capital letter +function isDeployable(artifactName : string) : boolean { + const interfaceRegex = new RegExp("^I[A-Z]"); + return !interfaceRegex.test(getContractName(artifactName)); +} + +// Check if the contract is already deployed on this network +// Note: redeployed anyway if on local hardhat network +function alreadyDeployed(artifactName : string) : boolean { + if (testing()) { + return false; + } + + const deployment = getDeployment(); + if (!deployment.hasOwnProperty(network.name)) { + // Network doesnt have any deployments + return false; + } + + return deployment[network.name].hasOwnProperty(getContractName(artifactName)); +} + +// Check if the contract is already deployed on this network +function isChanged(artifactName : string) : boolean { + const contractName = getContractName(artifactName); + if (alwaysRedeploy.includes(contractName)) { + // Pretend it is changed to redeploy + return true; + } + + const deployment = getDeployment(); + if (!deployment.hasOwnProperty(network.name)) { + // Network doesnt have any deployments + return false; + } + + if (!deployment[network.name].hasOwnProperty(contractName)) { + // Contract not deployed yet + return false; + } + + const artifact = hre.artifacts.readArtifactSync(artifactName); + if (deployment[network.name][contractName].fileHash !== getHash(artifact.bytecode)) { + // Possibly change this into a Y/n console prompt (with of course option to accept/reject all) + console.log("Detected changes to", contractName, "compared to latest deployment. Redeploying..."); + return true; + } + return false; +} \ No newline at end of file diff --git a/deployments/deploy_ENS.ts b/deployments/deploy_ENS.ts index e335e23..2a6ee24 100644 --- a/deployments/deploy_ENS.ts +++ b/deployments/deploy_ENS.ts @@ -26,7 +26,6 @@ import { ENSRegistry } from "../typechain-types"; async function deployENS() { const ENSRegistry = await ethers.getContractFactory("ENSRegistry"); const ens = await ENSRegistry.deploy(); - console.log(`Ens registry deployed at ${ens.address}`); return ens; }; @@ -49,7 +48,6 @@ async function deployResolver(ens : ENSRegistry, owner : string, subdomain : str resolver.address, 0 ); - console.log(`Ens resolver deployed for subdomain ${subdomain} at ${resolver.address}`); return resolver; } diff --git a/deployments/deploy_ExampleDiamond.ts b/deployments/deploy_ExampleDiamond.ts index e65e481..c12567d 100644 --- a/deployments/deploy_ExampleDiamond.ts +++ b/deployments/deploy_ExampleDiamond.ts @@ -8,7 +8,7 @@ // Framework import { ethers } from "hardhat"; -import { DiamondCutFacet } from "../typechain-types"; +import { DiamondCutTestFacet, IDiamondCut } from "../typechain-types"; // Utils import { getSelectors, FacetCutAction } from "../utils/diamondHelper"; @@ -21,28 +21,23 @@ async function deployDiamond () { const [ owner ] = await ethers.getSigners(); // Deploy DiamondCutFacet - const DiamondCutFacetContract = await ethers.getContractFactory('DiamondCutFacet'); + const DiamondCutFacetContract = await ethers.getContractFactory('DiamondCutTestFacet'); const DiamondCutFacetDeploy = await DiamondCutFacetContract.deploy(); // Deploy Diamond const DiamondContract = await ethers.getContractFactory('ExampleDiamond'); const Diamond = await DiamondContract.deploy(owner.address, DiamondCutFacetDeploy.address); - // Deploy DiamondInit - // DiamondInit provides a function that is called when the diamond is upgraded to initialize state variables - // Read about how the diamondCut function works here: https://eips.ethereum.org/EIPS/eip-2535#addingreplacingremoving-functions - const DiamondInitContract = await ethers.getContractFactory('ExampleDiamondInit'); - const DiamondInit = await DiamondInitContract.deploy(); - // Deploy facets - const cut : any = []; + const cut : IDiamondCut.FacetCutStruct[] = []; const DiamondLoupeFacetContract = await ethers.getContractFactory("DiamondLoupeFacet"); const DiamondLoupeFacetDeploy = await DiamondLoupeFacetContract.deploy(); cut.push({ facetAddress: DiamondLoupeFacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(DiamondLoupeFacetDeploy) + functionSelectors: getSelectors(DiamondLoupeFacetDeploy).selectors, + initCalldata: "0x", }); const OwnershipFacetContract = await ethers.getContractFactory("OwnershipFacet"); @@ -50,16 +45,15 @@ async function deployDiamond () { cut.push({ facetAddress: OwnershipFacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(OwnershipFacetDeploy) + functionSelectors: getSelectors(OwnershipFacetDeploy).selectors, + initCalldata: "0x", }); - const DiamondCutFacet = await ethers.getContractAt("DiamondCutFacet", Diamond.address); + const DiamondCutFacet = await ethers.getContractAt("DiamondCutTestFacet", Diamond.address); const DiamondLoupeFacet = await ethers.getContractAt("DiamondLoupeFacet", Diamond.address); const OwnershipFacet = await ethers.getContractAt("OwnershipFacet", Diamond.address); - // Call to init function - const functionCall = DiamondInit.interface.encodeFunctionData('init'); - const tx = await DiamondCutFacet.diamondCut(cut, DiamondInit.address, functionCall); + const tx = await DiamondCutFacet.diamondCut(cut); const receipt = await tx.wait(); if (!receipt.status) { @@ -69,17 +63,17 @@ async function deployDiamond () { return { Diamond, DiamondCutFacet, DiamondLoupeFacet, OwnershipFacet, DiamondCutFacetDeploy, DiamondLoupeFacetDeploy, OwnershipFacetDeploy }; } -async function deployTest1Facet(diamondCutFacet : DiamondCutFacet) { +async function deployTest1Facet(diamondCutFacet : DiamondCutTestFacet) { const Test1FacetContract = await ethers.getContractFactory('Test1Facet'); const Test1FacetDeploy = await Test1FacetContract.deploy(); - const selectors = getSelectors(Test1FacetDeploy).remove(['supportsInterface(bytes4)']); + const selectors = getSelectors(Test1FacetDeploy).remove(['supportsInterface(bytes4)']).selectors; const tx = await diamondCutFacet.diamondCut( [{ facetAddress: Test1FacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`) @@ -88,17 +82,17 @@ async function deployTest1Facet(diamondCutFacet : DiamondCutFacet) { return { Test1Facet, Test1FacetDeploy }; } -async function deployTest2Facet(diamondCutFacet : DiamondCutFacet) { +async function deployTest2Facet(diamondCutFacet : DiamondCutTestFacet) { const Test2FacetContract = await ethers.getContractFactory('Test2Facet'); const Test2FacetDeploy = await Test2FacetContract.deploy(); - const selectors = getSelectors(Test2FacetDeploy); + const selectors = getSelectors(Test2FacetDeploy).selectors; const tx = await diamondCutFacet.diamondCut( [{ facetAddress: Test2FacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); if (!receipt.status) { throw Error(`Diamond upgrade failed: ${tx.hash}`) diff --git a/deployments/deploy_Libraries.ts b/deployments/deploy_Libraries.ts deleted file mode 100644 index 0be0c16..0000000 --- a/deployments/deploy_Libraries.ts +++ /dev/null @@ -1,111 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers } from "hardhat"; - -// Utils - -// Types - -// Other - -// addresses of deployed libraries -interface Libraries { - DAOReferenceFacetInit: string; - PartialVotingProposalFacetInit: string; - PartialBurnVotingProposalFacetInit: string; - VerificationFacetInit: string; - ERC20TimeClaimableFacetInit: string; - ERC20TieredTimeClaimableFacetInit: string; - ERC20OneTimeRewardFacetInit: string; - ERC20OneTimeVerificationRewardFacetInit: string; - SearchSECOMonetizationFacetInit: string; - SearchSECORewardingFacetInit: string; -} - -async function deployLibraries(): Promise { - const DAOReferenceFacetInitContract = await ethers.getContractFactory( - "DAOReferenceFacetInit" - ); - const DAOReferenceFacetInit = await DAOReferenceFacetInitContract.deploy(); - - const PartialVotingProposalFacetInitContract = - await ethers.getContractFactory("PartialVotingProposalFacetInit"); - const PartialVotingProposalFacetInit = - await PartialVotingProposalFacetInitContract.deploy(); - - const PartialBurnVotingProposalFacetInitContract = - await ethers.getContractFactory("PartialBurnVotingProposalFacetInit", { - libraries: { - PartialVotingProposalFacetInit: PartialVotingProposalFacetInit.address, - }, - }); - const PartialBurnVotingProposalFacetInit = - await PartialBurnVotingProposalFacetInitContract.deploy(); - - const VerificationFacetInitContract = await ethers.getContractFactory( - "VerificationFacetInit" - ); - const VerificationFacetInit = await VerificationFacetInitContract.deploy(); - - const ERC20TimeClaimableFacetInitContract = await ethers.getContractFactory( - "ERC20TimeClaimableFacetInit" - ); - const ERC20TimeClaimableFacetInit = - await ERC20TimeClaimableFacetInitContract.deploy(); - - const ERC20TieredTimeClaimableFacetInitContract = - await ethers.getContractFactory("ERC20TieredTimeClaimableFacetInit", { - libraries: { - ERC20TimeClaimableFacetInit: ERC20TimeClaimableFacetInit.address, - }, - }); - const ERC20TieredTimeClaimableFacetInit = - await ERC20TieredTimeClaimableFacetInitContract.deploy(); - - const ERC20OneTimeRewardFacetInitContract = await ethers.getContractFactory( - "ERC20OneTimeRewardFacetInit" - ); - const ERC20OneTimeRewardFacetInit = - await ERC20OneTimeRewardFacetInitContract.deploy(); - - const ERC20OneTimeVerificationRewardFacetInitContract = - await ethers.getContractFactory("ERC20OneTimeVerificationRewardFacetInit"); - const ERC20OneTimeVerificationRewardFacetInit = - await ERC20OneTimeVerificationRewardFacetInitContract.deploy(); - - const SearchSECOMonetizationFacetInitContract = - await ethers.getContractFactory("SearchSECOMonetizationFacetInit"); - const SearchSECOMonetizationFacetInit = - await SearchSECOMonetizationFacetInitContract.deploy(); - - const SearchSECORewardingFacetInitContract = await ethers.getContractFactory( - "SearchSECORewardingFacetInit" - ); - const SearchSECORewardingFacetInit = - await SearchSECORewardingFacetInitContract.deploy(); - - return { - DAOReferenceFacetInit: DAOReferenceFacetInit.address, - PartialVotingProposalFacetInit: PartialVotingProposalFacetInit.address, - PartialBurnVotingProposalFacetInit: - PartialBurnVotingProposalFacetInit.address, - VerificationFacetInit: VerificationFacetInit.address, - ERC20TimeClaimableFacetInit: ERC20TimeClaimableFacetInit.address, - ERC20TieredTimeClaimableFacetInit: - ERC20TieredTimeClaimableFacetInit.address, - ERC20OneTimeRewardFacetInit: ERC20OneTimeRewardFacetInit.address, - ERC20OneTimeVerificationRewardFacetInit: - ERC20OneTimeVerificationRewardFacetInit.address, - SearchSECOMonetizationFacetInit: SearchSECOMonetizationFacetInit.address, - SearchSECORewardingFacetInit: SearchSECORewardingFacetInit.address, - }; -} - -export { deployLibraries }; diff --git a/deployments/deploy_MonetaryToken.ts b/deployments/deploy_MonetaryToken.ts new file mode 100644 index 0000000..95b7b07 --- /dev/null +++ b/deployments/deploy_MonetaryToken.ts @@ -0,0 +1,207 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import hre from "hardhat"; +import { ethers } from "hardhat"; +import { BigNumber } from "ethers"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { ERC20MonetaryToken, ERC20BondedToken, MarketMaker, SimpleHatch } from "../typechain-types"; +import { ether } from "../utils/etherUnits"; +import { CurveParametersStruct } from "../typechain-types/contracts/facets/token/ERC20/monetary-token/ABC/core/MarketMaker"; +import { HatchParametersStruct } from "../typechain-types/contracts/facets/token/ERC20/monetary-token/ABC/core/SimpleHatch"; + +// Utils + +// Types + +// Other + + +export enum MonetaryTokenType { FixedSupply, ABC } + +export abstract class MonetaryTokenDeployer { + public runVerification : boolean = false; + public deployedContracts : { [contractName : string] : string } = { }; + + public abstract beforeDAODeploy() : Promise; + + public abstract afterDAODeploy(dao : string, diamondGovernance : string) : Promise; +} + +export class FixedSupplyDeployer extends MonetaryTokenDeployer { + public override async beforeDAODeploy() : Promise { + const ERC20MonetaryTokenContract = await ethers.getContractFactory("ERC20MonetaryToken"); + const ERC20MonetaryToken = await ERC20MonetaryTokenContract.deploy("SecureSECO Coin", "SECOIN"); + await ERC20MonetaryToken.deployed(); + + if (this.runVerification) { + try { + console.log("Starting verification"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: ERC20MonetaryToken.address, + constructorArguments: ["SecureSECO Coin", "SECOIN"], + }); + } catch { } + } + + this.deployedContracts.ERC20MonetaryToken = ERC20MonetaryToken.address; + return ERC20MonetaryToken.address; + } + + public override async afterDAODeploy(dao : string, diamondGovernance : string) : Promise { + const [owner] = await ethers.getSigners(); + const ERC20MonetaryToken = await GetTypedContractAt("ERC20MonetaryToken", this.deployedContracts.ERC20MonetaryToken, owner); + ERC20MonetaryToken.init(dao, ether.mul(1000000)); + } +} + +export interface ABCDeployerSettings { + curveParameters: { + theta: number, + friction: number, + reserveRatio: number, + }, + hatchParameters: { + initialPrice: BigNumber, + minimumRaise: BigNumber, + maximumRaise: BigNumber, + hatchDeadline: number, + }, + vestingSchedule: { + cliff: number, + start: number, + duration: number, + revocable: boolean, + }, + externalERC20: string, +} + +export class ABCDeployer extends MonetaryTokenDeployer { + public settings : ABCDeployerSettings; + + constructor(_settings : ABCDeployerSettings) { + super(); + + this.settings = _settings; + } + + public override async beforeDAODeploy() : Promise { + const ERC20BondedTokenContract = await ethers.getContractFactory("ERC20BondedToken"); + const ERC20BondedToken = await ERC20BondedTokenContract.deploy("SecureSECO Coin", "SECOIN"); + await ERC20BondedToken.deployed(); + + if (this.runVerification) { + try { + console.log("Starting verification ERC20BondedToken"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: ERC20BondedToken.address, + constructorArguments: ["SecureSECO Coin", "SECOIN"], + }); + } catch { } + } + + const BancorBondingCurveContract = await ethers.getContractFactory("BancorBondingCurve"); + const BancorBondingCurve = await BancorBondingCurveContract.deploy(); + await BancorBondingCurve.deployed(); + + + if (this.runVerification) { + try { + console.log("Starting verification BancorBondingCurve"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: BancorBondingCurve.address, + constructorArguments: [], + }); + } catch { } + } + + const curveParameters : CurveParametersStruct = { + theta: this.settings.curveParameters.theta, + friction: this.settings.curveParameters.friction, + reserveRatio: this.settings.curveParameters.reserveRatio, + formula: BancorBondingCurve.address + }; + const MarketMakerContract = await ethers.getContractFactory("MarketMaker"); + const MarketMaker = await MarketMakerContract.deploy(ERC20BondedToken.address, this.settings.externalERC20, curveParameters); + await MarketMaker.deployed(); + + + if (this.runVerification) { + try { + console.log("Starting verification MarketMaker"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: MarketMaker.address, + constructorArguments: [ERC20BondedToken.address, this.settings.externalERC20, curveParameters], + }); + } catch { } + } + + const hatchParameters : HatchParametersStruct = { + externalToken: this.settings.externalERC20, + bondedToken: ERC20BondedToken.address, + pool: MarketMaker.address, + initialPrice: this.settings.hatchParameters.initialPrice, + minimumRaise: this.settings.hatchParameters.minimumRaise, + maximumRaise: this.settings.hatchParameters.maximumRaise, + hatchDeadline: this.settings.hatchParameters.hatchDeadline, + } + + const SimpleHatchContract = await ethers.getContractFactory("SimpleHatch"); + const SimpleHatch = await SimpleHatchContract.deploy(hatchParameters, this.settings.vestingSchedule); + await SimpleHatch.deployed(); + + + if (this.runVerification) { + try { + console.log("Starting verification SimpleHatch"); + // Wait for etherscan to process the deployment + await new Promise(f => setTimeout(f, 10 * 1000)); + await hre.run("verify:verify", { + address: SimpleHatch.address, + constructorArguments: [hatchParameters, this.settings.vestingSchedule], + }); + } catch { } + } + + await ERC20BondedToken.grantPermission(await ERC20BondedToken.MINT_PERMISSION_ID(), MarketMaker.address); + await ERC20BondedToken.grantPermission(await ERC20BondedToken.BURN_PERMISSION_ID(), MarketMaker.address); + await MarketMaker.grantPermission(await MarketMaker.HATCH_PERMISSION_ID(), SimpleHatch.address); + + this.deployedContracts.ERC20BondedToken = ERC20BondedToken.address; + this.deployedContracts.MarketMaker = MarketMaker.address; + this.deployedContracts.SimpleHatch = SimpleHatch.address; + return ERC20BondedToken.address; + } + + public override async afterDAODeploy(dao : string, diamondGovernance : string) : Promise { + const [owner] = await ethers.getSigners(); + + const ERC20BondedToken = await GetTypedContractAt("ERC20BondedToken", this.deployedContracts.ERC20BondedToken, owner); + const MarketMaker = await GetTypedContractAt("MarketMaker", this.deployedContracts.MarketMaker, owner); + const SimpleHatch = await GetTypedContractAt("SimpleHatch", this.deployedContracts.SimpleHatch, owner); + + await MarketMaker.grantPermission(await MarketMaker.CONFIGURE_PERMISSION_ID(), diamondGovernance); + + await ERC20BondedToken.setDao(dao); + await MarketMaker.setDao(dao); + await SimpleHatch.setDao(dao); + + await ERC20BondedToken.transferOwnership(diamondGovernance); + await MarketMaker.transferOwnership(diamondGovernance); + await SimpleHatch.transferOwnership(diamondGovernance); + } +} \ No newline at end of file diff --git a/deployments/deploy_StandaloneVerificationContract.ts b/deployments/deploy_StandaloneVerificationContract.ts deleted file mode 100644 index bd8b666..0000000 --- a/deployments/deploy_StandaloneVerificationContract.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers } from "hardhat"; - -// Utils - -// Types -import {GithubVerification} from "../typechain-types"; - -// Other -const VERIFICATION_DAY_THRESHOLD = 60; -const REVERIFICATION_THRESHOLD = 30; - -export const deployStandaloneVerificationContract = async () : Promise => { - const StandaloneVerificationContract = await ethers.getContractFactory("GithubVerification"); - const StandaloneVerification = await StandaloneVerificationContract.deploy(VERIFICATION_DAY_THRESHOLD, REVERIFICATION_THRESHOLD); - console.log(`Standalone verification contract deployed at ${StandaloneVerification.address}`); - - return StandaloneVerification; -} \ No newline at end of file diff --git a/deployments/deployed-contracts/deployed_AragonOSxFramework.json b/deployments/deployed-contracts/deployed_AragonOSxFramework.json new file mode 100644 index 0000000..fcf55fc --- /dev/null +++ b/deployments/deployed-contracts/deployed_AragonOSxFramework.json @@ -0,0 +1,98 @@ +{ + "goerli": { + "managingDAOImplemenation": "0x99C83C89C59166f7f766A221D5D0Ee00D37170c3", + "managingDAO": "0xB76F8d3512497040a96E77141c951a5374F24Eb9", + "DAO_ENSSubdomainRegistrar_Implementation": "0x394B49Cc32Dc81B8EaCdeb62A6Fa66F31D1D022c", + "DAO_ENSSubdomainRegistrar": "0xC62820f3E74cC82F89100032Ad7F04682F9EdaE0", + "Plugin_ENSSubdomainRegistrar_Implementation": "0xbcE9b6fE957464aF2B739337bd1a936EbFCB5B48", + "Plugin_ENSSubdomainRegistrar": "0xd5656b6d1bc0354073f62AAbc1430530C331979c", + "DAORegistry_Implementation": "0xa796AC80af77a52AdA92778d8fb6133792480B77", + "DAORegistry": "0xd51ac19130A73455F8B3b1c26aFea21D6bA88E54", + "PluginRepoRegistry_Implementation": "0x3861Ef32c1bFcdd53E9AaE4af1C9f47390c17fBf", + "PluginRepoRegistry": "0x970Eb7Dd57c9F0dc4c5a10c06653d1103946b508", + "PluginRepoFactory": "0x301868712b77744A3C0E5511609238399f0A2d4d", + "PluginSetupProcessor": "0xE8B5d8D66a02CD1b9Bd32a4064D7ABa45F51305e", + "DAOFactory": "0x16B6c6674fEf5d29C9a49EA68A19944f5a8471D3", + "AddresslistVotingSetup": "0x4980e5B4394B326c069A54C9ED0Dee2659227352", + "TokenVotingSetup": "0x64B336524ea859ed2133c93e4B18be17f44692eE", + "AdminSetup": "0x633845bB511DE83EA31b8717614d88fa7b569694", + "MultisigSetup": "0xBFd84852C8007Bf148721d2c20F69456F193b201", + "address-list-voting-repo": "0xbD293e27226EF2b85E84FADCF2d5135AbC52e50A", + "token-voting-repo": "0xFCc843C48BD44e5dA5976a2f2d85772D59C5959E", + "admin-repo": "0xF66348E9865bb0f29B889E7c0FE1BCf4acAb5f54", + "multisig-repo": "0x92C090cffC592B1bC321aCfAF735057B876375F8" + }, + "mainnet": { + "managingDAOImplemenation": "0x005098056a837c2c4F99C7eCeE976F8D90bdFFF8", + "managingDAO": "0xf2d594F3C93C19D7B1a6F15B5489FFcE4B01f7dA", + "DAO_ENSSubdomainRegistrar_Implementation": "0xCe0B4124dea6105bfB85fB4461c4D39f360E9ef3", + "DAO_ENSSubdomainRegistrar": "0xE640Da5AD169630555A86D9b6b9C145B4961b1EB", + "Plugin_ENSSubdomainRegistrar_Implementation": "0x08633901DdF9cD8e2DC3a073594d0A7DaD6f3f57", + "Plugin_ENSSubdomainRegistrar": "0x35B62715459cB60bf6dC17fF8cfe138EA305E7Ee", + "DAORegistry_Implementation": "0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f", + "DAORegistry": "0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e", + "PluginRepoRegistry_Implementation": "0xddCc39a2a0047Eb47EdF94180452cbaB14d426EF", + "PluginRepoRegistry": "0x5B3B36BdC9470963A2734D6a0d2F6a64C21C159f", + "PluginRepoFactory": "0x96E54098317631641703404C06A5afAD89da7373", + "PluginSetupProcessor": "0xE978942c691e43f65c1B7c7F8f1dc8cDF061B13f", + "DAOFactory": "0xA03C2182af8eC460D498108C92E8638a580b94d4", + "AddresslistVotingSetup": "0x360586dB62DA31327B2462BA27bEb3e48ebbf396", + "TokenVotingSetup": "0xB2A2b32b9d885C85d5b229C0509341c37CaE7483", + "AdminSetup": "0xBFD541bc4fcE14adf1Fb9258574D3cBF5f55a894", + "MultisigSetup": "0x8d6726Fe85Caa585d88FD8342ebEEE88d703E754", + "address-list-voting-repo": "0xC207767d8A7a28019AFFAEAe6698F84B5526EbD7", + "token-voting-repo": "0xb7401cD221ceAFC54093168B814Cc3d42579287f", + "admin-repo": "0xA4371a239D08bfBA6E8894eccf8466C6323A52C3", + "multisig-repo": "0x8c278e37D0817210E18A7958524b7D0a1fAA6F7b" + }, + "mumbai": { + "managingDAOImplemenation": "0x5E993db91Fd2c713Df1110358396EAc60d54fE66", + "managingDAO": "0xE1De373E219a0d19a0500e599adb903477bCA0f9", + "ENSRegistry": "0xD24A78824dF3C29CA03661368e6437b767A5422D", + "PublicResolver": "0xdbFf6be618180E0FF0d74dd3B6BdC1b5de074273", + "DAO_ENSSubdomainRegistrar_Implementation": "0xD5baCA29C944A28f1f568F7e69B119030914c15D", + "DAO_ENSSubdomainRegistrar": "0xC528B8AA6a4D0f21455a06b6D7A41fd795619C31", + "Plugin_ENSSubdomainRegistrar_Implementation": "0x99965D7cFFE21C4AC94526AAFEd33E9EaA27f004", + "Plugin_ENSSubdomainRegistrar": "0x2EfcED958034c3BC455273153C3e604D34C78e46", + "DAORegistry_Implementation": "0xE5058D785C934279Af1EF7E90BB5D58048829256", + "DAORegistry": "0x6dD0C8b7F9406206ceAA01B5576D9d46e9298f0E", + "PluginRepoRegistry_Implementation": "0xab27e29F579C870F66F48F4825A4D294AE540818", + "PluginRepoRegistry": "0xc796bB1AfEBc56daDF6CAcD2aDa78055e5381971", + "PluginRepoFactory": "0xDcC5933bc3567E7798Ff00Ab3413cF5f5801BD41", + "PluginSetupProcessor": "0x9227b311C5cecB416707F1C8B7Ca1b52649AabEc", + "DAOFactory": "0x5bdbaafd90b908058567080513635f560f896918", + "AddresslistVotingSetup": "0xD1CE76c26bc20255157C8ef478276eb115eC02a7", + "TokenVotingSetup": "0x76D3795Df5acF2e2141557BA1Cf094fd54d4e10C", + "AdminSetup": "0x40a3EF0f0780e044EbDDEdAa9AB225158f315afd", + "MultisigSetup": "0x2C233F09CaB08BC66b750CB80da401Bd700B74a0", + "address-list-voting-repo": "0x71570268A86A80B5cCa3F5e430c2BAa3F4b26278", + "token-voting-repo": "0xaCa70D8c462940B839DE386BcDD4CACf745632cA", + "admin-repo": "0x0DF9b15550fF39149e491dDD154b28f587e0cD16", + "multisig-repo": "0x2c4690b8be39adAd4F15A69340d5035aC6E53eEF" + }, + "polygon": { + "AddresslistVotingSetup": "0x622DB36633643E4A4075ecc3A309a4f0B942922a", + "AdminSetup": "0x82aBAfBf46759358c705c7E323543A7Be47AbAf0", + "managingDAO": "0x6d4FB6Ff01A172774f42789fcfcdd84E68c28494", + "DAOFactory": "0x51Ead12DEcD31ea75e1046EdFAda14dd639789b8", + "DAORegistry": "0x96E54098317631641703404C06A5afAD89da7373", + "DAORegistry_Implementation": "0x5B3B36BdC9470963A2734D6a0d2F6a64C21C159f", + "DAO_ENSSubdomainRegistrar": "0x07f49c49Ce2A99CF7C28F66673d406386BDD8Ff4", + "DAO_ENSSubdomainRegistrar_Implementation": "0x35B62715459cB60bf6dC17fF8cfe138EA305E7Ee", + "managingDAOImplemenation": "0xCa834B3F404c97273f34e108029eEd776144d324", + "ENSRegistry": "0x57bf333951967a0cC0afcD58FC7959Ca0Eae6905", + "PluginRepoFactory": "0x6E924eA5864044D8642385683fFA5AD42FB687f2", + "PluginRepoRegistry": "0xA03C2182af8eC460D498108C92E8638a580b94d4", + "PluginRepoRegistry_Implementation": "0xE978942c691e43f65c1B7c7F8f1dc8cDF061B13f", + "PluginSetupProcessor": "0x879D9dfe3F36d7684BeC1a2bB4Aa8E8871A7245B", + "Plugin_ENSSubdomainRegistrar": "0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e", + "Plugin_ENSSubdomainRegistrar_Implementation": "0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f", + "PublicResolver": "0x74b3B3504B5d6D1c6247009c9b1e3D8cFF7bd445", + "TokenVotingSetup": "0x03445b197271CB3BE5E453745eD98a05793a4538", + "MultisigSetup": "0xD63A8Cfb0eec960C3e70F96a9e3F3091f3FD70b6", + "address-list-voting-repo": "0x641DdEdc2139d9948e8dcC936C1Ab2314D9181E6", + "token-voting-repo": "0xae67aea0B830ed4504B36670B5Fa70c5C386Bb58", + "admin-repo": "0x7fF570473d0876db16A59e8F04EE7F17Ab117309", + "multisig-repo": "0x5A5035E7E8aeff220540F383a9cf8c35929bcF31" + } +} \ No newline at end of file diff --git a/deployments/existing-contracts/existing_ENSFramework.json b/deployments/deployed-contracts/deployed_ENSFramework.json similarity index 96% rename from deployments/existing-contracts/existing_ENSFramework.json rename to deployments/deployed-contracts/deployed_ENSFramework.json index bda503b..831909c 100644 --- a/deployments/existing-contracts/existing_ENSFramework.json +++ b/deployments/deployed-contracts/deployed_ENSFramework.json @@ -4,4 +4,4 @@ "daoResolver": "0xdbFf6be618180E0FF0d74dd3B6BdC1b5de074273", "pluginResolver": "0xc796bB1AfEBc56daDF6CAcD2aDa78055e5381971" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/deployments/deploymentTypes.ts b/deployments/deploymentTypes.ts new file mode 100644 index 0000000..7d1c526 --- /dev/null +++ b/deployments/deploymentTypes.ts @@ -0,0 +1,18 @@ +import { DAO, DAOFactory, DAORegistry, ENS, ENSSubdomainRegistrar, PluginRepoFactory, PluginRepoRegistry, PluginSetupProcessor, PublicResolver } from "../typechain-types"; + +export interface AragonOSxFrameworkContracts { + ManagingDAO : DAO; + DAO_ENSSubdomainRegistrar: ENSSubdomainRegistrar; + Plugin_ENSSubdomainRegistrar: ENSSubdomainRegistrar; + DAORegistry: DAORegistry; + PluginRepoRegistry: PluginRepoRegistry; + PluginRepoFactory : PluginRepoFactory; + PluginSetupProcessor: PluginSetupProcessor; + DAOFactory: DAOFactory; +} + +export interface ENSFrameworkContracts { + ens: ENS; + daoResolver: PublicResolver; + pluginResolver: PublicResolver; +} \ No newline at end of file diff --git a/deployments/existing-contracts/existing_AragonOSxFramework.json b/deployments/existing-contracts/existing_AragonOSxFramework.json deleted file mode 100644 index 11ed385..0000000 --- a/deployments/existing-contracts/existing_AragonOSxFramework.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "goerli": { - "managingDAOImplemenation": "0x99C83C89C59166f7f766A221D5D0Ee00D37170c3", - "managingDAO": "0xB76F8d3512497040a96E77141c951a5374F24Eb9", - "DAO_ENSSubdomainRegistrar_Implementation": "0x394B49Cc32Dc81B8EaCdeb62A6Fa66F31D1D022c", - "DAO_ENSSubdomainRegistrar": "0xC62820f3E74cC82F89100032Ad7F04682F9EdaE0", - "Plugin_ENSSubdomainRegistrar_Implementation": "0xbcE9b6fE957464aF2B739337bd1a936EbFCB5B48", - "Plugin_ENSSubdomainRegistrar": "0xd5656b6d1bc0354073f62AAbc1430530C331979c", - "DAORegistry_Implementation": "0xa796AC80af77a52AdA92778d8fb6133792480B77", - "DAORegistry": "0xd51ac19130A73455F8B3b1c26aFea21D6bA88E54", - "PluginRepoRegistry_Implementation": "0x3861Ef32c1bFcdd53E9AaE4af1C9f47390c17fBf", - "PluginRepoRegistry": "0x970Eb7Dd57c9F0dc4c5a10c06653d1103946b508", - "PluginRepoFactory": "0x301868712b77744A3C0E5511609238399f0A2d4d", - "PluginSetupProcessor": "0xE8B5d8D66a02CD1b9Bd32a4064D7ABa45F51305e", - "DAOFactory": "0x16B6c6674fEf5d29C9a49EA68A19944f5a8471D3", - "AddresslistVotingSetup": "0x4980e5B4394B326c069A54C9ED0Dee2659227352", - "TokenVotingSetup": "0x64B336524ea859ed2133c93e4B18be17f44692eE", - "AdminSetup": "0x633845bB511DE83EA31b8717614d88fa7b569694", - "MultisigSetup": "0xBFd84852C8007Bf148721d2c20F69456F193b201", - "address-list-voting-repo": "0xbD293e27226EF2b85E84FADCF2d5135AbC52e50A", - "token-voting-repo": "0xFCc843C48BD44e5dA5976a2f2d85772D59C5959E", - "admin-repo": "0xF66348E9865bb0f29B889E7c0FE1BCf4acAb5f54", - "multisig-repo": "0x92C090cffC592B1bC321aCfAF735057B876375F8" - }, - "mainnet": { - "managingDAOImplemenation": "0x005098056a837c2c4F99C7eCeE976F8D90bdFFF8", - "managingDAO": "0xf2d594F3C93C19D7B1a6F15B5489FFcE4B01f7dA", - "DAO_ENSSubdomainRegistrar_Implementation": "0xCe0B4124dea6105bfB85fB4461c4D39f360E9ef3", - "DAO_ENSSubdomainRegistrar": "0xE640Da5AD169630555A86D9b6b9C145B4961b1EB", - "Plugin_ENSSubdomainRegistrar_Implementation": "0x08633901DdF9cD8e2DC3a073594d0A7DaD6f3f57", - "Plugin_ENSSubdomainRegistrar": "0x35B62715459cB60bf6dC17fF8cfe138EA305E7Ee", - "DAORegistry_Implementation": "0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f", - "DAORegistry": "0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e", - "PluginRepoRegistry_Implementation": "0xddCc39a2a0047Eb47EdF94180452cbaB14d426EF", - "PluginRepoRegistry": "0x5B3B36BdC9470963A2734D6a0d2F6a64C21C159f", - "PluginRepoFactory": "0x96E54098317631641703404C06A5afAD89da7373", - "PluginSetupProcessor": "0xE978942c691e43f65c1B7c7F8f1dc8cDF061B13f", - "DAOFactory": "0xA03C2182af8eC460D498108C92E8638a580b94d4", - "AddresslistVotingSetup": "0x360586dB62DA31327B2462BA27bEb3e48ebbf396", - "TokenVotingSetup": "0xB2A2b32b9d885C85d5b229C0509341c37CaE7483", - "AdminSetup": "0xBFD541bc4fcE14adf1Fb9258574D3cBF5f55a894", - "MultisigSetup": "0x8d6726Fe85Caa585d88FD8342ebEEE88d703E754", - "address-list-voting-repo": "0xC207767d8A7a28019AFFAEAe6698F84B5526EbD7", - "token-voting-repo": "0xb7401cD221ceAFC54093168B814Cc3d42579287f", - "admin-repo": "0xA4371a239D08bfBA6E8894eccf8466C6323A52C3", - "multisig-repo": "0x8c278e37D0817210E18A7958524b7D0a1fAA6F7b" - }, - "mumbai": { - "managingDAOImplemenation": "0x5E993db91Fd2c713Df1110358396EAc60d54fE66", - "managingDAO": "0xE1De373E219a0d19a0500e599adb903477bCA0f9", - "ENSRegistry": "0xD24A78824dF3C29CA03661368e6437b767A5422D", - "PublicResolver": "0xdbFf6be618180E0FF0d74dd3B6BdC1b5de074273", - "DAO_ENSSubdomainRegistrar_Implementation": "0xD5baCA29C944A28f1f568F7e69B119030914c15D", - "DAO_ENSSubdomainRegistrar": "0xC528B8AA6a4D0f21455a06b6D7A41fd795619C31", - "Plugin_ENSSubdomainRegistrar_Implementation": "0x99965D7cFFE21C4AC94526AAFEd33E9EaA27f004", - "Plugin_ENSSubdomainRegistrar": "0x2EfcED958034c3BC455273153C3e604D34C78e46", - "DAORegistry_Implementation": "0xE5058D785C934279Af1EF7E90BB5D58048829256", - "DAORegistry": "0x6dD0C8b7F9406206ceAA01B5576D9d46e9298f0E", - "PluginRepoRegistry_Implementation": "0xab27e29F579C870F66F48F4825A4D294AE540818", - "PluginRepoRegistry": "0xc796bB1AfEBc56daDF6CAcD2aDa78055e5381971", - "PluginRepoFactory": "0xDcC5933bc3567E7798Ff00Ab3413cF5f5801BD41", - "PluginSetupProcessor": "0x9227b311C5cecB416707F1C8B7Ca1b52649AabEc", - "DAOFactory": "0x5bDBaAfd90B908058567080513635f560F896918", - "AddresslistVotingSetup": "0xD1CE76c26bc20255157C8ef478276eb115eC02a7", - "TokenVotingSetup": "0x76D3795Df5acF2e2141557BA1Cf094fd54d4e10C", - "AdminSetup": "0x40a3EF0f0780e044EbDDEdAa9AB225158f315afd", - "MultisigSetup": "0x8b2361C65E898F40372a0DD5E1BfEE9895A676B3", - "address-list-voting-repo": "0x71570268A86A80B5cCa3F5e430c2BAa3F4b26278", - "token-voting-repo": "0xaCa70D8c462940B839DE386BcDD4CACf745632cA", - "admin-repo": "0x0DF9b15550fF39149e491dDD154b28f587e0cD16", - "multisig-repo": "0x2c4690b8be39adAd4F15A69340d5035aC6E53eEF" - }, - "polygon": { - "AddresslistVotingSetup": "0x622DB36633643E4A4075ecc3A309a4f0B942922a", - "AdminSetup": "0x82aBAfBf46759358c705c7E323543A7Be47AbAf0", - "managingDAO": "0x6d4FB6Ff01A172774f42789fcfcdd84E68c28494", - "DAOFactory": "0x51Ead12DEcD31ea75e1046EdFAda14dd639789b8", - "DAORegistry": "0x96E54098317631641703404C06A5afAD89da7373", - "DAORegistry_Implementation": "0x5B3B36BdC9470963A2734D6a0d2F6a64C21C159f", - "DAO_ENSSubdomainRegistrar": "0x07f49c49Ce2A99CF7C28F66673d406386BDD8Ff4", - "DAO_ENSSubdomainRegistrar_Implementation": "0x35B62715459cB60bf6dC17fF8cfe138EA305E7Ee", - "managingDAOImplemenation": "0xCa834B3F404c97273f34e108029eEd776144d324", - "ENSRegistry": "0x57bf333951967a0cC0afcD58FC7959Ca0Eae6905", - "PluginRepoFactory": "0x6E924eA5864044D8642385683fFA5AD42FB687f2", - "PluginRepoRegistry": "0xA03C2182af8eC460D498108C92E8638a580b94d4", - "PluginRepoRegistry_Implementation": "0xE978942c691e43f65c1B7c7F8f1dc8cDF061B13f", - "PluginSetupProcessor": "0x879D9dfe3F36d7684BeC1a2bB4Aa8E8871A7245B", - "Plugin_ENSSubdomainRegistrar": "0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e", - "Plugin_ENSSubdomainRegistrar_Implementation": "0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f", - "PublicResolver": "0x74b3B3504B5d6D1c6247009c9b1e3D8cFF7bd445", - "TokenVotingSetup": "0x03445b197271CB3BE5E453745eD98a05793a4538", - "MultisigSetup": "0xD63A8Cfb0eec960C3e70F96a9e3F3091f3FD70b6", - "address-list-voting-repo": "0x641DdEdc2139d9948e8dcC936C1Ab2314D9181E6", - "token-voting-repo": "0xae67aea0B830ed4504B36670B5Fa70c5C386Bb58", - "admin-repo": "0x7fF570473d0876db16A59e8F04EE7F17Ab117309", - "multisig-repo": "0x5A5035E7E8aeff220540F383a9cf8c35929bcF31" - } - } \ No newline at end of file diff --git a/example-facet/CounterFacet.sol b/example-facet/CounterFacet.sol new file mode 100644 index 0000000..44c9005 --- /dev/null +++ b/example-facet/CounterFacet.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +import { IFacet } from "../contracts/facets/IFacet.sol"; +import { ICounterFacet } from "./ICounterFacet.sol"; +import { LibCounterStorage } from "./LibCounterStorage.sol"; + +contract CounterFacet is ICounterFacet, IFacet { + struct CounterFacetInitParams { + uint myNumber; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + // Decode the parameters + CounterFacetInitParams memory _params = abi.decode(_initParams, (CounterFacetInitParams)); + // Set the storage variables using the unique init + __CounterFacet_init(_params); + } + + /* This init function is needed for the (typescript) deployment to automatically + * detect the parameters for initialization. + */ + function __CounterFacet_init(CounterFacetInitParams memory _initParams) public virtual { + LibCounterStorage.Storage storage ds = LibCounterStorage.getStorage(); + ds.myNumber = _initParams.myNumber; + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); // call the deinit() function of the superclass as convention. + + // This function comes from IFacet, it removes the interface from the supported interfaces + unregisterInterface(type(ICounterFacet).interfaceId); // Change this here + } + + /// @inheritdoc ICounterFacet + function incrementCounter() external override returns (uint) { + LibCounterStorage.Storage storage myStorage = LibCounterStorage.getStorage(); + myStorage.myNumber = myStorage.myNumber + 1; // You might want to replace this with SafeMath + return myStorage.myNumber; + } + + /// @inheritdoc ICounterFacet + function getMyNumber() external view override returns (uint) { + return LibCounterStorage.getStorage().myNumber; + } + + /// @inheritdoc ICounterFacet + function setMyNumber(uint _myNumber) external override { + LibCounterStorage.getStorage().myNumber = _myNumber; + } +} \ No newline at end of file diff --git a/example-facet/ICounterFacet.sol b/example-facet/ICounterFacet.sol new file mode 100644 index 0000000..254a506 --- /dev/null +++ b/example-facet/ICounterFacet.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +interface ICounterFacet { + /// @notice This function increments a number by 1 + /// @return uint The new value of our number + function incrementCounter() external returns (uint); + + /// @notice This function returns our number + /// @return uint The value of our number + function getMyNumber() external view returns (uint); + + /// @notice This function sets our number + /// @param _myNumber The new value of our number + function setMyNumber(uint _myNumber) external; +} \ No newline at end of file diff --git a/example-facet/LibCounterStorage.sol b/example-facet/LibCounterStorage.sol new file mode 100644 index 0000000..df32cbb --- /dev/null +++ b/example-facet/LibCounterStorage.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +library LibCounterStorage { + bytes32 constant COUNTER_STORAGE_POSITION = + keccak256("counter.diamond.storage.position"); // This should be a unique hash! + + // Put your storage variables here + struct Storage { + uint myNumber; + // plus any other storage variables you might want... + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = COUNTER_STORAGE_POSITION; // don't forget to change this variable name + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/example-facet/barebones/ITemplateFacet.sol.example b/example-facet/barebones/ITemplateFacet.sol.example new file mode 100644 index 0000000..4739104 --- /dev/null +++ b/example-facet/barebones/ITemplateFacet.sol.example @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +interface ICounterFacet {} \ No newline at end of file diff --git a/example-facet/barebones/LibTemplateStorage.sol.example b/example-facet/barebones/LibTemplateStorage.sol.example new file mode 100644 index 0000000..1981f5a --- /dev/null +++ b/example-facet/barebones/LibTemplateStorage.sol.example @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +library LibCounterStorage { + bytes32 constant COUNTER_STORAGE_POSITION = + keccak256("counter.diamond.storage.position"); // This should be a unique hash! + + // Put your storage variables here + struct Storage { + // TODO: DELETE THIS VARIABLE! + uint deleteMe; + } + + function getStorage() internal pure returns (Storage storage ds) { + bytes32 position = COUNTER_STORAGE_POSITION; // don't forget to change this variable name + assembly { + ds.slot := position + } + } +} \ No newline at end of file diff --git a/example-facet/barebones/TemplateFacet.sol.example b/example-facet/barebones/TemplateFacet.sol.example new file mode 100644 index 0000000..78d19a4 --- /dev/null +++ b/example-facet/barebones/TemplateFacet.sol.example @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + */ + +pragma solidity ^0.8.0; + +/* INSERT IFACET IMPORT HERE */ +import { ICounterFacet } from "./ICounterFacet.sol"; +/* INSERT STORAGE IMPORT HERE */ + +contract CounterFacet is ICounterFacet, IFacet { + struct CounterFacetInitParams { + // TODO: DELETE THIS VARIABLE! + uint deleteMe; + } + + /// @inheritdoc IFacet + function init(bytes memory _initParams) public virtual override { + // Decode the parameters + CounterFacetInitParams memory _params = abi.decode(_initParams, (CounterFacetInitParams)); + // Set the storage variables using the unique init + __CounterFacet_init(_params); + } + + /* This init function is needed for the (typescript) deployment to automatically + * detect the parameters for initialization. + */ + function __CounterFacet_init(CounterFacetInitParams memory _initParams) public virtual { + // LibCounterStorage.Storage storage ds = LibCounterStorage.getStorage(); + } + + /// @inheritdoc IFacet + function deinit() public virtual override { + super.deinit(); // call the deinit() function of the superclass as convention. + + // This function comes from IFacet, it removes the interface from the supported interfaces + unregisterInterface(type(ICounterFacet).interfaceId); // Change this here + } +} \ No newline at end of file diff --git a/generated/abis.json b/generated/abis.json new file mode 100644 index 0000000..5312e73 --- /dev/null +++ b/generated/abis.json @@ -0,0 +1 @@ +{"DAO":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"ActionFailed","type":"error"},{"inputs":[],"name":"AnyAddressDisallowedForWhoAndWhere","type":"error"},{"inputs":[],"name":"ConditionNotPresentForAnyAddress","type":"error"},{"inputs":[],"name":"InsufficientGas","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"NativeTokenDepositAmountMismatch","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"internalType":"address","name":"currentCondition","type":"address"},{"internalType":"address","name":"newCondition","type":"address"}],"name":"PermissionAlreadyGrantedForDifferentCondition","type":"error"},{"inputs":[],"name":"PermissionsForAnyAddressDisallowed","type":"error"},{"inputs":[],"name":"TooManyActions","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"Unauthorized","type":"error"},{"inputs":[{"internalType":"bytes4","name":"callbackSelector","type":"bytes4"},{"internalType":"bytes4","name":"magicNumber","type":"bytes4"}],"name":"UnkownCallback","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"CallbackReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_reference","type":"string"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"actor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"callId","type":"bytes32"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"failureMap","type":"uint256"},{"indexed":false,"internalType":"bytes[]","name":"execResults","type":"bytes[]"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"contract IPermissionCondition","name":"condition","type":"address"}],"name":"Granted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"MetadataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeTokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"daoURI","type":"string"}],"name":"NewURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signatureValidator","type":"address"}],"name":"SignatureValidatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"indexed":false,"internalType":"bytes4","name":"callbackSelector","type":"bytes4"},{"indexed":false,"internalType":"bytes4","name":"magicNumber","type":"bytes4"}],"name":"StandardCallbackRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"forwarder","type":"address"}],"name":"TrustedForwarderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"EXECUTE_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTER_STANDARD_CALLBACK_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_METADATA_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_SIGNATURE_VALIDATOR_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_TRUSTED_FORWARDER_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_DAO_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"_items","type":"tuple[]"}],"name":"applyMultiTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.SingleTargetPermission[]","name":"items","type":"tuple[]"}],"name":"applySingleTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_reference","type":"string"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_callId","type":"bytes32"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"},{"internalType":"uint256","name":"_allowFailureMap","type":"uint256"}],"name":"execute","outputs":[{"internalType":"bytes[]","name":"execResults","type":"bytes[]"},{"internalType":"uint256","name":"failureMap","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTrustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"grant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"contract IPermissionCondition","name":"_condition","type":"address"}],"name":"grantWithCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"},{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"string","name":"daoURI_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"isGranted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"},{"internalType":"bytes4","name":"_callbackSelector","type":"bytes4"},{"internalType":"bytes4","name":"_magicNumber","type":"bytes4"}],"name":"registerStandardCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newDaoURI","type":"string"}],"name":"setDaoURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signatureValidator","type":"address"}],"name":"setSignatureValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTrustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signatureValidator","outputs":[{"internalType":"contract IERC1271","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}],"IDAO":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_reference","type":"string"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"actor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"callId","type":"bytes32"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"failureMap","type":"uint256"},{"indexed":false,"internalType":"bytes[]","name":"execResults","type":"bytes[]"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"MetadataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeTokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signatureValidator","type":"address"}],"name":"SignatureValidatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"indexed":false,"internalType":"bytes4","name":"callbackSelector","type":"bytes4"},{"indexed":false,"internalType":"bytes4","name":"magicNumber","type":"bytes4"}],"name":"StandardCallbackRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"forwarder","type":"address"}],"name":"TrustedForwarderSet","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_reference","type":"string"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_callId","type":"bytes32"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"},{"internalType":"uint256","name":"_allowFailureMap","type":"uint256"}],"name":"execute","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTrustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"},{"internalType":"bytes4","name":"_callbackSelector","type":"bytes4"},{"internalType":"bytes4","name":"_magicNumber","type":"bytes4"}],"name":"registerStandardCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signatureValidator","type":"address"}],"name":"setSignatureValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IEIP4824":[{"inputs":[],"name":"daoURI","outputs":[{"internalType":"string","name":"_daoURI","type":"string"}],"stateMutability":"view","type":"function"}],"IPermissionCondition":[{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"isGranted","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"}],"PermissionLib":[{"inputs":[],"name":"NO_CONDITION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"PermissionManager":[{"inputs":[],"name":"AnyAddressDisallowedForWhoAndWhere","type":"error"},{"inputs":[],"name":"ConditionNotPresentForAnyAddress","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"internalType":"address","name":"currentCondition","type":"address"},{"internalType":"address","name":"newCondition","type":"address"}],"name":"PermissionAlreadyGrantedForDifferentCondition","type":"error"},{"inputs":[],"name":"PermissionsForAnyAddressDisallowed","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"contract IPermissionCondition","name":"condition","type":"address"}],"name":"Granted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Revoked","type":"event"},{"inputs":[],"name":"ROOT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"_items","type":"tuple[]"}],"name":"applyMultiTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.SingleTargetPermission[]","name":"items","type":"tuple[]"}],"name":"applySingleTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"grant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"contract IPermissionCondition","name":"_condition","type":"address"}],"name":"grantWithCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"isGranted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IPlugin":[{"inputs":[],"name":"pluginType","outputs":[{"internalType":"enum IPlugin.PluginType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}],"Plugin":[{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginType","outputs":[{"internalType":"enum IPlugin.PluginType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"PluginCloneable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginType","outputs":[{"internalType":"enum IPlugin.PluginType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"PluginUUPSUpgradeable":[{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_PLUGIN_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginType","outputs":[{"internalType":"enum IPlugin.PluginType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"DaoAuthorizable":[{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"DaoAuthorizableUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"IMembership":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IProposal":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint64","name":"startDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endDate","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"allowFailureMap","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"CallbackHandler":[{"inputs":[{"internalType":"bytes4","name":"callbackSelector","type":"bytes4"},{"internalType":"bytes4","name":"magicNumber","type":"bytes4"}],"name":"UnkownCallback","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"CallbackReceived","type":"event"}],"DAOFactory":[{"inputs":[{"internalType":"contract DAORegistry","name":"_registry","type":"address"},{"internalType":"contract PluginSetupProcessor","name":"_pluginSetupProcessor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NoPluginProvided","type":"error"},{"inputs":[{"components":[{"internalType":"address","name":"trustedForwarder","type":"address"},{"internalType":"string","name":"daoURI","type":"string"},{"internalType":"string","name":"subdomain","type":"string"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"internalType":"struct DAOFactory.DAOSettings","name":"_daoSettings","type":"tuple"},{"components":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct DAOFactory.PluginSettings[]","name":"_pluginSettings","type":"tuple[]"}],"name":"createDao","outputs":[{"internalType":"contract DAO","name":"createdDao","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoBase","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoRegistry","outputs":[{"internalType":"contract DAORegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginSetupProcessor","outputs":[{"internalType":"contract PluginSetupProcessor","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"DAORegistry":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractAlreadyRegistered","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractERC165SupportInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractInterfaceInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"inputs":[{"internalType":"string","name":"subdomain","type":"string"}],"name":"InvalidDaoSubdomain","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"subdomain","type":"string"}],"name":"DAORegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"REGISTER_DAO_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_REGISTRY_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entries","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IDAO","name":"_managingDao","type":"address"},{"internalType":"contract ENSSubdomainRegistrar","name":"_subdomainRegistrar","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IDAO","name":"dao","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"subdomain","type":"string"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subdomainRegistrar","outputs":[{"internalType":"contract ENSSubdomainRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetInterfaceId","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"IPluginRepo":[{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"},{"internalType":"address","name":"_pluginSetupAddress","type":"address"},{"internalType":"bytes","name":"_buildMetadata","type":"bytes"},{"internalType":"bytes","name":"_releaseMetadata","type":"bytes"}],"name":"createVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"},{"internalType":"bytes","name":"_releaseMetadata","type":"bytes"}],"name":"updateReleaseMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"}],"PluginRepo":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AnyAddressDisallowedForWhoAndWhere","type":"error"},{"inputs":[],"name":"ConditionNotPresentForAnyAddress","type":"error"},{"inputs":[],"name":"EmptyReleaseMetadata","type":"error"},{"inputs":[],"name":"InvalidPluginSetupInterface","type":"error"},{"inputs":[{"internalType":"uint8","name":"latestRelease","type":"uint8"},{"internalType":"uint8","name":"newRelease","type":"uint8"}],"name":"InvalidReleaseIncrement","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"internalType":"address","name":"currentCondition","type":"address"},{"internalType":"address","name":"newCondition","type":"address"}],"name":"PermissionAlreadyGrantedForDifferentCondition","type":"error"},{"inputs":[],"name":"PermissionsForAnyAddressDisallowed","type":"error"},{"inputs":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"},{"internalType":"address","name":"pluginSetup","type":"address"}],"name":"PluginSetupAlreadyInPreviousRelease","type":"error"},{"inputs":[],"name":"ReleaseDoesNotExist","type":"error"},{"inputs":[],"name":"ReleaseZeroNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"Unauthorized","type":"error"},{"inputs":[{"internalType":"bytes32","name":"versionHash","type":"bytes32"}],"name":"VersionHashDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"contract IPermissionCondition","name":"condition","type":"address"}],"name":"Granted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"release","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"releaseMetadata","type":"bytes"}],"name":"ReleaseMetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"permissionId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"here","type":"address"},{"indexed":false,"internalType":"address","name":"where","type":"address"},{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"release","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"build","type":"uint16"},{"indexed":true,"internalType":"address","name":"pluginSetup","type":"address"},{"indexed":false,"internalType":"bytes","name":"buildMetadata","type":"bytes"}],"name":"VersionCreated","type":"event"},{"inputs":[],"name":"MAINTAINER_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_REPO_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"_items","type":"tuple[]"}],"name":"applyMultiTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.SingleTargetPermission[]","name":"items","type":"tuple[]"}],"name":"applySingleTargetPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"}],"name":"buildCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"},{"internalType":"address","name":"_pluginSetup","type":"address"},{"internalType":"bytes","name":"_buildMetadata","type":"bytes"},{"internalType":"bytes","name":"_releaseMetadata","type":"bytes"}],"name":"createVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pluginSetup","type":"address"}],"name":"getLatestVersion","outputs":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"tag","type":"tuple"},{"internalType":"address","name":"pluginSetup","type":"address"},{"internalType":"bytes","name":"buildMetadata","type":"bytes"}],"internalType":"struct PluginRepo.Version","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"}],"name":"getLatestVersion","outputs":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"tag","type":"tuple"},{"internalType":"address","name":"pluginSetup","type":"address"},{"internalType":"bytes","name":"buildMetadata","type":"bytes"}],"internalType":"struct PluginRepo.Version","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tagHash","type":"bytes32"}],"name":"getVersion","outputs":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"tag","type":"tuple"},{"internalType":"address","name":"pluginSetup","type":"address"},{"internalType":"bytes","name":"buildMetadata","type":"bytes"}],"internalType":"struct PluginRepo.Version","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"_tag","type":"tuple"}],"name":"getVersion","outputs":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"tag","type":"tuple"},{"internalType":"address","name":"pluginSetup","type":"address"},{"internalType":"bytes","name":"buildMetadata","type":"bytes"}],"internalType":"struct PluginRepo.Version","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"grant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"contract IPermissionCondition","name":"_condition","type":"address"}],"name":"grantWithCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"isGranted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRelease","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_where","type":"address"},{"internalType":"address","name":"_who","type":"address"},{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_release","type":"uint8"},{"internalType":"bytes","name":"_releaseMetadata","type":"bytes"}],"name":"updateReleaseMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"PluginRepoFactory":[{"inputs":[{"internalType":"contract PluginRepoRegistry","name":"_pluginRepoRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"_subdomain","type":"string"},{"internalType":"address","name":"_initialOwner","type":"address"}],"name":"createPluginRepo","outputs":[{"internalType":"contract PluginRepo","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_subdomain","type":"string"},{"internalType":"address","name":"_pluginSetup","type":"address"},{"internalType":"address","name":"_maintainer","type":"address"},{"internalType":"bytes","name":"_releaseMetadata","type":"bytes"},{"internalType":"bytes","name":"_buildMetadata","type":"bytes"}],"name":"createPluginRepoWithFirstVersion","outputs":[{"internalType":"contract PluginRepo","name":"pluginRepo","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pluginRepoBase","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginRepoRegistry","outputs":[{"internalType":"contract PluginRepoRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"PluginRepoRegistry":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractAlreadyRegistered","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractERC165SupportInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractInterfaceInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"inputs":[],"name":"EmptyPluginRepoSubdomain","type":"error"},{"inputs":[{"internalType":"string","name":"subdomain","type":"string"}],"name":"InvalidPluginSubdomain","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"subdomain","type":"string"},{"indexed":false,"internalType":"address","name":"pluginRepo","type":"address"}],"name":"PluginRepoRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"REGISTER_PLUGIN_REPO_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_REGISTRY_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entries","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IDAO","name":"_dao","type":"address"},{"internalType":"contract ENSSubdomainRegistrar","name":"_subdomainRegistrar","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"subdomain","type":"string"},{"internalType":"address","name":"pluginRepo","type":"address"}],"name":"registerPluginRepo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subdomainRegistrar","outputs":[{"internalType":"contract ENSSubdomainRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetInterfaceId","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"IPluginSetup":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"prepareInstallation","outputs":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUninstallation","outputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"uint16","name":"_currentBuild","type":"uint16"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUpdate","outputs":[{"internalType":"bytes","name":"initData","type":"bytes"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"}],"PluginSetup":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"prepareInstallation","outputs":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUninstallation","outputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"uint16","name":"_currentBuild","type":"uint16"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUpdate","outputs":[{"internalType":"bytes","name":"initData","type":"bytes"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"PluginSetupProcessor":[{"inputs":[{"internalType":"contract PluginRepoRegistry","name":"_repoRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"}],"name":"IPluginNotSupported","type":"error"},{"inputs":[{"internalType":"bytes32","name":"currentAppliedSetupId","type":"bytes32"},{"internalType":"bytes32","name":"appliedSetupId","type":"bytes32"}],"name":"InvalidAppliedSetupId","type":"error"},{"inputs":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"currentVersionTag","type":"tuple"},{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"newVersionTag","type":"tuple"}],"name":"InvalidUpdateVersion","type":"error"},{"inputs":[],"name":"PluginAlreadyInstalled","type":"error"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"}],"name":"PluginNonupgradeable","type":"error"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"}],"name":"PluginProxyUpgradeFailed","type":"error"},{"inputs":[],"name":"PluginRepoNonexistent","type":"error"},{"inputs":[{"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"}],"name":"SetupAlreadyPrepared","type":"error"},{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"SetupApplicationUnauthorized","type":"error"},{"inputs":[{"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"}],"name":"SetupNotApplicable","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":true,"internalType":"address","name":"plugin","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"appliedSetupId","type":"bytes32"}],"name":"InstallationApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"},{"indexed":true,"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"},{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"indexed":false,"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"indexed":false,"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"name":"InstallationPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":true,"internalType":"address","name":"plugin","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"}],"name":"UninstallationApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"},{"indexed":true,"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"},{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"indexed":false,"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IPluginSetup.SetupPayload","name":"setupPayload","type":"tuple"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"indexed":false,"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"name":"UninstallationPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":true,"internalType":"address","name":"plugin","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"appliedSetupId","type":"bytes32"}],"name":"UpdateApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"dao","type":"address"},{"indexed":false,"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"},{"indexed":true,"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"},{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"indexed":false,"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IPluginSetup.SetupPayload","name":"setupPayload","type":"tuple"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"indexed":false,"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"},{"indexed":false,"internalType":"bytes","name":"initData","type":"bytes"}],"name":"UpdatePrepared","type":"event"},{"inputs":[],"name":"APPLY_INSTALLATION_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"APPLY_UNINSTALLATION_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"APPLY_UPDATE_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"},{"internalType":"bytes32","name":"helpersHash","type":"bytes32"}],"internalType":"struct PluginSetupProcessor.ApplyInstallationParams","name":"_params","type":"tuple"}],"name":"applyInstallation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct PluginSetupProcessor.ApplyUninstallationParams","name":"_params","type":"tuple"}],"name":"applyUninstallation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"internalType":"bytes","name":"initData","type":"bytes"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"},{"internalType":"bytes32","name":"helpersHash","type":"bytes32"}],"internalType":"struct PluginSetupProcessor.ApplyUpdateParams","name":"_params","type":"tuple"}],"name":"applyUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct PluginSetupProcessor.PrepareInstallationParams","name":"_params","type":"tuple"}],"name":"prepareInstallation","outputs":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"versionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"}],"internalType":"struct PluginSetupRef","name":"pluginSetupRef","type":"tuple"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"setupPayload","type":"tuple"}],"internalType":"struct PluginSetupProcessor.PrepareUninstallationParams","name":"_params","type":"tuple"}],"name":"prepareUninstallation","outputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"currentVersionTag","type":"tuple"},{"components":[{"internalType":"uint8","name":"release","type":"uint8"},{"internalType":"uint16","name":"build","type":"uint16"}],"internalType":"struct PluginRepo.Tag","name":"newVersionTag","type":"tuple"},{"internalType":"contract PluginRepo","name":"pluginSetupRepo","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"setupPayload","type":"tuple"}],"internalType":"struct PluginSetupProcessor.PrepareUpdateParams","name":"_params","type":"tuple"}],"name":"prepareUpdate","outputs":[{"internalType":"bytes","name":"initData","type":"bytes"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repoRegistry","outputs":[{"internalType":"contract PluginRepoRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"states","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"currentAppliedSetupId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"pluginInstallationId","type":"bytes32"},{"internalType":"bytes32","name":"preparedSetupId","type":"bytes32"}],"name":"validatePreparedSetupId","outputs":[],"stateMutability":"view","type":"function"}],"InterfaceBasedRegistry":[{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractAlreadyRegistered","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractERC165SupportInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"ContractInterfaceInvalid","type":"error"},{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_REGISTRY_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entries","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetInterfaceId","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"ENSSubdomainRegistrar":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"subnode","type":"bytes32"},{"internalType":"address","name":"nodeOwner","type":"address"}],"name":"AlreadyRegistered","type":"error"},{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"InvalidResolver","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"REGISTER_ENS_SUBDOMAIN_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_REGISTRAR_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IDAO","name":"_managingDao","type":"address"},{"internalType":"contract ENS","name":"_ens","type":"address"},{"internalType":"bytes32","name":"_node","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"node","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_label","type":"bytes32"},{"internalType":"address","name":"_targetAddress","type":"address"}],"name":"registerSubnode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_resolver","type":"address"}],"name":"setDefaultResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"Buffer":[],"BytesUtils":[{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"OffsetOutOfBoundsError","type":"error"}],"RRUtils":[],"IBaseRegistrar":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nameExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"reclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"register","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ENS":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setSubnodeRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}],"ENSRegistry":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setSubnodeRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}],"FIFSRegistrar":[{"inputs":[{"internalType":"contract ENS","name":"ensAddr","type":"address"},{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IMulticallable":[{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"}],"Multicallable":[{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nodehash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"PublicResolver":[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"},{"internalType":"contract INameWrapper","name":"wrapperAddress","type":"address"},{"internalType":"address","name":"_trustedETHController","type":"address"},{"internalType":"address","name":"_trustedReverseRegistrar","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":true,"internalType":"bool","name":"approved","type":"bool"}],"name":"Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"lastzonehash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"zonehash","type":"bytes"}],"name":"DNSZonehashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"delegate","type":"address"}],"name":"isApprovedFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nodehash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setZonehash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"zonehash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"Resolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"lastzonehash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"zonehash","type":"bytes"}],"name":"DNSZonehashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"content","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nodehash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicallWithNodeCheck","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"multihash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDnsrr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setMultihash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"zonehash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"ResolverBase":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"ABIResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"AddrResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"ContentHashResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"DNSResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"lastzonehash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"zonehash","type":"bytes"}],"name":"DNSZonehashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setZonehash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"zonehash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"ExtendedResolver":[{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IABIResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IAddrResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"IAddressResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IContentHashResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IDNSRecordResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IDNSZoneResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"lastzonehash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"zonehash","type":"bytes"}],"name":"DNSZonehashChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"zonehash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IExtendedResolver":[{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}],"IInterfaceResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"INameResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"IPubkeyResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"}],"ITextResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"IVersionableResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}],"InterfaceResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"NameResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"PubkeyResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"TextResolver":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"newVersion","type":"uint64"}],"name":"VersionChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"recordVersions","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"IMetadataService":[{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"INameWrapper":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"ExpiryExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"fuses","type":"uint32"}],"name":"FusesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NameUnwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint32","name":"fuses","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"NameWrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint32","name":"fuseMask","type":"uint32"}],"name":"allFusesBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"canModifyName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"extendExpiry","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getData","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataService","outputs":[{"internalType":"contract IMetadataService","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"names","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"}],"name":"registerAndWrapETH2LD","outputs":[{"internalType":"uint256","name":"registrarExpiry","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registrar","outputs":[{"internalType":"contract IBaseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"labelHash","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[{"internalType":"uint256","name":"expires","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setChildFuses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"}],"name":"setFuses","outputs":[{"internalType":"uint32","name":"newFuses","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMetadataService","name":"_metadataService","type":"address"}],"name":"setMetadataService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setSubnodeRecord","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract INameWrapperUpgrade","name":"_upgradeAddress","type":"address"}],"name":"setUpgradeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"newRegistrant","type":"address"},{"internalType":"address","name":"newController","type":"address"}],"name":"unwrapETH2LD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeContract","outputs":[{"internalType":"contract INameWrapperUpgrade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"address","name":"resolver","type":"address"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"},{"internalType":"address","name":"resolver","type":"address"}],"name":"wrapETH2LD","outputs":[],"stateMutability":"nonpayable","type":"function"}],"INameWrapperUpgrade":[{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"wrapFromUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC1822ProxiableUpgradeable":[{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"ERC1967UpgradeUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}],"IBeaconUpgradeable":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"Initializable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"}],"UUPSUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"ReentrancyGuardUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"}],"IERC1155ReceiverUpgradeable":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IERC1155Upgradeable":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IERC20Upgradeable":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IERC20PermitUpgradeable":[{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SafeERC20Upgradeable":[],"IERC721ReceiverUpgradeable":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"AddressUpgradeable":[],"ContextUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"}],"StorageSlotUpgradeable":[],"ERC165CheckerUpgradeable":[],"ERC165StorageUpgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"ERC165Upgradeable":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IERC165Upgradeable":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"Ownable":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IVotes":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC1271":[{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"}],"IERC1822Proxiable":[{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}],"Clones":[],"ERC1967Proxy":[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"ERC1967Upgrade":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}],"Proxy":[{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"IBeacon":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"ReentrancyGuard":[],"ERC1155":[{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"IERC1155":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IERC1155Receiver":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IERC1155MetadataURI":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"ERC20":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IERC20":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IERC20Metadata":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IERC20Permit":[{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ERC721":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC721":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC721Receiver":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"IERC721Metadata":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"Address":[],"Context":[],"Counters":[],"StorageSlot":[],"Strings":[],"ECDSA":[],"ERC165":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"ERC165Checker":[],"IERC165":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"Math":[],"SafeCast":[],"SafeMath":[],"DiamondGovernance":[{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"DiamondGovernanceAragon":[{"inputs":[{"internalType":"contract IDAO","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"DiamondGovernanceSetup":[{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"prepareInstallation","outputs":[{"internalType":"address","name":"plugin","type":"address"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUninstallation","outputs":[{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"},{"internalType":"uint16","name":"_currentBuild","type":"uint16"},{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address[]","name":"currentHelpers","type":"address[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IPluginSetup.SetupPayload","name":"_payload","type":"tuple"}],"name":"prepareUpdate","outputs":[{"internalType":"bytes","name":"initData","type":"bytes"},{"components":[{"internalType":"address[]","name":"helpers","type":"address[]"},{"components":[{"internalType":"enum PermissionLib.Operation","name":"operation","type":"uint8"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"condition","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"internalType":"struct PermissionLib.MultiTargetPermission[]","name":"permissions","type":"tuple[]"}],"internalType":"struct IPluginSetup.PreparedSetupData","name":"preparedSetupData","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IDiamondCut":[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"DiamondCut","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IDiamondLoupe":[{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facetAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"facetAddresses_","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"facetFunctionSelectors_","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"facets_","type":"tuple[]"}],"stateMutability":"view","type":"function"}],"IERC173":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC5805":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC6372":[{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"}],"StorageExample":[{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setVariable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"variable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"ExampleDiamond":[{"inputs":[{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"DiamondCutTestFacet":[{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"DiamondCut","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"}],"Test1Facet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"something","type":"address"}],"name":"TestEvent","type":"event"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"test1Func1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func11","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func12","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func13","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func14","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func15","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func16","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func17","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func18","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func19","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func8","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test1Func9","outputs":[],"stateMutability":"nonpayable","type":"function"}],"Test2Facet":[{"inputs":[],"name":"test2Func1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func11","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func12","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func13","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func14","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func15","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func16","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func17","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func18","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func19","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func8","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"test2Func9","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IFacet":[{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"DAOReferenceFacet":[{"inputs":[],"name":"__DAOReferenceFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IDAOReferenceFacet":[{"inputs":[],"name":"dao","outputs":[{"internalType":"contract IDAO","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"PluginFacet":[{"inputs":[],"name":"__PluginFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pluginType","outputs":[{"internalType":"enum IPlugin.PluginType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"}],"DiamondCutFacet":[{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"DiamondCut","type":"event"},{"inputs":[],"name":"DIAMOND_CUT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__DiamondCutFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"DiamondLoupeFacet":[{"inputs":[],"name":"__DiamondLoupeFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facetAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"facetAddresses_","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"_facetFunctionSelectors","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"facets_","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"OwnershipFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"__OwnershipFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IBurnVotingProposalFacet":[{"inputs":[],"name":"getProposalCreationCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalCreationCost","type":"uint256"}],"name":"setProposalCreationCost","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IPartialVotingProposalFacet":[{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"DateOutOfBounds","type":"error"},{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"MinDurationOutOfBounds","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ProposalCreationForbidden","type":"error"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecutionForbidden","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"name":"VotingSettingsUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"canExecute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"},{"internalType":"uint256","name":"_allowFailureMap","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"uint64","name":"_endDate","type":"uint64"},{"internalType":"bool","name":"_allowEarlyExecution","type":"bool"}],"name":"createProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMaxSingleWalletPower","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinParticipation","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinProposerVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint64","name":"executed","type":"uint64"},{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"bool","name":"earlyExecution","type":"bool"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint64","name":"endDate","type":"uint64"},{"internalType":"uint64","name":"snapshotBlock","type":"uint64"},{"internalType":"uint256","name":"minParticipationThresholdPower","type":"uint256"},{"internalType":"uint256","name":"maxSingleWalletPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.ProposalParameters","name":"parameters","type":"tuple"},{"components":[{"internalType":"uint256","name":"abstain","type":"uint256"},{"internalType":"uint256","name":"yes","type":"uint256"},{"internalType":"uint256","name":"no","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.Tally","name":"tally","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"internalType":"uint256","name":"allowFailureMap","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address[]","name":"voterList","type":"address[]"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"getVoteOption","outputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingMode","outputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isMinParticipationReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReachedEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxSingleWalletPower","type":"uint32"}],"name":"setMaxSingleWalletPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_minDuration","type":"uint64"}],"name":"setMinDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minParticipation","type":"uint32"}],"name":"setMinParticipation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProposerVotingPower","type":"uint256"}],"name":"setMinProposerVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_supportThreshold","type":"uint32"}],"name":"setSupportThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"_votingMode","type":"uint8"}],"name":"setVotingMode","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IProposalFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint64","name":"startDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endDate","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"allowFailureMap","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"PartialBurnVotingProposalFacet":[{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"DateOutOfBounds","type":"error"},{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"MinDurationOutOfBounds","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ProposalCreationForbidden","type":"error"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecutionForbidden","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"RatioOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint64","name":"startDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endDate","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"allowFailureMap","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"name":"VotingSettingsUpdated","type":"event"},{"inputs":[],"name":"UPDATE_VOTING_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"proposalCreationCost","type":"uint256"},{"components":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"internalType":"struct PartialVotingProposalFacet.PartialVotingProposalFacetInitParams","name":"_PartialVotingProposalFacetInitParams","type":"tuple"}],"internalType":"struct PartialBurnVotingProposalFacet.PartialBurnVotingProposalFacetInitParams","name":"_params","type":"tuple"}],"name":"__PartialBurnVotingProposalFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"internalType":"struct PartialVotingProposalFacet.PartialVotingProposalFacetInitParams","name":"_params","type":"tuple"}],"name":"__PartialVotingProposalFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"canExecute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"},{"internalType":"uint256","name":"_allowFailureMap","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"uint64","name":"_endDate","type":"uint64"},{"internalType":"bool","name":"_allowEarlyExecution","type":"bool"}],"name":"createProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMaxSingleWalletPower","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinParticipation","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinProposerVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint64","name":"executed","type":"uint64"},{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"bool","name":"earlyExecution","type":"bool"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint64","name":"endDate","type":"uint64"},{"internalType":"uint64","name":"snapshotBlock","type":"uint64"},{"internalType":"uint256","name":"minParticipationThresholdPower","type":"uint256"},{"internalType":"uint256","name":"maxSingleWalletPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.ProposalParameters","name":"parameters","type":"tuple"},{"components":[{"internalType":"uint256","name":"abstain","type":"uint256"},{"internalType":"uint256","name":"yes","type":"uint256"},{"internalType":"uint256","name":"no","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.Tally","name":"tally","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"internalType":"uint256","name":"allowFailureMap","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address[]","name":"voterList","type":"address[]"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalCreationCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"getVoteOption","outputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingMode","outputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isMinParticipationReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReachedEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxSingleWalletPower","type":"uint32"}],"name":"setMaxSingleWalletPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_minDuration","type":"uint64"}],"name":"setMinDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minParticipation","type":"uint32"}],"name":"setMinParticipation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProposerVotingPower","type":"uint256"}],"name":"setMinProposerVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalCreationCost","type":"uint256"}],"name":"setProposalCreationCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_supportThreshold","type":"uint32"}],"name":"setSupportThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"_votingMode","type":"uint8"}],"name":"setVotingMode","outputs":[],"stateMutability":"nonpayable","type":"function"}],"PartialVotingProposalFacet":[{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"DateOutOfBounds","type":"error"},{"inputs":[{"internalType":"uint64","name":"limit","type":"uint64"},{"internalType":"uint64","name":"actual","type":"uint64"}],"name":"MinDurationOutOfBounds","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ProposalCreationForbidden","type":"error"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecutionForbidden","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"RatioOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint64","name":"startDate","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endDate","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"allowFailureMap","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"name":"VotingSettingsUpdated","type":"event"},{"inputs":[],"name":"UPDATE_VOTING_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint32","name":"minParticipation","type":"uint32"},{"internalType":"uint32","name":"maxSingleWalletPower","type":"uint32"},{"internalType":"uint64","name":"minDuration","type":"uint64"},{"internalType":"uint256","name":"minProposerVotingPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.VotingSettings","name":"votingSettings","type":"tuple"}],"internalType":"struct PartialVotingProposalFacet.PartialVotingProposalFacetInitParams","name":"_params","type":"tuple"}],"name":"__PartialVotingProposalFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"canExecute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_metadata","type":"bytes"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"},{"internalType":"uint256","name":"_allowFailureMap","type":"uint256"},{"internalType":"uint64","name":"_startDate","type":"uint64"},{"internalType":"uint64","name":"_endDate","type":"uint64"},{"internalType":"bool","name":"_allowEarlyExecution","type":"bool"}],"name":"createProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMaxSingleWalletPower","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinParticipation","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinProposerVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint64","name":"executed","type":"uint64"},{"components":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"votingMode","type":"uint8"},{"internalType":"bool","name":"earlyExecution","type":"bool"},{"internalType":"uint32","name":"supportThreshold","type":"uint32"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint64","name":"endDate","type":"uint64"},{"internalType":"uint64","name":"snapshotBlock","type":"uint64"},{"internalType":"uint256","name":"minParticipationThresholdPower","type":"uint256"},{"internalType":"uint256","name":"maxSingleWalletPower","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.ProposalParameters","name":"parameters","type":"tuple"},{"components":[{"internalType":"uint256","name":"abstain","type":"uint256"},{"internalType":"uint256","name":"yes","type":"uint256"},{"internalType":"uint256","name":"no","type":"uint256"}],"internalType":"struct IPartialVotingProposalFacet.Tally","name":"tally","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"actions","type":"tuple[]"},{"internalType":"uint256","name":"allowFailureMap","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address[]","name":"voterList","type":"address[]"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"getVoteOption","outputs":[{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingMode","outputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isMinParticipationReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"isSupportThresholdReachedEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_maxSingleWalletPower","type":"uint32"}],"name":"setMaxSingleWalletPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_minDuration","type":"uint64"}],"name":"setMinDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minParticipation","type":"uint32"}],"name":"setMinParticipation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProposerVotingPower","type":"uint256"}],"name":"setMinProposerVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_supportThreshold","type":"uint32"}],"name":"setSupportThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPartialVotingFacet.VotingMode","name":"_votingMode","type":"uint8"}],"name":"setVotingMode","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IMembershipExtended":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isMemberAt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IMembershipWhitelisting":[{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ITieredMembershipStructure":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getTierAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isMemberAt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"IBurnableGovernanceStructure":[{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"walletVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IGovernanceStructure":[{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"walletVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IMintableGovernanceStructure":[{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"walletVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IPartialVotingFacet":[{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCastForbidden","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCast","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_account","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"canVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"}],"PartialBurnVotingFacet":[{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCastForbidden","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"__PartialBurnVotingFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__PartialVotingFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"canVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"}],"PartialVotingFacet":[{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCastForbidden","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IPartialVotingFacet.PartialVote","name":"voteData","type":"tuple"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"__PartialVotingFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"canVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"components":[{"internalType":"enum IPartialVotingFacet.VoteOption","name":"option","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPartialVotingFacet.PartialVote","name":"_voteData","type":"tuple"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IVerificationFacet":[{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getStamps","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getStampsAt","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_providerId","type":"string"}],"name":"getTierMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVerificationContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_providerId","type":"string"},{"internalType":"uint256","name":"_tier","type":"uint256"}],"name":"setTierMapping","outputs":[],"stateMutability":"nonpayable","type":"function"}],"VerificationFacet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[],"name":"UPDATE_TIER_MAPPING_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MEMBER_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"verificationContractAddress","type":"address"},{"internalType":"string[]","name":"providers","type":"string[]"},{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"internalType":"struct VerificationFacet.VerificationFacetInitParams","name":"_params","type":"tuple"}],"name":"__VerificationFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getStamps","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getStampsAt","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getTierAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_providerId","type":"string"}],"name":"getTierMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVerificationContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isMemberAt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_providerId","type":"string"},{"internalType":"uint256","name":"_tier","type":"uint256"}],"name":"setTierMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IRewardMultiplierFacet":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"applyMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getMultiplierQuad","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"}],"name":"setMultiplierTypeConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"},{"internalType":"uint256","name":"_baseN","type":"uint256"},{"internalType":"uint256","name":"_baseD","type":"uint256"}],"name":"setMultiplierTypeExponential","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"},{"internalType":"uint256","name":"_slopeN","type":"uint256"},{"internalType":"uint256","name":"_slopeD","type":"uint256"}],"name":"setMultiplierTypeLinear","outputs":[],"stateMutability":"nonpayable","type":"function"}],"LibCalculateGrowth":[],"RewardMultiplierFacet":[{"inputs":[],"name":"UPDATE_MULTIPLIER_TYPE_MEMBER_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"slopeN","type":"uint256"},{"internalType":"uint256","name":"slopeD","type":"uint256"}],"internalType":"struct RewardMultiplierFacet.RewardMultiplierFacetInitParams","name":"_initParams","type":"tuple"}],"name":"__RewardMultiplierFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"applyMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getMultiplierQuad","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"}],"name":"setMultiplierTypeConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"},{"internalType":"uint256","name":"_baseN","type":"uint256"},{"internalType":"uint256","name":"_baseD","type":"uint256"}],"name":"setMultiplierTypeExponential","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_initialAmount","type":"uint256"},{"internalType":"uint256","name":"_slopeN","type":"uint256"},{"internalType":"uint256","name":"_slopeD","type":"uint256"}],"name":"setMultiplierTypeLinear","outputs":[],"stateMutability":"nonpayable","type":"function"}],"GithubPullRequestFacet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"owner","type":"string"},{"indexed":false,"internalType":"string","name":"repo","type":"string"},{"indexed":false,"internalType":"string","name":"pull_number","type":"string"},{"indexed":false,"internalType":"string","name":"sha","type":"string"}],"name":"MergePullRequest","type":"event"},{"inputs":[],"name":"MERGE_PR_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__GithubPullRequestFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_owner","type":"string"},{"internalType":"string","name":"_repo","type":"string"},{"internalType":"string","name":"_pull_number","type":"string"},{"internalType":"string","name":"_sha","type":"string"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IGithubPullRequestFacet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"owner","type":"string"},{"indexed":false,"internalType":"string","name":"repo","type":"string"},{"indexed":false,"internalType":"string","name":"pull_number","type":"string"},{"indexed":false,"internalType":"string","name":"sha","type":"string"}],"name":"MergePullRequest","type":"event"},{"inputs":[{"internalType":"string","name":"_owner","type":"string"},{"internalType":"string","name":"_repo","type":"string"},{"internalType":"string","name":"_pull_number","type":"string"},{"internalType":"string","name":"_sha","type":"string"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IMiningRewardPoolFacet":[{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseMiningRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMiningRewardPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseMiningRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_miner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rewardCoinsToMiner","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ISearchSECOMonetizationFacet":[{"inputs":[],"name":"getHashCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_uniqueId","type":"string"}],"name":"payForHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashCost","type":"uint256"}],"name":"setHashCost","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ISearchSECORewardingFacet":[{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getHashCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHashDevaluationFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHashReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningRewardPoolPayoutRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardingSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toReward","type":"address"},{"internalType":"uint256","name":"_hashCount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_repFrac","type":"uint256"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"rewardMinerForHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashDevaluationFactor","type":"uint256"}],"name":"setHashDevaluationFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashReward","type":"uint256"}],"name":"setHashReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_miningRewardPoolPayoutRatio","type":"uint256"}],"name":"setMiningRewardPoolPayoutRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardingSigner","type":"address"}],"name":"setRewardingSigner","outputs":[],"stateMutability":"nonpayable","type":"function"}],"MiningRewardPoolFacet":[{"inputs":[],"name":"UPDATE_MINING_REWARD_POOL_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__MiningRewardFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseMiningRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMiningRewardPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseMiningRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_miner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rewardCoinsToMiner","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SearchSECOMonetizationFacet":[{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"RatioOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"uniqueId","type":"string"}],"name":"PaymentProcessed","type":"event"},{"inputs":[],"name":"UPDATE_HASH_COST_MAPPING_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"hashCost","type":"uint256"},{"internalType":"uint32","name":"treasuryRatio","type":"uint32"}],"internalType":"struct SearchSECOMonetizationFacet.SearchSECOMonetizationFacetInitParams","name":"_params","type":"tuple"}],"name":"__SearchSECOMonetizationFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getHashCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_uniqueId","type":"string"}],"name":"payForHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashCost","type":"uint256"}],"name":"setHashCost","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SearchSECORewardingFacet":[{"inputs":[],"name":"UPDATE_HASH_REWARD_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATE_REWARDING_SIGNER_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"miningRewardPoolPayoutRatio","type":"uint256"},{"internalType":"uint256","name":"hashDevaluationFactor","type":"uint256"}],"internalType":"struct SearchSECORewardingFacet.SearchSECORewardingFacetInitParams","name":"_params","type":"tuple"}],"name":"__SearchSECORewardingFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getHashCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHashDevaluationFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHashReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningRewardPoolPayoutRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardingSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toReward","type":"address"},{"internalType":"uint256","name":"_hashCount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_repFrac","type":"uint256"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"rewardMinerForHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashDevaluationFactor","type":"uint256"}],"name":"setHashDevaluationFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hashReward","type":"uint256"}],"name":"setHashReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_miningRewardPoolPayoutRatio","type":"uint256"}],"name":"setMiningRewardPoolPayoutRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardingSigner","type":"address"}],"name":"setRewardingSigner","outputs":[],"stateMutability":"nonpayable","type":"function"}],"AlwaysAcceptAuthFacet":[{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"auth","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"AlwaysMemberTier1Facet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getTierAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isMemberAt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}],"AlwaysMemberTier1FacetStorage":[],"AuthConsumerTestFacet":[{"inputs":[],"name":"AUTH_CONSUMER_TEST_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"AuthConsumerTestFacetStorage":[],"ExecuteAnythingFacet":[{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IDAO.Action[]","name":"_actions","type":"tuple[]"}],"name":"executeAnything","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SetMemberTierFacet":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"members","type":"address[]"}],"name":"MembersRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"definingContract","type":"address"}],"name":"MembershipContractAnnounced","type":"event"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMembers","outputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getTierAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isMemberAt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_tier","type":"uint256"}],"name":"setMemberTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SetMemberTierFacetStorage":[],"IEIP712Facet":[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct IEIP712Facet.IEIP712FacetInitParams","name":"_params","type":"tuple"}],"name":"__IEIP712Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC20ClaimableFacet":[{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ERC20OneTimeRewardFacet":[{"inputs":[],"name":"UPDATE_ONE_TIME_REWARD_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct ERC20OneTimeRewardFacet.ERC20OneTimeRewardFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20OneTimeRewardFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOneTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOneTimeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeReward","type":"uint256"}],"name":"setOneTimeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableOneTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20OneTimeVerificationRewardFacet":[{"inputs":[],"name":"UPDATE_ONE_TIME_VERIFICATION_REWARD_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string[]","name":"providers","type":"string[]"},{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"internalType":"struct ERC20OneTimeVerificationRewardFacet.ERC20OneTimeVerificationRewardFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20OneTimeVerificationRewardFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVerificationRewardAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stampIndex","type":"uint256"}],"name":"claimVerificationRewardStamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provider","type":"string"}],"name":"getProviderReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provider","type":"string"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setProviderReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableVerificationRewardAll","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stampIndex","type":"uint256"}],"name":"tokensClaimableVerificationRewardStamp","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC20OneTimeRewardFacet":[{"inputs":[],"name":"claimOneTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOneTimeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneTimeReward","type":"uint256"}],"name":"setOneTimeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableOneTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC20OneTimeVerificationRewardFacet":[{"inputs":[],"name":"claimVerificationRewardAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stampIndex","type":"uint256"}],"name":"claimVerificationRewardStamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provider","type":"string"}],"name":"getProviderReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_provider","type":"string"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setProviderReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableVerificationRewardAll","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stampIndex","type":"uint256"}],"name":"tokensClaimableVerificationRewardStamp","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20PartialBurnVotingProposalRefundFacet":[{"inputs":[],"name":"__ERC20PartialBurnVotingProposalRefundFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"refundTokensFromProposalCreation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"}],"name":"tokensRefundableFromProposalCreation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20PartialBurnVotingRefundFacet":[{"inputs":[],"name":"__ERC20PartialBurnVotingRefundFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"refundTokensFromProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"}],"name":"tokensRefundableFromProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC20PartialBurnVotingProposalRefundFacet":[{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"refundTokensFromProposalCreation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"}],"name":"tokensRefundableFromProposalCreation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC20PartialBurnVotingRefundFacet":[{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"refundTokensFromProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"}],"name":"tokensRefundableFromProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20TieredTimeClaimableFacet":[{"inputs":[],"name":"UPDATE_CLAIM_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256[]","name":"tiers","type":"uint256[]"},{"internalType":"uint256[]","name":"rewards","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"timeTillReward","type":"uint256"},{"internalType":"uint256","name":"maxTimeRewarded","type":"uint256"}],"internalType":"struct ERC20TimeClaimableFacet.ERC20TimeClaimableFacetInitParams","name":"_ERC20TimeClaimableFacetInitParams","type":"tuple"}],"internalType":"struct ERC20TieredTimeClaimableFacet.ERC20TieredTimeClaimableFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20TieredTimeClaimableFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"timeTillReward","type":"uint256"},{"internalType":"uint256","name":"maxTimeRewarded","type":"uint256"}],"internalType":"struct ERC20TimeClaimableFacet.ERC20TimeClaimableFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20TimeClaimableFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimPeriodInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimPeriodMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"}],"name":"getClaimReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodInterval","type":"uint256"}],"name":"setClaimPeriodInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodMax","type":"uint256"}],"name":"setClaimPeriodMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20TimeClaimableFacet":[{"inputs":[],"name":"UPDATE_CLAIM_SETTINGS_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"timeTillReward","type":"uint256"},{"internalType":"uint256","name":"maxTimeRewarded","type":"uint256"}],"internalType":"struct ERC20TimeClaimableFacet.ERC20TimeClaimableFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20TimeClaimableFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimPeriodInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimPeriodMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodInterval","type":"uint256"}],"name":"setClaimPeriodInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodMax","type":"uint256"}],"name":"setClaimPeriodMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"IERC20TieredTimeClaimableFacet":[{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"}],"name":"getClaimReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tier","type":"uint256"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC20TimeClaimableFacet":[{"inputs":[],"name":"claimTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimPeriodInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimPeriodMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodInterval","type":"uint256"}],"name":"setClaimPeriodInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimPeriodMax","type":"uint256"}],"name":"setClaimPeriodMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensClaimableTime","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20Facet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"ERC20PermitFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20PermitFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct IEIP712Facet.IEIP712FacetInitParams","name":"_params","type":"tuple"}],"name":"__IEIP712Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"ERC20VotesFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20PermitFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20VotesFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct IEIP712Facet.IEIP712FacetInitParams","name":"_params","type":"tuple"}],"name":"__IEIP712Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesFacet.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"ERC20DisabledFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"ERC20PermitDisabledFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"ERC20VotesDisabledFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesFacet.Checkpoint","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"GovernanceERC20BurnableFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURN_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20PermitFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20VotesFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_ERC20VotesFacetInitParams","type":"tuple"}],"internalType":"struct GovernanceERC20Facet.GovernanceERC20FacetInitParams","name":"_GovernanceERC20FacetInitParams","type":"tuple"}],"internalType":"struct GovernanceERC20BurnableFacet.GovernanceERC20BurnableFacetInitParams","name":"_params","type":"tuple"}],"name":"__GovernanceERC20BurnableFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_ERC20VotesFacetInitParams","type":"tuple"}],"internalType":"struct GovernanceERC20Facet.GovernanceERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__GovernanceERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct IEIP712Facet.IEIP712FacetInitParams","name":"_params","type":"tuple"}],"name":"__IEIP712Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesFacet.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"walletVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"GovernanceERC20DisabledFacet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesFacet.Checkpoint","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"GovernanceERC20Facet":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOCK_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20PermitFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_params","type":"tuple"}],"name":"__ERC20VotesFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct ERC20Facet.ERC20FacetInitParams","name":"_ERC20FacetInitParams","type":"tuple"}],"internalType":"struct ERC20PermitFacet.ERC20PermitFacetInitParams","name":"_ERC20PermitFacetInitParams","type":"tuple"}],"internalType":"struct ERC20VotesFacet.ERC20VotesFacetInitParams","name":"_ERC20VotesFacetInitParams","type":"tuple"}],"internalType":"struct GovernanceERC20Facet.GovernanceERC20FacetInitParams","name":"_params","type":"tuple"}],"name":"__GovernanceERC20Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct IEIP712Facet.IEIP712FacetInitParams","name":"_params","type":"tuple"}],"name":"__IEIP712Facet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20VotesFacet.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clock","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timepoint","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintVotingPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"totalVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"walletVotingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"ERC20MultiMinterFacet":[{"inputs":[],"name":"MULTIMINT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__ERC20MultiMinterFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"multimint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IERC20MultiMinterFacet":[{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"multimint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ERC20BondedToken":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"NotPermitted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURN_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"MarketMaker":[{"inputs":[{"internalType":"contract IBondedToken","name":"bondedToken_","type":"address"},{"internalType":"contract IERC20","name":"externalToken_","type":"address"},{"components":[{"internalType":"uint32","name":"theta","type":"uint32"},{"internalType":"uint32","name":"friction","type":"uint32"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"},{"internalType":"contract IBondingCurve","name":"formula","type":"address"}],"internalType":"struct CurveParameters","name":"curve_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DepositAmountCannotBeZero","type":"error"},{"inputs":[],"name":"HatchingAlreadyStarted","type":"error"},{"inputs":[],"name":"HatchingNotStarted","type":"error"},{"inputs":[],"name":"InitialReserveCannotBeZero","type":"error"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"}],"name":"InvalidGovernanceParameter","type":"error"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"NotPermitted","type":"error"},{"inputs":[],"name":"OwnerCanNotContinuousBurn","type":"error"},{"inputs":[],"name":"OwnerCanNotContinuousMint","type":"error"},{"inputs":[],"name":"WouldRecieveLessThanMinRecieve","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CONFIGURE_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENOMINATOR_PPM","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HATCH_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondedToken","outputs":[{"internalType":"contract IBondedToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmountReceived","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurveParameters","outputs":[{"components":[{"internalType":"uint32","name":"theta","type":"uint32"},{"internalType":"uint32","name":"friction","type":"uint32"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"},{"internalType":"contract IBondingCurve","name":"formula","type":"address"}],"internalType":"struct CurveParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"hatchTo","type":"address"}],"name":"hatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isHatched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmountReceived","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveRatio","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sponsoredBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sponsoredMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"SimpleHatch":[{"inputs":[{"components":[{"internalType":"contract IERC20","name":"externalToken","type":"address"},{"internalType":"contract IBondedToken","name":"bondedToken","type":"address"},{"internalType":"contract IMarketMaker","name":"pool","type":"address"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"minimumRaise","type":"uint256"},{"internalType":"uint256","name":"maximumRaise","type":"uint256"},{"internalType":"uint256","name":"hatchDeadline","type":"uint256"}],"internalType":"struct HatchParameters","name":"params_","type":"tuple"},{"components":[{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"internalType":"struct VestingSchedule","name":"schedule_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContributionWindowClosed","type":"error"},{"inputs":[],"name":"HatchNotCanceled","type":"error"},{"inputs":[],"name":"HatchNotOpen","type":"error"},{"inputs":[],"name":"HatchOngoing","type":"error"},{"inputs":[],"name":"HatchingNotStarted","type":"error"},{"inputs":[],"name":"MaxContributionReached","type":"error"},{"inputs":[],"name":"MinRaiseMet","type":"error"},{"inputs":[],"name":"NoContribution","type":"error"},{"inputs":[],"name":"NotEnoughRaised","type":"error"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"NotPermitted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Contribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"inputs":[],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"contribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"components":[{"components":[{"internalType":"contract IERC20","name":"externalToken","type":"address"},{"internalType":"contract IBondedToken","name":"bondedToken","type":"address"},{"internalType":"contract IMarketMaker","name":"pool","type":"address"},{"internalType":"uint256","name":"initialPrice","type":"uint256"},{"internalType":"uint256","name":"minimumRaise","type":"uint256"},{"internalType":"uint256","name":"maximumRaise","type":"uint256"},{"internalType":"uint256","name":"hatchDeadline","type":"uint256"}],"internalType":"struct HatchParameters","name":"params","type":"tuple"},{"internalType":"enum HatchStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"raised","type":"uint256"}],"internalType":"struct HatchState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewVesting","outputs":[{"internalType":"contract Vesting","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"Vesting":[{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"beneficiary_","type":"address"},{"internalType":"contract IERC20","name":"token_","type":"address"},{"components":[{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"internalType":"struct VestingSchedule","name":"schedule_","type":"tuple"},{"internalType":"uint256","name":"amountTotal_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"NotEnoughVestedTokens","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"OnlyBeneficiary","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"VestingScheduleNotRevocable","type":"error"},{"inputs":[],"name":"VestingScheduleRevoked","type":"error"},{"inputs":[],"name":"computeReleasableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"internalType":"struct VestingSchedule","name":"schedule","type":"tuple"},{"internalType":"uint256","name":"amountTotal","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"internalType":"struct VestingState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"revokeTo","type":"address"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBeneficiary_","type":"address"}],"name":"transferVesting","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ABCConfigureFacet":[{"inputs":[],"name":"CONFIGURE_ABC_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"marketMaker","type":"address"},{"internalType":"address","name":"hatcher","type":"address"}],"internalType":"struct ABCConfigureFacet.ABCConfigureFacetInitParams","name":"_params","type":"tuple"}],"name":"__ABCConfigureFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFormulaABC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFrictionABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHatcher","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketMaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveRatioABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThetaABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_formulaABC","type":"address"}],"name":"setFormulaABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_frictionABC","type":"uint32"}],"name":"setFrictionABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hatcher","type":"address"}],"name":"setHatcher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketMaker","type":"address"}],"name":"setMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_reserveRatioABC","type":"uint32"}],"name":"setReserveRatioABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_thetaABC","type":"uint32"}],"name":"setThetaABC","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IABCConfigureFacet":[{"inputs":[],"name":"getFormulaABC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFrictionABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHatcher","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketMaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveRatioABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThetaABC","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_formulaABC","type":"address"}],"name":"setFormulaABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_frictionABC","type":"uint32"}],"name":"setFrictionABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hatcher","type":"address"}],"name":"setHatcher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketMaker","type":"address"}],"name":"setMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_reserveRatioABC","type":"uint32"}],"name":"setReserveRatioABC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_thetaABC","type":"uint32"}],"name":"setThetaABC","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IBondedToken":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IBondingCurve":[{"inputs":[{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"continuousSupply","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"}],"name":"getContinuousBurnRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"continuousSupply","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"}],"name":"getContinuousMintReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"IMarketMaker":[{"inputs":[],"name":"getCurveParameters","outputs":[{"components":[{"internalType":"uint32","name":"theta","type":"uint32"},{"internalType":"uint32","name":"friction","type":"uint32"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"},{"internalType":"contract IBondingCurve","name":"formula","type":"address"}],"internalType":"struct CurveParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"hatchTo","type":"address"}],"name":"hatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}],"Errors":[{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"addresses","type":"uint256"},{"internalType":"uint256","name":"values","type":"uint256"}],"name":"AddressesAmountMismatch","type":"error"},{"inputs":[],"name":"BurnAmountCannotBeZero","type":"error"},{"inputs":[],"name":"ContributionWindowClosed","type":"error"},{"inputs":[],"name":"DepositAmountCannotBeZero","type":"error"},{"inputs":[],"name":"DurationCannotBeLessThanCliff","type":"error"},{"inputs":[],"name":"DurationCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint16","name":"exitFee","type":"uint16"}],"name":"ExitFeeError","type":"error"},{"inputs":[],"name":"FundingAmountHigherThanBalance","type":"error"},{"inputs":[{"internalType":"uint16","name":"fundingRate","type":"uint16"}],"name":"FundingRateError","type":"error"},{"inputs":[],"name":"HatchNotCanceled","type":"error"},{"inputs":[],"name":"HatchNotOpen","type":"error"},{"inputs":[],"name":"HatchOngoing","type":"error"},{"inputs":[],"name":"HatchingAlreadyStarted","type":"error"},{"inputs":[],"name":"HatchingNotStarted","type":"error"},{"inputs":[],"name":"InitialReserveCannotBeZero","type":"error"},{"inputs":[],"name":"InitialSupplyCannotBeZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InsufficentBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"InsufficientReserve","type":"error"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"}],"name":"InvalidGovernanceParameter","type":"error"},{"inputs":[{"internalType":"uint32","name":"value","type":"uint32"}],"name":"InvalidPPMValue","type":"error"},{"inputs":[],"name":"MaxContributionReached","type":"error"},{"inputs":[],"name":"MinRaiseMet","type":"error"},{"inputs":[],"name":"NoContribution","type":"error"},{"inputs":[],"name":"NotEnoughRaised","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"NotEnoughVestedTokens","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"OnlyBeneficiary","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"OwnerCanNotContinuousBurn","type":"error"},{"inputs":[],"name":"OwnerCanNotContinuousMint","type":"error"},{"inputs":[],"name":"SlicePeriodCannotBeZero","type":"error"},{"inputs":[],"name":"TradingAlreadyOpened","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"VestingScheduleNotInitialized","type":"error"},{"inputs":[],"name":"VestingScheduleNotRevocable","type":"error"},{"inputs":[],"name":"VestingScheduleRevoked","type":"error"},{"inputs":[],"name":"WouldRecieveLessThanMinRecieve","type":"error"}],"Events":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reimburseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"ContinuousBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fundingAmount","type":"uint256"}],"name":"ContinuousMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"hatcher","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Hatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"SponsoredBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"}],"name":"SponsoredMint","type":"event"}],"BancorBondingCurve":[{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_reserveBalance","type":"uint256"},{"internalType":"uint32","name":"_reserveRatio","type":"uint32"},{"internalType":"uint256","name":"_depositAmount","type":"uint256"}],"name":"calculatePurchaseReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_reserveBalance","type":"uint256"},{"internalType":"uint32","name":"_reserveRatio","type":"uint32"},{"internalType":"uint256","name":"_sellAmount","type":"uint256"}],"name":"calculateSaleReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_continuousTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_continuousSupply","type":"uint256"},{"internalType":"uint256","name":"_reserveBalance","type":"uint256"},{"internalType":"uint32","name":"_reserveRatio","type":"uint32"}],"name":"getContinuousBurnRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"continuousSupply","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint32","name":"reserveRatio","type":"uint32"}],"name":"getContinuousMintReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"BancorFormula":[{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_reserveBalance","type":"uint256"},{"internalType":"uint32","name":"_reserveRatio","type":"uint32"},{"internalType":"uint256","name":"_depositAmount","type":"uint256"}],"name":"calculatePurchaseReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_reserveBalance","type":"uint256"},{"internalType":"uint32","name":"_reserveRatio","type":"uint32"},{"internalType":"uint256","name":"_sellAmount","type":"uint256"}],"name":"calculateSaleReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"Power":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"Modifiers":[],"PluginStandalone":[{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"}],"name":"NotPermitted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"dao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"ERC20MonetaryToken":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"IChangeableTokenContract":[{"inputs":[],"name":"getTokenContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"setTokenContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}],"MonetaryTokenFacet":[{"inputs":[],"name":"SECOIN_MINT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_MONETARY_TOKEN_CONTRACT_PERMISSION_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"monetaryTokenContractAddress","type":"address"}],"internalType":"struct MonetaryTokenFacet.MonetaryTokenFacetInitParams","name":"_params","type":"tuple"}],"name":"__MonetaryTokenFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTokenContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initParams","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"setTokenContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}],"LibDiamond":[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"},{"internalType":"bytes","name":"initCalldata","type":"bytes"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"}],"name":"DiamondCut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}],"ABDKMathQuad":[],"LibABDKHelper":[],"LibABCConfigureStorage":[],"LibBurnVotingProposalStorage":[],"LibDAOReferenceStorage":[],"LibEIP712Storage":[],"LibERC20OneTimeRewardStorage":[],"LibERC20OneTimeVerificationRewardStorage":[],"LibERC20PermitStorage":[],"LibERC20Storage":[],"LibERC20TieredTimeClaimableStorage":[],"LibERC20TimeClaimableStorage":[],"LibERC20VotesStorage":[],"LibMiningRewardStorage":[],"LibMonetaryTokenStorage":[],"LibPartialVotingProposalStorage":[],"LibProposalStorage":[],"LibRewardMultiplierStorage":[],"LibSearchSECOMonetizationStorage":[],"LibSearchSECORewardingStorage":[],"LibVerificationStorage":[],"SignVerification":[{"inputs":[{"internalType":"uint64","name":"_threshold","type":"uint64"},{"internalType":"uint64","name":"_reverifyThreshold","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"getAllMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toCheck","type":"address"}],"name":"getStamps","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toCheck","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getStampsAt","outputs":[{"components":[{"internalType":"string","name":"providerId","type":"string"},{"internalType":"string","name":"userHash","type":"string"},{"internalType":"uint64[]","name":"verifiedAt","type":"uint64[]"}],"internalType":"struct SignVerification.Stamp[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThresholdHistory","outputs":[{"components":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"threshold","type":"uint64"}],"internalType":"struct SignVerification.Threshold[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toCheck","type":"address"}],"name":"isOrWasMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reverifyThreshold","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_days","type":"uint64"}],"name":"setReverifyThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_days","type":"uint64"}],"name":"setVerifyDayThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_providerId","type":"string"}],"name":"unverify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toVerify","type":"address"},{"internalType":"string","name":"_userHash","type":"string"},{"internalType":"uint64","name":"_timestamp","type":"uint64"},{"internalType":"string","name":"_providerId","type":"string"},{"internalType":"bytes","name":"_proofSignature","type":"bytes"}],"name":"verifyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}],"AuthConsumer":[],"GenericSignatureHelper":[],"InterfaceIds":[{"inputs":[],"name":"IABCConfigureFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IAuthProvider_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IBurnVotingProposalFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IBurnableGovernanceStructure_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IChangeableTokenContract_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IDAOReferenceFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IDiamondCut_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IDiamondLoupe_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC165_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC173_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20Metadata_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20MultiMinterFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20OneTimeRewardFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20OneTimeVerificationRewardFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20PartialBurnVotingProposalRefundFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20PartialBurnVotingRefundFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20Permit_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20TieredTimeClaimableFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20TimeClaimableFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC20_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IERC6372_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IGithubPullRequestFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IGovernanceStructure_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMembershipExtended_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMembershipWhitelisting_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMembership_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMiningRewardPoolFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMintableGovernanceStructure_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPartialVotingFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPartialVotingProposalFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPlugin_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IProposal_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IRewardMultiplierFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISearchSECOMonetizationFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ISearchSECORewardingFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ITieredMembershipStructure_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IVerificationFacet_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IVotes_ID","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"}],"AragonAuthFacet":[{"inputs":[{"internalType":"address","name":"dao","type":"address"},{"internalType":"address","name":"where","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes32","name":"permissionId","type":"bytes32"}],"name":"DaoUnauthorized","type":"error"},{"inputs":[],"name":"__AragonAuthFacet_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"auth","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"}],"IAuthProvider":[{"inputs":[{"internalType":"bytes32","name":"_permissionId","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"auth","outputs":[],"stateMutability":"view","type":"function"}],"console":[]} \ No newline at end of file diff --git a/sdk/src/client-template.ts b/generated/client-template.ts similarity index 52% rename from sdk/src/client-template.ts rename to generated/client-template.ts index 68014e2..2f6fe47 100644 --- a/sdk/src/client-template.ts +++ b/generated/client-template.ts @@ -6,22 +6,24 @@ * LICENSE file in the root directory of this source tree. */ -import { ethers } from "hardhat"; +import { Contract } from "ethers"; import { Signer } from "@ethersproject/abstract-signer"; -import { IERC165, /* interfaces */ } from "../../typechain-types"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { IERC165, /* interfaces */ } from "../typechain-types"; enum DiamondGovernanceInterfaces { IERC165, /* interfaces */ } class DiamondGovernancePure { - public pluginAddress : string; - public signer : Signer; - private cache: { [id: string] : any } + public readonly pluginAddress : string; + public readonly signer : Signer; + public skipInterfaceCheck : boolean; + private cache: { [id: string] : Contract } public constructor(_pluginAddress : string, _signer : Signer) { this.pluginAddress = _pluginAddress; this.signer = _signer; + this.skipInterfaceCheck = false; this.cache = { }; - Object.freeze(this); } public async IERC165() : Promise { @@ -29,16 +31,32 @@ class DiamondGovernancePure { } /* interface methods */ - private async _get(_interface : DiamondGovernanceInterfaces, _interfaceId : string) : Promise { + public async GetCustomInterface(_name : string, _abi : any[], _interfaceId : string | undefined) : Promise { + if (this.cache.hasOwnProperty(_name)) { + return this.cache[_name]; + } + + if (_interfaceId != undefined) { + const ierc165 = await this.IERC165(); + const isSupported = await ierc165.supportsInterface(_interfaceId); + if (!isSupported) { + throw new Error("Interface not supported by the diamond"); + } + } + + const contract = new Contract(this.pluginAddress, _abi, this.signer); + this.cache[_name] = contract; + return contract; + } + + private async _get(_interface : DiamondGovernanceInterfaces, _interfaceId : string) : Promise { if (this.cache.hasOwnProperty(_interface)) { return this.cache[_interface] as Type; } - const name = DiamondGovernanceInterfaces[_interface]; - const contract = await ethers.getContractAt(name, this.pluginAddress, this.signer) as Type; - if (_interface !== DiamondGovernanceInterfaces.IERC165) { + if (_interface !== DiamondGovernanceInterfaces.IERC165 && !this.skipInterfaceCheck) { if (_interfaceId === null || _interfaceId === undefined) { - throw new Error("Invalid interfaceId"); + throw new Error("InterfaceId not provided"); } const ierc165 = await this.IERC165(); @@ -47,6 +65,9 @@ class DiamondGovernancePure { throw new Error("Interface not supported by the diamond"); } } + + const name = DiamondGovernanceInterfaces[_interface]; + const contract = await GetTypedContractAt(name, this.pluginAddress, this.signer); this.cache[name] = contract; return contract; } diff --git a/generated/client.ts b/generated/client.ts new file mode 100644 index 0000000..820939c --- /dev/null +++ b/generated/client.ts @@ -0,0 +1,223 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Contract } from "ethers"; +import { Signer } from "@ethersproject/abstract-signer"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { IERC165, IABCConfigureFacet, IAuthProvider, IBurnVotingProposalFacet, IBurnableGovernanceStructure, IChangeableTokenContract, IDAOReferenceFacet, IDiamondCut, IDiamondLoupe, IERC173, IERC20Metadata, IERC20MultiMinterFacet, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMiningRewardPoolFacet, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, IRewardMultiplierFacet, ISearchSECOMonetizationFacet, ISearchSECORewardingFacet, ITieredMembershipStructure, IVerificationFacet, IVotes } from "../typechain-types"; + +enum DiamondGovernanceInterfaces { IERC165, IABCConfigureFacet, IAuthProvider, IBurnVotingProposalFacet, IBurnableGovernanceStructure, IChangeableTokenContract, IDAOReferenceFacet, IDiamondCut, IDiamondLoupe, IERC173, IERC20Metadata, IERC20MultiMinterFacet, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMiningRewardPoolFacet, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, IRewardMultiplierFacet, ISearchSECOMonetizationFacet, ISearchSECORewardingFacet, ITieredMembershipStructure, IVerificationFacet, IVotes } + +class DiamondGovernancePure { + public readonly pluginAddress : string; + public readonly signer : Signer; + public skipInterfaceCheck : boolean; + private cache: { [id: string] : Contract } + + public constructor(_pluginAddress : string, _signer : Signer) { + this.pluginAddress = _pluginAddress; + this.signer = _signer; + this.skipInterfaceCheck = false; + this.cache = { }; + } + + public async IERC165() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC165, ""); + } + + public async IABCConfigureFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IABCConfigureFacet, "0xdc91c068"); + } + + public async IAuthProvider() : Promise { + return await this._get(DiamondGovernanceInterfaces.IAuthProvider, "0x516a166a"); + } + + public async IBurnVotingProposalFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IBurnVotingProposalFacet, "0x2dba5df5"); + } + + public async IBurnableGovernanceStructure() : Promise { + return await this._get(DiamondGovernanceInterfaces.IBurnableGovernanceStructure, "0x85d9cf86"); + } + + public async IChangeableTokenContract() : Promise { + return await this._get(DiamondGovernanceInterfaces.IChangeableTokenContract, "0x90d91dd0"); + } + + public async IDAOReferenceFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IDAOReferenceFacet, "0x4162169f"); + } + + public async IDiamondCut() : Promise { + return await this._get(DiamondGovernanceInterfaces.IDiamondCut, "0x3a6327ed"); + } + + public async IDiamondLoupe() : Promise { + return await this._get(DiamondGovernanceInterfaces.IDiamondLoupe, "0x48e2b093"); + } + + public async IERC173() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC173, "0x7f5828d0"); + } + + public async IERC20Metadata() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20Metadata, "0xa219a025"); + } + + public async IERC20MultiMinterFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20MultiMinterFacet, "0x14004ef3"); + } + + public async IERC20OneTimeRewardFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20OneTimeRewardFacet, "0x3a325683"); + } + + public async IERC20OneTimeVerificationRewardFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20OneTimeVerificationRewardFacet, "0x0ec06dca"); + } + + public async IERC20PartialBurnVotingProposalRefundFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20PartialBurnVotingProposalRefundFacet, "0x4aabfd6c"); + } + + public async IERC20PartialBurnVotingRefundFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20PartialBurnVotingRefundFacet, "0x91e2ebbe"); + } + + public async IERC20Permit() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20Permit, "0x9d8ff7da"); + } + + public async IERC20TieredTimeClaimableFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20TieredTimeClaimableFacet, "0x84110572"); + } + + public async IERC20TimeClaimableFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20TimeClaimableFacet, "0x1bdd5d66"); + } + + public async IERC20() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC20, "0x36372b07"); + } + + public async IERC6372() : Promise { + return await this._get(DiamondGovernanceInterfaces.IERC6372, "0xda287a1d"); + } + + public async IGithubPullRequestFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IGithubPullRequestFacet, "0xbad30a18"); + } + + public async IGovernanceStructure() : Promise { + return await this._get(DiamondGovernanceInterfaces.IGovernanceStructure, "0x217205e6"); + } + + public async IMembershipExtended() : Promise { + return await this._get(DiamondGovernanceInterfaces.IMembershipExtended, "0x2a21f601"); + } + + public async IMembershipWhitelisting() : Promise { + return await this._get(DiamondGovernanceInterfaces.IMembershipWhitelisting, "0x9b19251a"); + } + + public async IMembership() : Promise { + return await this._get(DiamondGovernanceInterfaces.IMembership, "0xa230c524"); + } + + public async IMiningRewardPoolFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IMiningRewardPoolFacet, "0xd72176f2"); + } + + public async IMintableGovernanceStructure() : Promise { + return await this._get(DiamondGovernanceInterfaces.IMintableGovernanceStructure, "0x03520be9"); + } + + public async IPartialVotingFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IPartialVotingFacet, "0xe7ce0a62"); + } + + public async IPartialVotingProposalFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IPartialVotingProposalFacet, "0x88536810"); + } + + public async IPlugin() : Promise { + return await this._get(DiamondGovernanceInterfaces.IPlugin, "0x41de6830"); + } + + public async IProposal() : Promise { + return await this._get(DiamondGovernanceInterfaces.IProposal, "0xda35c664"); + } + + public async IRewardMultiplierFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IRewardMultiplierFacet, "0xfc4a5cc0"); + } + + public async ISearchSECOMonetizationFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.ISearchSECOMonetizationFacet, "0x2db9731f"); + } + + public async ISearchSECORewardingFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.ISearchSECORewardingFacet, "0x29cf267d"); + } + + public async ITieredMembershipStructure() : Promise { + return await this._get(DiamondGovernanceInterfaces.ITieredMembershipStructure, "0xdea631ee"); + } + + public async IVerificationFacet() : Promise { + return await this._get(DiamondGovernanceInterfaces.IVerificationFacet, "0x5e089b18"); + } + + public async IVotes() : Promise { + return await this._get(DiamondGovernanceInterfaces.IVotes, "0xe90fb3f6"); + } + + public async GetCustomInterface(_name : string, _abi : any[], _interfaceId : string | undefined) : Promise { + if (this.cache.hasOwnProperty(_name)) { + return this.cache[_name]; + } + + if (_interfaceId != undefined) { + const ierc165 = await this.IERC165(); + const isSupported = await ierc165.supportsInterface(_interfaceId); + if (!isSupported) { + throw new Error("Interface not supported by the diamond"); + } + } + + const contract = new Contract(this.pluginAddress, _abi, this.signer); + this.cache[_name] = contract; + return contract; + } + + private async _get(_interface : DiamondGovernanceInterfaces, _interfaceId : string) : Promise { + if (this.cache.hasOwnProperty(_interface)) { + return this.cache[_interface] as Type; + } + + if (_interface !== DiamondGovernanceInterfaces.IERC165 && !this.skipInterfaceCheck) { + if (_interfaceId === null || _interfaceId === undefined) { + throw new Error("InterfaceId not provided"); + } + + const ierc165 = await this.IERC165(); + const isSupported = await ierc165.supportsInterface(_interfaceId); + if (!isSupported) { + throw new Error("Interface not supported by the diamond"); + } + } + + const name = DiamondGovernanceInterfaces[_interface]; + const contract = await GetTypedContractAt(name, this.pluginAddress, this.signer); + this.cache[name] = contract; + return contract; + } +} + +export { DiamondGovernanceInterfaces, DiamondGovernancePure, IERC165, IABCConfigureFacet, IAuthProvider, IBurnVotingProposalFacet, IBurnableGovernanceStructure, IChangeableTokenContract, IDAOReferenceFacet, IDiamondCut, IDiamondLoupe, IERC173, IERC20Metadata, IERC20MultiMinterFacet, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMiningRewardPoolFacet, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, IRewardMultiplierFacet, ISearchSECOMonetizationFacet, ISearchSECORewardingFacet, ITieredMembershipStructure, IVerificationFacet, IVotes } \ No newline at end of file diff --git a/generated/deployed_DiamondGovernance.json b/generated/deployed_DiamondGovernance.json new file mode 100644 index 0000000..3b616aa --- /dev/null +++ b/generated/deployed_DiamondGovernance.json @@ -0,0 +1 @@ +{"mumbai":{"DiamondGovernanceSetup":{"address":"0xF9338a4547485CE05051f36a949fbEb95308a190","fileHash":315745137},"DAOReferenceFacet":{"address":"0xC46367AF5B1446D1CdB012181A5928dE3C1995EC","fileHash":389118451},"PluginFacet":{"address":"0x5bA78aacA726d7315fB2e2c10872855C0c1e3727","fileHash":-406822024},"DiamondCutFacet":{"address":"0x476CF66b6Bf0D8cF7bfeCA86cc1e7d23FdDB325c","fileHash":-418841592},"DiamondLoupeFacet":{"address":"0x34C521181Ef41db2cea4Af0a7719348dAE938Ba3","fileHash":462724456},"OwnershipFacet":{"address":"0xC0D4C7F3513093BC58f6cc3224032C14b4E8cb40","fileHash":1033360365},"PartialBurnVotingProposalFacet":{"address":"0x482B55Ea5907C32C3c7bf5F94E95D65b10CE289a","fileHash":1883035311},"PartialVotingProposalFacet":{"address":"0x3D6AED31048253Eb8D90b9937A59d50aFEE05E5C","fileHash":-1974798607},"PartialBurnVotingFacet":{"address":"0x732C92e1f790bBE90d3DBcDF163914D0d0ccC9e3","fileHash":-346089395},"PartialVotingFacet":{"address":"0x761A008f81656F04561Dd4C1bD1b5e6Dc087632D","fileHash":1163509447},"VerificationFacet":{"address":"0xf8Db78cf348BdA9b9910E89ABd1B22176b1f4ec9","fileHash":-643475184},"GithubPullRequestFacet":{"address":"0x2c6002887316BDA0583BC9B45Bb6061fef2cA543","fileHash":-1121742565},"SearchSECOMonetizationFacet":{"address":"0xbBdC77e7217e36125378CAab7C9A21D1CDa02162","fileHash":-22846629},"SearchSECORewardingFacet":{"address":"0x5E5525F6FCc88Ab32FAC11254d9B6F391b10c64a","fileHash":-632111854},"ERC20OneTimeRewardFacet":{"address":"0x1709576B07802409a9878Fb2b212d34f1Da169Db","fileHash":1301578954},"ERC20OneTimeVerificationRewardFacet":{"address":"0x54f988f3e6B17Fe1DE62cf766314CD5f5b06A575","fileHash":522377200},"ERC20PartialBurnVotingProposalRefundFacet":{"address":"0x2942a3De40f1e9852Df4bF6f411BF785F1F03E35","fileHash":1515755561},"ERC20PartialBurnVotingRefundFacet":{"address":"0x373108Da207168d053bEdC0F687074F76B149Ede","fileHash":-1724343470},"ERC20TieredTimeClaimableFacet":{"address":"0x949137e3eCe7d27276f7f6A0AfACFC7C8200af3F","fileHash":1667379320},"ERC20TimeClaimableFacet":{"address":"0xe4479B749762d626FB642436a01e10BA1111cBE9","fileHash":-1656077585},"ERC20Facet":{"address":"0xd11E50B3e7fe9e94124DA1B0BBEB57713BD0532D","fileHash":-1755757140},"ERC20PermitFacet":{"address":"0x341f2bC20CeCc51a9759B7892357a8F60ddff5a0","fileHash":1618064184},"ERC20VotesFacet":{"address":"0xaa9BBB22f7E6FB8f91Fc4C5288577022c0d6c00E","fileHash":1836682910},"ERC20DisabledFacet":{"address":"0x680f5Fd21685Ed004854E0aa69f9Eb9A593F78BA","fileHash":1422908485},"ERC20PermitDisabledFacet":{"address":"0xDc29Ea40fB9285892C803b9B0F2317aAb5dd63a2","fileHash":-1597709860},"ERC20VotesDisabledFacet":{"address":"0x2455131F2Aeaa5b0D55262194743e21CE0A95a83","fileHash":636971857},"GovernanceERC20BurnableFacet":{"address":"0x35a82e8652640b2b3e91e9Cd475834E048a251b3","fileHash":225245324},"GovernanceERC20DisabledFacet":{"address":"0xeF641BE714B30Cb7AAeB2f92D22bb87842bB5b60","fileHash":-610684215},"GovernanceERC20Facet":{"address":"0x6E46D2Bbb287668C65e9a49c493b3712010Ca603","fileHash":-998330858},"ERC20MultiMinterFacet":{"address":"0xf84026571c0f8502A549B04db5D87918e5B76Dd6","fileHash":1462214568},"ERC20MonetaryToken":{"address":"0x77364C58B46e4E6a46b919463f228C7A1a9BC39B","fileHash":-421597800},"MonetaryTokenFacet":{"address":"0xe16aCf6B42347d53Ffc0ac025CB33bbB9EB68737","fileHash":579306442},"SignVerification":{"address":"0x0D9EB3Cb3df46b2b764253b1F98Bc0E013b88E97","fileHash":1297565486},"AragonAuthFacet":{"address":"0xC94ad73b63d763aa39c7f5698c5ed23454E22C12","fileHash":-1867781459},"RewardMultiplierFacet":{"address":"0x6c6D198C664A28943F4F4999F9D3f263db38641F","fileHash":-1647479093},"MiningRewardPoolFacet":{"address":"0xb2c54869A1cF9D014462E06bCeDCB32eC9ca8D39","fileHash":-576965598},"ABCConfigureFacet":{"address":"0xe010b99Acd64E45606ddFe82F8267C8d03B4Bb4e","fileHash":-1458887284}}} \ No newline at end of file diff --git a/generated/diamondGovernanceRepo.json b/generated/diamondGovernanceRepo.json new file mode 100644 index 0000000..02fa97d --- /dev/null +++ b/generated/diamondGovernanceRepo.json @@ -0,0 +1 @@ +{"mumbai":{"repo":"0x9539C7360637aD5aa89e9B842De0786bA3BeFCA1"}} \ No newline at end of file diff --git a/generated/functionSelectors.json b/generated/functionSelectors.json new file mode 100644 index 0000000..76bd638 --- /dev/null +++ b/generated/functionSelectors.json @@ -0,0 +1 @@ +{"0x5e81772e":"IABCConfigureFacet","0x818f06a9":"IABCConfigureFacet","0xda6949d6":"IABCConfigureFacet","0xe092b067":"IABCConfigureFacet","0xb9c769c7":"IABCConfigureFacet","0xa341e71b":"IABCConfigureFacet","0x938f052b":"IABCConfigureFacet","0xa3df19bb":"IABCConfigureFacet","0x77486076":"IABCConfigureFacet","0xf54c42d7":"IABCConfigureFacet","0xfe965921":"IABCConfigureFacet","0x6f20a192":"IABCConfigureFacet","0x516a166a":"IAuthProvider","0x87ffa625":"IBurnVotingProposalFacet","0xaa45fbd0":"IBurnVotingProposalFacet","0x85d9cf86":"IBurnableGovernanceStructure","0x536f9f42":"IMintableGovernanceStructure","0x721d9aa4":"IMintableGovernanceStructure","0x22e45584":"IChangeableTokenContract","0xb23d4854":"IChangeableTokenContract","0x4162169f":"IDAOReferenceFacet","0x3a6327ed":"IDiamondCut","0xcdffacc6":"IDiamondLoupe","0x52ef6b2c":"IDiamondLoupe","0xadfca15e":"IDiamondLoupe","0x7a0ed627":"IDiamondLoupe","0x8da5cb5b":"IERC173","0xf2fde38b":"IERC173","0xdd62ed3e":"IERC20","0x095ea7b3":"IERC20","0x70a08231":"IERC20","0x313ce567":"IERC20Metadata","0x06fdde03":"IERC20Metadata","0x95d89b41":"IERC20Metadata","0x18160ddd":"IERC20","0xa9059cbb":"IERC20","0x23b872dd":"IERC20","0x14004ef3":"IERC20MultiMinterFacet","0x1fad1584":"IERC20OneTimeRewardFacet","0x3bb63652":"IERC20OneTimeRewardFacet","0x8dd8e89d":"IERC20OneTimeRewardFacet","0x93f19dc8":"IERC20OneTimeRewardFacet","0xca638013":"IERC20OneTimeVerificationRewardFacet","0x4567178f":"IERC20OneTimeVerificationRewardFacet","0x54c92e8b":"IERC20OneTimeVerificationRewardFacet","0x730a63e9":"IERC20OneTimeVerificationRewardFacet","0x3c7fd3d3":"IERC20OneTimeVerificationRewardFacet","0x9a7864e7":"IERC20OneTimeVerificationRewardFacet","0x30778538":"IERC20PartialBurnVotingProposalRefundFacet","0x7adc7854":"IERC20PartialBurnVotingProposalRefundFacet","0x18ad11f1":"IERC20PartialBurnVotingRefundFacet","0x894ffa4f":"IERC20PartialBurnVotingRefundFacet","0x3644e515":"IERC20Permit","0x7ecebe00":"IERC20Permit","0xd505accf":"IERC20Permit","0xbe06fba0":"IERC20TieredTimeClaimableFacet","0x3a17fed2":"IERC20TieredTimeClaimableFacet","0x27b3bf11":"IERC20TimeClaimableFacet","0x815c8a29":"IERC20TimeClaimableFacet","0x9cdade2d":"IERC20TimeClaimableFacet","0xa513c44a":"IERC20TimeClaimableFacet","0x63d8aedd":"IERC20TimeClaimableFacet","0xe723dce4":"IERC20TimeClaimableFacet","0x4bf5d7e9":"IERC6372","0x91ddadf4":"IERC6372","0xbad30a18":"IGithubPullRequestFacet","0x9eab5253":"ITieredMembershipStructure","0xa230c524":"ITieredMembershipStructure","0x16ba6176":"ITieredMembershipStructure","0x9b19251a":"IMembershipWhitelisting","0x35e9f1b1":"IMiningRewardPoolFacet","0x50a4236c":"IMiningRewardPoolFacet","0xa5126dfc":"IMiningRewardPoolFacet","0x177ec9d3":"IMiningRewardPoolFacet","0x03520be9":"IMintableGovernanceStructure","0xce9865de":"IPartialVotingFacet","0x29566fbc":"IPartialVotingFacet","0xcc63604a":"IPartialVotingProposalFacet","0xff33d3b1":"IPartialVotingProposalFacet","0xfe0d94c1":"IPartialVotingProposalFacet","0xe34192e9":"IPartialVotingProposalFacet","0x034d501b":"IPartialVotingProposalFacet","0xc350ba5f":"IPartialVotingProposalFacet","0x45c4818b":"IPartialVotingProposalFacet","0xc7f758a8":"IPartialVotingProposalFacet","0x85b29a02":"IPartialVotingProposalFacet","0x970601d8":"IPartialVotingProposalFacet","0xcca0f4c0":"IPartialVotingProposalFacet","0x8a4b00f8":"IPartialVotingProposalFacet","0xcf131149":"IPartialVotingProposalFacet","0x0de21856":"IPartialVotingProposalFacet","0x97ad61fb":"IPartialVotingProposalFacet","0xb0ca2b3c":"IPartialVotingProposalFacet","0x1fb39c68":"IPartialVotingProposalFacet","0xbd52985a":"IPartialVotingProposalFacet","0xb94fa5e0":"IPartialVotingProposalFacet","0x4e06634c":"IPartialVotingProposalFacet","0x41de6830":"IPlugin","0xda35c664":"IProposal","0x225f5934":"IRewardMultiplierFacet","0xc41abefa":"IRewardMultiplierFacet","0xe414ad6a":"IRewardMultiplierFacet","0xe52c037c":"IRewardMultiplierFacet","0xb80b5cfd":"IRewardMultiplierFacet","0xa33c49e5":"IRewardMultiplierFacet","0xea51fcf2":"ISearchSECOMonetizationFacet","0xda4a3958":"ISearchSECOMonetizationFacet","0x1da2b6b5":"ISearchSECOMonetizationFacet","0xc45607df":"ISearchSECORewardingFacet","0xa79558f9":"ISearchSECORewardingFacet","0x136c3111":"ISearchSECORewardingFacet","0xef9d9451":"ISearchSECORewardingFacet","0xcded93f7":"ISearchSECORewardingFacet","0x143b9aca":"ISearchSECORewardingFacet","0xfc726f66":"ISearchSECORewardingFacet","0x2b50ae84":"ISearchSECORewardingFacet","0xe75b64db":"ISearchSECORewardingFacet","0x5f52701f":"ISearchSECORewardingFacet","0xf487c7ef":"ITieredMembershipStructure","0x1a371932":"IVerificationFacet","0x50c31502":"IVerificationFacet","0xdfa3a245":"IVerificationFacet","0x0a397589":"IVerificationFacet","0xc16640e4":"IVerificationFacet","0x5c19a95c":"IVotes","0xc3cda520":"IVotes","0x587cde1e":"IVotes","0x8e539e8c":"IVotes","0x3a46b1a8":"IVotes","0x9ab24eb0":"IVotes"} \ No newline at end of file diff --git a/generated/variableSelectors.json b/generated/variableSelectors.json new file mode 100644 index 0000000..f330192 --- /dev/null +++ b/generated/variableSelectors.json @@ -0,0 +1 @@ +{"0x5e81772e":{"facetName":"IABCConfigureFacet","variableName":"FormulaABC","variableType":"address","setSelector":"0x938f052b"},"0x818f06a9":{"facetName":"IABCConfigureFacet","variableName":"FrictionABC","variableType":"uint32","setSelector":"0xa3df19bb"},"0xda6949d6":{"facetName":"IABCConfigureFacet","variableName":"Hatcher","variableType":"address","setSelector":"0x77486076"},"0xe092b067":{"facetName":"IABCConfigureFacet","variableName":"MarketMaker","variableType":"address","setSelector":"0xf54c42d7"},"0xb9c769c7":{"facetName":"IABCConfigureFacet","variableName":"ReserveRatioABC","variableType":"uint32","setSelector":"0xfe965921"},"0xa341e71b":{"facetName":"IABCConfigureFacet","variableName":"ThetaABC","variableType":"uint32","setSelector":"0x6f20a192"},"0x87ffa625":{"facetName":"IBurnVotingProposalFacet","variableName":"ProposalCreationCost","variableType":"uint256","setSelector":"0xaa45fbd0"},"0x22e45584":{"facetName":"IChangeableTokenContract","variableName":"TokenContractAddress","variableType":"address","setSelector":"0xb23d4854"},"0x3bb63652":{"facetName":"IERC20OneTimeRewardFacet","variableName":"OneTimeReward","variableType":"uint256","setSelector":"0x8dd8e89d"},"0x815c8a29":{"facetName":"IERC20TimeClaimableFacet","variableName":"ClaimPeriodInterval","variableType":"uint256","setSelector":"0xa513c44a"},"0x9cdade2d":{"facetName":"IERC20TimeClaimableFacet","variableName":"ClaimPeriodMax","variableType":"uint256","setSelector":"0x63d8aedd"},"0xe34192e9":{"facetName":"IPartialVotingProposalFacet","variableName":"MaxSingleWalletPower","variableType":"uint32","setSelector":"0x97ad61fb"},"0x034d501b":{"facetName":"IPartialVotingProposalFacet","variableName":"MinDuration","variableType":"uint64","setSelector":"0xb0ca2b3c"},"0xc350ba5f":{"facetName":"IPartialVotingProposalFacet","variableName":"MinParticipation","variableType":"uint32","setSelector":"0x1fb39c68"},"0x45c4818b":{"facetName":"IPartialVotingProposalFacet","variableName":"MinProposerVotingPower","variableType":"uint256","setSelector":"0xbd52985a"},"0x85b29a02":{"facetName":"IPartialVotingProposalFacet","variableName":"SupportThreshold","variableType":"uint32","setSelector":"0xb94fa5e0"},"0xcca0f4c0":{"facetName":"IPartialVotingProposalFacet","variableName":"VotingMode","variableType":"uint8","setSelector":"0x4e06634c"},"0xea51fcf2":{"facetName":"ISearchSECOMonetizationFacet","variableName":"HashCost","variableType":"uint256","setSelector":"0x1da2b6b5"},"0xa79558f9":{"facetName":"ISearchSECORewardingFacet","variableName":"HashDevaluationFactor","variableType":"uint256","setSelector":"0xfc726f66"},"0x136c3111":{"facetName":"ISearchSECORewardingFacet","variableName":"HashReward","variableType":"uint256","setSelector":"0x2b50ae84"},"0xef9d9451":{"facetName":"ISearchSECORewardingFacet","variableName":"MiningRewardPoolPayoutRatio","variableType":"uint256","setSelector":"0xe75b64db"},"0xcded93f7":{"facetName":"ISearchSECORewardingFacet","variableName":"RewardingSigner","variableType":"address","setSelector":"0x5f52701f"}} \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 32e92e4..cc96dd1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -15,7 +15,7 @@ import '@nomiclabs/hardhat-ethers' //.env secrets import { config as dotEnvConfig } from "dotenv"; -import { ETHERSCAN_API_KEY, POLYGONSCAN_API_KEY, MUMBAI_API_KEY, MUMBAI_PRIVATE_KEY } from './secrets'; +import { ETHERSCAN_API_KEY, POLYGONSCAN_API_KEY, MUMBAI_PRIVATE_KEY } from './secrets'; dotEnvConfig(); /** @type import('hardhat/config').HardhatUserConfig */ @@ -30,10 +30,12 @@ module.exports = { count: 20, passphrase: "", }, + allowBlocksWithSameTimestamp: true, }, mumbai: { - url: `https://polygon-mumbai.g.alchemy.com/v2/${MUMBAI_API_KEY()}`, - accounts: [MUMBAI_PRIVATE_KEY()] + url: "https://polygon-mumbai.g.alchemy.com/v2/GFsknWbazmwCAkh0yVuOs_PrhfXo_DsT", + accounts: [MUMBAI_PRIVATE_KEY()], + allowUnlimitedContractSize: true } }, etherscan: { diff --git a/package-lock.json b/package-lock.json index f734412..f63d57b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,14 @@ "version": "1.0.0", "license": "AGPL-3.0-or-later", "dependencies": { - "@aragon/osx": "^1.0.1", + "@aragon/osx": "^1.2.0", "@ensdomains/ens-contracts": "^0.0.20", "@ethersproject/abstract-signer": "^5.7.0", "@openzeppelin/contracts": "^4.8.2", "@openzeppelin/contracts-upgradeable": "^4.8.2", "axios": "^1.4.0", - "dotenv": "^16.0.3" + "dotenv": "^16.0.3", + "form-data": "^4.0.0" }, "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^2.0.2", @@ -24,15 +25,60 @@ } }, "node_modules/@aragon/osx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@aragon/osx/-/osx-1.0.1.tgz", - "integrity": "sha512-TiP5/1AGv/hth+V8PoDVFlwMzmLazYxzp//jiepAZ0WJkx9EnQNYafo+M7+pjAqRPG005liQjmFZNiK6ARLULg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@aragon/osx/-/osx-1.2.0.tgz", + "integrity": "sha512-RgEdopViHun6B7zv27GloiVbVQ7c5rTlcI9HrU9Wq1NoUOWhdXKTISPfgOAys427MlO5AEy+tJAcDjC4BXpMbQ==", + "dependencies": { + "@ensdomains/ens-contracts": "0.0.11", + "@openzeppelin/contracts": "4.8.1", + "@openzeppelin/contracts-upgradeable": "4.8.1" + } + }, + "node_modules/@aragon/osx/node_modules/@ensdomains/buffer": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", + "dependencies": { + "@nomiclabs/hardhat-truffle5": "^2.0.0" + } + }, + "node_modules/@aragon/osx/node_modules/@ensdomains/ens-contracts": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "dependencies": { + "@ensdomains/buffer": "^0.0.13", + "@ensdomains/solsha1": "0.0.3", + "@openzeppelin/contracts": "^4.1.0", + "dns-packet": "^5.3.0" + } + }, + "node_modules/@aragon/osx/node_modules/@openzeppelin/contracts": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.1.tgz", + "integrity": "sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ==" + }, + "node_modules/@aragon/osx/node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.1.tgz", + "integrity": "sha512-1wTv+20lNiC0R07jyIAbHU7TNHKRwGiTGRfiNnA8jOWjKT98g5OgLpYWOi40Vgpk8SPLA9EvfJAbAeIyVn+7Bw==" + }, + "node_modules/@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -41,11 +87,43 @@ "node": ">=12" } }, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "dependencies": { + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" + } + }, + "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/@ensdomains/buffer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.1.1.tgz", "integrity": "sha512-92SfSiNS8XorgU7OUBHo/i1ZU7JV7iz/6bKuLPNVsMxV79/eI7fJR6jfJJc40zAHjs3ha+Xo965Idomlq3rqnw==" }, + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", + "dependencies": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + } + }, "node_modules/@ensdomains/ens-contracts": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.20.tgz", @@ -57,6 +135,209 @@ "dns-packet": "^5.3.0" } }, + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ensdomains/ens/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "dependencies": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" + } + }, + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" + }, "node_modules/@ensdomains/solsha1": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", @@ -65,11 +346,102 @@ "hash-test-vectors": "^1.3.2" } }, + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "funding": [ { "type": "individual", @@ -182,7 +554,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, "funding": [ { "type": "individual", @@ -193,7 +564,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -259,7 +629,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, "funding": [ { "type": "individual", @@ -270,7 +639,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -288,7 +656,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "funding": [ { "type": "individual", @@ -315,7 +682,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, "funding": [ { "type": "individual", @@ -326,7 +692,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -346,7 +711,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, "funding": [ { "type": "individual", @@ -357,7 +721,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -430,7 +793,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, "funding": [ { "type": "individual", @@ -441,7 +803,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -469,7 +830,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, "funding": [ { "type": "individual", @@ -480,7 +840,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -508,8 +867,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -530,7 +887,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, "funding": [ { "type": "individual", @@ -541,7 +897,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -570,7 +925,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, "funding": [ { "type": "individual", @@ -581,7 +935,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -615,7 +968,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, "funding": [ { "type": "individual", @@ -626,7 +978,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -686,7 +1037,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, "funding": [ { "type": "individual", @@ -697,7 +1047,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -708,7 +1057,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, "funding": [ { "type": "individual", @@ -719,7 +1067,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -764,7 +1111,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, "funding": [ { "type": "individual", @@ -775,7 +1121,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -788,7 +1133,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6.0.0" @@ -798,14 +1143,14 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -821,7 +1166,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -871,7 +1215,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true, "funding": [ { "type": "individual", @@ -883,7 +1226,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, "funding": [ { "type": "individual", @@ -933,7 +1275,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -950,7 +1291,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -973,7 +1313,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-common": "3.1.2", @@ -996,7 +1335,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1019,7 +1357,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-util": "8.0.6", "crc-32": "^1.2.0" @@ -1029,7 +1366,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -1046,7 +1382,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1069,7 +1404,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -1088,7 +1422,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1111,7 +1444,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", - "dev": true, "bin": { "rlp": "bin/rlp" }, @@ -1123,7 +1455,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -1138,7 +1469,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1161,7 +1491,6 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -1176,7 +1505,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1199,7 +1527,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -1214,7 +1541,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1237,7 +1563,6 @@ "version": "8.0.6", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "ethereum-cryptography": "0.1.3" @@ -1250,7 +1575,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1273,7 +1597,6 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-blockchain": "6.2.2", @@ -1300,7 +1623,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1424,7 +1746,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, "engines": { "node": ">= 12" }, @@ -1448,7 +1769,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1464,7 +1784,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1480,7 +1799,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1496,7 +1814,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1512,7 +1829,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1528,7 +1844,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1544,7 +1859,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1560,7 +1874,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1576,7 +1889,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1592,7 +1904,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1634,6 +1945,148 @@ "hardhat": "^2.0.4" } }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "peer": true, + "dependencies": { + "@types/bignumber.js": "^5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, "node_modules/@openzeppelin/contracts": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", @@ -1868,7 +2321,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true, "funding": [ { "type": "individual", @@ -1880,7 +2332,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, "funding": [ { "type": "individual", @@ -1897,7 +2348,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, "funding": [ { "type": "individual", @@ -1913,7 +2363,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1929,7 +2378,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -1943,7 +2391,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -1957,7 +2404,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -1977,7 +2423,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1993,7 +2438,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true, "engines": { "node": ">=6" } @@ -2002,7 +2446,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -2011,6 +2454,17 @@ "node": ">=6" } }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@solidity-parser/parser": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", @@ -2021,131 +2475,393 @@ "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true + "node_modules/@truffle/abi-utils": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.10.tgz", + "integrity": "sha512-Q3TXsF0NIct3KFLL2giF/alfSoKf5axyw+4wQdDRlihFrG1nbTBzWq+Q0ya6oHffZDida0NSpnJIf5IhFMV+JQ==", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.10.0" + } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.7.tgz", + "integrity": "sha512-1nibqGjEHC7KAyDThEFvbm2+EO8zAHee/VjCtxkYBE3ySwP50joh0QCEBjy7K/9z+icpMoDucfxmgaKToBFUgQ==" + }, + "node_modules/@truffle/codec": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.15.0.tgz", + "integrity": "sha512-FEcwtDUuMr85a9u39eqvNgmUgXDvIkwhJjMCCi/bC4/GmLisOpih8vAidDgdYMJldukMPaOX5XIIgsG5k615YA==", + "dependencies": { + "@truffle/abi-utils": "^0.3.10", + "@truffle/compile-common": "^0.9.4", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.10.0" + } }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true + "node_modules/@truffle/codec/node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } }, - "node_modules/@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", - "dev": true, - "peer": true, + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@typechain/hardhat": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", - "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", - "dev": true, - "peer": true, + "node_modules/@truffle/codec/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "fs-extra": "^9.1.0" + "yallist": "^4.0.0" }, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.9.9", - "typechain": "^8.1.1" + "engines": { + "node": ">=10" } }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, + "node_modules/@truffle/codec/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@truffle/compile-common": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", + "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@truffle/error": "^0.2.0", + "colors": "1.4.0" } }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" + }, + "node_modules/@truffle/contract-schema": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", + "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" } }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", + "node_modules/@truffle/debug-utils": { + "version": "6.0.49", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.49.tgz", + "integrity": "sha512-39gf9si9CnHSCR9YjfLIOremdSsp6Vcq87iiKqX4yqrI+TDGfeTyC3OQqTBAyPaOPd334XRX7LoWFE/pOep4Nw==", + "dependencies": { + "@truffle/codec": "^0.15.0", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" + } + }, + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" + }, + "node_modules/@truffle/interface-adapter": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.33.tgz", + "integrity": "sha512-vbVcH2I8hX+wM0Xj9uAjpgxMHqfT+y6m26zSkOVvZ2wo9Ez1slaOJkK1/TZK+7nJitGZSXeJeB4purMDuADvGA==", + "dependencies": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.10.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "dependencies": { + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true, + "peer": true + }, + "node_modules/@typechain/ethers-v5": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", + "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", + "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", + "dev": true, + "peer": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.2.0", + "ethers": "^5.4.7", + "hardhat": "^2.9.9", + "typechain": "^8.1.1" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" + }, + "node_modules/@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", + "peer": true, + "dependencies": { + "bignumber.js": "*" + } }, "node_modules/@types/bn.js": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true, - "peer": true + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" }, "node_modules/@types/chai-as-promised": { "version": "7.1.5", @@ -2188,11 +2904,23 @@ "@types/node": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -2211,14 +2939,12 @@ "node_modules/@types/node": { "version": "18.15.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", - "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", - "dev": true + "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -2237,11 +2963,18 @@ "dev": true, "peer": true }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -2257,7 +2990,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2265,11 +2997,15 @@ "node": ">=6.5" } }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, "node_modules/abstract-level": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -2283,11 +3019,23 @@ "node": ">=12" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "acorn": "bin/acorn" @@ -2300,7 +3048,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=0.4.0" @@ -2320,7 +3068,6 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, "engines": { "node": ">=0.3.0" } @@ -2328,15 +3075,12 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true, - "peer": true + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -2348,7 +3092,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2361,8 +3104,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2389,7 +3130,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } @@ -2398,7 +3138,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -2413,7 +3152,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2422,7 +3160,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2441,7 +3178,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2454,14 +3190,13 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-back": { "version": "3.1.0", @@ -2487,6 +3222,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2538,8 +3278,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -2548,8 +3286,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "peer": true, "engines": { "node": ">=0.8" } @@ -2558,8 +3294,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -2578,7 +3312,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, "dependencies": { "lodash": "^4.17.14" } @@ -2587,11 +3320,15 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, "dependencies": { "async": "^2.4.0" } }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2611,8 +3348,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -2624,8 +3359,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -2633,9 +3366,7 @@ "node_modules/aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true, - "peer": true + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { "version": "1.4.0", @@ -2650,14 +3381,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" } @@ -2666,7 +3395,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -2686,8 +3414,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -2695,22 +3421,37 @@ "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true, - "peer": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } }, "node_modules/bigint-crypto-utils": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, "dependencies": { "bigint-mod-arith": "^3.1.0" }, @@ -2722,16 +3463,22 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", - "dev": true, "engines": { "node": ">=10.4.0" } }, + "node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -2739,19 +3486,77 @@ "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2761,7 +3566,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2778,7 +3582,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -2789,14 +3592,12 @@ "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -2810,7 +3611,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, "dependencies": { "base-x": "^3.0.2" } @@ -2819,7 +3619,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -2830,7 +3629,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "funding": [ { "type": "github", @@ -2853,23 +3651,23 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "dev": true, "hasInstallScript": true, - "optional": true, - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -2881,7 +3679,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, "dependencies": { "streamsearch": "^1.1.0" }, @@ -2893,16 +3690,61 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -2911,11 +3753,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -2926,15 +3776,12 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "peer": true + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, "engines": { "node": ">=6" } @@ -2955,8 +3802,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -2987,7 +3832,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2997,6 +3841,31 @@ "node": ">=4" } }, + "node_modules/change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -3011,17 +3880,50 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true, "engines": { "node": "*" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -3044,27 +3946,84 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, "node_modules/classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, "hasInstallScript": true, "dependencies": { "abstract-level": "^1.0.2", @@ -3081,7 +4040,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -3154,18 +4112,35 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -3173,15 +4148,12 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "peer": true, "engines": { "node": ">=0.1.90" } @@ -3200,8 +4172,7 @@ "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "node_modules/command-line-args": { "version": "5.2.1", @@ -3258,8 +4229,7 @@ "node_modules/commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/compare-versions": { "version": "5.0.3", @@ -3270,8 +4240,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3322,27 +4291,78 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dependencies": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "peer": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -3354,7 +4374,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3367,7 +4386,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -3381,9 +4399,17 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, + "devOptional": true, "peer": true }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -3394,12 +4420,59 @@ "node": "*" } }, + "node_modules/crypto-addr-codec": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "dependencies": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -3418,7 +4491,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3435,7 +4507,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -3443,20 +4514,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { - "node": ">=6" + "node": ">=0.10" } }, - "node_modules/deep-extend": { + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", @@ -3473,6 +4575,14 @@ "dev": true, "peer": true }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, "node_modules/define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -3502,11 +4612,27 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "engines": { + "node": ">=4" + } + }, "node_modules/detect-port": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", @@ -3526,7 +4652,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, "engines": { "node": ">=0.3.1" } @@ -3568,6 +4693,70 @@ "node": ">=6" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dependencies": { + "no-case": "^2.2.0" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -3580,13 +4769,16 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -3609,14 +4801,28 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "dependencies": { "ansi-colors": "^4.1.1" }, @@ -3624,15 +4830,33 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -3741,20 +4965,61 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -3830,6 +5095,28 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, "node_modules/eth-gas-reporter": { "version": "0.2.25", "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", @@ -4411,12 +5698,43 @@ "node": ">=6" } }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, "node_modules/ethereum-bloom-filters": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "peer": true, "dependencies": { "js-sha3": "^0.8.0" } @@ -4425,7 +5743,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -4433,11 +5750,28 @@ "@scure/bip39": "1.1.1" } }, + "node_modules/ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dependencies": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + } + }, + "node_modules/ethereum-ens/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, "node_modules/ethereumjs-abi": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -4446,14 +5780,12 @@ "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -4468,7 +5800,6 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -4476,14 +5807,12 @@ "node_modules/ethereumjs-util/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -4506,7 +5835,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, "funding": [ { "type": "individual", @@ -4517,7 +5845,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -4555,8 +5882,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "peer": true, "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -4569,15 +5894,12 @@ "node_modules/ethjs-unit/node_modules/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true, - "peer": true + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/ethjs-util": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -4591,44 +5913,182 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "peer": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, "engines": [ "node >=0.6.0" - ], - "peer": true + ] + }, + "node_modules/fast-check": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "dependencies": { + "pure-rand": "^5.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.12", @@ -4650,9 +6110,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -4675,7 +6133,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4683,6 +6140,36 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -4700,7 +6187,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, "dependencies": { "locate-path": "^2.0.0" }, @@ -4712,7 +6198,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, "bin": { "flat": "cli.js" } @@ -4740,8 +6225,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -4750,8 +6233,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -4769,17 +6250,36 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -4789,6 +6289,14 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -4799,14 +6307,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -4819,8 +6325,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4844,8 +6349,7 @@ "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -4861,7 +6365,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4870,8 +6373,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -4880,7 +6381,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4900,6 +6400,17 @@ "node": ">=4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -4921,8 +6432,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -4945,7 +6454,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4965,7 +6473,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4973,6 +6480,15 @@ "node": ">= 6" } }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -5041,8 +6557,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -5050,11 +6564,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -5092,8 +6631,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -5103,8 +6640,6 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", - "dev": true, - "peer": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -5117,7 +6652,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -5208,7 +6742,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -5230,7 +6763,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -5265,7 +6797,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5277,8 +6808,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -5293,7 +6822,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -5321,11 +6849,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "bin": { "he": "bin/he" } }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", @@ -5333,6 +6869,19 @@ "dev": true, "peer": true }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-solidity": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5343,6 +6892,29 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -5359,11 +6931,15 @@ "node": ">=6.0.0" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -5375,6 +6951,11 @@ "node": ">= 0.8" } }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -5396,8 +6977,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -5408,11 +6987,22 @@ "npm": ">=1.3.7" } }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -5425,7 +7015,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5433,11 +7022,29 @@ "node": ">=0.10.0" } }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -5466,14 +7073,12 @@ "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } @@ -5482,7 +7087,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5525,15 +7129,45 @@ "node": ">= 0.10" } }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/io-ts": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, "dependencies": { "fp-ts": "^1.0.0" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5549,6 +7183,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -5566,7 +7205,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5595,7 +7233,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, "funding": [ { "type": "github", @@ -5618,8 +7255,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -5647,7 +7282,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5656,16 +7290,33 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5677,12 +7328,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "dev": true, "engines": { "node": ">=6.5.0", "npm": ">=3" } }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dependencies": { + "lower-case": "^1.1.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -5700,7 +7358,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -5725,7 +7382,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "engines": { "node": ">=8" } @@ -5796,8 +7452,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -5815,15 +7469,12 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "peer": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -5831,6 +7482,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5861,9 +7525,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "peer": true + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/js-sha3": { "version": "0.8.0", @@ -5874,7 +7536,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5885,36 +7546,32 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "peer": true + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "peer": true + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5933,8 +7590,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5949,7 +7604,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, "hasInstallScript": true, "dependencies": { "node-addon-api": "^2.0.0", @@ -5960,6 +7614,14 @@ "node": ">=10.0.0" } }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5974,16 +7636,25 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.9" } }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/level": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, "dependencies": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -6000,7 +7671,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, "engines": { "node": ">=12" } @@ -6009,7 +7679,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -6032,11 +7701,33 @@ "node": ">= 0.8.0" } }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -6048,8 +7739,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -6058,6 +7753,11 @@ "dev": true, "peer": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -6069,7 +7769,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -6085,7 +7784,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6100,7 +7798,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6116,7 +7813,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -6127,14 +7823,12 @@ "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6143,7 +7837,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6155,23 +7848,43 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "peer": true, "dependencies": { "get-func-name": "^2.0.0" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -6180,7 +7893,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/markdown-table": { @@ -6194,7 +7907,6 @@ "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, "engines": { "node": ">=8.9.0" } @@ -6203,18 +7915,24 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memory-level": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -6228,11 +7946,15 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, "engines": { "node": ">= 0.10.0" } }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6243,6 +7965,14 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -6257,6 +7987,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6276,6 +8017,22 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6290,7 +8047,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6302,18 +8058,31 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -6321,11 +8090,22 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mnemonist": { "version": "0.38.5", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, "dependencies": { "obliterator": "^2.0.0" } @@ -6334,7 +8114,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -6374,7 +8153,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, "engines": { "node": ">=6" } @@ -6383,7 +8161,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -6392,7 +8169,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -6404,7 +8180,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6420,7 +8195,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6429,7 +8203,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6444,7 +8217,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6455,14 +8227,12 @@ "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6477,7 +8247,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -6492,7 +8261,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -6501,7 +8269,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6512,11 +8279,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, "node_modules/module-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, "engines": { "node": ">=10" } @@ -6524,14 +8295,107 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "varint": "^5.0.0" + } + }, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } + }, + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/nano-base32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6542,8 +8406,15 @@ "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/neo-async": { "version": "2.6.2", @@ -6552,11 +8423,23 @@ "dev": true, "peer": true }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-emoji": { "version": "1.11.0", @@ -6589,11 +8472,29 @@ "semver": "bin/semver" } }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -6622,11 +8523,59 @@ "nopt": "bin/nopt.js" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "engines": { "node": ">=0.10.0" } @@ -6635,8 +8584,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "peer": true, "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -6649,16 +8596,12 @@ "node_modules/number-to-bn/node_modules/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true, - "peer": true + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -6667,8 +8610,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6677,7 +8618,6 @@ "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6730,14 +8670,31 @@ "node_modules/obliterator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dependencies": { + "http-https": "^1.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6767,20 +8724,37 @@ "dev": true, "peer": true }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, "node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "dependencies": { "p-try": "^1.0.0" }, @@ -6792,7 +8766,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, "dependencies": { "p-limit": "^1.1.0" }, @@ -6804,7 +8777,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -6819,11 +8791,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, "engines": { "node": ">=4" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, "node_modules/parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -6831,20 +8815,82 @@ "dev": true, "peer": true }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6852,8 +8898,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -6869,8 +8919,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -6879,7 +8927,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -6894,15 +8941,12 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "peer": true + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6920,6 +8964,25 @@ "node": ">=6" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6946,6 +9009,14 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6974,6 +9045,18 @@ "signal-exit": "^3.0.2" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6982,25 +9065,44 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "peer": true + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "peer": true, "engines": { "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -7011,11 +9113,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -7031,20 +9145,37 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -7055,11 +9186,79 @@ "node": ">= 0.8" } }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7073,7 +9272,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -7117,6 +9315,11 @@ "node": ">=6" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -7166,8 +9369,6 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -7233,8 +9434,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -7248,8 +9447,6 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "peer": true, "engines": { "node": ">=0.6" } @@ -7259,8 +9456,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "peer": true, "bin": { "uuid": "bin/uuid" } @@ -7269,7 +9464,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7278,7 +9472,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7294,7 +9487,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, "dependencies": { "path-parse": "^1.0.6" }, @@ -7302,6 +9494,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -7312,6 +9509,25 @@ "node": ">=4" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -7336,7 +9552,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -7348,17 +9563,23 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "engines": { + "node": ">=8" + } + }, "node_modules/rlp": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, "dependencies": { "bn.js": "^5.2.0" }, @@ -7394,7 +9615,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, "funding": [ { "type": "github", @@ -7416,14 +9636,12 @@ "node_modules/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -7457,8 +9675,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sc-istanbul": { "version": "0.4.6", @@ -7581,14 +9798,12 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, "hasInstallScript": true, "dependencies": { "elliptic": "^6.5.4", @@ -7603,44 +9818,116 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7663,6 +9950,14 @@ "node": "*" } }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "dependencies": { + "buffer": "6.0.3" + } + }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -7685,7 +9980,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -7701,26 +9995,66 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "dependencies": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" @@ -7765,11 +10099,18 @@ "dev": true, "peer": true }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dependencies": { + "no-case": "^2.2.0" + } + }, "node_modules/solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, "dependencies": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -7792,7 +10133,6 @@ "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -7805,7 +10145,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -7814,7 +10153,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -8399,7 +10737,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8408,12 +10745,39 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -8425,8 +10789,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8450,15 +10812,12 @@ "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/stacktrace-parser": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -8470,7 +10829,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, "engines": { "node": ">=8" } @@ -8479,7 +10837,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -8498,16 +10855,22 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, "engines": { "node": ">=10.0.0" } }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -8523,7 +10886,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8585,7 +10947,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8593,11 +10954,21 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dev": true, "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -8606,11 +10977,18 @@ "npm": ">=3" } }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -8622,7 +11000,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -8630,6 +11007,137 @@ "node": ">=4" } }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + } + }, + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, "node_modules/sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -8732,6 +11240,29 @@ "dev": true, "peer": true }, + "node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." + }, "node_modules/then-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", @@ -8777,11 +11308,27 @@ "node": ">= 0.12" } }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -8793,7 +11340,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -8805,7 +11351,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, "engines": { "node": ">=0.6" } @@ -8814,8 +11359,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "peer": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -8824,6 +11367,11 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-command-line-args": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", @@ -8931,7 +11479,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -8975,7 +11523,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=0.3.1" @@ -8984,21 +11532,17 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -9009,14 +11553,17 @@ "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/tweetnacl-util": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "node_modules/type-check": { "version": "0.3.2", @@ -9035,8 +11582,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -9045,7 +11590,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -9053,6 +11597,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typechain": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", @@ -9134,11 +11690,19 @@ "dev": true, "peer": true }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -9172,6 +11736,11 @@ "node": ">=0.8.0" } }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -9188,11 +11757,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "node_modules/undici": { "version": "5.21.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, "dependencies": { "busboy": "^1.6.0" }, @@ -9204,7 +11777,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, "engines": { "node": ">= 4.0.0" } @@ -9213,29 +11785,41 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dependencies": { + "upper-case": "^1.1.1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, "hasInstallScript": true, - "optional": true, - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -9246,21 +11830,37 @@ "node_modules/utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true, - "peer": true + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -9269,30 +11869,430 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "devOptional": true, "peer": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, "engines": [ "node >=0.6.0" ], - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "node_modules/web3-utils": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", - "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", - "dev": true, - "peer": true, + "node_modules/web3": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", + "hasInstallScript": true, + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", + "dependencies": { + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-helpers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", + "dependencies": { + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-method": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-promievent": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-requestmanager": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", + "dependencies": { + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-subscriptions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-core/node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/web3-eth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", + "dependencies": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/web3-eth-contract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", + "dependencies": { + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-net": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-http": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-shh": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", + "hasInstallScript": true, + "dependencies": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -9310,8 +12310,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -9334,8 +12332,6 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "peer": true, "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -9347,6 +12343,49 @@ "node": ">=10.0.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -9388,8 +12427,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -9462,6 +12499,17 @@ "node": ">=4" } }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -9506,14 +12554,12 @@ "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9530,7 +12576,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9545,7 +12590,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9556,20 +12600,17 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, "engines": { "node": ">=8.3.0" }, @@ -9586,36 +12627,80 @@ } } }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dependencies": { + "xhr-request": "^1.1.0" + } + }, "node_modules/xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "peer": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9633,7 +12718,6 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, "engines": { "node": ">=10" } @@ -9642,7 +12726,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -9657,7 +12740,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6" @@ -9667,7 +12750,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -9676,33 +12758,270 @@ } }, "sdk": { - "name": "diamond-governance-sdk", - "version": "0.0.1", + "name": "@plopmenz/diamond-governance-sdk", + "version": "0.1.4", "extraneous": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "ethers": "^5.7.0" + } } }, "dependencies": { "@aragon/osx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@aragon/osx/-/osx-1.0.1.tgz", - "integrity": "sha512-TiP5/1AGv/hth+V8PoDVFlwMzmLazYxzp//jiepAZ0WJkx9EnQNYafo+M7+pjAqRPG005liQjmFZNiK6ARLULg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@aragon/osx/-/osx-1.2.0.tgz", + "integrity": "sha512-RgEdopViHun6B7zv27GloiVbVQ7c5rTlcI9HrU9Wq1NoUOWhdXKTISPfgOAys427MlO5AEy+tJAcDjC4BXpMbQ==", + "requires": { + "@ensdomains/ens-contracts": "0.0.11", + "@openzeppelin/contracts": "4.8.1", + "@openzeppelin/contracts-upgradeable": "4.8.1" + }, + "dependencies": { + "@ensdomains/buffer": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", + "requires": { + "@nomiclabs/hardhat-truffle5": "^2.0.0" + } + }, + "@ensdomains/ens-contracts": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "requires": { + "@ensdomains/buffer": "^0.0.13", + "@ensdomains/solsha1": "0.0.3", + "@openzeppelin/contracts": "^4.1.0", + "dns-packet": "^5.3.0" + } + }, + "@openzeppelin/contracts": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.1.tgz", + "integrity": "sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ==" + }, + "@openzeppelin/contracts-upgradeable": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.1.tgz", + "integrity": "sha512-1wTv+20lNiC0R07jyIAbHU7TNHKRwGiTGRfiNnA8jOWjKT98g5OgLpYWOi40Vgpk8SPLA9EvfJAbAeIyVn+7Bw==" + } + } + }, + "@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "requires": { + "regenerator-runtime": "^0.13.11" + } }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" } }, + "@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "requires": { + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, "@ensdomains/buffer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.1.1.tgz", "integrity": "sha512-92SfSiNS8XorgU7OUBHo/i1ZU7JV7iz/6bKuLPNVsMxV79/eI7fJR6jfJJc40zAHjs3ha+Xo965Idomlq3rqnw==" }, + "@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "requires": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "requires": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, "@ensdomains/ens-contracts": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.20.tgz", @@ -9714,6 +13033,26 @@ "dns-packet": "^5.3.0" } }, + "@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "requires": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==" + }, "@ensdomains/solsha1": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", @@ -9722,11 +13061,100 @@ "hash-test-vectors": "^1.3.2" } }, + "@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + }, + "dependencies": { + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "requires": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + }, + "dependencies": { + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + } + } + }, "@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -9789,8 +13217,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -9826,8 +13252,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -9845,7 +13269,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -9862,8 +13285,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -9883,8 +13304,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -9927,8 +13346,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -9946,8 +13363,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -9975,8 +13390,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "peer": true, "requires": {} } } @@ -9985,8 +13398,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -10005,8 +13416,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -10030,8 +13439,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -10071,8 +13478,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -10083,8 +13488,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -10119,8 +13522,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, - "peer": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -10133,21 +13534,21 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "peer": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, + "devOptional": true, "peer": true }, "@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -10163,7 +13564,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, "requires": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -10195,14 +13595,12 @@ "@noble/hashes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" }, "@noble/secp256k1": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -10237,7 +13635,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -10251,7 +13648,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10276,7 +13672,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-common": "3.1.2", @@ -10296,7 +13691,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10321,7 +13715,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-util": "8.0.6", "crc-32": "^1.2.0" @@ -10331,7 +13724,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -10345,7 +13737,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10370,7 +13761,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -10386,7 +13776,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10410,14 +13799,12 @@ "@nomicfoundation/ethereumjs-rlp": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", - "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", - "dev": true + "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==" }, "@nomicfoundation/ethereumjs-statemanager": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -10432,7 +13819,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10457,7 +13843,6 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -10469,7 +13854,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10494,7 +13878,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -10506,7 +13889,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10531,7 +13913,6 @@ "version": "8.0.6", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "ethereum-cryptography": "0.1.3" @@ -10541,7 +13922,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10566,7 +13946,6 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-blockchain": "6.2.2", @@ -10590,7 +13969,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10686,7 +14064,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, "requires": { "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", @@ -10704,70 +14081,60 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-darwin-x64": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-freebsd-x64": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-musl": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "dev": true, "optional": true }, "@nomiclabs/hardhat-ethers": { @@ -10797,6 +14164,132 @@ "undici": "^5.14.0" } }, + "@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "requires": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "dependencies": { + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + } + } + }, + "@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "peer": true, + "requires": { + "@types/bignumber.js": "^5.0.0" + } + }, + "@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "requires": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==" + } + } + }, "@openzeppelin/contracts": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", @@ -10975,14 +14468,12 @@ "@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" }, "@scure/bip32": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, "requires": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -10993,7 +14484,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, "requires": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -11003,7 +14493,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -11016,7 +14505,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, "requires": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -11027,7 +14515,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -11038,7 +14525,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, "requires": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -11055,7 +14541,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -11067,19 +14552,22 @@ "@sentry/types": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" }, "@sentry/utils": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, "requires": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" } }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, "@solidity-parser/parser": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", @@ -11090,32 +14578,256 @@ "antlr4ts": "^0.5.0-alpha.4" } }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "@truffle/abi-utils": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.10.tgz", + "integrity": "sha512-Q3TXsF0NIct3KFLL2giF/alfSoKf5axyw+4wQdDRlihFrG1nbTBzWq+Q0ya6oHffZDida0NSpnJIf5IhFMV+JQ==", + "requires": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.10.0" + } + }, + "@truffle/blockchain-utils": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.7.tgz", + "integrity": "sha512-1nibqGjEHC7KAyDThEFvbm2+EO8zAHee/VjCtxkYBE3ySwP50joh0QCEBjy7K/9z+icpMoDucfxmgaKToBFUgQ==" + }, + "@truffle/codec": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.15.0.tgz", + "integrity": "sha512-FEcwtDUuMr85a9u39eqvNgmUgXDvIkwhJjMCCi/bC4/GmLisOpih8vAidDgdYMJldukMPaOX5XIIgsG5k615YA==", + "requires": { + "@truffle/abi-utils": "^0.3.10", + "@truffle/compile-common": "^0.9.4", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.10.0" + }, + "dependencies": { + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "requires": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==" + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "@truffle/compile-common": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", + "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", + "requires": { + "@truffle/error": "^0.2.0", + "colors": "1.4.0" + }, + "dependencies": { + "@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" + } + } + }, + "@truffle/contract-schema": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", + "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", + "requires": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "@truffle/debug-utils": { + "version": "6.0.49", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.49.tgz", + "integrity": "sha512-39gf9si9CnHSCR9YjfLIOremdSsp6Vcq87iiKqX4yqrI+TDGfeTyC3OQqTBAyPaOPd334XRX7LoWFE/pOep4Nw==", + "requires": { + "@truffle/codec": "^0.15.0", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" + } + }, + "@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" + }, + "@truffle/interface-adapter": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.33.tgz", + "integrity": "sha512-vbVcH2I8hX+wM0Xj9uAjpgxMHqfT+y6m26zSkOVvZ2wo9Ez1slaOJkK1/TZK+7nJitGZSXeJeB4purMDuADvGA==", + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.10.0" + }, + "dependencies": { + "ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==" + } + } + }, + "@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "requires": { + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, + "devOptional": true, "peer": true }, "@typechain/ethers-v5": { @@ -11175,24 +14887,40 @@ "@types/async-eventemitter": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" + }, + "@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "peer": true, + "requires": { + "bignumber.js": "*" + } }, "@types/bn.js": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, "requires": { "@types/node": "*" } }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true, - "peer": true + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" }, "@types/chai-as-promised": { "version": "7.1.5", @@ -11235,11 +14963,23 @@ "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, "@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, "@types/minimatch": { "version": "5.1.2", @@ -11258,14 +14998,12 @@ "@types/node": { "version": "18.15.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", - "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==", - "dev": true + "integrity": "sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==" }, "@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -11284,11 +15022,18 @@ "dev": true, "peer": true }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, "@types/secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, "requires": { "@types/node": "*" } @@ -11304,16 +15049,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "requires": { "event-target-shim": "^5.0.0" } }, + "abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, "abstract-level": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, "requires": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -11324,18 +15072,27 @@ "queue-microtask": "^1.2.3" } }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, + "devOptional": true, "peer": true }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "peer": true }, "address": { @@ -11348,21 +15105,17 @@ "adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" }, "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true, - "peer": true + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "requires": { "debug": "4" } @@ -11371,7 +15124,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -11381,8 +15133,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11401,14 +15151,12 @@ "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "requires": { "type-fest": "^0.21.3" } @@ -11416,14 +15164,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -11439,7 +15185,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -11449,14 +15194,13 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, + "devOptional": true, "peer": true }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-back": { "version": "3.1.0", @@ -11476,6 +15220,11 @@ "is-array-buffer": "^3.0.1" } }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -11515,8 +15264,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "peer": true, "requires": { "safer-buffer": "~2.1.0" } @@ -11524,16 +15271,12 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "peer": true + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "peer": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "astral-regex": { "version": "2.0.0", @@ -11546,7 +15289,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, "requires": { "lodash": "^4.17.14" } @@ -11555,11 +15297,15 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, "requires": { "async": "^2.4.0" } }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -11575,23 +15321,17 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "peer": true + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "peer": true + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true, - "peer": true + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "axios": { "version": "1.4.0", @@ -11606,14 +15346,12 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -11621,15 +15359,12 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "peer": true, "requires": { "tweetnacl": "^0.14.3" }, @@ -11637,24 +15372,29 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" } } }, "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true, - "peer": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==" + }, + "big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==" }, "bigint-crypto-utils": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, "requires": { "bigint-mod-arith": "^3.1.0" } @@ -11662,31 +15402,84 @@ "bigint-mod-arith": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", - "dev": true + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==" + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11696,7 +15489,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -11710,7 +15502,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, "requires": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -11721,14 +15512,12 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -11742,7 +15531,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, "requires": { "base-x": "^3.0.2" } @@ -11751,7 +15539,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "requires": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -11762,7 +15549,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -11771,22 +15557,22 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "dev": true, - "optional": true, - "peer": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -11795,7 +15581,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, "requires": { "streamsearch": "^1.1.0" } @@ -11803,37 +15588,74 @@ "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==" + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "peer": true + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==" }, "cbor": { "version": "8.1.0", @@ -11848,8 +15670,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "peer": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -11874,13 +15694,37 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -11891,15 +15735,39 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "peer": true + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -11911,27 +15779,66 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, "classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, "requires": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -11943,8 +15850,7 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-table3": { "version": "0.5.1", @@ -11999,18 +15905,29 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -12018,15 +15935,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "peer": true + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, "combined-stream": { "version": "1.0.8", @@ -12039,8 +15953,7 @@ "command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "command-line-args": { "version": "5.2.1", @@ -12087,8 +16000,7 @@ "commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "compare-versions": { "version": "5.0.3", @@ -12099,8 +16011,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", @@ -12150,30 +16061,71 @@ } } }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "peer": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, "crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -12186,7 +16138,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -12200,9 +16151,17 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, + "devOptional": true, "peer": true }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -12210,12 +16169,50 @@ "dev": true, "peer": true }, + "crypto-addr-codec": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "requires": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -12231,7 +16228,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -12239,15 +16235,32 @@ "decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } }, "deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "peer": true, "requires": { "type-detect": "^4.0.0" } @@ -12266,6 +16279,11 @@ "dev": true, "peer": true }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, "define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -12285,8 +16303,17 @@ "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==" }, "detect-port": { "version": "1.5.1", @@ -12302,8 +16329,7 @@ "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "difflib": { "version": "0.2.4", @@ -12333,6 +16359,52 @@ "@leichtgewicht/ip-codec": "^2.0.1" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "requires": { + "no-case": "^2.2.0" + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -12342,13 +16414,16 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "peer": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -12373,23 +16448,46 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "requires": { "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } }, "es-abstract": { "version": "1.21.2", @@ -12480,17 +16578,54 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "escodegen": { "version": "1.8.1", @@ -12540,6 +16675,27 @@ "dev": true, "peer": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + } + } + }, "eth-gas-reporter": { "version": "0.2.25", "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", @@ -13000,9 +17156,44 @@ "dev": true, "peer": true, "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } @@ -13011,8 +17202,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "peer": true, "requires": { "js-sha3": "^0.8.0" } @@ -13021,7 +17210,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, "requires": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -13029,11 +17217,30 @@ "@scure/bip39": "1.1.1" } }, + "ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "requires": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + } + } + }, "ethereumjs-abi": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, "requires": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -13042,8 +17249,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -13051,7 +17257,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, "requires": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -13066,7 +17271,6 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, "requires": { "@types/node": "*" } @@ -13074,14 +17278,12 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -13106,8 +17308,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "peer": true, "requires": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -13145,8 +17345,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "peer": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -13155,9 +17353,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true, - "peer": true + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, @@ -13165,7 +17361,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -13174,39 +17369,155 @@ "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "peer": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "peer": true + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "fast-check": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "requires": { + "pure-rand": "^5.0.1" + } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.12", @@ -13225,9 +17536,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -13250,11 +17559,39 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -13269,7 +17606,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -13277,8 +17613,7 @@ "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, "follow-redirects": { "version": "1.15.2", @@ -13289,8 +17624,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, "requires": { "is-callable": "^1.1.3" } @@ -13298,9 +17631,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "peer": true + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { "version": "4.0.0", @@ -13312,23 +17643,44 @@ "mime-types": "^2.1.12" } }, + "form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, "fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -13339,21 +17691,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.5", @@ -13371,8 +17720,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "functions-have-names": { "version": "1.2.3", @@ -13384,21 +17732,17 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "peer": true + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" }, "get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -13412,6 +17756,11 @@ "dev": true, "peer": true }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -13427,8 +17776,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -13448,7 +17795,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13462,11 +17808,19 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -13520,17 +17874,34 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "peer": true, "requires": { "get-intrinsic": "^1.1.3" } }, + "got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "requires": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + } + }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "growl": { "version": "1.10.5", @@ -13556,16 +17927,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "peer": true + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "peer": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -13575,7 +17942,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -13645,7 +18011,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -13660,8 +18025,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { "version": "1.0.0", @@ -13683,15 +18047,12 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "peer": true, "requires": { "has-symbols": "^1.0.2" } @@ -13700,7 +18061,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -13724,8 +18084,16 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } }, "heap": { "version": "0.2.7", @@ -13734,6 +18102,16 @@ "dev": true, "peer": true }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "highlightjs-solidity": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -13744,6 +18122,22 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -13757,11 +18151,15 @@ "parse-cache-control": "^1.0.1" } }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "requires": { "depd": "2.0.0", "inherits": "2.0.4", @@ -13770,6 +18168,11 @@ "toidentifier": "1.0.1" } }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, "http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -13793,19 +18196,25 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -13815,16 +18224,29 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==" + } + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.4", @@ -13836,20 +18258,17 @@ "immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -13886,15 +18305,33 @@ "dev": true, "peer": true }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" + }, "io-ts": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, "requires": { "fp-ts": "^1.0.0" } }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -13907,6 +18344,11 @@ "is-typed-array": "^1.1.10" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -13921,7 +18363,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -13940,15 +18381,12 @@ "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-date-object": { "version": "1.0.5", @@ -13963,20 +18401,30 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -13984,8 +18432,15 @@ "is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "dev": true + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "requires": { + "lower-case": "^1.1.0" + } }, "is-negative-zero": { "version": "2.0.2", @@ -13997,8 +18452,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -14013,8 +18467,7 @@ "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, "is-regex": { "version": "1.1.4", @@ -14061,8 +18514,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "peer": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -14074,15 +18525,25 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "peer": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "requires": { + "upper-case": "^1.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "is-weakref": { "version": "1.0.2", @@ -14111,9 +18572,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "peer": true + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "js-sha3": { "version": "0.8.0", @@ -14124,7 +18583,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -14132,36 +18590,32 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "peer": true + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "peer": true + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -14177,8 +18631,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "peer": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -14190,13 +18642,20 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", "readable-stream": "^3.6.0" } }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -14208,16 +18667,22 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "dev": true, "requires": { "graceful-fs": "^4.1.9" } }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "requires": { + "invert-kv": "^1.0.0" + } + }, "level": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, "requires": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -14226,14 +18691,12 @@ "level-supports": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==" }, "level-transcoder": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, "requires": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -14250,11 +18713,29 @@ "type-check": "~0.3.2" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -14263,8 +18744,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" }, "lodash.camelcase": { "version": "4.3.0", @@ -14273,6 +18758,11 @@ "dev": true, "peer": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -14284,7 +18774,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14294,7 +18783,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -14303,7 +18791,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14313,7 +18800,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -14321,20 +18807,17 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -14345,23 +18828,37 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "peer": true, "requires": { "get-func-name": "^2.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "requires": { + "lower-case": "^1.1.2" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" + }, "lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -14370,7 +18867,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, + "devOptional": true, "peer": true }, "markdown-table": { @@ -14383,25 +18880,27 @@ "mcl-wasm": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==" }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, "memory-level": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, "requires": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -14411,8 +18910,12 @@ "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge2": { "version": "1.4.1", @@ -14421,6 +18924,11 @@ "dev": true, "peer": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -14432,6 +18940,11 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -14445,6 +18958,19 @@ "mime-db": "1.52.0" } }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -14459,7 +18985,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -14467,25 +18992,45 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, "requires": { "minimist": "^1.2.6" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "requires": { + "mkdirp": "*" + } + }, "mnemonist": { "version": "0.38.5", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, "requires": { "obliterator": "^2.0.0" } @@ -14494,7 +19039,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -14522,14 +19066,12 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -14537,14 +19079,12 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14553,14 +19093,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -14569,7 +19107,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -14577,14 +19114,12 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -14593,7 +19128,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "requires": { "p-limit": "^3.0.2" } @@ -14601,43 +19135,115 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, + "mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, "module-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==" }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "nano-base32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -14646,11 +19252,23 @@ "dev": true, "peer": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node-emoji": { "version": "1.11.0", @@ -14682,11 +19300,18 @@ } } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" }, "nofilter": { "version": "3.1.0", @@ -14704,18 +19329,51 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" }, "number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "peer": true, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -14724,31 +19382,24 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true, - "peer": true + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "peer": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "peer": true + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-keys": { "version": "1.1.1", @@ -14786,14 +19437,28 @@ "obliterator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -14820,17 +19485,28 @@ "dev": true, "peer": true }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "requires": { + "lcid": "^1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -14839,7 +19515,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -14848,7 +19523,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -14856,8 +19530,20 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "requires": { + "no-case": "^2.2.0" + } }, "parse-cache-control": { "version": "1.0.1", @@ -14866,23 +19552,77 @@ "dev": true, "peer": true }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "requires": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "requires": { + "no-case": "^2.2.0" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -14894,15 +19634,12 @@ "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": true + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -14914,15 +19651,12 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "peer": true + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "4.0.1", @@ -14931,6 +19665,19 @@ "dev": true, "peer": true }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -14945,6 +19692,11 @@ "dev": true, "peer": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14973,6 +19725,15 @@ "signal-exit": "^3.0.2" } }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -14981,46 +19742,72 @@ "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "peer": true + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "peer": true + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "pure-rand": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==" }, "qs": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "dev": true, "requires": { "side-channel": "^1.0.4" } }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, "raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15028,11 +19815,65 @@ "unpipe": "1.0.0" } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15043,7 +19884,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -15075,6 +19915,11 @@ "dev": true, "peer": true }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -15111,8 +19956,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "peer": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -15140,8 +19983,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "peer": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -15151,16 +19992,12 @@ "qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "peer": true + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true, - "peer": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -15189,14 +20026,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -15209,11 +20044,15 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -15221,6 +20060,21 @@ "dev": true, "peer": true }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -15238,7 +20092,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -15247,17 +20100,20 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, + "ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==" + }, "rlp": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, "requires": { "bn.js": "^5.2.0" } @@ -15276,7 +20132,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -15284,14 +20139,12 @@ "rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { "version": "1.0.0", @@ -15308,8 +20161,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sc-istanbul": { "version": "0.4.6", @@ -15414,14 +20266,12 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, "requires": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -15431,42 +20281,109 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "requires": { "randombytes": "^2.1.0" } }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -15483,6 +20400,14 @@ "crypt": ">= 0.0.1" } }, + "sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "requires": { + "buffer": "6.0.3" + } + }, "shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -15499,7 +20424,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -15512,6 +20436,31 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "requires": { + "mimic-response": "^1.0.0" + } + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15560,11 +20509,18 @@ } } }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "requires": { + "no-case": "^2.2.0" + } + }, "solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, "requires": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -15581,7 +20537,6 @@ "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -15594,7 +20549,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -15602,8 +20556,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -16063,19 +21016,45 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -16087,8 +21066,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "peer": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16104,9 +21081,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" } } }, @@ -16114,7 +21089,6 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, "requires": { "type-fest": "^0.7.1" }, @@ -16122,16 +21096,14 @@ "type-fest": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" } } }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stealthy-require": { "version": "1.1.1", @@ -16143,14 +21115,17 @@ "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -16166,7 +21141,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16213,35 +21187,142 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==" + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + } + } + }, "sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -16329,6 +21410,25 @@ } } }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + }, + "testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==" + }, "then-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", @@ -16370,11 +21470,24 @@ } } }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -16383,7 +21496,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -16391,20 +21503,22 @@ "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "peer": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "ts-command-line-args": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", @@ -16488,7 +21602,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -16510,7 +21624,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "peer": true } } @@ -16518,21 +21632,17 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "peer": true, "requires": { "safe-buffer": "^5.0.1" } @@ -16540,14 +21650,17 @@ "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "tweetnacl-util": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.3.2", @@ -16562,15 +21675,21 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } }, "typechain": { "version": "8.1.1", @@ -16634,11 +21753,19 @@ "dev": true, "peer": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, + "devOptional": true, "peer": true }, "typical": { @@ -16656,6 +21783,11 @@ "optional": true, "peer": true }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -16669,11 +21801,15 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "undici": { "version": "5.21.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, "requires": { "busboy": "^1.6.0" } @@ -16681,32 +21817,43 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "requires": { + "upper-case": "^1.1.1" + } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, "requires": { "punycode": "^2.1.0" } }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + }, "utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "optional": true, - "peer": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -16714,47 +21861,395 @@ "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true, - "peer": true + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "devOptional": true, "peer": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, + "web3": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", + "requires": { + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-bzz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", + "requires": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + } + } + }, + "web3-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", + "requires": { + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + } + } + }, + "web3-core-helpers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", + "requires": { + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-core-method": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", + "requires": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-core-promievent": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", + "requires": { + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" + } + }, + "web3-core-subscriptions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" + } + }, + "web3-eth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "requires": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-eth-abi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", + "requires": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" + } + }, + "web3-eth-accounts": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", + "requires": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, + "web3-eth-contract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", + "requires": { + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-eth-ens": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-eth-iban": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "requires": { + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" + } + }, + "web3-eth-personal": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + } + } + }, + "web3-net": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", + "requires": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + } + }, + "web3-providers-http": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", + "requires": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" + } + }, + "web3-providers-ipc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", + "requires": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + } + }, + "web3-providers-ws": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" + } + }, + "web3-shh": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", + "requires": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" + } + }, "web3-utils": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", - "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", - "dev": true, - "peer": true, + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "requires": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -16769,8 +22264,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "peer": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -16793,8 +22286,6 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "peer": true, "requires": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -16805,6 +22296,48 @@ } } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -16840,8 +22373,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "peer": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -16898,6 +22429,11 @@ } } }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -16935,14 +22471,12 @@ "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16953,7 +22487,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -16962,7 +22495,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -16970,48 +22502,83 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, "requires": {} }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "requires": { + "xhr-request": "^1.1.0" + } + }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "peer": true + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -17025,14 +22592,12 @@ "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" }, "yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -17044,14 +22609,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "peer": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 51a2f66..ac8b277 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "main": "index.js", "scripts": { "compile": "npx hardhat compile", - "test": "npm run compile && npx hardhat test --typecheck", - "deploy": "npm run compile && npx hardhat run deployments/deploy.ts --network mumbai", - "generate-sdk": "npm run compile && npx hardhat run scripts/GenerateSDK.ts" + "test": "npm run generate-sdk && npx hardhat test --typecheck", + "deploy": "npm run generate-abis && npx hardhat run scripts/Deploy.ts --network mumbai", + "generate-sdk": "npm run generate-abis && npx hardhat run scripts/GenerateSDK.ts", + "generate-abis": "npm run compile && npx hardhat run scripts/GenerateAbis.ts", + "generate-facet": "npx hardhat run scripts/GenerateFacet.ts" }, "repository": { "type": "git", @@ -25,12 +27,13 @@ "hardhat": "^2.13.0" }, "dependencies": { - "@aragon/osx": "^1.0.1", + "@aragon/osx": "^1.2.0", "@ensdomains/ens-contracts": "^0.0.20", "@ethersproject/abstract-signer": "^5.7.0", "@openzeppelin/contracts": "^4.8.2", "@openzeppelin/contracts-upgradeable": "^4.8.2", "axios": "^1.4.0", - "dotenv": "^16.0.3" + "dotenv": "^16.0.3", + "form-data": "^4.0.0" } } diff --git a/scripts/Deploy.ts b/scripts/Deploy.ts new file mode 100644 index 0000000..299b3c9 --- /dev/null +++ b/scripts/Deploy.ts @@ -0,0 +1,190 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { createDiamondGovernanceRepoIfNotExists, deployDiamondGovernance } from "../deployments/deploy_DiamondGovernance"; +// import { deployTestNetwork } from "../test/utils/testDeployer"; +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { DiamondCut, DAOCreationSettings, CreateDAO } from "../utils/diamondGovernanceHelper"; +import { days, hours, now } from "../utils/timeUnits"; +import { ether, wei } from "../utils/etherUnits"; +import { ethers, network } from "hardhat"; +import { MonetaryTokenDeployer, ABCDeployer, ABCDeployerSettings } from "../deployments/deploy_MonetaryToken"; +import { to18Decimal } from "../utils/decimals18Helper"; +import { BigNumber } from "ethers"; + +async function main() { + console.log("Deploying to", network.name); + // await deployTestNetwork(); + await deployDiamondGovernance(); + await createDiamondGovernanceRepoIfNotExists(); + + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + + const ABCDeployerSettings : ABCDeployerSettings = { + curveParameters: { + theta: 0.05 * 10**6, // 5% + friction: 0.01 * 10**6, // 1% + reserveRatio: 0.2 * 10**6, // 20% + }, + hatchParameters: { + initialPrice: wei.mul(1), + minimumRaise: wei.mul(1), + maximumRaise: wei.mul(1), + hatchDeadline: now() + 24 * hours, + }, + vestingSchedule: { + cliff: 0, + start: now() + 24 * hours, + duration: 1 * hours, + revocable: false, + }, + externalERC20: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889", // Uniswap WMATIC + }; + const monetaryTokenDeployer : MonetaryTokenDeployer = new ABCDeployer(ABCDeployerSettings); + monetaryTokenDeployer.runVerification = true; + const MonetaryToken = await monetaryTokenDeployer.beforeDAODeploy(); + + const ERC20Disabled = [ + "transfer(address, uint256)", + "approve(address, uint256)", + "transferFrom(address, address, uint256)", + "increaseAllowance(address, uint256)", + "decreaseAllowance(address, uint256)", + "permit(address, address, uint256, uint256, uint8, bytes32, bytes32)", + "delegate(address)", + "delegateBySig(address, uint256, uint256, uint8, bytes32, bytes32)", + ]; + enum VotingMode { + SingleVote, + SinglePartialVote, + MultiplePartialVote, + } + const PartialBurnVotingProposalFacetSettings = { + proposalCreationCost: ether.mul(1), + _PartialVotingProposalFacetInitParams: { + votingSettings: { + votingMode: VotingMode.MultiplePartialVote, //IPartialVotingFacet.VotingMode + supportThreshold: 0.5 * 10**6, //uint32 + minParticipation: 0.2 * 10**6, //uint32 + maxSingleWalletPower: 0.1 * 10**6, //uint32 + minDuration: 1 * days, //uint64 + minProposerVotingPower: ether.mul(1), //uint256 + }, + } + }; + const GovernanceERC20BurnableFacetSettings = { + _GovernanceERC20FacetInitParams: { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "SecureSECO Reputation", //string + symbol: "SECOREP", //string + } + } + } + } + } + const VerificationFacetSettings = { + verificationContractAddress: diamondGovernance.SignVerification.address, //address + providers: ["github", "proofofhumanity", "whitelist"], //string[] + rewards: [3, 10, 9999], //uint256[] + }; + const ERC20TieredTimeClaimableFacetSettings = { + tiers: [3, 10, 9999], //uint256[] + rewards: [ether.mul(1), ether.mul(3), ether.mul(3)], //uint256[] + _ERC20TimeClaimableFacetInitParams: { + timeTillReward: 1 * days, //uint256 + maxTimeRewarded: 10 * days, //uint256 + }, + }; + const ERC20OneTimeVerificationRewardFacetSettings = { + providers: ["github", "proofofhumanity"], //string[] + rewards: [ether.mul(30), ether.mul(100)], //uint256[] + }; + const SearchSECOMonetizationFacetSettings = { + hashCost: 1, + treasuryRatio: 0.2 * 10**6, // 20% + }; + const SearchSECORewardingFacetSettings = { + signer: owner.address, + miningRewardPoolPayoutRatio: to18Decimal(0.01.toString()), // 1% + hashDevaluationFactor: 10000, // 10000 hashes for 1% of mining reward pool + }; + const MonetaryTokenFacetSettings = { + monetaryTokenContractAddress: MonetaryToken, + }; + const RewardMultiplierSettings = { + name: "inflation", + startBlock: await owner.provider?.getBlockNumber(), + initialAmount: BigNumber.from(10).pow(18), // dec18 = 1 + slopeN: 1, + slopeD: 1, + }; + const ABCConfigureFacetSettings = { + marketMaker: monetaryTokenDeployer.deployedContracts.MarketMaker, + hatcher: monetaryTokenDeployer.deployedContracts.SimpleHatch, + }; + + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.DiamondCutFacet), + await DiamondCut.All(diamondGovernance.DiamondLoupeFacet), + await DiamondCut.All(diamondGovernance.DAOReferenceFacet), + await DiamondCut.All(diamondGovernance.PluginFacet), + await DiamondCut.All(diamondGovernance.AragonAuthFacet), + await DiamondCut.All(diamondGovernance.PartialBurnVotingProposalFacet, [PartialBurnVotingProposalFacetSettings]), + await DiamondCut.All(diamondGovernance.PartialVotingFacet), + await DiamondCut.All(diamondGovernance.GithubPullRequestFacet), + await DiamondCut.Only(diamondGovernance.GovernanceERC20DisabledFacet, ERC20Disabled), + await DiamondCut.Except(diamondGovernance.GovernanceERC20BurnableFacet, ERC20Disabled, [GovernanceERC20BurnableFacetSettings]), + await DiamondCut.All(diamondGovernance.VerificationFacet, [VerificationFacetSettings]), + await DiamondCut.All(diamondGovernance.ERC20TieredTimeClaimableFacet, [ERC20TieredTimeClaimableFacetSettings]), + await DiamondCut.All(diamondGovernance.ERC20OneTimeVerificationRewardFacet, [ERC20OneTimeVerificationRewardFacetSettings]), + await DiamondCut.All(diamondGovernance.ERC20MultiMinterFacet), + await DiamondCut.All(diamondGovernance.SearchSECOMonetizationFacet, [SearchSECOMonetizationFacetSettings]), + await DiamondCut.All(diamondGovernance.SearchSECORewardingFacet, [SearchSECORewardingFacetSettings]), + await DiamondCut.All(diamondGovernance.MiningRewardPoolFacet), + await DiamondCut.All(diamondGovernance.MonetaryTokenFacet, [MonetaryTokenFacetSettings]), + await DiamondCut.All(diamondGovernance.ERC20PartialBurnVotingProposalRefundFacet), + await DiamondCut.All(diamondGovernance.RewardMultiplierFacet, [RewardMultiplierSettings]), + await DiamondCut.All(diamondGovernance.ABCConfigureFacet, [ABCConfigureFacetSettings]), + ]; + const settings : DAOCreationSettings = { + trustedForwarder: ethers.constants.AddressZero, + daoURI: "https://dao.secureseco.org/", + subdomain: "dao" + Math.round(Math.random() * 100000), + metadata: { + name: "SecureSECO DAO", + description: "DAO for the SecureSECO project.", + links: [{ + name: "SecureSECO", + url: "https://secureseco.org/", + }, { + name: "GitHub", + url: "https://github.com/SecureSECODAO", + }], + avatar: "ipfs://QmaoV7cWi2qeAX81E429ER2RUsjC93LVsJ5JJETv5h8p8t" + }, + diamondCut: cut, + additionalPlugins: [] + }; + const dao = await CreateDAO(settings, owner); + console.log("DAO:", dao.dao.address); + console.log("Diamond Governance:", dao.diamondGovernance.address); + + await monetaryTokenDeployer.afterDAODeploy(dao.dao.address, dao.diamondGovernance.address); + + console.log("Deploy finished!"); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/scripts/GenerateAbis.ts b/scripts/GenerateAbis.ts new file mode 100644 index 0000000..019d2d7 --- /dev/null +++ b/scripts/GenerateAbis.ts @@ -0,0 +1,32 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import fs from "fs"; +import hre from "hardhat"; + +const outputFile = "./generated/abis.json"; + +async function main() { + console.log("Start copying abis from artifacts..."); + let abis : { [name : string] : any[] } = { }; + const artifactNames = await hre.artifacts.getAllFullyQualifiedNames(); + for (let i = 0; i < artifactNames.length; i++) { + const artifact = await hre.artifacts.readArtifact(artifactNames[i]); + abis[artifact.contractName] = artifact.abi; + } + + fs.writeFileSync(outputFile, JSON.stringify(abis)); + console.log("Finished creating abis.json"); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/scripts/GenerateDiamondCutProposal.ts b/scripts/GenerateDiamondCutProposal.ts new file mode 100644 index 0000000..119ec43 --- /dev/null +++ b/scripts/GenerateDiamondCutProposal.ts @@ -0,0 +1,51 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { ethers } from "hardhat"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { Action, DiamondGovernanceClient, ProposalMetadata } from "../sdk/index"; +import { days, now } from "../utils/timeUnits"; +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; + +const diamondGovernanceAddress = ""; +const proposalMetadata : ProposalMetadata = { + title: "Diamond cut proposal", + description: "Example of diamond cut", + body: "

Diamond cuts are pretty cool

", + resources: [{ + name: "Diamond cut docs", + url: "https://docs.secureseco.org/actions/diamond-cut", + }], +} +const endDate = now() + 7 * days; + +async function main() { + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const client = new DiamondGovernanceClient(diamondGovernanceAddress, owner); + + const cut : DiamondCut[] = [ + + ]; + const action : Action = { + interface: "IDiamondCut", + method: "diamondCut((address,uint8,bytes4[],bytes)[])", + params: { + _diamondCut: cut.map(c => c.ToBlockchain()) + } + }; + + await client.sugar.CreateProposal(proposalMetadata, [action], new Date(0), new Date(endDate * 1000)); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/scripts/GenerateFacet.ts b/scripts/GenerateFacet.ts new file mode 100644 index 0000000..328067c --- /dev/null +++ b/scripts/GenerateFacet.ts @@ -0,0 +1,133 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import fs from "fs"; +import path from "path"; + +const templateFacetFile = "./example-facet/barebones/TemplateFacet.sol.example"; +const templateInterfaceFile = + "./example-facet/barebones/ITemplateFacet.sol.example"; +const templateStorageFile = + "./example-facet/barebones/LibTemplateStorage.sol.example"; +const iFacetLocation = "./contracts/facets/IFacet.sol"; +const facetDirectory = "./contracts/facets"; +const storageDirectory = "./contracts/libraries/storage"; + +const printHelpMessage = () => { + const exampleUsage = `npm run generate-facet --name="VeryCool" --output="/aragon" --includeStorage=true`; + console.log( + +`Example usage: ${exampleUsage} + +Arguments: +\t--name= +\t\t[REQUIRED] Resulting name will be Facet.sol + +\t--output= +\t\t[REQUIRED] Directory where facet will be generated. This is appended to \"./contracts/facets\" + +\t--includeStorage=" +\t\t[OPTIONAL] Whether to generate a storage library for your facet. Defaults to false. +` + + ); +}; + +async function main() { + console.log({ + name: process.env.npm_config_name, + output: process.env.npm_config_output, + includeStorage: process.env.npm_config_includeStorage, + }); + if (!process.env.npm_config_name) { + console.log("No name provided; use --name=NAME\r\n"); + printHelpMessage(); + return; + } + if (!process.env.npm_config_output) { + console.log("No output provided; use --output=PATH\r\n"); + printHelpMessage(); + return; + } + const name: string = process.env.npm_config_name; + const outputDirectory: string = path.join(facetDirectory, process.env.npm_config_output); + const includeStorage: boolean = + process.env.npm_config_includeStorage === "true"; + + if (!fs.existsSync(outputDirectory)) { + console.log(`Creating directory: ${outputDirectory}`); + fs.mkdirSync(outputDirectory); + } + + console.log(`Started generating facet: ${name}Facet.sol`); + + const outputFacetPath = path.join(outputDirectory, `${name}Facet.sol`); + const outputInterfacePath = path.join(outputDirectory, `I${name}Facet.sol`); + const outputStoragePath = path.join( + storageDirectory, + `Lib${name}Storage.sol` + ); + const relativeIFacetPath = + path.relative(outputDirectory, iFacetLocation).replaceAll("\\", "\/"); + const relativeStoragePath = + path.relative(outputDirectory, outputStoragePath).replaceAll("\\", "\/"); + + const outputFacet = fs + .readFileSync(templateFacetFile, "utf-8") + .replaceAll("Counter", name) + .replace( + "/* INSERT IFACET IMPORT HERE */", + `import { IFacet } from "${relativeIFacetPath}";` + ) + .replace( + "/* INSERT STORAGE IMPORT HERE */", + includeStorage + ? `import { Lib${name}Storage } from "${relativeStoragePath}";` + : "" + ); + + const outputInterface = fs + .readFileSync(templateInterfaceFile, "utf-8") + .replaceAll("Counter", name); + + fs.writeFileSync(outputFacetPath, outputFacet); + console.log(`Finished generating facet: ${outputFacetPath}`); + fs.writeFileSync(outputInterfacePath, outputInterface); + console.log(`Finished generating interface: ${outputInterfacePath}`); + + if (includeStorage) { + const nameSplit = name.replace(/([a-z])([A-Z])/g, "$1 $2"); // split on camelCase using regex + const nameSplitUpper = nameSplit.toUpperCase().replaceAll(" ", "_"); // convert to uppercase and replace spaces with underscores + const nameSplitLower = nameSplit.toLowerCase().replaceAll(" ", "."); // convert to lowercase and replace spaces with dots + const outputStorage = fs + .readFileSync(templateStorageFile, "utf-8") + .replaceAll("COUNTER", nameSplitUpper) + .replaceAll("counter", nameSplitLower) + .replace("Counter", name); // only the class name needs to be replaced + + fs.writeFileSync(outputStoragePath, outputStorage); + console.log(`Finished generating storage: ${outputStoragePath}`); + } else { + console.log("Skipping storage generation"); + } + + console.log(); + console.log( + "Don't forget to replace placeholder variable in the storage struct!" + ); + console.log( + "Don't forget to replace placeholder variable in the init params struct!" + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/GenerateSDK.ts b/scripts/GenerateSDK.ts index 031599c..f563801 100644 --- a/scripts/GenerateSDK.ts +++ b/scripts/GenerateSDK.ts @@ -8,10 +8,18 @@ import fs from "fs"; import { generateInterfaceIds } from "./sdk/GenerateInterfaceIds"; +import { ethers } from "hardhat"; +import { getSelectors } from "../utils/diamondHelper"; +import { FunctionSelectorsJson, VariableSelectorsJson } from "../utils/jsonTypes"; const insertInterfaces = "/* interfaces */"; const insertMethods = "/* interface methods */"; -function generateInterfaceMethod(interfaceName : string, interfaceId : string) { +const templateFile = "./generated/client-template.ts"; +const outputFile = "./generated/client.ts"; +const reverseSelectorFile = "./generated/functionSelectors.json"; +const variableSelectorFile = "./generated/variableSelectors.json"; + +async function generateInterfaceMethod(interfaceName : string, interfaceId : string) : Promise { return ` public async ${interfaceName}() : Promise<${interfaceName}> { return await this._get<${interfaceName}>(DiamondGovernanceInterfaces.${interfaceName}, "${interfaceId}"); @@ -22,22 +30,77 @@ async function main() { console.log("Started generating of SDK"); const interfaceIds = await generateInterfaceIds(); const interfaceKeys = Object.keys(interfaceIds); - console.log("Interfaces detected: ", interfaceIds); let interfaceMethodArray = []; + let reverseFunctionSelectorLookup : FunctionSelectorsJson = {}; + let variableSelectors : VariableSelectorsJson = {}; for (let i = 0; i < interfaceKeys.length; i++) { const name = interfaceKeys[i]; - interfaceMethodArray.push(generateInterfaceMethod(name, interfaceIds[name])); + interfaceMethodArray.push(await generateInterfaceMethod(name, interfaceIds[name])); + + const contract = await ethers.getContractAt(name, ethers.constants.AddressZero); + //reverseFunctionSelectorLookup + const selectors = getSelectors(contract).selectors; + for (let j = 0; j < selectors.length; j++) { + reverseFunctionSelectorLookup[selectors[j]] = name; + } + + //variableSelectors + const functions = Object.keys(contract.interface.functions); + for (let j = 0; j < functions.length; j++) { + // Is not a get function (getX(args)) + if (!functions[j].startsWith("get")) { continue; } + const variableName = functions[j].split('(')[0].substring(3); + + // There exists no set function (setX(args)) + const setFunctionIndex = functions.findIndex(f => f.startsWith("set" + variableName)); + if (setFunctionIndex === -1) { continue; } + + const getFunctionFrag = contract.interface.functions[functions[j]]; + // Get functions with inputs currently not supported + if (getFunctionFrag.inputs.length > 0) { continue; } + + // Get function without output is illegal + if (getFunctionFrag.outputs == undefined) { console.warn("Variable get function for", variableName, "has no outputs"); continue; } + if (getFunctionFrag.outputs.length < 0) { console.warn("Variable get function for", variableName, "has no outputs"); continue; } + if (getFunctionFrag.outputs.length > 1) { console.warn("Variable get function for", variableName, "has more than 1 output"); continue; } + + // Check if set function matches the get function and follows the programming patterns + const setFunctionFrag = contract.interface.functions[functions[setFunctionIndex]]; + if (setFunctionFrag.inputs.length < 0) { console.warn("Variable set function for", variableName, "has no inputs"); continue; } + if (setFunctionFrag.inputs.length > 1) { console.warn("Variable set function for", variableName, "has more than 1 input"); continue; } + if (setFunctionFrag.inputs[0].type !== getFunctionFrag.outputs[0].type) { + console.warn("Variable get and set function for", variableName, "have different types for out and input"); + continue; + } + if (setFunctionFrag.inputs[0].name !== "_" + firstLetterToLowercase(variableName)) { + console.warn("Variable set function for", variableName, "does not follow pattern of _variableName"); + continue; + } + + variableSelectors[contract.interface.getSighash(functions[j])] = { + facetName: name, + variableName: variableName, + variableType: getFunctionFrag.outputs[0].format("full"), + setSelector: contract.interface.getSighash(functions[setFunctionIndex]), + }; + } } const interfaces = interfaceKeys.join(", "); const methods = interfaceMethodArray.join("\n"); - const template = fs.readFileSync("./sdk/src/client-template.ts", 'utf-8'); + const template = fs.readFileSync(templateFile, 'utf-8'); const newClient = template.replaceAll(insertInterfaces, interfaces).replaceAll(insertMethods, methods); - fs.writeFileSync("./sdk/src/client.ts", newClient); - console.log("Finished generating of SDK"); + fs.writeFileSync(outputFile, newClient); + fs.writeFileSync(reverseSelectorFile, JSON.stringify(reverseFunctionSelectorLookup)); + fs.writeFileSync(variableSelectorFile, JSON.stringify(variableSelectors)); + console.log("Finished generating of SDK with", interfaceKeys.length, "interfaces"); +} + +function firstLetterToLowercase(str : string) : string { + return str.charAt(0).toLowerCase() + str.slice(1); } // We recommend this pattern to be able to use async/await everywhere diff --git a/scripts/sdk/GenerateInterfaceIds.ts b/scripts/sdk/GenerateInterfaceIds.ts index 4c6cc6e..0250167 100644 --- a/scripts/sdk/GenerateInterfaceIds.ts +++ b/scripts/sdk/GenerateInterfaceIds.ts @@ -6,24 +6,27 @@ * LICENSE file in the root directory of this source tree. */ -import { ethers } from "hardhat"; +import { ethers, network } from "hardhat"; export async function generateInterfaceIds() { - const InterfaceIdsContract = await ethers.getContractFactory("InterfaceIds"); - const InterfaceIds : any = await InterfaceIdsContract.deploy(); + if (network.name != "hardhat"){ + throw new Error("Deploying InterfaceIds on real blockchain!"); + } + const InterfaceIdsContract = await ethers.getContractFactory("InterfaceIds"); + const InterfaceIds : any = await InterfaceIdsContract.deploy(); - const InterfaceIdsKeys = Object.keys(InterfaceIds); - let interfaceIdObj : { [id: string]: string; } = { }; - for (let i = 0; i < InterfaceIdsKeys.length; i++) { - const key = InterfaceIdsKeys[i]; + const InterfaceIdsKeys = Object.keys(InterfaceIds); + let interfaceIdObj : { [id: string]: string; } = { }; + for (let i = 0; i < InterfaceIdsKeys.length; i++) { + const key = InterfaceIdsKeys[i]; - // Every interface defined in this contract should end with _ID (used to distinct from other object properties generated by ethers/hardhat) - if (!key.endsWith("_ID")) { continue; } + // Every interface defined in this contract should end with _ID (used to distinct from other object properties generated by ethers/hardhat) + if (!key.endsWith("_ID")) { continue; } - // IERC165 is already included in the template, as this is required for the sdk to do safety checks - if (key == "IERC165_ID") { continue; } + // IERC165 is already included in the template, as this is required for the sdk to do safety checks + if (key == "IERC165_ID") { continue; } - interfaceIdObj[key.substring(0, key.length-3)] = await InterfaceIds[key].call(); - } - return interfaceIdObj; + interfaceIdObj[key.substring(0, key.length-3)] = await InterfaceIds[key].call(); + } + return interfaceIdObj; } \ No newline at end of file diff --git a/sdk/hardhat.config.ts b/sdk/hardhat.config.ts deleted file mode 100644 index 959ae28..0000000 --- a/sdk/hardhat.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Typescript support for smart contract interaction -import '@typechain/hardhat' -import '@nomiclabs/hardhat-ethers' - -/** @type import('hardhat/config').HardhatUserConfig */ -module.exports = { - solidity: "0.8.17", -}; diff --git a/sdk/index.ts b/sdk/index.ts index 6ccb5f2..15bfd91 100644 --- a/sdk/index.ts +++ b/sdk/index.ts @@ -1,6 +1,6 @@ import { Signer } from "@ethersproject/abstract-signer"; -import { DiamondGovernancePure } from "./src/client"; +import { DiamondGovernancePure } from "../generated/client"; import { DiamondGovernanceSugar } from "./src/sugar"; import { VerificationSugar } from "./src/verification"; @@ -14,7 +14,21 @@ export class DiamondGovernanceClient { this.sugar = new DiamondGovernanceSugar(this.pure); this.verification = new VerificationSugar(this.sugar, _signer); } + + public Update(_pluginAddress : string, _signer : Signer) { + this.pure = new DiamondGovernancePure(_pluginAddress, _signer); + this.sugar = new DiamondGovernanceSugar(this.pure); + this.verification = new VerificationSugar(this.sugar, _signer); + } + + public UpdateAddress(_pluginAddress : string) { + this.Update(_pluginAddress, this.pure.signer); + } + + public UpdateSigner(_signer : Signer) { + this.Update(this.pure.pluginAddress, _signer); + } } -export * from "./src/client"; +export * from "../generated/client"; export * from "./src/sugar"; \ No newline at end of file diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 8570065..24de0d5 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,44 +1,20 @@ { "name": "@plopmenz/diamond-governance-sdk", - "version": "0.1.1", + "version": "0.1.33", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@plopmenz/diamond-governance-sdk", - "version": "0.1.1", + "version": "0.1.33", "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@nomiclabs/hardhat-ethers": "^2.2.3" - } - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "peer": true - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "peer": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "peer": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" + "axios": "^1.4.0", + "ethers": "^5.7.0", + "form-data": "^4.0.0" } }, "node_modules/@ethersproject/abi": { @@ -167,7 +143,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -243,7 +218,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -297,7 +271,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -327,7 +300,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -410,7 +382,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -435,9 +406,9 @@ } }, "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", + "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", "funding": [ { "type": "individual", @@ -448,7 +419,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -472,27 +442,6 @@ "ws": "7.4.6" } }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@ethersproject/random": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", @@ -507,7 +456,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -546,7 +494,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -590,7 +537,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -660,7 +606,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -681,7 +626,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -736,7 +680,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -745,91 +688,83 @@ "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "peer": true, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "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" - }, - "engines": { - "node": ">=12.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", - "peer": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=14" + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethers": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", + "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", "funding": [ { "type": "individual", @@ -840,7 +775,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -857,10 +791,10 @@ "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", + "@ethersproject/networks": "5.7.0", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", + "@ethersproject/providers": "5.7.0", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", @@ -870,202 +804,32 @@ "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", + "@ethersproject/web": "5.7.0", "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "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" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", - "peer": true, - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", - "peer": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, + "node_modules/ethers/node_modules/@ethersproject/networks": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", + "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "node_modules/ethers/node_modules/@ethersproject/web": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", + "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", "funding": [ { "type": "individual", @@ -1076,6623 +840,717 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, "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" + "@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" } }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", - "peer": true, - "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3" + "node": ">=4.0" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", - "peer": true, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "ethereum-cryptography": "0.1.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=14" + "node": ">= 6" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "peer": true, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "peer": true, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "peer": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=14" + "node": ">= 0.6" } }, - "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "peer": true, - "engines": { - "node": ">= 12" + "mime-db": "1.52.0" }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, "engines": { - "node": ">= 10" + "node": ">= 0.6" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true - }, - "node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "peer": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "peer": true, - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "peer": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "peer": true, - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "peer": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "peer": true, - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "peer": true - }, - "node_modules/@types/node": { - "version": "18.16.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", - "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", - "peer": true - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "peer": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "peer": true, - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "peer": true, - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "peer": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "peer": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "peer": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "peer": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "peer": true - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "peer": true - }, - "node_modules/bigint-crypto-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "peer": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "peer": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "peer": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "peer": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "peer": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "peer": true, - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "peer": true, - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "peer": true - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "peer": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true - }, - "node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "peer": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "peer": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "peer": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "peer": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "peer": true, - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "peer": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true - }, - "node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "peer": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ethereumjs-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true - }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", - "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/abstract-provider": "^5.0.0", - "@ethersproject/abstract-signer": "^5.0.0", - "@ethersproject/address": "^5.0.0", - "@ethersproject/base64": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/hash": "^5.0.0", - "@ethersproject/hdnode": "^5.0.0", - "@ethersproject/json-wallets": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/networks": "^5.0.0", - "@ethersproject/pbkdf2": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@ethersproject/random": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/sha2": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0", - "@ethersproject/solidity": "^5.0.0", - "@ethersproject/strings": "^5.0.0", - "@ethersproject/transactions": "^5.0.0", - "@ethersproject/units": "^5.0.0", - "@ethersproject/wallet": "^5.0.0", - "@ethersproject/web": "^5.0.0", - "@ethersproject/wordlists": "^5.0.0" - } - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "peer": true, - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "peer": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "peer": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "peer": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "peer": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "peer": true - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "peer": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "peer": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "peer": true - }, - "node_modules/hardhat": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", - "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@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", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.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", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "peer": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "peer": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "peer": true - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "peer": true, - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "peer": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "peer": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "peer": true, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "peer": true, - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "peer": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "peer": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "peer": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "peer": true, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "peer": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "peer": true, - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "peer": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "peer": true, - "dependencies": { - "obliterator": "^2.0.0" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "peer": true, - "dependencies": { - "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" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "peer": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "peer": true - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "peer": true - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "peer": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "peer": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "peer": true - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "peer": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "peer": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "peer": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "peer": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "peer": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "peer": true, - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "peer": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "peer": true - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "peer": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "peer": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "peer": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "peer": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "peer": true, - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "peer": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "peer": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "peer": true - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "peer": true - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "peer": true - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "peer": true - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.0.tgz", - "integrity": "sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==", - "peer": true, - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "peer": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "peer": true - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "peer": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "peer": true, - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "peer": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "peer": true - }, - "@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "peer": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "peer": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "peer": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "peer": true, - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "peer": true, - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "peer": true, - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "peer": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "peer": true, - "requires": { - "@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" - }, - "dependencies": { - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "peer": true, - "requires": {} - } - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "peer": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "peer": true, - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "peer": true, - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "peer": true, - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "peer": true, - "requires": { - "@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": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@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": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "peer": true, - "requires": { - "@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" - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "peer": true, - "requires": { - "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": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "peer": true - }, - "@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "peer": true - }, - "@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "peer": true, - "requires": { - "@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" - } - } - } - }, - "@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "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" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" - } - }, - "@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", - "peer": true, - "requires": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", - "peer": true - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "peer": true, - "requires": { - "@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" - } - } - } - }, - "@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", - "peer": true, - "requires": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", - "peer": true, - "requires": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "peer": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "peer": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "peer": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "peer": true, - "requires": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "optional": true, - "peer": true - }, - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "optional": true, - "peer": true - }, - "@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "requires": {} - }, - "@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "peer": true - }, - "@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "peer": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "peer": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "peer": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "peer": true, - "requires": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "peer": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "peer": true, - "requires": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - } - }, - "@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "peer": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "peer": true - }, - "@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "peer": true, - "requires": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "peer": true - }, - "@types/node": { - "version": "18.16.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", - "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", - "peer": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "peer": true, - "requires": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "peer": true, - "requires": { - "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" - } - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "peer": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "peer": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "peer": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "peer": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "peer": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "peer": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "peer": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "peer": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "peer": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "peer": true - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "peer": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "peer": true - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "peer": true - }, - "bigint-crypto-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", - "peer": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "peer": true - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "peer": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "peer": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "peer": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "peer": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "peer": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "peer": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "peer": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "peer": true - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "peer": true, - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "peer": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true - }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "peer": true - }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "peer": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "peer": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "peer": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "peer": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "peer": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "peer": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "peer": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "peer": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "peer": true - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "peer": true - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "peer": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "peer": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "peer": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "peer": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "peer": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "peer": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "peer": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "peer": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "peer": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true - }, - "ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "peer": true, - "requires": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "peer": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true - } - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "peer": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "peer": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "ethers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", - "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", - "peer": true, - "requires": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/abstract-provider": "^5.0.0", - "@ethersproject/abstract-signer": "^5.0.0", - "@ethersproject/address": "^5.0.0", - "@ethersproject/base64": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/hash": "^5.0.0", - "@ethersproject/hdnode": "^5.0.0", - "@ethersproject/json-wallets": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/networks": "^5.0.0", - "@ethersproject/pbkdf2": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@ethersproject/random": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/sha2": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0", - "@ethersproject/solidity": "^5.0.0", - "@ethersproject/strings": "^5.0.0", - "@ethersproject/transactions": "^5.0.0", - "@ethersproject/units": "^5.0.0", - "@ethersproject/wallet": "^5.0.0", - "@ethersproject/web": "^5.0.0", - "@ethersproject/wordlists": "^5.0.0" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "peer": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "peer": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "peer": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "peer": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "peer": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "peer": true - }, - "fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "peer": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "peer": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true, - "peer": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "peer": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "peer": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "peer": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "peer": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "peer": true - }, - "hardhat": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", - "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@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", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.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", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "peer": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "peer": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "peer": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true + "utf-8-validate": { + "optional": true } } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "peer": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "peer": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "peer": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "peer": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "peer": true - }, - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "peer": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "peer": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "peer": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "peer": true, - "requires": { - "fp-ts": "^1.0.0" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "peer": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "peer": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "peer": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "peer": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "peer": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "peer": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "peer": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "peer": true - }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "peer": true - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "peer": true, + } + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "requires": { - "argparse": "^2.0.1" + "@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" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "peer": true, + "@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "requires": { - "graceful-fs": "^4.1.6" + "@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" } }, - "keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "peer": true, + "@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.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" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "peer": true, + "@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "requires": { - "graceful-fs": "^4.1.9" + "@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" } }, - "level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "peer": true, + "@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "requires": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" + "@ethersproject/bytes": "^5.7.0" } }, - "level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "peer": true - }, - "level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "peer": true, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "peer": true, + "@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "peer": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "peer": true, + "@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@ethersproject/logger": "^5.7.0" } }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "peer": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "peer": true, + "@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "requires": { - "yallist": "^3.0.2" + "@ethersproject/bignumber": "^5.7.0" } }, - "mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "peer": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "peer": true, + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@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" } }, - "memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "peer": true, + "@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "requires": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" + "@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" } }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "peer": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "requires": { - "brace-expansion": "^1.1.7" + "@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" } }, - "mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "peer": true, + "@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "requires": { - "obliterator": "^2.0.0" + "@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" } }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "peer": true, + "@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "requires": { - "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" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "peer": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "peer": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "peer": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "peer": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "peer": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, - "module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "peer": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "peer": true - }, - "napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "peer": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "peer": true - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "peer": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "peer": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "peer": true - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "peer": true + "@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "peer": true, + "@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "requires": { - "wrappy": "1" + "@ethersproject/logger": "^5.7.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "peer": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "peer": true, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "requires": { - "p-try": "^1.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "peer": true, + "@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "requires": { - "p-limit": "^1.1.0" + "@ethersproject/logger": "^5.7.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "peer": true, + "@ethersproject/providers": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", + "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", "requires": { - "aggregate-error": "^3.0.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/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" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "peer": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "peer": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "peer": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "peer": true, + "@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "peer": true - }, - "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "peer": true, + "@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "requires": { - "side-channel": "^1.0.4" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "peer": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, + "@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "requires": { - "safe-buffer": "^5.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "peer": true, + "@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.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" } }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "peer": true, + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@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" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "peer": true, + "@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "requires": { - "picomatch": "^2.2.1" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "peer": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "peer": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "peer": true, + "@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "requires": { - "path-parse": "^1.0.6" + "@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" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, + "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "requires": { - "glob": "^7.1.3" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "peer": true, + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "@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" } }, - "rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "peer": true, + "@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "requires": { - "bn.js": "^5.2.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" } }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "peer": true, + "@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "requires": { - "queue-microtask": "^1.2.2" + "@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" } }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "peer": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "peer": true + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "peer": true, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "peer": true + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "peer": true + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "peer": true, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "delayed-stream": "~1.0.0" } }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "peer": true, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } } }, - "solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "peer": true, + "ethers": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", + "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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" + "@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.0", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.0", + "@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.0", + "@ethersproject/wordlists": "5.7.0" }, "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "peer": true, + "@ethersproject/networks": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", + "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "@ethersproject/logger": "^5.7.0" } }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "peer": true, + "@ethersproject/web": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", + "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", "requires": { - "graceful-fs": "^4.1.6" + "@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" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true } } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "peer": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "peer": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true - } - } + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "peer": true, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { - "ansi-regex": "^5.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "peer": true, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "requires": { - "is-hex-prefixed": "1.0.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "peer": true + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "peer": true, - "requires": { - "os-tmpdir": "~1.0.2" - } + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "peer": true, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "is-number": "^7.0.0" + "mime-db": "1.52.0" } }, - "toidentifier": { + "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "peer": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "peer": true - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "peer": true - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "peer": true - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "peer": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "peer": true - }, - "undici": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.0.tgz", - "integrity": "sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==", - "peer": true, - "requires": { - "busboy": "^1.6.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "peer": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "peer": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "peer": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "peer": true + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "peer": true + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - } - } + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "peer": true + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "peer": true, + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "requires": {} - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "peer": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "peer": true, - "requires": { - "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-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "peer": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "peer": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "peer": true } } } diff --git a/sdk/package.json b/sdk/package.json index 52db43b..e29037a 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@plopmenz/diamond-governance-sdk", - "version": "0.1.1", + "version": "0.1.33", "description": "SDK for Diamond Governance, a ERC-2535 DAO bridge.", "main": "dist/sdk/index.js", "typings": "dist/sdk/index.d.ts", @@ -34,6 +34,8 @@ "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@nomiclabs/hardhat-ethers": "^2.2.3" + "axios": "^1.4.0", + "ethers": "^5.7.0", + "form-data": "^4.0.0" } } diff --git a/sdk/src/abi/verificationContractAbi.ts b/sdk/src/abi/verificationContractAbi.ts new file mode 100644 index 0000000..06c8d2f --- /dev/null +++ b/sdk/src/abi/verificationContractAbi.ts @@ -0,0 +1,122 @@ +export const verificationContractAbi = [ + { + inputs: [], + name: "reverifyThreshold", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_toCheck", + type: "address", + }, + ], + name: "getStamps", + outputs: [ + { + components: [ + { + internalType: "string", + name: "providerId", + type: "string", + }, + { + internalType: "string", + name: "userHash", + type: "string", + }, + { + internalType: "uint64[]", + name: "verifiedAt", + type: "uint64[]", + }, + ], + internalType: "struct GithubVerification.Stamp[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getThresholdHistory", + outputs: [ + { + components: [ + { + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "threshold", + type: "uint64", + }, + ], + internalType: "struct GithubVerification.Threshold[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_providerId", + type: "string", + }, + ], + name: "unverify", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_toVerify", + type: "address", + }, + { + internalType: "string", + name: "_userHash", + type: "string", + }, + { + internalType: "uint64", + name: "_timestamp", + type: "uint64", + }, + { + internalType: "string", + name: "_providerId", + type: "string", + }, + { + internalType: "bytes", + name: "_proofSignature", + type: "bytes", + }, + ], + name: "verifyAddress", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +]; diff --git a/sdk/src/client.ts b/sdk/src/client.ts deleted file mode 100644 index 914dc5b..0000000 --- a/sdk/src/client.ts +++ /dev/null @@ -1,162 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { ethers } from "hardhat"; -import { Signer } from "@ethersproject/abstract-signer"; -import { IERC165, IAuthProvider, IBurnableGovernanceStructure, IDiamondLoupe, IERC173, IERC20Metadata, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, ITieredMembershipStructure, IVerificationFacet, IVotes } from "../../typechain-types"; - -enum DiamondGovernanceInterfaces { IERC165, IAuthProvider, IBurnableGovernanceStructure, IDiamondLoupe, IERC173, IERC20Metadata, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, ITieredMembershipStructure, IVerificationFacet, IVotes } - -class DiamondGovernancePure { - public pluginAddress : string; - public signer : Signer; - private cache: { [id: string] : any } - - public constructor(_pluginAddress : string, _signer : Signer) { - this.pluginAddress = _pluginAddress; - this.signer = _signer; - this.cache = { }; - Object.freeze(this); - } - - public async IERC165() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC165, ""); - } - - public async IAuthProvider() : Promise { - return await this._get(DiamondGovernanceInterfaces.IAuthProvider, "0xb2aee3b9"); - } - - public async IBurnableGovernanceStructure() : Promise { - return await this._get(DiamondGovernanceInterfaces.IBurnableGovernanceStructure, "0x85d9cf86"); - } - - public async IDiamondLoupe() : Promise { - return await this._get(DiamondGovernanceInterfaces.IDiamondLoupe, "0x48e2b093"); - } - - public async IERC173() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC173, "0x7f5828d0"); - } - - public async IERC20Metadata() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20Metadata, "0xa219a025"); - } - - public async IERC20OneTimeRewardFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20OneTimeRewardFacet, "0x8c5c884c"); - } - - public async IERC20OneTimeVerificationRewardFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20OneTimeVerificationRewardFacet, "0xf61c53c0"); - } - - public async IERC20PartialBurnVotingProposalRefundFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20PartialBurnVotingProposalRefundFacet, "0x4aabfd6c"); - } - - public async IERC20PartialBurnVotingRefundFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20PartialBurnVotingRefundFacet, "0x91e2ebbe"); - } - - public async IERC20Permit() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20Permit, "0x9d8ff7da"); - } - - public async IERC20TieredTimeClaimableFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20TieredTimeClaimableFacet, "0x3a17fed2"); - } - - public async IERC20TimeClaimableFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20TimeClaimableFacet, "0x065b0962"); - } - - public async IERC20() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC20, "0x36372b07"); - } - - public async IERC6372() : Promise { - return await this._get(DiamondGovernanceInterfaces.IERC6372, "0xda287a1d"); - } - - public async IGithubPullRequestFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IGithubPullRequestFacet, "0xa1ff1300"); - } - - public async IGovernanceStructure() : Promise { - return await this._get(DiamondGovernanceInterfaces.IGovernanceStructure, "0x217205e6"); - } - - public async IMembershipExtended() : Promise { - return await this._get(DiamondGovernanceInterfaces.IMembershipExtended, "0x2a21f601"); - } - - public async IMembershipWhitelisting() : Promise { - return await this._get(DiamondGovernanceInterfaces.IMembershipWhitelisting, "0x9b19251a"); - } - - public async IMembership() : Promise { - return await this._get(DiamondGovernanceInterfaces.IMembership, "0xa230c524"); - } - - public async IMintableGovernanceStructure() : Promise { - return await this._get(DiamondGovernanceInterfaces.IMintableGovernanceStructure, "0x03520be9"); - } - - public async IPartialVotingFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IPartialVotingFacet, "0xe7ce0a62"); - } - - public async IPartialVotingProposalFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IPartialVotingProposalFacet, "0x753cf0af"); - } - - public async IPlugin() : Promise { - return await this._get(DiamondGovernanceInterfaces.IPlugin, "0x41de6830"); - } - - public async IProposal() : Promise { - return await this._get(DiamondGovernanceInterfaces.IProposal, "0xda35c664"); - } - - public async ITieredMembershipStructure() : Promise { - return await this._get(DiamondGovernanceInterfaces.ITieredMembershipStructure, "0xdea631ee"); - } - - public async IVerificationFacet() : Promise { - return await this._get(DiamondGovernanceInterfaces.IVerificationFacet, "0x40cd79b9"); - } - - public async IVotes() : Promise { - return await this._get(DiamondGovernanceInterfaces.IVotes, "0xe90fb3f6"); - } - - private async _get(_interface : DiamondGovernanceInterfaces, _interfaceId : string) : Promise { - if (this.cache.hasOwnProperty(_interface)) { - return this.cache[_interface] as Type; - } - - const name = DiamondGovernanceInterfaces[_interface]; - const contract = await ethers.getContractAt(name, this.pluginAddress, this.signer) as Type; - if (_interface !== DiamondGovernanceInterfaces.IERC165) { - if (_interfaceId === null || _interfaceId === undefined) { - throw new Error("Invalid interfaceId"); - } - - const ierc165 = await this.IERC165(); - const isSupported = await ierc165.supportsInterface(_interfaceId); - if (!isSupported) { - throw new Error("Interface not supported by the diamond"); - } - } - this.cache[name] = contract; - return contract; - } -} - -export { DiamondGovernanceInterfaces, DiamondGovernancePure, IERC165, IAuthProvider, IBurnableGovernanceStructure, IDiamondLoupe, IERC173, IERC20Metadata, IERC20OneTimeRewardFacet, IERC20OneTimeVerificationRewardFacet, IERC20PartialBurnVotingProposalRefundFacet, IERC20PartialBurnVotingRefundFacet, IERC20Permit, IERC20TieredTimeClaimableFacet, IERC20TimeClaimableFacet, IERC20, IERC6372, IGithubPullRequestFacet, IGovernanceStructure, IMembershipExtended, IMembershipWhitelisting, IMembership, IMintableGovernanceStructure, IPartialVotingFacet, IPartialVotingProposalFacet, IPlugin, IProposal, ITieredMembershipStructure, IVerificationFacet, IVotes } \ No newline at end of file diff --git a/sdk/src/sugar.ts b/sdk/src/sugar.ts index 84bc403..30985ec 100644 --- a/sdk/src/sugar.ts +++ b/sdk/src/sugar.ts @@ -1,13 +1,19 @@ -import { DiamondGovernancePure } from "./client"; -import { ProposalStatus, ProposalSorting, SortingOrder, VoteOption, ProposalMetadata, Action, Stamp } from "./sugar/data"; +import { DiamondGovernancePure } from "../../generated/client"; +import { ProposalStatus, ProposalSorting, SortingOrder, ProposalMetadata, Action, InterfaceVariables, Variable } from "./sugar/data"; import { ProposalCache } from "./sugar/proposal-cache"; import { Proposal } from "./sugar/proposal"; import { EncodeMetadata } from "./sugar/proposal-metadata"; import { ToAction } from "./sugar/actions"; import { asyncFilter, asyncMap, ToBlockchainDate } from "./utils"; -import type { ContractTransaction } from "ethers"; +import { ContractReceipt, ContractTransaction } from "ethers"; +import { getEvents } from "../../utils/utils"; +import variableSelectorsJson from "../../generated/variableSelectors.json"; +import { VariableSelectorsJson } from "../../utils/jsonTypes"; +import { MarketMaker, SimpleHatch } from "../../typechain-types"; +import { GetTypedContractAt } from "../../utils/contractHelper"; export * from "./sugar/data"; +export * from "./sugar/proposal"; export class DiamondGovernanceSugar { private pure: DiamondGovernancePure; @@ -22,6 +28,16 @@ export class DiamondGovernanceSugar { return IVerificationFacet.getVerificationContractAddress(); } + public async GetABCHatcher() : Promise { + const IABCConfigureFacet = await this.pure.IABCConfigureFacet(); + return GetTypedContractAt("SimpleHatch", await IABCConfigureFacet.getHatcher(), this.pure.signer); + } + + public async GetABCMarketMaker() : Promise { + const IABCConfigureFacet = await this.pure.IABCConfigureFacet(); + return GetTypedContractAt("MarketMaker", await IABCConfigureFacet.getMarketMaker(), this.pure.signer); + } + /** * Fetch all members of the DAO * @returns list of addresses that are members of the DAO @@ -44,7 +60,7 @@ export class DiamondGovernanceSugar { const IPartialVotingFacet = await this.pure.IPartialVotingFacet(); const getProposalCount = async () => (await IProposal.proposalCount()).toNumber(); - const getProposal = async (i : number) => await Proposal.New(i, await IPartialVotingProposalFacet.getProposal(i), IPartialVotingProposalFacet, IPartialVotingFacet); + const getProposal = async (i : number) => await Proposal.New(this.pure, i, await IPartialVotingProposalFacet.getProposal(i), IPartialVotingProposalFacet, IPartialVotingFacet); return new ProposalCache(getProposal, getProposalCount); } @@ -61,7 +77,9 @@ export class DiamondGovernanceSugar { count : number = 10, refreshSorting : boolean = false ) : Promise { - this.proposalCache = this.proposalCache ?? await this.InitProposalCache(); + if (this.proposalCache == null) { + this.proposalCache = await this.InitProposalCache(); + } return await this.proposalCache.GetProposals(status, sorting, order, fromIndex, count, refreshSorting); } @@ -70,21 +88,41 @@ export class DiamondGovernanceSugar { * @param id Id of the proposal to retrieve * @returns {Promise} Proposal object */ - public async GetProposal(id : number) : Promise { - this.proposalCache = this.proposalCache ?? await this.InitProposalCache(); - return await this.proposalCache.GetProposal(id); + public async GetProposal(id : number, useCache : boolean = true) : Promise { + if (this.proposalCache == null) { + this.proposalCache = await this.InitProposalCache(); + } + return await this.proposalCache.GetProposal(id, useCache); } /** - * Retrieve the number of proposals from the cache, if the cache is not initialized it will be initialized - * @returns {Promise} Number of proposals (in the cache) -> are these all proposals or only the ones that are open? + * Retrieve the number of proposals + * @returns {Promise} Number of proposals */ public async GetProposalCount() : Promise { - this.proposalCache = this.proposalCache ?? await this.InitProposalCache(); + if (this.proposalCache == null) { + this.proposalCache = await this.InitProposalCache(); + } return await this.proposalCache.GetProposalCount() } - // maybe add return type proposal id? + /** + * Retrieve the number of proposals with a certain status filter active + * @param status The status filter, undefined means no filter and returns GetProposalCount + * @returns {Promise} Number of proposals + */ + public async GetFilteredProposalCount(status : ProposalStatus[] | undefined = undefined) : Promise { + if (this.proposalCache == null) { + this.proposalCache = await this.InitProposalCache(); + } + if (status == undefined) return await this.GetProposalCount(); + else return await this.proposalCache.GetFilteredProposalCount(status); + } + + public async ClearProposalCache() { + this.proposalCache = await this.InitProposalCache(); + } + /** * Creates a proposal using the IPartialVotingProposalFacet interface/contract * @param metadata Proposal metadata object (IPFS related) @@ -96,12 +134,57 @@ export class DiamondGovernanceSugar { const IPartialVotingProposalFacet = await this.pure.IPartialVotingProposalFacet(); return await IPartialVotingProposalFacet.createProposal( EncodeMetadata(metadata), - await asyncMap(actions, (action : Action) => ToAction(this.pure.pluginAddress, action)), + await asyncMap(actions, (action : Action) => ToAction(this.pure, this.pure.pluginAddress, action, this.pure.signer)), 0, ToBlockchainDate(startDate), ToBlockchainDate(endDate), true ); } + + public async GetProposalId(receipt : ContractReceipt) : Promise { + const IProposal = await this.pure.IProposal(); + const proposalCreationEvent = getEvents(IProposal, "ProposalCreated", receipt); + if (proposalCreationEvent.length < 1) { + throw new Error("Proposal creation event not found"); + } + const proposalId = proposalCreationEvent[0].args.proposalId; + return proposalId; + } + + /** + * Gets all variables that are gettable in the facets of the Diamond + * @returns {Promise} The variables in the facets of the Diamond + */ + public async GetVariables() : Promise { + let interfaceVariables : { [interfaceName: string] : Variable[] } = { }; + const variableSelectors : VariableSelectorsJson = variableSelectorsJson; + + const IDiamondLoupe = await this.pure.IDiamondLoupe(); + const facetSelectors = await IDiamondLoupe.facets(); + for (let i = 0; i < facetSelectors.length; i++) { + for (let j = 0; j < facetSelectors[i].functionSelectors.length; j++) { + const functionSelector = facetSelectors[i].functionSelectors[j]; + if (!variableSelectors.hasOwnProperty(functionSelector)) { + // Likely not a get function, or a get function that has not been processed (custom?) + continue; + } + + const variableInfo = variableSelectors[functionSelector]; + if (!interfaceVariables.hasOwnProperty(variableInfo.facetName)) { + interfaceVariables[variableInfo.facetName] = []; + } + + interfaceVariables[variableInfo.facetName].push({ + variableName: variableInfo.variableName, + variableType: variableInfo.variableType, + changeable: facetSelectors[i].functionSelectors.includes(variableInfo.setSelector), + }); + } + } + + const interfaces = Object.keys(interfaceVariables); + return interfaces.map(interfaceName => { return { interfaceName: interfaceName, variables: interfaceVariables[interfaceName] }; }); + } } diff --git a/sdk/src/sugar/actions.ts b/sdk/src/sugar/actions.ts index 90016ec..b527062 100644 --- a/sdk/src/sugar/actions.ts +++ b/sdk/src/sugar/actions.ts @@ -7,20 +7,12 @@ */ import { IDAO, Action } from "./data"; -import { ethers } from "hardhat"; -import { DiamondGovernanceInterfaces } from "../client"; -import { FunctionFragment, Interface, ParamType } from "@ethersproject/abi"; +import { ParamType } from "@ethersproject/abi"; import { arrayify } from "@ethersproject/bytes"; - -// Source: https://github.com/aragon/sdk/blob/60edc9e36ba58909391085153f6a5c2a2f4c5e9c/modules/client/src/client-common/encoding.ts#L63 -function getFunctionFragment( - data: Uint8Array, - availableFunctions: string[], -): FunctionFragment { - const hexBytes = bytesToHex(data); - const iface = new Interface(availableFunctions); - return iface.getFunction(hexBytes.substring(0, 10)); -} +import { GetAbi, GetTypedContractAt, ReverseFunctionSelectorLookup } from "../../../utils/contractHelper"; +import { ethers } from "ethers"; +import { Signer } from "@ethersproject/abstract-signer"; +import { IDAOReferenceFacet, IERC165 } from "../../../typechain-types"; // Source: https://github.com/aragon/sdk/blob/60edc9e36ba58909391085153f6a5c2a2f4c5e9c/modules/common/src/encoding.ts#L24 export function bytesToHex(buff: Uint8Array, skip0x?: boolean): string { @@ -39,18 +31,57 @@ export function bytesToHex(buff: Uint8Array, skip0x?: boolean): string { * @param action Action (interface, method, params) object * @returns {Promise} ActionStruct object */ -export async function ToAction(toAddress : string, action : Action) : Promise { - const contract = await ethers.getContractAt(action.interface, ethers.constants.AddressZero); - const inputs = await contract.interface.functions[action.method].inputs; - const args = inputs.map((input : ParamType) => action.params[input.name]); - const calldata = await contract.interface.encodeFunctionData(action.method, args); - return { - to: toAddress, - // idk if the value is an information field? In the Aragon SDK it is zero everywhere - // This is the native token value, this should be zero assuming it isn't a paid function - value: Object.keys(DiamondGovernanceInterfaces).indexOf(action.interface) + 1, - data: calldata - }; +export async function ToAction(contracts : any, pluginAddress : string, action : Action, signer : Signer) : Promise { + if (action.interface == "DAO") { + if (action.method == "WithdrawNative") { + return { + to: action.params._to, + value: action.params._value, + data: new Uint8Array() + }; + } + else if (action.method == "WithdrawERC20") { + const IERC20 = new ethers.utils.Interface(GetAbi("IERC20")); + + const IDAOReferenceFacet = await contracts["IDAOReferenceFacet"]() as IDAOReferenceFacet; + const DAOAddress = await IDAOReferenceFacet.dao(); + const data = action.params._from == DAOAddress ? + await IERC20.encodeFunctionData("transfer", [action.params._to, action.params._amount]) : + await IERC20.encodeFunctionData("transferFrom(address,address,uint256)", [action.params._from, action.params._to, action.params._amount]); + + return { + to: action.params._contractAddress, + value: 0, + data: data + }; + } + else if (action.method == "WithdrawERC721") { + const IERC721 = new ethers.utils.Interface(GetAbi("IERC721")); + return { + to: action.params._contractAddress, + value: 0, + data: await IERC721.encodeFunctionData("transferFrom(address,address,uint256)", [action.params._from, action.params._to, action.params._tokenId]) + }; + } + else if (action.method == "WithdrawERC1155") { + const IERC1155 = new ethers.utils.Interface(GetAbi("IERC1155")); + return { + to: action.params._contractAddress, + value: 0, + data: await IERC1155.encodeFunctionData("safeTransferFrom(address,address,uint256,uint256,bytes)", [action.params._from, action.params._to, action.params._tokenId, action.params._amount, '0x']) + }; + } + } + + const contract = await contracts[action.interface](); + const inputs = await contract.interface.functions[action.method].inputs; + const args = inputs.map((input : ParamType) => action.params[input.name]); + const calldata = await contract.interface.encodeFunctionData(action.method, args); + return { + to: pluginAddress, + value: 0, + data: calldata + }; } /** @@ -58,29 +89,117 @@ export async function ToAction(toAddress : string, action : Action) : Promise} Action object */ -export async function ParseAction(action : IDAO.ActionStruct) : Promise { - if (action.value == 0) { +export async function ParseAction(contracts : any, pluginAddress : string, action : IDAO.ActionStruct, signer : Signer) : Promise { + // The action is not a Diamond Governance interaction + if (await action.to != pluginAddress) { + // The action sends native currency + if ((await action.value).toString() != "0") { return { - interface: "Unsupported", - method: "Likely made by Aragon SDK", - params: { } + interface: "DAO", + method: "WithdrawNative", + params: { + _to: action.to, + _value: action.value + } }; } + else { + const hexBytes = bytesToHex(arrayify(await action.data)); + const funcSelector = hexBytes.substring(0, 10); + if (funcSelector == "0xa9059cbb") { //transfer + const IERC20 = new ethers.utils.Interface(GetAbi("IERC20")); + const paramData = IERC20.decodeFunctionData("transfer(address,uint256)", await action.data); + const IDAOReferenceFacet = await contracts["IDAOReferenceFacet"]() as IDAOReferenceFacet; + const DAOAddress = await IDAOReferenceFacet.dao(); + return { + interface: "DAO", + method: "WithdrawERC20", + params: { + _from: DAOAddress, + _to: paramData[0], + _amount: paramData[1], + _contractAddress: await action.to + } + }; + } else if (funcSelector == "0x23b872dd") { //transferFrom + // This function is implemented with the same signature on both IERC20 as IERC721 (only the parameters have different meaning) + // IERC721 requires IERC165 support, we will use this to check if it's an IERC721 + const IERC165 = await GetTypedContractAt("IERC165", await action.to, signer); + try { + // Calling this on an IERC20 contract might give an error + const supportsIERC721 = await IERC165.supportsInterface("0x80ac58cd"); + if (!supportsIERC721) { + throw new Error("Not IERC721"); + } - const hexBytes = bytesToHex(arrayify(await action.data)); - const contractName = Object.keys(DiamondGovernanceInterfaces)[(action.value as any).toNumber() - 1]; - const contract = await ethers.getContractAt(contractName, ethers.constants.AddressZero); - const method = contract.interface.getFunction(hexBytes.substring(0, 10)); - const fullMethodName = method.name + "(" + method.inputs.map((input : ParamType) => input.type).join(",") + ")"; - const inputData = await contract.interface.decodeFunctionData(method, await action.data) - const params : { [name: string]: any } = { }; - for (let i = 0; i < inputData.length; i++) { - params[method.inputs[i].name] = inputData[i]; + const IERC721 = new ethers.utils.Interface(GetAbi("IERC721")); + const paramData = IERC721.decodeFunctionData("transferFrom(address,address,uint256)", await action.data); + return { + interface: "DAO", + method: "WithdrawERC721", + params: { + _from: paramData[0], + _to: paramData[1], + _tokenId: paramData[2], + _contractAddress: await action.to + } + }; + } + catch { + const IERC20 = new ethers.utils.Interface(GetAbi("IERC20")); + const paramData = IERC20.decodeFunctionData("transferFrom(address,address,uint256)", await action.data); + return { + interface: "DAO", + method: "WithdrawERC20", + params: { + _from: paramData[0], + _to: paramData[1], + _amount: paramData[2], + _contractAddress: await action.to + } + }; + } + } else if (funcSelector == "0xf242432a") { //safeTransferFrom + const IERC1155 = new ethers.utils.Interface(GetAbi("IERC1155")); + const paramData = IERC1155.decodeFunctionData("safeTransferFrom(address,address,uint256,uint256,bytes)", await action.data); + return { + interface: "DAO", + method: "WithdrawERC1155", + params: { + _from: paramData[0], + _to: paramData[1], + _tokenId: paramData[2], + _amount: paramData[3], + _contractAddress: await action.to + } + }; + } + else { + // Unkown action, not much we can here + return { + interface: "Contract" + await action.to, + method: "Function" + funcSelector, + params: { } + }; + } } + } + + const hexBytes = bytesToHex(arrayify(await action.data)); + const funcSelector = hexBytes.substring(0, 10); + const contractName = ReverseFunctionSelectorLookup(funcSelector); + const contract = await contracts[contractName](); + const method = contract.interface.getFunction(funcSelector); + const fullMethodName = method.name + "(" + method.inputs.map((input : ParamType) => input.type).join(",") + ")"; + const inputData = await contract.interface.decodeFunctionData(method, await action.data); + const params : { [name: string]: any } = { }; + for (let i = 0; i < inputData.length; i++) { + params[method.inputs[i].name] = inputData[i]; + } - return { - interface: contractName, - method: fullMethodName, - params: params - }; + return { + interface: contractName, + method: fullMethodName, + params: params + }; } \ No newline at end of file diff --git a/sdk/src/sugar/data.ts b/sdk/src/sugar/data.ts index 9db1218..008639b 100644 --- a/sdk/src/sugar/data.ts +++ b/sdk/src/sugar/data.ts @@ -6,7 +6,7 @@ * LICENSE file in the root directory of this source tree. */ -import { IDAO, IPartialVotingProposalFacet } from "../../../typechain-types"; +import { IDAO, IPartialVotingFacet, IPartialVotingProposalFacet } from "../../../typechain-types"; import { BigNumber } from 'ethers'; export { IDAO }; @@ -17,12 +17,15 @@ export enum SortingOrder { Asc, Desc } export interface ProposalData { open: boolean; - executed: boolean; + executed: BigNumber; parameters: IPartialVotingProposalFacet.ProposalParametersStructOutput; tally: IPartialVotingProposalFacet.TallyStructOutput; actions: IDAO.ActionStructOutput[]; - allowFailureMap: any; //bigNumber + allowFailureMap: BigNumber; metadata: string; + creator: string; + voterList: string[]; + executor: string; } export interface ProposalResource { @@ -43,27 +46,21 @@ export interface Action { params: { [name: string]: any }; } -// Used as a subtype of Action to make sure that the params are correct -export type WithdrawAction = Action & { - params: { - amount: BigNumber; - tokenAddress: string; - to: string; - } -} +export type Stamp = [id: string, userHash: string, verifiedAt: BigNumber[]]; +export type VerificationThreshold = [timestamp: BigNumber, threshold: BigNumber]; -// Used as a subtype of Action to make sure that the params are correct -export type MintAction = Action & { - params: { - to: [ - { - to: string; - amount: BigNumber; - tokenId: BigNumber; - } - ] - } +export interface AddressVotes { + address: string; + votes: IPartialVotingFacet.PartialVoteStructOutput[]; } -export type Stamp = [id: string, userHash: string, verifiedAt: BigNumber[]]; -export type VerificationThreshold = [timestamp: BigNumber, threshold: BigNumber]; \ No newline at end of file +export interface InterfaceVariables { + interfaceName: string; + variables: Variable[]; +}; + +export interface Variable { + variableName: string; + variableType: string; + changeable: boolean; +} \ No newline at end of file diff --git a/sdk/src/sugar/proposal-cache.ts b/sdk/src/sugar/proposal-cache.ts index b242a3e..747aff1 100644 --- a/sdk/src/sugar/proposal-cache.ts +++ b/sdk/src/sugar/proposal-cache.ts @@ -6,7 +6,8 @@ * LICENSE file in the root directory of this source tree. */ -import { ProposalData, ProposalStatus, ProposalSorting, SortingOrder } from "./data"; +import { asyncMap } from "../utils"; +import { ProposalStatus, ProposalSorting, SortingOrder } from "./data"; import { Proposal } from "./proposal"; /** @@ -17,11 +18,12 @@ import { Proposal } from "./proposal"; */ export class ProposalCache { private proposals: Proposal[]; + private unorderedProposals: { [index: number]: Proposal }; private getProposal: (i : number) => Promise; private getProposalCount: () => Promise; //ProposalSorting cast to number as id, same for status (only keep track of indexes, so refreshing is easier) //Actually should not be allowed to cache total votes on open proposals... (Refresh all open proposal upon selecting this filter?) - private cachedSorting: { [sort: number]: { [stat: number]: number[] } }; + private cachedSorting: { [stat: number]: { [sort: number]: number[] } }; /** * @param _getProposal Function to get proposal data from the blockchain @@ -32,19 +34,37 @@ export class ProposalCache { _getProposalCount : () => Promise ) { this.proposals = []; + this.unorderedProposals = { }; this.getProposal = _getProposal; this.getProposalCount = _getProposalCount; - this.cachedSorting = { }; + this.cachedSorting = { }; } /** * @param until Fill the cache until this index (exclusive) */ private async FillCacheUntil(until : number) { - while (this.proposals.length < until) { - const prop = await this.getProposal(this.proposals.length); - this.proposals.push(prop); + const indexes = [...Array(until - this.proposals.length).keys()].map(i => i + this.proposals.length); + await asyncMap(indexes, async (index) => { + if (this.unorderedProposals.hasOwnProperty(index)) { + this.proposals[index] = this.unorderedProposals[index]; + delete this.unorderedProposals[index]; + } else { + this.proposals[index] = await this.getProposal(index); + } + }); + } + + private async TryGetProposalFromCache(index : number) { + if (this.unorderedProposals.hasOwnProperty(index)) { + return this.unorderedProposals[index]; } + if (index < this.proposals.length) { + return this.proposals[index]; + } + + this.unorderedProposals[index] = await this.getProposal(index); + return this.unorderedProposals[index]; } /** @@ -55,19 +75,46 @@ export class ProposalCache { return await this.getProposalCount(); } + /** + * Asynchronously retrieve the number of proposals from the blockchain with a certain status filter applied + * @returns {Promise} The number of proposals + */ + public async GetFilteredProposalCount(status : ProposalStatus[]) : Promise { + const proposalCount = await this.GetProposalCount(); + await this.FillCacheUntil(proposalCount); + + const sorting = ProposalSorting.Creation; + const sort = sorting as number; + const stat = status.reduce((sum, x) => sum + x, 0); + if (!this.cachedSorting.hasOwnProperty(stat)) { + this.cachedSorting[stat] = { }; + } + if (!this.cachedSorting[stat].hasOwnProperty(sort)) { + this.cachedSorting[stat][sort] = this.proposals + .filter(prop => status.includes(prop.status)) + .sort(this.getSortingFunc(sorting)) + .map(prop => prop.id); + } + + return this.cachedSorting[stat][sort].length; + } + /** * Asynchronously retrieve a proposal from the blockchain * @param id The id of the proposal * @returns {Promise} The proposal with the given id */ - public async GetProposal(id : number) { + public async GetProposal(id : number, useCache : boolean = true) { const proposalCount = await this.GetProposalCount(); if (id < 0 || id > proposalCount) { throw new Error("Invalid id"); } + + if (!useCache) { + return await this.getProposal(this.proposals.length); + } - await this.FillCacheUntil(id + 1); - return this.proposals[id]; + return this.TryGetProposalFromCache(id); } /** @@ -77,26 +124,56 @@ export class ProposalCache { * @param order Order of results (ascending or descending) * @param fromIndex Index to start from * @param count Number of proposals to return - * @param refreshSorting Refresh the sorting (if false, the sorting will be cached) + * @param refreshSorting Refresh the proposals and the sorting (if false, the sorting will be cached) * @returns {Promise} List of proposals */ public async GetProposals(status : ProposalStatus[], sorting : ProposalSorting, order : SortingOrder, fromIndex : number, count : number, refreshSorting : boolean) : Promise { + if (status.length == Object.values(ProposalStatus).length/2 && sorting == ProposalSorting.Creation) { + // No need to fetch all proposals for sorting / filtering + return await this.GetProposalsEfficient(order, fromIndex, count); + } + const proposalCount = await this.GetProposalCount(); await this.FillCacheUntil(proposalCount); + if (refreshSorting) { + await asyncMap(this.proposals, prop => prop.Refresh()); + this.cachedSorting = { }; + } + const sort = sorting as number; const stat = status.reduce((sum, x) => sum + x, 0); - if (!this.cachedSorting.hasOwnProperty(sort)) { - this.cachedSorting[sort] = { }; + if (!this.cachedSorting.hasOwnProperty(stat)) { + this.cachedSorting[stat] = { }; } - if (!this.cachedSorting[sort].hasOwnProperty(stat) || refreshSorting) { - this.cachedSorting[sort][stat] = this.proposals + if (!this.cachedSorting[stat].hasOwnProperty(sort)) { + this.cachedSorting[stat][sort] = this.proposals .filter(prop => status.includes(prop.status)) - .sort(this.getSortingFunc(sorting, order)) + .sort(this.getSortingFunc(sorting)) .map(prop => prop.id); } - return this.cachedSorting[sort][stat].slice(fromIndex, fromIndex + count).map(i => this.proposals[i]); + let proposalIds = this.cachedSorting[stat][sort]; + if (order == SortingOrder.Desc) { + proposalIds = [...proposalIds].reverse(); + } + + return proposalIds.slice(fromIndex, fromIndex + count).map(i => this.proposals[i]); + } + + private async GetProposalsEfficient(order : SortingOrder, fromIndex : number, count : number) : Promise { + const proposals : number[] = []; + const proposalCount = await this.getProposalCount(); + for (let i = 0; i < count; i++) { + let index = fromIndex + i; + if (order == SortingOrder.Desc) { + index = proposalCount - 1 - index; + } + if (index < 0 || index >= proposalCount) break; + + proposals.push(index); + } + return asyncMap(proposals, p => this.TryGetProposalFromCache(p)); } /** @@ -105,14 +182,10 @@ export class ProposalCache { * @param order Order of results (ascending or descending) * @returns {Function} Function to sort proposals */ - private getSortingFunc(sorting : ProposalSorting, order : SortingOrder) : (prop1: Proposal, prop2: Proposal) => number { + private getSortingFunc(sorting : ProposalSorting) : (prop1: Proposal, prop2: Proposal) => number { const sort = (x1 : any, x2 : any) => { - // This can be significatly shorted with x1 - x2 (and switch on order reverse), but this is more readable + // This can be significatly shorted with x1 - x2, but that might not work for all types (string? BigNumbers?) if (x1 == x2) return 0; - if (order == SortingOrder.Asc) { - if (x1 < x2) return 1; - else return -1; - } else { if (x1 > x2) return 1; else return -1; @@ -128,7 +201,7 @@ export class ProposalCache { getAttribute = (prop : Proposal) => { return prop.metadata.title; } break; case ProposalSorting.TotalVotes: - getAttribute = (prop : Proposal) => { return prop.data.tally.abstain.add(prop.data.tally.yes).add(prop.data.tally.no).toNumber(); } + getAttribute = (prop : Proposal) => { return prop.data.tally.abstain.add(prop.data.tally.yes).add(prop.data.tally.no); } break; } diff --git a/sdk/src/sugar/proposal-metadata.ts b/sdk/src/sugar/proposal-metadata.ts index 77591bc..4c04881 100644 --- a/sdk/src/sugar/proposal-metadata.ts +++ b/sdk/src/sugar/proposal-metadata.ts @@ -17,5 +17,6 @@ export async function EncodeMetadata(metadata : ProposalMetadata) : Promise { const decoded = new TextDecoder().decode(metadata); const cid = decoded.replace("ipfs://", ""); - return JSON.parse(await getFromIpfs(cid)); + const proposalMetadata = await getFromIpfs(cid); + return proposalMetadata as ProposalMetadata; } \ No newline at end of file diff --git a/sdk/src/sugar/proposal.ts b/sdk/src/sugar/proposal.ts index 9257297..48f97ec 100644 --- a/sdk/src/sugar/proposal.ts +++ b/sdk/src/sugar/proposal.ts @@ -6,12 +6,12 @@ * LICENSE file in the root directory of this source tree. */ -import { ProposalData, ProposalStatus, Action, ProposalMetadata, VoteOption } from "./data"; +import { ProposalData, ProposalStatus, Action, ProposalMetadata, VoteOption, AddressVotes } from "./data"; import { DecodeMetadata } from "./proposal-metadata"; import { ParseAction } from "./actions"; -import { asyncMap } from "../utils"; -import { IPartialVotingFacet, IPartialVotingProposalFacet } from "../client"; -import type { ContractTransaction } from "ethers"; +import { asyncMap, FromBlockchainDate, FromBlocknumber } from "../utils"; +import { DiamondGovernancePure, IPartialVotingFacet, IPartialVotingProposalFacet } from "../../../generated/client"; +import type { ContractTransaction, BigNumber } from "ethers"; /** * Proposal is a class that represents a proposal on the blockchain. @@ -24,6 +24,13 @@ export class Proposal { public status: ProposalStatus; public actions: Action[]; + public startDate: Date; + public endDate: Date; + public creationDate: Date; + public executionDate: Date | undefined; + + private voterCache : { [address : string]: IPartialVotingFacet.PartialVoteStructOutput[] }; + private proposalContract: IPartialVotingProposalFacet; private voteContract: IPartialVotingFacet; @@ -38,22 +45,36 @@ export class Proposal { }; this.status = ProposalStatus.Pending; this.actions = []; + this.startDate = new Date(); + this.endDate = new Date(); + this.creationDate = new Date(); + this.voterCache = { }; this.proposalContract = _proposalContract; this.voteContract = _voteContract; } - private fromHexString(hexString : string) : Uint8Array { return Uint8Array.from(hexString.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) ?? new Uint8Array()); } + private fromHexString(hexString : string) : Uint8Array { + return Uint8Array.from(Buffer.from(hexString, 'hex')); + } /** * New proposal object from the blockchain * @param _id The id of the proposal * @param _data The data of the proposal * @returns {Promise} The proposal with the given id */ - public static async New(_id : number, _data : ProposalData, _proposalContract : IPartialVotingProposalFacet, _voteContract : IPartialVotingFacet) : Promise { + public static async New(_pure : DiamondGovernancePure, _id : number, _data : ProposalData, _proposalContract : IPartialVotingProposalFacet, _voteContract : IPartialVotingFacet) : Promise { const prop = new Proposal(_id, _data, _proposalContract, _voteContract); prop.metadata = await DecodeMetadata(prop.fromHexString(prop.data.metadata.substring(2))); //remove 0x and convert to utf-8 array prop.status = prop.getStatus(); - prop.actions = await asyncMap(prop.data.actions, ParseAction); + prop.actions = await asyncMap(prop.data.actions, async (a) => await ParseAction(_pure, _pure.pluginAddress, a, _pure.signer)); + + prop.startDate = FromBlockchainDate(prop.data.parameters.startDate.toNumber()); + prop.endDate = FromBlockchainDate(prop.data.parameters.endDate.toNumber()); + prop.creationDate = await FromBlocknumber(prop.data.parameters.snapshotBlock.toNumber(), _pure.signer); + if (prop.data.executed.gt(0)) { + prop.executionDate = await FromBlocknumber(prop.data.executed.toNumber(), _pure.signer); + } + return prop; } @@ -61,7 +82,7 @@ export class Proposal { * @returns {ProposalStatus} The status of the proposal */ private getStatus() : ProposalStatus { - if (this.data.executed) return ProposalStatus.Executed; + if (this.data.executed.gt(0)) return ProposalStatus.Executed; if (this.data.open) return ProposalStatus.Active; if (this.data.parameters.startDate.toNumber() < Date.now()) return ProposalStatus.Pending; @@ -77,7 +98,7 @@ export class Proposal { * @param _voteOption Which option to vote for (Yes, No, Abstain) * @param _voteAmount Number of tokens to vote with */ - public async CanVote(_voteOption : VoteOption, _voteAmount : number) : Promise { + public async CanVote(_voteOption : VoteOption, _voteAmount : BigNumber) : Promise { const address = await this.voteContract.signer.getAddress(); return await this.voteContract.canVote(this.id, address, { option : _voteOption, amount : _voteAmount }); } @@ -87,7 +108,7 @@ export class Proposal { * @param _voteOption Which option to vote for (Yes, No, Abstain) * @param _voteAmount Number of tokens to vote with */ - public async Vote(_voteOption : VoteOption, _voteAmount : number) : Promise { + public async Vote(_voteOption : VoteOption, _voteAmount : BigNumber) : Promise { return await this.voteContract.vote(this.id, { option : _voteOption, amount : _voteAmount }); } @@ -105,6 +126,24 @@ export class Proposal { return await this.proposalContract.execute(this.id); } + /** + * Get vote of address + */ + public async GetVote(address : string) : Promise { + if (!this.voterCache.hasOwnProperty(address)) { + this.voterCache[address] = await this.proposalContract.getVoteOption(this.id, address); + } + return this.voterCache[address]; + } + + /** + * Get votes on proposal, count undefined gives all + */ + public async GetVotes(fromIndex : number = 0, count : number | undefined = undefined) : Promise { + const addresses = this.data.voterList.slice(fromIndex, count == undefined ? undefined : fromIndex + count); + return await asyncMap(addresses, async (address) => { return { address: address, votes: await this.GetVote(address) }; }); + } + /** * Refreshed the data */ @@ -113,5 +152,6 @@ export class Proposal { // metadata doesn't change this.status = this.getStatus(); // actions doesn't change + this.voterCache = { }; } } \ No newline at end of file diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts index f6fb27d..97a6778 100644 --- a/sdk/src/utils.ts +++ b/sdk/src/utils.ts @@ -1,3 +1,5 @@ +import { Signer } from "@ethersproject/abstract-signer"; + /** * @param arr Array to filter on * @param predicate Function to filter with @@ -28,4 +30,34 @@ export async function asyncMap(arr : T1[], func : ((elem : T1) => Promis */ export function ToBlockchainDate(date : Date) : number { return Math.round(date.getTime() / 1000); +} + +/** + * @remarks + * + * Converts seconds timestamp to js Date + * + * @param timestamp Timestamp to convert + * @returns {Date} js date + */ +export function FromBlockchainDate(timestamp : number) : Date { + let date = new Date(); + date.setTime(timestamp * 1000); + return date; +} + +/** + * @remarks + * + * Converts block number to js Date this block was mined + * + * @param blockNumber Block number to get mine date from + * @returns {Date} js date + */ +export async function FromBlocknumber(blockNumber : number, signer : Signer) : Promise { + if (signer.provider == undefined) { + throw new Error("Provider of signer not found"); + } + const block = await signer.provider.getBlock(blockNumber); + return FromBlockchainDate(block.timestamp); } \ No newline at end of file diff --git a/sdk/src/verification.ts b/sdk/src/verification.ts index 259eb39..ac2aca3 100644 --- a/sdk/src/verification.ts +++ b/sdk/src/verification.ts @@ -1,8 +1,8 @@ -import { ethers } from "hardhat"; -import { GithubVerification } from "../../typechain-types"; +import { SignVerification } from "../../typechain-types"; import { DiamondGovernanceSugar, Stamp, VerificationThreshold } from "./sugar"; -import { BigNumber } from "ethers"; +import { ContractTransaction, BigNumber } from "ethers"; import { Signer } from "@ethersproject/abstract-signer"; +import { GetTypedContractAt } from "../../utils/contractHelper"; /** * VerificationSugar is a class that provides methods for interacting with the verification contract. @@ -13,12 +13,12 @@ import { Signer } from "@ethersproject/abstract-signer"; export class VerificationSugar { /** * Cache for the verification contract and threshold history - * + * * @remarks * This cache is used to reduce the number of calls to the blockchain, the cache is filled on the first call to a method that requires it */ private cache: { - verificationContract?: GithubVerification; + verificationContract?: SignVerification; thresholdHistory?: VerificationThreshold[]; }; private sugar: DiamondGovernanceSugar; @@ -34,15 +34,10 @@ export class VerificationSugar { * Gets the verification contract object * @returns The verification contract object */ - public async GetVerificationContract(): Promise { + public async GetVerificationContract(): Promise { if (this.cache.verificationContract == null) { - const verificationContractAddress = - await this.GetVerificationContractAddress(); - this.cache.verificationContract = (await ethers.getContractAt( - "GithubVerification", - verificationContractAddress, - this.signer - )) as GithubVerification; + const verificationContractAddress = await this.sugar.GetVerificationContractAddress(); + this.cache.verificationContract = await GetTypedContractAt("SignVerification", verificationContractAddress, this.signer); } return this.cache.verificationContract; } @@ -84,7 +79,7 @@ export class VerificationSugar { const currentTimestamp = Math.round(Date.now() / 1000); const lastVerifiedAt = stamp - ? stamp[2][stamp[2].length -1] + ? stamp[2][stamp[2].length - 1] : BigNumber.from(0); // Retrieve the threshold history, and the threshold for the current timestamp @@ -100,10 +95,11 @@ export class VerificationSugar { stamp[2] != null && stamp[2].length > 0 && thresholdHistory != null && - thresholdHistory.length > 0 && - currentTimestamp >= lastVerifiedAt.toNumber(); + thresholdHistory.length > 0; - const expirationDate = lastVerifiedAt.add(threshold.mul(24 * 60 * 60)).toNumber(); + const expirationDate = lastVerifiedAt + .add(threshold.mul(24 * 60 * 60)) + .toNumber(); const verified = preCondition && stamp != null && currentTimestamp < expirationDate; @@ -131,6 +127,7 @@ export class VerificationSugar { * @param timestamp The timestamp in seconds * @param providerId The provider ID (github, proofofhumanity, etc.) * @param proofSignature The signature that you receive from the verification back-end + * @return Transaction of the object */ public async Verify( toVerify: string, @@ -138,9 +135,9 @@ export class VerificationSugar { timestamp: number, providerId: string, proofSignature: string - ): Promise { + ): Promise { const verificationContract = await this.GetVerificationContract(); - await verificationContract.verifyAddress( + return await verificationContract.verifyAddress( toVerify, userHash, timestamp, @@ -153,17 +150,14 @@ export class VerificationSugar { * Unverifies the current user * @param providerId The provider ID (github, proofofhumanity, etc.) */ - public async Unverify(providerId: string): Promise { + public async Unverify(providerId: string): Promise { const verificationContract = await this.GetVerificationContract(); - await verificationContract.unverify(providerId); + return await verificationContract.unverify(providerId); } - /** - * Gets the verification contract address - * @returns The verification contract address - */ - private async GetVerificationContractAddress(): Promise { - return this.sugar.GetVerificationContractAddress(); + public async GetReverifyThreshold(): Promise { + const verificationContract = await this.GetVerificationContract(); + return await verificationContract.reverifyThreshold(); } /** @@ -182,4 +176,5 @@ export class VerificationSugar { return threshold ? threshold[1] : BigNumber.from(0); } + } diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index fbde998..71cdf54 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -7,7 +7,7 @@ "outDir": "dist", "resolveJsonModule": true }, - "include": ["./src"], + "include": ["./src", "../generated/client.ts"], "exclude": ["node_modules"], - "files": ["./hardhat.config.ts"] + "files": ["./index.ts"] } \ No newline at end of file diff --git a/secrets.ts b/secrets.ts index 77831ff..4cb3efc 100644 --- a/secrets.ts +++ b/secrets.ts @@ -18,20 +18,8 @@ export function POLYGONSCAN_API_KEY() { return fromEnv; } -export function MUMBAI_API_KEY() { - const fromEnv = process.env.MUMBAI_API_KEY; - if (fromEnv === undefined) { return "NO_MUMBAI_API_KEY_FOUND"; } - return fromEnv; -} - export function MUMBAI_PRIVATE_KEY() { const fromEnv = process.env.MUMBAI_PRIVATE_KEY; if (fromEnv === undefined) { return "0000000000000000000000000000000000000000000000000000000000000000"; } return fromEnv; -} - -export function IPFS_PINATA_TOKEN() { - const fromEnv = process.env.IPFS_PINATA_TOKEN; - if (fromEnv === undefined) { return "0000000000000000000000000000000000000000000000000000000000000000"; } - return fromEnv; } \ No newline at end of file diff --git a/test/Test_ABC.ts b/test/Test_ABC.ts new file mode 100644 index 0000000..805973f --- /dev/null +++ b/test/Test_ABC.ts @@ -0,0 +1,375 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; +import { BigNumber } from "ethers"; + +// Tests +import { expect } from "chai"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { ether, wei } from "../utils/etherUnits"; +import { minutes, now } from "../utils/timeUnits"; +import { GetTypedContractAt } from "../utils/contractHelper"; + +// Types +import { ERC20, MarketMaker, SimpleHatch, Vesting } from "../typechain-types"; + +// Other +import { ABCDeployer, ABCDeployerSettings } from "../deployments/deploy_MonetaryToken"; +import { DiamondGovernanceClient } from "../sdk/index"; + +const hatchParameters = { + initialPrice: ether.mul(1), + minimumRaise: ether.mul(10), + maximumRaise: ether.mul(20), + hatchDeadlineTime: now() + 10 * minutes, +}; +const vestingSchedule = { + cliff: 5 * minutes, + duration: 15 * minutes, +}; + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + // Use fixed supply monetary token as external token + const ERC20MonetaryTokenContract = await ethers.getContractFactory("ERC20MonetaryToken"); + const ERC20MonetaryToken = await ERC20MonetaryTokenContract.deploy("Token", "TOK"); + await ERC20MonetaryToken.init(owner.address, ether.mul(1_000_000)); + + const ABCDeployerSettings : ABCDeployerSettings = { + curveParameters: { + theta: 0.05 * 10**6, + friction: 0.01 * 10**6, + reserveRatio: 0.2 * 10**6, + }, + hatchParameters: { + initialPrice: hatchParameters.initialPrice, + minimumRaise: hatchParameters.minimumRaise, + maximumRaise: hatchParameters.maximumRaise, + hatchDeadline: now() + hatchParameters.hatchDeadlineTime, + }, + vestingSchedule: { + cliff: vestingSchedule.cliff, + start: now() + hatchParameters.hatchDeadlineTime, + duration: vestingSchedule.duration, + revocable: false, + }, + externalERC20: ERC20MonetaryToken.address, + }; + const deployer = new ABCDeployer(ABCDeployerSettings); + const monetaryToken = await deployer.beforeDAODeploy(); + + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const MonetaryTokenFacetSettings = { + monetaryTokenContractAddress: monetaryToken, + }; + const ABCConfigureFacetSettings = { + marketMaker: deployer.deployedContracts.MarketMaker, + hatcher: deployer.deployedContracts.SimpleHatch, + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.MonetaryTokenFacet, [MonetaryTokenFacetSettings]), + await DiamondCut.All(diamondGovernance.ABCConfigureFacet, [ABCConfigureFacetSettings]), + ]; + const client = await createTestingDao(cut); + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + await deployer.afterDAODeploy(await IDAOReferenceFacet.dao(), client.pure.pluginAddress); + return client; +} + +async function Contribute(client : DiamondGovernanceClient, amount : BigNumber) { + const [owner] = await ethers.getSigners(); + const IABCConfigureFacet = await client.pure.IABCConfigureFacet(); + const SimpleHatch = await GetTypedContractAt("SimpleHatch", await IABCConfigureFacet.getHatcher(), owner); + const externalToken = await GetTypedContractAt("ERC20", (await SimpleHatch.getState()).params.externalToken, owner); + await externalToken.approve(SimpleHatch.address, amount); + await SimpleHatch.contribute(amount); + return SimpleHatch; +} + +async function GetVesting() { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + const SimpleHatch = await Contribute(client, hatchParameters.maximumRaise); + await SimpleHatch.hatch(); + + await SimpleHatch.claimVesting(); + return GetTypedContractAt("Vesting", await SimpleHatch.viewVesting(), owner); +} + +async function GetMarketMaker() { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + const SimpleHatch = await Contribute(client, hatchParameters.maximumRaise); + await SimpleHatch.hatch(); + + const IABCConfigureFacet = await client.pure.IABCConfigureFacet(); + const MarketMakerAddress = await IABCConfigureFacet.getMarketMaker(); + const externalToken = await GetTypedContractAt("ERC20", (await SimpleHatch.getState()).params.externalToken, owner); + await externalToken.approve(MarketMakerAddress, ethers.constants.MaxUint256); + + return GetTypedContractAt("MarketMaker", MarketMakerAddress, owner); +} + +describe("ABC", () => { + describe("Hatching", () => { + it("should not be able to hatch right away", async () => { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + + const IABCConfigureFacet = await client.pure.IABCConfigureFacet(); + const SimpleHatch = await GetTypedContractAt("SimpleHatch", await IABCConfigureFacet.getHatcher(), owner); + expect(SimpleHatch.hatch()).to.be.revertedWithCustomError(SimpleHatch, "NotEnoughRaised"); + }); + + it("should not be able to hatch if under minimum raise and after the deadline", async () => { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + + const IABCConfigureFacet = await client.pure.IABCConfigureFacet(); + const SimpleHatch = await GetTypedContractAt("SimpleHatch", await IABCConfigureFacet.getHatcher(), owner); + await time.increase(hatchParameters.hatchDeadlineTime); + expect(SimpleHatch.hatch()).to.be.revertedWithCustomError(SimpleHatch, "NotEnoughRaised"); + }); + + it("should not be able to hatch right away if at the minimum raise", async () => { + const client = await loadFixture(getClient); + + const SimpleHatch = await Contribute(client, hatchParameters.minimumRaise); + + expect(SimpleHatch.hatch()).to.be.revertedWithCustomError(SimpleHatch, "NotEnoughRaised"); + }); + + it("should be able to hatch if at the minimum raise and after the hatch deadline", async () => { + const client = await loadFixture(getClient); + + const SimpleHatch = await Contribute(client, hatchParameters.minimumRaise); + await time.increase(hatchParameters.hatchDeadlineTime); + + expect(SimpleHatch.hatch()).to.not.be.reverted; + }); + + it("should be able to hatch right away if at the maximum raise", async () => { + const client = await loadFixture(getClient); + + const SimpleHatch = await Contribute(client, hatchParameters.maximumRaise); + + expect(SimpleHatch.hatch()).to.not.be.reverted; + }); + }); + + describe("Vesting", () => { + it("should allow contributors to claim their vesting contract", async () => { + const client = await loadFixture(getClient); + + const SimpleHatch = await Contribute(client, hatchParameters.maximumRaise); + await SimpleHatch.hatch(); + await SimpleHatch.claimVesting(); + + expect(await SimpleHatch.viewVesting()).to.not.be.equal(ethers.constants.AddressZero); + }); + + it("should not allow non-contributors to claim a vesting contract", async () => { + const client = await loadFixture(getClient); + const [_, nonContributor] = await ethers.getSigners(); + + const SimpleHatch = await Contribute(client, hatchParameters.maximumRaise); + await SimpleHatch.hatch(); + const SimpleHatchNonContributor = await GetTypedContractAt("SimpleHatch", SimpleHatch.address, nonContributor); + + expect(SimpleHatchNonContributor.claimVesting()).to.be.revertedWithCustomError(SimpleHatch, "NoContribution"); + }); + + it("should allow all tokens to be claimable after vesting is over", async () => { + const vesting = await loadFixture(GetVesting); + + const vestingState = await vesting.getState(); + await time.increaseTo(vestingState.schedule.start.add(vestingState.schedule.duration)); + + expect(await vesting.computeReleasableAmount()).to.be.equal(vestingState.amountTotal); + }); + + it("should allow half of the tokens to be claimable halfway through the vesting", async () => { + const vesting = await loadFixture(GetVesting); + + const vestingState = await vesting.getState(); + await time.increaseTo(vestingState.schedule.start.add(vestingState.schedule.duration.div(2))); + + expect(await vesting.computeReleasableAmount()).to.be.equal(vestingState.amountTotal.div(2)); + }); + + it("should not allow any tokens to be claimable before the cliff", async () => { + const vesting = await loadFixture(GetVesting); + + const vestingState = await vesting.getState(); + await time.increaseTo(vestingState.schedule.start.add(vestingState.schedule.cliff.sub(1))); + + expect(await vesting.computeReleasableAmount()).to.be.equal(0); + }); + + it("should release the releaseable tokens", async () => { + const vesting = await loadFixture(GetVesting); + const [owner] = await ethers.getSigners(); + + await time.increase(vestingSchedule.duration); + const releaseable = await vesting.computeReleasableAmount(); + const ERC20 = await GetTypedContractAt("ERC20", await vesting.getToken(), owner); + + const balanceBefore = await ERC20.balanceOf(owner.address); + await vesting.release(releaseable); + + expect(await ERC20.balanceOf(owner.address)).to.be.equal(balanceBefore.add(releaseable)); + }); + + it("should not release more than the total amount", async () => { + const vesting = await loadFixture(GetVesting); + const [owner] = await ethers.getSigners(); + + const ERC20 = await GetTypedContractAt("ERC20", await vesting.getToken(), owner); + const balanceBefore = await ERC20.balanceOf(owner.address); + const total = (await vesting.getState()).amountTotal; + + await time.increase(vestingSchedule.duration / 2); + await vesting.release(await vesting.computeReleasableAmount()); + await time.increase(vestingSchedule.duration / 2); + await vesting.release(await vesting.computeReleasableAmount()); + await time.increase(vestingSchedule.duration / 2); + await vesting.release(await vesting.computeReleasableAmount()); + + expect(await ERC20.balanceOf(owner.address)).to.be.equal(balanceBefore.add(total)); + }); + }); + + describe("MarketMaker", () => { + it("should not allow to mint before hatch", async () => { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + + const IABCConfigureFacet = await client.pure.IABCConfigureFacet(); + const MarketMaker = await GetTypedContractAt("MarketMaker", await IABCConfigureFacet.getMarketMaker(), owner); + const externalToken = await GetTypedContractAt("ERC20", await MarketMaker.externalToken(), owner); + await externalToken.approve(MarketMaker.address, ethers.constants.MaxUint256); + + expect(MarketMaker.mint(ether.mul(1), wei.mul(0))).to.be.revertedWithCustomError(MarketMaker, "HatchingNotStarted"); + }); + + it("should give the correct amount of bonded tokens on mint", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const amount = ether.mul(1); + + const bondedToken = await GetTypedContractAt("ERC20", await MarketMaker.bondedToken(), owner); + const balanceBefore = await bondedToken.balanceOf(owner.address); + const expectedTokens = await MarketMaker.calculateMint(amount); + await MarketMaker.mint(amount, wei.mul(0)); + + expect(await bondedToken.balanceOf(owner.address)).to.be.equal(balanceBefore.add(expectedTokens)); + }); + + it("should take the correct amount of external tokens on mint", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const amount = ether.mul(1); + + const externalToken = await GetTypedContractAt("ERC20", await MarketMaker.externalToken(), owner); + const balanceBefore = await externalToken.balanceOf(owner.address); + await MarketMaker.mint(amount, wei.mul(0)); + + expect(await externalToken.balanceOf(owner.address)).to.be.equal(balanceBefore.sub(amount)); + }); + + it("should send some of the external token to the DAO on mint", async () => { + const client = await loadFixture(getClient); + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const amount = ether.mul(1); + + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + const DAOAddress = await IDAOReferenceFacet.dao(); + const externalToken = await GetTypedContractAt("ERC20", await MarketMaker.externalToken(), owner); + const balanceBefore = await externalToken.balanceOf(DAOAddress); + await MarketMaker.mint(amount, wei.mul(0)); + + expect(await externalToken.balanceOf(DAOAddress)).to.be.gt(balanceBefore); + }); + + it("should give the correct amount of external tokens on burn", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const mintAmount = ether.mul(1); + + await MarketMaker.mint(mintAmount, wei.mul(0)); + const bondedToken = await GetTypedContractAt("ERC20", await MarketMaker.bondedToken(), owner); + const externalToken = await GetTypedContractAt("ERC20", await MarketMaker.externalToken(), owner); + const bondedTokenBalance = await bondedToken.balanceOf(owner.address); + const balanceBefore = await externalToken.balanceOf(owner.address); + let expectedTokens = await MarketMaker.calculateBurn(bondedTokenBalance); + expectedTokens = expectedTokens.sub(await MarketMaker.calculateFee(expectedTokens)); + await MarketMaker.burn(bondedTokenBalance, wei.mul(0)); + + expect(await externalToken.balanceOf(owner.address)).to.be.equal(balanceBefore.add(expectedTokens)); + expect(expectedTokens).to.be.lt(mintAmount); + }); + + it("should take the correct amount of bonded tokens on burn", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const mintAmount = ether.mul(1); + + await MarketMaker.mint(mintAmount, wei.mul(0)); + const bondedToken = await GetTypedContractAt("ERC20", await MarketMaker.bondedToken(), owner); + const bondedTokenBalance = await bondedToken.balanceOf(owner.address); + let expectedTokens = await MarketMaker.calculateBurn(bondedTokenBalance); + expectedTokens = expectedTokens.sub(await MarketMaker.calculateFee(expectedTokens)); + await MarketMaker.burn(bondedTokenBalance, wei.mul(0)); + + expect(await bondedToken.balanceOf(owner.address)).to.be.equal(0); + }); + + it("should revert if receiving less bonded tokens on mint than min recieve", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const amount = ether.mul(1); + + const expectedTokens = await MarketMaker.calculateMint(amount); + + expect(MarketMaker.mint(amount, expectedTokens.add(1))).to.be.revertedWithCustomError(MarketMaker, "WouldRecieveLessThanMinRecieve"); + }); + + it("should revert if receiving less bonded tokens on mint than min recieve", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const amount = ether.mul(1); + + let expectedTokens = await MarketMaker.calculateBurn(amount); + expectedTokens = expectedTokens.sub(await MarketMaker.calculateFee(expectedTokens)); + + expect(MarketMaker.burn(amount, expectedTokens.add(1))).to.be.revertedWithCustomError(MarketMaker, "WouldRecieveLessThanMinRecieve"); + }); + + it("should give you less tokens on burn than what you paid to mint", async () => { + const MarketMaker = await loadFixture(GetMarketMaker); + const [owner] = await ethers.getSigners(); + const mintAmount = ether.mul(1); + + const externalERC20 = await GetTypedContractAt("ERC20", await MarketMaker.externalToken(), owner); + const balanceBefore = await externalERC20.balanceOf(owner.address); + await MarketMaker.mint(mintAmount, wei.mul(0)); + const bondedToken = await GetTypedContractAt("ERC20", await MarketMaker.bondedToken(), owner); + const bondedTokenBalance = await bondedToken.balanceOf(owner.address); + await MarketMaker.burn(bondedTokenBalance, wei.mul(0)); + + expect(await externalERC20.balanceOf(owner.address)).to.be.lt(balanceBefore); + }); + }); +}); \ No newline at end of file diff --git a/test/Test_AragonAuthFacet.ts b/test/Test_AragonAuthFacet.ts new file mode 100644 index 0000000..29ed0e2 --- /dev/null +++ b/test/Test_AragonAuthFacet.ts @@ -0,0 +1,75 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { AuthConsumerTestFacet } from "../typechain-types"; + +// Types + +// Other + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.DiamondCutFacet), + await DiamondCut.All(diamondGovernance.DiamondLoupeFacet), + await DiamondCut.All(diamondGovernance.DAOReferenceFacet), + await DiamondCut.All(diamondGovernance.PluginFacet), + await DiamondCut.All(diamondGovernance.AragonAuthFacet), + await DiamondCut.All(diamondGovernance.AuthConsumerTestFacet), + ]; + return createTestingDao(cut, false); + } + +describe("AragonAuthFacet", () => { + it("should allow the plugin itself", async () => { + const client = await loadFixture(getClient); + const signer = await ethers.getImpersonatedSigner(client.pure.pluginAddress); + client.pure.signer.sendTransaction({ to: signer.address, value: ethers.utils.parseEther("1")}); // Smart contract by default has no funds to pay for gas + const AuthConsumerTestFacet = await GetTypedContractAt("AuthConsumerTestFacet", client.pure.pluginAddress, signer); + + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.false; + await AuthConsumerTestFacet.Execute(); + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.true; + }); + + it("should allow the dao", async () => { + const client = await loadFixture(getClient); + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + const DAOAddress = await IDAOReferenceFacet.dao(); + const signer = await ethers.getImpersonatedSigner(DAOAddress); + client.pure.signer.sendTransaction({ to: signer.address, value: ethers.utils.parseEther("1")}); // Smart contract by default has no funds to pay for gas + const AuthConsumerTestFacet = await GetTypedContractAt("AuthConsumerTestFacet", client.pure.pluginAddress, signer); + + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.false; + await AuthConsumerTestFacet.Execute(); + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.true; + }); + + it("shouldn't allow a different address", async () => { + const client = await loadFixture(getClient); + const AuthConsumerTestFacet = await GetTypedContractAt("AuthConsumerTestFacet", client.pure.pluginAddress, client.pure.signer); + + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.false; + expect(AuthConsumerTestFacet.Execute()).to.be.reverted; + expect(await AuthConsumerTestFacet.hasExecuted()).to.be.false; + }); +}); \ No newline at end of file diff --git a/test/Test_DAOCreation.ts b/test/Test_DAOCreation.ts index 976c44d..1fdeb24 100644 --- a/test/Test_DAOCreation.ts +++ b/test/Test_DAOCreation.ts @@ -7,22 +7,30 @@ */ // Framework -import { ethers } from "hardhat"; // Tests import { expect } from "chai"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; // Utils +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { GetTypedContractAt } from "../utils/contractHelper"; // Types +import { DAO } from "../typechain-types"; // Other -import { deployAragonDAOWithFramework } from "../deployments/deploy_AragonDAO"; + +async function getClient() { + await loadFixture(deployTestNetwork); + return createTestingDao([]); +} describe("DAO", function () { - it("should deploy", async function () { - const { DAO } = await loadFixture(deployAragonDAOWithFramework); + it("should have the correct testing uri", async function () { + const client = await loadFixture(getClient); + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + const DAO = await GetTypedContractAt("DAO", await IDAOReferenceFacet.dao(), client.pure.signer); expect(await DAO.daoURI()).to.be.equal("https://plopmenz.com"); }); }); \ No newline at end of file diff --git a/test/Test_Decimals18Helper.ts b/test/Test_Decimals18Helper.ts new file mode 100644 index 0000000..0702c1f --- /dev/null +++ b/test/Test_Decimals18Helper.ts @@ -0,0 +1,13 @@ +import {to18Decimal} from "../utils/decimals18Helper"; +import { expect } from "chai"; +import { BigNumber } from "ethers"; + +describe("decimals 18 helper", async () => { + it("should convert a number to 18 decimals", async () => { + expect(to18Decimal("1.234").toString()).to.equal( "1234000000000000000"); + expect(to18Decimal("1.23456789").toString()).to.equal( "1234567890000000000"); + expect(to18Decimal("1.23456789123456789").toString()).to.equal( "1234567891234567890"); + expect(to18Decimal("1.23456789123456789123456789").toString()).to.equal( "1234567891234567891"); + expect(to18Decimal("12345.6789123456789123456789").toString()).to.equal( "12345678912345678912345"); + }); +}); \ No newline at end of file diff --git a/test/Test_ERC20TimeClaimable.ts b/test/Test_ERC20TimeClaimable.ts new file mode 100644 index 0000000..d5cdb6b --- /dev/null +++ b/test/Test_ERC20TimeClaimable.ts @@ -0,0 +1,102 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { expect } from "chai"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { days } from "../utils/timeUnits"; +import { DECIMALS_18 } from "../utils/decimals18Helper"; + +// Types + +// Other + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const GovernanceERC20FacetSettings = { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "Token", + symbol: "TOK", + } + } + } + }; + const ERC20TimeClaimableFacetSettings = { + timeTillReward: 1 * days, + maxTimeRewarded: 10 * days, + }; + const RewardMultiplierSettings = { + name: "inflation", + startBlock: await owner.provider?.getBlockNumber(), + initialAmount: DECIMALS_18, + slopeN: 0, + slopeD: 1, + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.GovernanceERC20Facet, [GovernanceERC20FacetSettings]), + await DiamondCut.All(diamondGovernance.ERC20TimeClaimableFacet, [ERC20TimeClaimableFacetSettings]), + await DiamondCut.All(diamondGovernance.RewardMultiplierFacet, [RewardMultiplierSettings]), + ]; + return createTestingDao(cut); + } + +describe("ERC20TimeClaimable", function () { + it("should give 10 tokens on first claim", async function () { + const client = await loadFixture(getClient); + const IERC20TimeClaimableFacet = await client.pure.IERC20TimeClaimableFacet(); + const IERC20Facet = await client.pure.IERC20(); + const [owner] = await ethers.getSigners(); + + const balanceBefore = await IERC20Facet.balanceOf(owner.address); + await IERC20TimeClaimableFacet.claimTime(); + const balanceAfter = await IERC20Facet.balanceOf(owner.address); + + expect(balanceAfter).to.be.equal(balanceBefore.add(10)); + }); + + it("should give 0 tokens on claim after just having claimed", async function () { + const client = await loadFixture(getClient); + const IERC20TimeClaimableFacet = await client.pure.IERC20TimeClaimableFacet(); + const IERC20Facet = await client.pure.IERC20(); + const [owner] = await ethers.getSigners(); + + await IERC20TimeClaimableFacet.claimTime(); + const balanceBefore = await IERC20Facet.balanceOf(owner.address); + await IERC20TimeClaimableFacet.claimTime(); + const balanceAfter = await IERC20Facet.balanceOf(owner.address); + + expect(balanceAfter).to.be.equal(balanceBefore); + }); + + it("should give 1 tokens on claim after claiming again 1 day later", async function () { + const client = await loadFixture(getClient); + const IERC20TimeClaimableFacet = await client.pure.IERC20TimeClaimableFacet(); + const IERC20Facet = await client.pure.IERC20(); + const [owner] = await ethers.getSigners(); + + await IERC20TimeClaimableFacet.claimTime(); + const balanceBefore = await IERC20Facet.balanceOf(owner.address); + await time.increase(1 * days); + await IERC20TimeClaimableFacet.claimTime(); + const balanceAfter = await IERC20Facet.balanceOf(owner.address); + + expect(balanceAfter).to.be.equal(balanceBefore.add(1)); + }); +}); \ No newline at end of file diff --git a/test/Test_ERC20TimeClaimableFacet.ts b/test/Test_ERC20TimeClaimableFacet.ts deleted file mode 100644 index ab53f53..0000000 --- a/test/Test_ERC20TimeClaimableFacet.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers } from "hardhat"; - -// Tests -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; - -// Utils -import { deployAragonDAOAndVerifyFixture } from "../utils/verificationHelper"; - -// Types - -// Other - -describe("ERC20TimeClaimable", function () { - it("should give 10 tokens on first claim", async function () { - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - const ERC20TimeClaimableFacet = await ethers.getContractAt("ERC20TimeClaimableFacet", DiamondGovernance.address); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); - const [owner] = await ethers.getSigners(); - - const balanceBefore = await ERC20Facet.balanceOf(owner.address); - await ERC20TimeClaimableFacet.claimTime(); - const balanceAfter = await ERC20Facet.balanceOf(owner.address); - - expect(balanceAfter).to.be.equal(balanceBefore.add(10)); - }); - - it("should give 0 tokens on claim after just having claimed", async function () { - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - const ERC20TimeClaimableFacet = await ethers.getContractAt("ERC20TimeClaimableFacet", DiamondGovernance.address); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); - const [owner] = await ethers.getSigners(); - - await ERC20TimeClaimableFacet.claimTime(); - const balanceBefore = await ERC20Facet.balanceOf(owner.address); - await ERC20TimeClaimableFacet.claimTime(); - const balanceAfter = await ERC20Facet.balanceOf(owner.address); - - expect(balanceAfter).to.be.equal(balanceBefore); - }); -}); \ No newline at end of file diff --git a/test/Test_ExampleDiamond.ts b/test/Test_ExampleDiamond.ts index f4866cf..e69e618 100644 --- a/test/Test_ExampleDiamond.ts +++ b/test/Test_ExampleDiamond.ts @@ -55,15 +55,15 @@ describe('ExampleDiamond', function () { it('facets should have the right function selectors -- call to facetFunctionSelectors function', async function () { const { DiamondCutFacet, DiamondLoupeFacet, OwnershipFacet, DiamondCutFacetDeploy, DiamondLoupeFacetDeploy, OwnershipFacetDeploy } = await loadFixture(deployDiamond); - expect(await DiamondLoupeFacet.facetFunctionSelectors(DiamondCutFacetDeploy.address)).to.have.same.members(getSelectors(DiamondCutFacet)); - expect(await DiamondLoupeFacet.facetFunctionSelectors(DiamondLoupeFacetDeploy.address)).to.have.same.members(getSelectors(DiamondLoupeFacet)); - expect(await DiamondLoupeFacet.facetFunctionSelectors(OwnershipFacetDeploy.address)).to.have.same.members(getSelectors(OwnershipFacet)); + expect(await DiamondLoupeFacet.facetFunctionSelectors(DiamondCutFacetDeploy.address)).to.have.same.members(getSelectors(DiamondCutFacet).selectors); + expect(await DiamondLoupeFacet.facetFunctionSelectors(DiamondLoupeFacetDeploy.address)).to.have.same.members(getSelectors(DiamondLoupeFacet).selectors); + expect(await DiamondLoupeFacet.facetFunctionSelectors(OwnershipFacetDeploy.address)).to.have.same.members(getSelectors(OwnershipFacet).selectors); }); it('selectors should be associated to facets correctly -- multiple calls to facetAddress function', async function () { const { DiamondLoupeFacet, DiamondCutFacetDeploy, DiamondLoupeFacetDeploy, OwnershipFacetDeploy } = await loadFixture(deployDiamond); - expect(await DiamondLoupeFacet.facetAddress('0x1f931c1c')).to.be.equal(DiamondCutFacetDeploy.address); + expect(await DiamondLoupeFacet.facetAddress('0x3a6327ed')).to.be.equal(DiamondCutFacetDeploy.address); expect(await DiamondLoupeFacet.facetAddress('0xcdffacc6')).to.be.equal(DiamondLoupeFacetDeploy.address); expect(await DiamondLoupeFacet.facetAddress('0x01ffc9a7')).to.be.equal(DiamondLoupeFacetDeploy.address); expect(await DiamondLoupeFacet.facetAddress('0xf2fde38b')).to.be.equal(OwnershipFacetDeploy.address); @@ -74,7 +74,7 @@ describe('ExampleDiamond', function () { const selectors = getSelectors(Test1Facet).remove(['supportsInterface(bytes4)']); - expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(selectors); + expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(selectors.selectors); }); it('should test function call', async function () { @@ -91,19 +91,19 @@ describe('ExampleDiamond', function () { [{ facetAddress: Test1FacetDeploy.address, action: FacetCutAction.Replace, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors.selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); expect(receipt.status).to.be.equal(1); - expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(getSelectors(Test1Facet)); + expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(getSelectors(Test1Facet).selectors); }); it('should add test2 functions', async function () { const { DiamondLoupeFacet, Test2Facet, Test2FacetDeploy } = await loadFixture(deployDiamondWithTest2Facet); - expect(await DiamondLoupeFacet.facetFunctionSelectors(Test2FacetDeploy.address)).to.have.same.members(getSelectors(Test2Facet)); + expect(await DiamondLoupeFacet.facetFunctionSelectors(Test2FacetDeploy.address)).to.have.same.members(getSelectors(Test2Facet).selectors); }); it('should remove some test2 functions', async function () { @@ -114,13 +114,13 @@ describe('ExampleDiamond', function () { [{ facetAddress: ethers.constants.AddressZero, action: FacetCutAction.Remove, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors.selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); expect(receipt.status).to.be.equal(1); - expect(await DiamondLoupeFacet.facetFunctionSelectors(Test2FacetDeploy.address)).to.have.same.members(getSelectors(Test2Facet).get(functionsToKeep)); + expect(await DiamondLoupeFacet.facetFunctionSelectors(Test2FacetDeploy.address)).to.have.same.members(getSelectors(Test2Facet).get(functionsToKeep).selectors); }); it('should remove some test1 functions', async function () { @@ -131,13 +131,13 @@ describe('ExampleDiamond', function () { [{ facetAddress: ethers.constants.AddressZero, action: FacetCutAction.Remove, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors.selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); expect(receipt.status).to.be.equal(1); - expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(getSelectors(Test1Facet).get(functionsToKeep)); + expect(await DiamondLoupeFacet.facetFunctionSelectors(Test1FacetDeploy.address)).to.have.same.members(getSelectors(Test1Facet).get(functionsToKeep).selectors); }); it('remove all functions and facets except \'diamondCut\' and \'facets\'', async function () { @@ -148,21 +148,21 @@ describe('ExampleDiamond', function () { for (let i = 0; i < facetsBefore.length; i++) { selectors.push(...facetsBefore[i].functionSelectors) } - selectors = removeSelectors(selectors, ['facets()', 'diamondCut(tuple(address,uint8,bytes4[])[],address,bytes)']); + selectors = removeSelectors(selectors, ['facets()', 'diamondCut(tuple(address,uint8,bytes4[],bytes)[])']); const tx = await DiamondCutFacet.diamondCut( [{ facetAddress: ethers.constants.AddressZero, action: FacetCutAction.Remove, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors, + initCalldata: "0x", + }]); const receipt = await tx.wait(); const facetsAfter = await DiamondLoupeFacet.facets(); expect(receipt.status).to.be.equal(1); expect(facetsAfter).to.be.lengthOf(2); expect(facetsAfter[0][0]).to.be.equal(DiamondCutFacetDeploy.address); - expect(facetsAfter[0][1]).to.have.same.members(['0x1f931c1c']); + expect(facetsAfter[0][1]).to.have.same.members(['0x3a6327ed']); expect(facetsAfter[1][0]).to.be.equal(DiamondLoupeFacetDeploy.address); expect(facetsAfter[1][1]).to.have.same.members(['0x7a0ed627']); }); @@ -175,14 +175,14 @@ describe('ExampleDiamond', function () { for (let i = 0; i < facetsBefore.length; i++) { selectors.push(...facetsBefore[i].functionSelectors) } - selectors = removeSelectors(selectors, ['facets()', 'diamondCut(tuple(address,uint8,bytes4[])[],address,bytes)']); + selectors = removeSelectors(selectors, ['facets()', 'diamondCut(tuple(address,uint8,bytes4[],bytes)[])']); const txRemove = await DiamondCutFacet.diamondCut( [{ facetAddress: ethers.constants.AddressZero, action: FacetCutAction.Remove, - functionSelectors: selectors - }], - ethers.constants.AddressZero, '0x'); + functionSelectors: selectors, + initCalldata: "0x", + }]); const receiptRemove = await txRemove.wait(); expect(receiptRemove.status).to.be.equal(1); @@ -193,25 +193,29 @@ describe('ExampleDiamond', function () { { facetAddress: DiamondLoupeFacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: diamondLoupeFacetSelectors.remove(['facets()']) + functionSelectors: diamondLoupeFacetSelectors.copy().remove(['facets()']).selectors, + initCalldata: "0x", }, { facetAddress: OwnershipFacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(OwnershipFacet) + functionSelectors: getSelectors(OwnershipFacet).selectors, + initCalldata: "0x", }, { facetAddress: Test1FacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(Test1Facet) + functionSelectors: getSelectors(Test1Facet).selectors, + initCalldata: "0x", }, { facetAddress: Test2FacetDeploy.address, action: FacetCutAction.Add, - functionSelectors: getSelectors(Test2Facet) + functionSelectors: getSelectors(Test2Facet).selectors, + initCalldata: "0x", } ]; - const tx = await DiamondCutFacet.diamondCut(cut, ethers.constants.AddressZero, '0x'); + const tx = await DiamondCutFacet.diamondCut(cut); const receipt = await tx.wait(); const facets = await DiamondLoupeFacet.facets(); const facetAddresses = await DiamondLoupeFacet.facetAddresses(); @@ -224,10 +228,10 @@ describe('ExampleDiamond', function () { expect(facets[2][0]).to.be.equal(facetAddresses[2]); expect(facets[3][0]).to.be.equal(facetAddresses[3]); expect(facets[4][0]).to.be.equal(facetAddresses[4]); - expect(facets[findAddressPositionInFacets(DiamondCutFacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(DiamondCutFacet)); - expect(facets[findAddressPositionInFacets(DiamondLoupeFacetDeploy.address, facets)][1]).to.have.same.members(diamondLoupeFacetSelectors); - expect(facets[findAddressPositionInFacets(OwnershipFacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(OwnershipFacet)); - expect(facets[findAddressPositionInFacets(Test1FacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(Test1Facet)); - expect(facets[findAddressPositionInFacets(Test2FacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(Test2Facet)); + expect(facets[findAddressPositionInFacets(DiamondCutFacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(DiamondCutFacet).selectors); + expect(facets[findAddressPositionInFacets(DiamondLoupeFacetDeploy.address, facets)][1]).to.have.same.members(diamondLoupeFacetSelectors.selectors); + expect(facets[findAddressPositionInFacets(OwnershipFacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(OwnershipFacet).selectors); + expect(facets[findAddressPositionInFacets(Test1FacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(Test1Facet).selectors); + expect(facets[findAddressPositionInFacets(Test2FacetDeploy.address, facets)][1]).to.have.same.members(getSelectors(Test2Facet).selectors); }); }); \ No newline at end of file diff --git a/test/Test_GithubPullRequest.ts b/test/Test_GithubPullRequest.ts index 7e37f9c..84a4f63 100644 --- a/test/Test_GithubPullRequest.ts +++ b/test/Test_GithubPullRequest.ts @@ -1,58 +1,43 @@ /** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ // Framework +import { ethers } from "hardhat"; // Tests import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; // Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; // Types // Other -import { deployBaseAragonDAO } from "../deployments/deploy_BaseAragonDAO"; -import { addFacetToDiamond } from "../deployments/deploy_DGSelection"; -import { ethers } from "hardhat"; -async function deployDiamondWithTest1Facet() { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - return { DiamondGovernance, diamondGovernanceContracts }; +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const cut: DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.GithubPullRequestFacet), + ]; + return createTestingDao(cut); } -describe("Github Pull Requests", () => { - - let GithubPullRequestFacetContract: any; - let diamondData: any; - - beforeEach(async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployDiamondWithTest1Facet); - diamondData = { DiamondGovernance, diamondGovernanceContracts }; - await addFacetToDiamond(diamondGovernanceContracts, DiamondGovernance.address, "GithubPullRequestFacet"); - - GithubPullRequestFacetContract = await ethers.getContractAt("GithubPullRequestFacet", DiamondGovernance.address); +describe("GithubPullRequest", () => { + it("should emit the MergePullRequest event on calling merge", async () => { + const client = await loadFixture(getClient); + const IGithubPullRequestFacet = await client.pure.IGithubPullRequestFacet(); + expect(await IGithubPullRequestFacet.merge("owner", "repo", "0", "amogus")) + .to.emit(IGithubPullRequestFacet, "MergePullRequest") + .withArgs("owner", "repo", "0", "amogus"); }); - - - it("try call function to emit event as an outsider", async () => { - await expect(GithubPullRequestFacetContract.merge("owner", "repo", "0")).to.be.reverted; - }); - - it("call function to emit event as the dao", async () => { - await addFacetToDiamond( - diamondData.diamondGovernanceContracts, - diamondData.DiamondGovernance.address, - "GithubPullRequestMockFacet" - ); - const GithubPullRequestMockFacetContract = await ethers.getContractAt("GithubPullRequestMockFacet", diamondData.DiamondGovernance.address); - await expect(GithubPullRequestMockFacetContract._merge("owner", "repo", "0")) - .to.emit(GithubPullRequestFacetContract, "MergePullRequest") - .withArgs("owner", "repo", "0"); - }); -}); \ No newline at end of file +}); diff --git a/test/Test_MonetaryTokenContract.ts b/test/Test_MonetaryTokenContract.ts new file mode 100644 index 0000000..51230dd --- /dev/null +++ b/test/Test_MonetaryTokenContract.ts @@ -0,0 +1,82 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { ERC20MonetaryToken } from "../typechain-types"; +import { FixedSupplyDeployer } from "../deployments/deploy_MonetaryToken"; + +// Types + +// Other + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const deployer = new FixedSupplyDeployer(); + const monetaryToken = await deployer.beforeDAODeploy(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const MonetaryTokenFacetSettings = { + monetaryTokenContractAddress: monetaryToken, + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.MonetaryTokenFacet, [MonetaryTokenFacetSettings]), + ]; + const client = await createTestingDao(cut); + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + await deployer.afterDAODeploy(await IDAOReferenceFacet.dao(), client.pure.pluginAddress); + return client; +} + +describe("MonetaryTokenContract", () => { + it("should update contract address on set", async () => { + const client = await loadFixture(getClient); + + const IChangeableTokenContract = await client.pure.IChangeableTokenContract(); + await IChangeableTokenContract.setTokenContractAddress(ethers.constants.AddressZero); + + expect(await IChangeableTokenContract.getTokenContractAddress()).to.equal(ethers.constants.AddressZero); + }); + + it("should be able to mint monetary token once", async () => { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + const mintAmount = 10; + + const IChangeableTokenContract = await client.pure.IChangeableTokenContract(); + const monetaryTokenContractAddress = await IChangeableTokenContract.getTokenContractAddress(); + const ERC20MonetaryToken = await GetTypedContractAt("ERC20MonetaryToken", monetaryTokenContractAddress, owner); + + const balanceBefore = await ERC20MonetaryToken.balanceOf(owner.address); + await ERC20MonetaryToken.init(owner.address, mintAmount); + const balanceAfter = await ERC20MonetaryToken.balanceOf(owner.address); + expect(balanceAfter).to.be.equal(balanceBefore.add(mintAmount)); + }); + + it("should not be able to mint monetary token twice", async () => { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + + const IChangeableTokenContract = await client.pure.IChangeableTokenContract(); + const monetaryTokenContractAddress = await IChangeableTokenContract.getTokenContractAddress(); + const ERC20MonetaryToken = await GetTypedContractAt("ERC20MonetaryToken", monetaryTokenContractAddress, owner); + + await ERC20MonetaryToken.init(owner.address, 10); + expect(ERC20MonetaryToken.init(owner.address, 10)).to.be.reverted; + }); +}); \ No newline at end of file diff --git a/test/Test_PartialBurnVoting.ts b/test/Test_PartialBurnVoting.ts index da4b910..addf1a2 100644 --- a/test/Test_PartialBurnVoting.ts +++ b/test/Test_PartialBurnVoting.ts @@ -14,66 +14,122 @@ import { expect } from "chai"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; // Utils +import { days } from "../utils/timeUnits"; +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { wei } from "../utils/etherUnits"; // Types // Other -import { createProposal, voteOnProposal, VoteOption } from "./Test_PartialVoting" +import { createProposalWithClient, getVotingPower } from "./Test_PartialVoting" +import { VoteOption } from "../sdk/index"; + + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + enum VotingMode { + SingleVote, + SinglePartialVote, + MultiplePartialVote, + } + const PartialBurnVotingProposalFacetSettings = { + proposalCreationCost: 1, + _PartialVotingProposalFacetInitParams: { + votingSettings: { + votingMode: VotingMode.MultiplePartialVote, + supportThreshold: 1, + minParticipation: 1, + maxSingleWalletPower: 10**6, + minDuration: 1 * days, + minProposerVotingPower: wei.mul(1), + } + } + }; + const GovernanceERC20BurnableFacetSettings = { + _GovernanceERC20FacetInitParams: { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "Token", + symbol: "TOK", + } + } + } + } + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.PartialBurnVotingProposalFacet, [PartialBurnVotingProposalFacetSettings]), + await DiamondCut.All(diamondGovernance.PartialBurnVotingFacet), + await DiamondCut.All(diamondGovernance.GovernanceERC20BurnableFacet, [GovernanceERC20BurnableFacetSettings]), + await DiamondCut.All(diamondGovernance.AlwaysMemberTier1Facet), + ]; + return createTestingDao(cut); +} + + +async function createProposal() { + const client = await loadFixture(getClient); + await getVotingPower(client); + return createProposalWithClient(client); +} describe("PartialBurnVoting", function () { // Simple it("should burn the used voting power on yes", async function () { - const { DiamondGovernance, proposalId } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); + const { client, proposal } = await loadFixture(createProposal); + const IERC20 = await client.pure.IERC20(); const [owner] = await ethers.getSigners(); - const amount = 2; + const amount = wei.mul(2); - const balanceBefore = await ERC20Facet.balanceOf(owner.address); - await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Yes, amount: amount }); - const balanceAfter = await ERC20Facet.balanceOf(owner.address); + const balanceBefore = await IERC20.balanceOf(owner.address); + await proposal.Vote(VoteOption.Yes, amount); + const balanceAfter = await IERC20.balanceOf(owner.address); expect(balanceAfter).to.be.equal(balanceBefore.sub(amount)); }); it("should burn the used voting power on no", async function () { - const { DiamondGovernance, proposalId } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); + const { client, proposal } = await loadFixture(createProposal); + const IERC20 = await client.pure.IERC20(); const [owner] = await ethers.getSigners(); - const amount = 1; + const amount = wei.mul(1); - const balanceBefore = await ERC20Facet.balanceOf(owner.address); - await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.No, amount: amount }); - const balanceAfter = await ERC20Facet.balanceOf(owner.address); + const balanceBefore = await IERC20.balanceOf(owner.address); + await proposal.Vote(VoteOption.No, amount); + const balanceAfter = await IERC20.balanceOf(owner.address); expect(balanceAfter).to.be.equal(balanceBefore.sub(amount)); }); it("should burn no voting power on abstain", async function () { - const { DiamondGovernance, proposalId } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); + const { client, proposal } = await loadFixture(createProposal); + const IERC20 = await client.pure.IERC20(); const [owner] = await ethers.getSigners(); - const amount = 4; + const amount = wei.mul(4); - const balanceBefore = await ERC20Facet.balanceOf(owner.address); - await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Abstain, amount: amount }); - const balanceAfter = await ERC20Facet.balanceOf(owner.address); + const balanceBefore = await IERC20.balanceOf(owner.address); + await proposal.Vote(VoteOption.Abstain, amount); + const balanceAfter = await IERC20.balanceOf(owner.address); expect(balanceAfter).to.be.equal(balanceBefore); }); - it("should have 9 voting power after proposal creation", async function () { - const { DiamondGovernance } = await loadFixture(createProposal); - const ERC20Facet = await ethers.getContractAt("ERC20Facet", DiamondGovernance.address); + it("should have less voting power after proposal creation", async function () { + const client = await loadFixture(getClient); + const IERC20 = await client.pure.IERC20(); + const IBurnVotingProposalFacet = await client.pure.IBurnVotingProposalFacet(); const [owner] = await ethers.getSigners(); - const balance = await ERC20Facet.balanceOf(owner.address); + await getVotingPower(client); + const proposalCreationCost = await IBurnVotingProposalFacet.getProposalCreationCost(); + const balanceBefore = await IERC20.balanceOf(owner.address); + await createProposalWithClient(client); + const balanceAfter = await IERC20.balanceOf(owner.address); - expect(balance).to.be.equal(9); + expect(balanceAfter).to.be.equal(balanceBefore.sub(proposalCreationCost)); }); }); \ No newline at end of file diff --git a/test/Test_PartialVoting.ts b/test/Test_PartialVoting.ts index 7be3142..b53f041 100644 --- a/test/Test_PartialVoting.ts +++ b/test/Test_PartialVoting.ts @@ -11,163 +11,245 @@ import { ethers } from "hardhat"; // Tests import { expect } from "chai"; -import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; // Utils -import { toBytes, getEvents } from "../utils/utils"; -import { deployAragonDAOAndVerifyFixture } from "../utils/verificationHelper"; -import { now, minutes, days } from "../utils/timeUnits"; +import { now, days } from "../utils/timeUnits"; +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { wei } from "../utils/etherUnits"; // Types -import { DiamondGovernance, IPartialVotingFacet, PartialVotingFacet, PartialVotingProposalFacet } from "../typechain-types"; // Other - -enum VoteOption { Abstain, Yes, No } - -// This should be moved to utils -export async function getVotingPower(DiamondGovernance : DiamondGovernance) { - const ERC20TimeClaimableFacet = await ethers.getContractAt("ERC20TimeClaimableFacet", DiamondGovernance.address); - await ERC20TimeClaimableFacet.claimTime(); +import { DiamondGovernanceClient, ProposalMetadata, VoteOption } from "../sdk/index"; + +export async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + enum VotingMode { + SingleVote, + SinglePartialVote, + MultiplePartialVote, + } + const PartialVotingProposalFacetSettings = { + votingSettings: { + votingMode: VotingMode.MultiplePartialVote, + supportThreshold: 1, + minParticipation: 1, + maxSingleWalletPower: 10**6, + minDuration: 1 * days, + minProposerVotingPower: wei.mul(1), + }, + }; + const GovernanceERC20FacetSettings = { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "Token", + symbol: "TOK", + } + } + } + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.PartialVotingProposalFacet, [PartialVotingProposalFacetSettings]), + await DiamondCut.All(diamondGovernance.PartialVotingFacet), + await DiamondCut.All(diamondGovernance.GovernanceERC20Facet, [GovernanceERC20FacetSettings]), + await DiamondCut.All(diamondGovernance.AlwaysMemberTier1Facet), + ]; + return createTestingDao(cut); } -async function createProposal() { - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - await getVotingPower(DiamondGovernance); - const PartialVotingProposalFacet = await ethers.getContractAt("PartialVotingProposalFacet", DiamondGovernance.address); - - const start = now() + 20 * minutes; - const proposalData = { - _metadata: toBytes("Metadata"), //bytes - _actions: [], //IDAO.Action[] - _allowFailureMap: 0, //uint256 - _startDate: start, //uint64 - _endDate: start + 2 * days, //uint64 - _allowEarlyExecution: true //bool - } - const tx = await PartialVotingProposalFacet.createProposal(proposalData._metadata, proposalData._actions, proposalData._allowFailureMap, - proposalData._startDate, proposalData._endDate, proposalData._allowEarlyExecution); - const receipt = await tx.wait(); - const proposalCreationEvents = getEvents(PartialVotingProposalFacet, "ProposalCreated", receipt).map((log : any) => log.name); - expect(proposalCreationEvents).to.be.lengthOf(1); - await time.increaseTo(start + 1); - const proposalId = PartialVotingProposalFacet.interface.parseLog(receipt.logs[0]).args.proposalId; - const proposal = await PartialVotingProposalFacet.getProposal(proposalId); - expect(proposal.tally.yes).to.be.equal(0); - expect(proposal.tally.no).to.be.equal(0); - expect(proposal.tally.abstain).to.be.equal(0); +async function createProposal() { + const client = await loadFixture(getClient); + await getVotingPower(client); + return createProposalWithClient(client); +} - return { DiamondGovernance, proposalId, proposal }; +export async function getVotingPower(client : DiamondGovernanceClient) { + const [owner] = await ethers.getSigners(); + const IMintableGovernanceStructure = await client.pure.IMintableGovernanceStructure(); + await IMintableGovernanceStructure.mintVotingPower(owner.address, 0, 10); } -async function voteOnProposal(PartialVotingFacet : PartialVotingFacet, PartialVotingProposalFacet : PartialVotingProposalFacet, proposalId : any, voteData : IPartialVotingFacet.PartialVoteStruct) { - const tx = await PartialVotingFacet.vote(proposalId, voteData); +export async function createProposalWithClient(client : DiamondGovernanceClient) { + // Proposal parameters + const startTime = 0; // 0 will get translated to block.timestamp + const endTime = now() + 2 * days; + + const start = new Date(); + start.setTime(startTime * 1000); + const end = new Date(); + end.setTime(endTime * 1000); + + const metadata : ProposalMetadata = { + title: "Title", + description: "Description", + body: "Body", + resources: [] + }; + + // Create proposal + const tx = await client.sugar.CreateProposal(metadata, [], start, end); const receipt = await tx.wait(); - const voteCastEvents = getEvents(PartialVotingFacet, "VoteCast", receipt).map((log : any) => log.name); - expect(voteCastEvents).to.be.lengthOf(1); - - const proposalAfterVote = await PartialVotingProposalFacet.getProposal(proposalId); - return proposalAfterVote; + // Retrieve proposal information + const proposalId = await client.sugar.GetProposalId(receipt); + const proposal = await client.sugar.GetProposal(proposalId, false); + + return { client, proposal }; } describe("PartialVoting", function () { // Allowed simple it("should increase yes with the right amount when voting yes on proposal", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const amount = 2; + const { client, proposal} = await loadFixture(createProposal); + const amount = wei.mul(2); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const [owner] = await ethers.getSigners(); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); - const proposalAfterVote = await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Yes, amount: amount }); + const abstainBefore = wei.mul(0); + const yesBefore = wei.mul(0); + const noBefore = wei.mul(0); + await proposal.Vote(VoteOption.Yes, amount); + await proposal.Refresh(); - expect(proposalAfterVote.tally.abstain).to.be.equal(proposal.tally.abstain); - expect(proposalAfterVote.tally.yes).to.be.equal(proposal.tally.yes.add(amount)); - expect(proposalAfterVote.tally.no).to.be.equal(proposal.tally.no); + expect(abstainBefore.add(votingPower.sub(amount))).to.be.equal(proposal.data.tally.abstain); + expect(yesBefore.add(amount)).to.be.equal(proposal.data.tally.yes); + expect(noBefore).to.be.equal(proposal.data.tally.no); }); it("should increase no with the right amount when voting no on proposal", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const amount = 1; + const { client, proposal} = await loadFixture(createProposal); + const amount = wei.mul(1); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const [owner] = await ethers.getSigners(); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); - const proposalAfterVote = await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.No, amount: amount }); + const abstainBefore = wei.mul(0); + const yesBefore = wei.mul(0); + const noBefore = wei.mul(0); + await proposal.Vote(VoteOption.No, amount); + await proposal.Refresh(); - expect(proposalAfterVote.tally.abstain).to.be.equal(proposal.tally.abstain); - expect(proposalAfterVote.tally.yes).to.be.equal(proposal.tally.yes); - expect(proposalAfterVote.tally.no).to.be.equal(proposal.tally.no.add(amount)); + expect(abstainBefore.add(votingPower.sub(amount))).to.be.equal(proposal.data.tally.abstain); + expect(yesBefore).to.be.equal(proposal.data.tally.yes); + expect(noBefore.add(amount)).to.be.equal(proposal.data.tally.no); }); it("should increase abstain with the right amount when voting abstain on proposal", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const amount = 4; + const { client, proposal} = await loadFixture(createProposal); + const amount = wei.mul(4); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const [owner] = await ethers.getSigners(); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); - const proposalAfterVote = await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Abstain, amount: amount }); + const abstainBefore = wei.mul(0); + const yesBefore = wei.mul(0); + const noBefore = wei.mul(0); + await proposal.Vote(VoteOption.Abstain, amount); + await proposal.Refresh(); - expect(proposalAfterVote.tally.abstain).to.be.equal(proposal.tally.abstain.add(amount)); - expect(proposalAfterVote.tally.yes).to.be.equal(proposal.tally.yes); - expect(proposalAfterVote.tally.no).to.be.equal(proposal.tally.no); + expect(abstainBefore.add(votingPower)).to.be.equal(proposal.data.tally.abstain); + expect(yesBefore).to.be.equal(proposal.data.tally.yes); + expect(noBefore).to.be.equal(proposal.data.tally.no); }); //Allowed advanced it("should increase yes with the right amount when voting yes multiple times on proposal", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const amounts = [1, 2]; + const { client, proposal} = await loadFixture(createProposal); + const amounts = [wei.mul(1), wei.mul(2)]; + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const [owner] = await ethers.getSigners(); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); - let proposalAfterVote = proposal; - let total = 0; + const abstainBefore = wei.mul(0); + const yesBefore = wei.mul(0); + const noBefore = wei.mul(0); + let total = wei.mul(0); for (let i = 0; i < amounts.length; i++) { - proposalAfterVote = await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Yes, amount: amounts[i] }); - total = total + amounts[i]; + await proposal.Vote(VoteOption.Yes, amounts[i]); + total = total.add(amounts[i]); } + await proposal.Refresh(); - expect(proposalAfterVote.tally.abstain).to.be.equal(proposal.tally.abstain); - expect(proposalAfterVote.tally.yes).to.be.equal(proposal.tally.yes.add(total)); - expect(proposalAfterVote.tally.no).to.be.equal(proposal.tally.no); + expect(abstainBefore.add(votingPower.sub(total))).to.be.equal(proposal.data.tally.abstain); + expect(yesBefore.add(total)).to.be.equal(proposal.data.tally.yes); + expect(noBefore).to.be.equal(proposal.data.tally.no); }); it("should increase yes and no with the right amount when voting yes and no on proposal", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialBurnVotingProposalFacet = await ethers.getContractAt("PartialBurnVotingProposalFacet", DiamondGovernance.address); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const amountYes = 4; - const amountNo = 4; - - await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.Yes, amount: amountYes }); - const proposalAfterVote = await voteOnProposal(PartialVotingFacet, PartialBurnVotingProposalFacet, proposalId, { option: VoteOption.No, amount: amountNo }); - - expect(proposalAfterVote.tally.abstain).to.be.equal(proposal.tally.abstain); - expect(proposalAfterVote.tally.yes).to.be.equal(proposal.tally.yes.add(amountYes)); - expect(proposalAfterVote.tally.no).to.be.equal(proposal.tally.no.add(amountNo)); + const { client, proposal} = await loadFixture(createProposal); + const amountYes = wei.mul(1); + const amountNo = wei.mul(2); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const [owner] = await ethers.getSigners(); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); + + const abstainBefore = wei.mul(0); + const yesBefore = wei.mul(0); + const noBefore = wei.mul(0); + await proposal.Vote(VoteOption.Yes, amountYes); + await proposal.Vote(VoteOption.No, amountNo); + await proposal.Refresh(); + + expect(abstainBefore.add(votingPower.sub(amountYes).sub(amountNo))).to.be.equal(proposal.data.tally.abstain); + expect(yesBefore.add(amountYes)).to.be.equal(proposal.data.tally.yes); + expect(noBefore.add(amountNo)).to.be.equal(proposal.data.tally.no); }); // Not allowed - it("should not allow to vote with amount 0", async function () { - const { DiamondGovernance, proposalId } = await loadFixture(createProposal); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); + it("should not allow to vote with amount 0", async function () { + const { client, proposal} = await loadFixture(createProposal); + const IPartialVotingFacet = await client.pure.IPartialVotingFacet(); - const voteTx = PartialVotingFacet.vote(proposalId, { option: VoteOption.Yes, amount: 0 }); + const voteTx = proposal.Vote(VoteOption.Yes, wei.mul(0)); - expect(voteTx).to.be.revertedWithCustomError(PartialVotingFacet, "VoteCastForbidden"); + expect(voteTx).to.be.revertedWithCustomError(IPartialVotingFacet, "VoteCastForbidden"); }); it("should not allow to vote with amount higher than voting power", async function () { - const { DiamondGovernance, proposalId, proposal } = await loadFixture(createProposal); - const PartialVotingFacet = await ethers.getContractAt("PartialVotingFacet", DiamondGovernance.address); - const IGovernanceStructure = await ethers.getContractAt("IGovernanceStructure", DiamondGovernance.address); + const { client, proposal} = await loadFixture(createProposal); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const IPartialVotingFacet = await client.pure.IPartialVotingFacet(); const [owner] = await ethers.getSigners(); - const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.parameters.snapshotBlock); - const voteTx = PartialVotingFacet.vote(proposalId, { option: VoteOption.Yes, amount: votingPower.add(1)}); + const votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); + const voteTx = proposal.Vote(VoteOption.Yes, votingPower.add(1)); + + expect(voteTx).to.be.revertedWithCustomError(IPartialVotingFacet, "VoteCastForbidden"); + }); + + it("should not allow to vote with amount higher than max single wallet voting power", async function () { + const { client, proposal} = await loadFixture(createProposal); + const IPartialVotingFacet = await client.pure.IPartialVotingFacet(); + + const votingPower = proposal.data.parameters.maxSingleWalletPower; + const voteTx = proposal.Vote(VoteOption.Yes, votingPower.add(1)); - expect(voteTx).to.be.revertedWithCustomError(PartialVotingFacet, "VoteCastForbidden"); + expect(voteTx).to.be.revertedWithCustomError(IPartialVotingFacet, "VoteCastForbidden"); }); -}); -export { createProposal, voteOnProposal, VoteOption } \ No newline at end of file + it("should not allow to vote with amount higher when voting multiple times", async function () { + const { client, proposal} = await loadFixture(createProposal); + const IGovernanceStructure = await client.pure.IGovernanceStructure(); + const IPartialVotingFacet = await client.pure.IPartialVotingFacet(); + const [owner] = await ethers.getSigners(); + + let votingPower = await IGovernanceStructure.walletVotingPower(owner.address, proposal.data.parameters.snapshotBlock); + const maxPower = proposal.data.parameters.maxSingleWalletPower; + if (votingPower.gt(maxPower)) { + votingPower = maxPower; + } + + await proposal.Vote(VoteOption.Yes, votingPower); + const voteTx = proposal.Vote(VoteOption.Yes, wei.mul(1)); + + expect(voteTx).to.be.revertedWithCustomError(IPartialVotingFacet, "VoteCastForbidden"); + }); +}); \ No newline at end of file diff --git a/test/Test_PartialVotingProposal.ts b/test/Test_PartialVotingProposal.ts new file mode 100644 index 0000000..4f06603 --- /dev/null +++ b/test/Test_PartialVotingProposal.ts @@ -0,0 +1,203 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { expect } from "chai"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { now, days } from "../utils/timeUnits"; +import { getEvents } from "../utils/utils"; +import { wei } from "../utils/etherUnits"; + +// Types + +// Other +import { Action, DiamondGovernanceClient, ProposalMetadata, VoteOption } from "../sdk/index"; +import { getClient, getVotingPower } from "./Test_PartialVoting"; + + +export async function createProposalWithClient(client : DiamondGovernanceClient, metadata : ProposalMetadata, actions : Action[]) { + // Proposal parameters + const startTime = 0; // 0 will get translated to block.timestamp + const endTime = now() + 2 * days; + + const start = new Date(); + start.setTime(startTime * 1000); + const end = new Date(); + end.setTime(endTime * 1000); + + // Create proposal + const tx = await client.sugar.CreateProposal(metadata, actions, start, end); + const receipt = await tx.wait(); + + // Retrieve proposal information + const proposalId = await client.sugar.GetProposalId(receipt); + const proposal = await client.sugar.GetProposal(proposalId, false); + + return proposal; +} + +export function getExampleMetaData() : ProposalMetadata { + return { + title: "Title", + description: "Description", + body: "Body", + resources: [] + }; +} + +describe("PartialVotingProposal", function () { + it("should return the same metadata on query as set", async function () { + const client = await loadFixture(getClient); + await getVotingPower(client); + + const metadata : ProposalMetadata = { + title: "Title", + description: "Description", + body: "Body", + resources: [{ + name: "IPFS Url", + url: "ipfs://bafybeifzfqjybgdwyqhqxykldmtaqzvj6o26evqgifq3etgyc2ubfyh2xu/", + }, { + name: "Google", + url: "https://www.google.com", + }] + }; + const proposal = await createProposalWithClient(client, metadata, []); + + expect(proposal.metadata).to.be.deep.equal(metadata); + }); + + it("should return the same actions on query as set", async function () { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + await getVotingPower(client); + + const actions : Action[] = [ + { + interface: "IMintableGovernanceStructure", + method: "mintVotingPower(address,uint256,uint256)", + params: { + _to: owner.address, + _tokenId: wei.mul(0), + _amount: wei.mul(25), + } + } + ]; + const proposal = await createProposalWithClient(client, getExampleMetaData(), actions); + + expect(proposal.actions).to.be.deep.equal(actions); + }); + + it("should execute the action on execute", async function () { + const client = await loadFixture(getClient); + const [owner] = await ethers.getSigners(); + await getVotingPower(client); + const mintAmount = 25; + + const actions : Action[] = [ + { + interface: "IMintableGovernanceStructure", + method: "mintVotingPower(address,uint256,uint256)", + params: { + _to: owner.address, + _tokenId: wei.mul(0), + _amount: wei.mul(mintAmount), + } + } + ]; + const proposal = await createProposalWithClient(client, getExampleMetaData(), actions); + + const IERC20 = await client.pure.IERC20(); + const balanceBefore = await IERC20.balanceOf(owner.address); + + const voteTx = await proposal.Vote(VoteOption.Yes, balanceBefore); + await voteTx.wait(); + await time.increaseTo(proposal.data.parameters.endDate); + + const executeTx = await proposal.Execute(); + await executeTx.wait(); + + const balanceAfter = await IERC20.balanceOf(owner.address); + + expect(balanceAfter).to.be.deep.equal(balanceBefore.add(mintAmount)); + }); + + it("should parse withdraw actions correctly", async function () { + const client = await loadFixture(getClient); + const [owner, random] = await ethers.getSigners(); + await getVotingPower(client); + + const ERC20Contract = await ethers.getContractFactory("ERC20"); + const ERC20 = await ERC20Contract.deploy("ERC20 TOKEN", "ERC20"); + + const ERC721Contract = await ethers.getContractFactory("ERC721"); + const ERC721 = await ERC721Contract.deploy("ERC721 TOKEN", "ERC721"); + + const ERC1155Contract = await ethers.getContractFactory("ERC1155"); + const ERC1155 = await ERC1155Contract.deploy("uri"); + + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + const DAOAddress = await IDAOReferenceFacet.dao(); + + const actions : Action[] = [ + { + interface: "DAO", + method: "WithdrawNative", + params: { + _to: owner.address, + _value: wei.mul(2), + } + }, { + interface: "DAO", + method: "WithdrawERC20", + params: { + _from: DAOAddress, + _to: owner.address, + _amount: wei.mul(7), + _contractAddress: ERC20.address, + } + }, { + interface: "DAO", + method: "WithdrawERC20", + params: { + _from: random.address, + _to: owner.address, + _amount: wei.mul(8), + _contractAddress: ERC20.address, + } + }, { + interface: "DAO", + method: "WithdrawERC721", + params: { + _from: DAOAddress, + _to: owner.address, + _tokenId: wei.mul(1), + _contractAddress: ERC721.address, + } + }, { + interface: "DAO", + method: "WithdrawERC1155", + params: { + _from: DAOAddress, + _to: owner.address, + _tokenId: wei.mul(6), + _amount: wei.mul(9), + _contractAddress: ERC1155.address, + } + } + ]; + const proposal = await createProposalWithClient(client, getExampleMetaData(), actions); + + expect(proposal.actions).to.be.deep.equal(actions); + }); +}); \ No newline at end of file diff --git a/test/Test_ProposalSDKSugar.ts b/test/Test_ProposalSDKSugar.ts new file mode 100644 index 0000000..9ecf4de --- /dev/null +++ b/test/Test_ProposalSDKSugar.ts @@ -0,0 +1,215 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; +import { BigNumber } from "ethers"; + +// Tests +import { expect } from "chai"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { wei } from "../utils/etherUnits"; +import { now, days } from "../utils/timeUnits"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; + +// Types + +// Other +import { DiamondGovernanceClient, ProposalSorting, ProposalMetadata, Action, SortingOrder, VoteOption } from "../sdk/index"; +import { getVotingPower } from "./Test_PartialVoting"; +import { getExampleMetaData } from "./Test_PartialVotingProposal"; + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + enum VotingMode { + SingleVote, + SinglePartialVote, + MultiplePartialVote, + } + const PartialVotingProposalFacetSettings = { + votingSettings: { + votingMode: VotingMode.MultiplePartialVote, + supportThreshold: 1, + minParticipation: 1, + maxSingleWalletPower: 10**6, + minDuration: 1 * days, + minProposerVotingPower: wei.mul(1), + }, + }; + const GovernanceERC20BurnableFacetSettings = { + _GovernanceERC20FacetInitParams: { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "Token", + symbol: "TOK", + } + } + } + } + }; + const cut : DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.PartialVotingProposalFacet, [PartialVotingProposalFacetSettings]), + await DiamondCut.All(diamondGovernance.PartialVotingFacet), + await DiamondCut.All(diamondGovernance.GovernanceERC20BurnableFacet, [GovernanceERC20BurnableFacetSettings]), + await DiamondCut.All(diamondGovernance.AlwaysMemberTier1Facet), + ]; + return createTestingDao(cut); +} + +async function setVotingPower(client : DiamondGovernanceClient, votingPower : BigNumber) { + const IERC20 = await client.pure.IERC20(); + const address = await client.pure.signer.getAddress(); + const currentVotingPower = await IERC20.balanceOf(address); + if (currentVotingPower.lt(votingPower)) { + const IMintableGovernanceStructure = await client.pure.IMintableGovernanceStructure(); + await IMintableGovernanceStructure.mintVotingPower(address, 0, votingPower.sub(currentVotingPower)); + } + else if (currentVotingPower.gt(votingPower)) { + const IBurnableGovernanceStructure = await client.pure.IBurnableGovernanceStructure(); + await IBurnableGovernanceStructure.burnVotingPower(address, currentVotingPower.sub(votingPower)); + } +} + +export async function createProposalWithClient(client : DiamondGovernanceClient, metadata : ProposalMetadata, actions : Action[]) { + // Proposal parameters + const startTime = 0; // 0 will get translated to block.timestamp + const endTime = now() + 2 * days; + + const start = new Date(); + start.setTime(startTime * 1000); + const end = new Date(); + end.setTime(endTime * 1000); + + // Create proposal + await client.sugar.CreateProposal(metadata, actions, start, end); +} + +describe("Proposal SDK sugar", function () { + it("should return all proposals on get", async function () { + const client = await loadFixture(getClient); + await getVotingPower(client); + let proposalCount = 5; + await client.sugar.ClearProposalCache(); + + // Create proposals + for (let i = 0; i < proposalCount; i++) { + await createProposalWithClient(client, getExampleMetaData(), []); + } + + // Fetch all proposals + const proposals = await client.sugar.GetProposals(); + + // Fetch all proposals one by one + const proposalsIndividual = []; + for (let i = 0; i < proposalCount; i++) { + proposalsIndividual.push(await client.sugar.GetProposal(i)); + } + + expect(proposals).to.have.same.members(proposalsIndividual); + }); + + it("should sort the proposals on title ascendingly", async function () { + const client = await loadFixture(getClient); + await getVotingPower(client); + const titles = ["Empty treasury", "Kick all members", "Delete DAO", "Remove governance plugin"]; + await client.sugar.ClearProposalCache(); + + // Create proposals + for (let i = 0; i < titles.length; i++) { + let metadata = getExampleMetaData(); + metadata.title = titles[i]; + await createProposalWithClient(client, metadata, []); + } + + const proposals = await client.sugar.GetProposals(undefined, ProposalSorting.Title, SortingOrder.Asc); + const sortedTitles = [...titles].sort(); + const indexes = sortedTitles.map(sortedTitle => titles.findIndex(title => title == sortedTitle)); + + expect(proposals.map(prop => prop.id)).to.eql(indexes); + }); + + it("should sort the proposals on title descendingly", async function () { + const client = await loadFixture(getClient); + await getVotingPower(client); + const titles = ["Empty treasury", "Kick all members", "Delete DAO", "Remove governance plugin"]; + await client.sugar.ClearProposalCache(); + + // Create proposals + for (let i = 0; i < titles.length; i++) { + let metadata = getExampleMetaData(); + metadata.title = titles[i]; + await createProposalWithClient(client, metadata, []); + } + + const proposals = await client.sugar.GetProposals(undefined, ProposalSorting.Title, SortingOrder.Desc); + const sortedTitles = [...titles].sort().reverse(); + const indexes = sortedTitles.map(sortedTitle => titles.findIndex(title => title == sortedTitle)); + + expect(proposals.map(prop => prop.id)).to.eql(indexes); + }); + + it("should sort the proposals on total votes ascendingly", async function () { + const client = await loadFixture(getClient); + const votes = [7, 5, 6, 3, 2, 1, 4].map(i => wei.mul(i)); + await client.sugar.ClearProposalCache(); + + // Create proposals + for (let i = 0; i < votes.length; i++) { + await setVotingPower(client, votes[i]); + await createProposalWithClient(client, getExampleMetaData(), []); + const proposal = await client.sugar.GetProposal(i); + await proposal.Vote(VoteOption.Yes, votes[i]); + await proposal.Refresh(); + } + + const proposals = await client.sugar.GetProposals(undefined, ProposalSorting.TotalVotes, SortingOrder.Asc); + const sortedVotes = [...votes].sort(); + const indexes = sortedVotes.map(sortedVote => votes.findIndex(vote => vote == sortedVote)); + + expect(proposals.map(prop => prop.id)).to.eql(indexes); + }); + + it("should use cache correctly", async function () { + const client = await loadFixture(getClient); + const votes = [7, 5, 6, 3].map(i => wei.mul(i)); + const titles = ["Empty treasury", "Kick all members", "Delete DAO", "Remove governance plugin"]; + await client.sugar.ClearProposalCache(); + + // Create proposals + for (let i = 0; i < votes.length; i++) { + await setVotingPower(client, votes[i]); + let metadata = getExampleMetaData(); + metadata.title = titles[i]; + await createProposalWithClient(client, metadata, []); + const proposal = await client.sugar.GetProposal(i); + await proposal.Vote(VoteOption.Yes, votes[i]); + await proposal.Refresh(); + } + const proposalSortedCreation = await client.sugar.GetProposals(undefined, ProposalSorting.Creation, SortingOrder.Asc); + const sortedCreationIndexes = [0, 1, 2, 3]; + + const proposalSortedVotes = await client.sugar.GetProposals(undefined, ProposalSorting.TotalVotes, SortingOrder.Asc); + const sortedVotes = [...votes].sort(); + const sortedVotesIndexes = sortedVotes.map(sortedVote => votes.findIndex(vote => vote == sortedVote)); + + const proposalSortedTitles = await client.sugar.GetProposals(undefined, ProposalSorting.Title, SortingOrder.Asc); + const sortedTitles = [...titles].sort(); + const sortedTitlesIndexes = sortedTitles.map(sortedTitle => titles.findIndex(title => title == sortedTitle)); + + expect(proposalSortedCreation.map(prop => prop.id)).to.eql(sortedCreationIndexes); + expect(proposalSortedVotes.map(prop => prop.id)).to.eql(sortedVotesIndexes); + expect(proposalSortedTitles.map(prop => prop.id)).to.eql(sortedTitlesIndexes); + }); +}); \ No newline at end of file diff --git a/test/Test_RewardMultiplier.ts b/test/Test_RewardMultiplier.ts new file mode 100644 index 0000000..d70c1a0 --- /dev/null +++ b/test/Test_RewardMultiplier.ts @@ -0,0 +1,223 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { expect } from "chai"; +import { BigNumber } from "ethers"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { + tenFoldUntilLimit, + to18Decimal, + DECIMALS_18, +} from "../utils/decimals18Helper"; + +// Types + +// Other + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const RewardMultiplierSettings = { + name: "inflation", + startBlock: await owner.provider?.getBlockNumber(), + initialAmount: 1, + slopeN: 1, + slopeD: 1, + }; + const cut: DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.RewardMultiplierFacet, [ + RewardMultiplierSettings, + ]), + ]; + return createTestingDao(cut); +} + +const currentBlockNumber = async (): Promise => { + const [owner] = await ethers.getSigners(); + let blockNumber = await owner.provider?.getBlockNumber(); + // expect(blockNumber).to.be.not.undefined; + if (blockNumber === undefined) { + throw new Error("Block number is undefined"); + } + /* Update block number (should be 1 higher than before) */ + blockNumber++; // To take into account the block shift that happens for every transaction + return blockNumber; +}; + +/* CONSTANTS */ +const INITIAL_AMOUNT = 378303588.384; // Never used except to calculate the 18 decimal version +const INITIAL_AMOUNT_18 = to18Decimal(INITIAL_AMOUNT.toString()); +const MAX_BLOCKS_PASSED = 1000; + +const SLOPE_N = 1001; +const SLOPE_D = 1000; + +const BASE_N = 1005; +const BASE_D = 1000; + +const BASE_REWARD = 1234.56; // Never used except to calculate the 18 decimal version +const BASE_REWARD_18 = to18Decimal(BASE_REWARD.toString()); + +describe("RewardMultiplier", function () { + it("should give 0 multiplier for non-existing variable", async function () { + const client = await loadFixture(getClient); + const IRewardMultiplierFacet = await client.pure.IRewardMultiplierFacet(); + + const multiplierBefore = await IRewardMultiplierFacet.getMultiplier( + "nonsense" + ); + expect(multiplierBefore).to.be.equal(0); + }); + + it("should give multiplier based on constant growth", async function () { + const client = await loadFixture(getClient); + const IRewardMultiplierFacet = await client.pure.IRewardMultiplierFacet(); + + /* ------ Set constant multiplier ------ */ + const blockNumber = await currentBlockNumber(); + const pastBlock = Math.max(0, blockNumber - MAX_BLOCKS_PASSED); + + await IRewardMultiplierFacet.setMultiplierTypeConstant( + "nonsense", + pastBlock, + INITIAL_AMOUNT_18 + ); + const multiplierAfterConstant = await IRewardMultiplierFacet.getMultiplier( + "nonsense" + ); + expect(multiplierAfterConstant).to.be.approximately(INITIAL_AMOUNT_18, 1); // For rounding errors + }); + + it("should give multiplier based on linear growth", async function () { + const client = await loadFixture(getClient); + const IRewardMultiplierFacet = await client.pure.IRewardMultiplierFacet(); + + /* ------ Set linear multiplier ------ */ + const blockNumber = await currentBlockNumber(); + const pastBlock = Math.max(0, blockNumber - MAX_BLOCKS_PASSED); + + await IRewardMultiplierFacet.setMultiplierTypeLinear( + "nonsense", + pastBlock, + INITIAL_AMOUNT_18, + SLOPE_N, + SLOPE_D + ); + const multiplierAfterLinear = await IRewardMultiplierFacet.getMultiplier( + "nonsense" + ); + + const blocksPassed = blockNumber - pastBlock; + const total = calculateLinearGrowth(blocksPassed); + + expect(multiplierAfterLinear).to.be.approximately(total, 1); // For rounding errors + + // Check that the multiplier is not approximately the same if the block number is different + const wrongTotal = calculateLinearGrowth(blocksPassed + 1); + expect(multiplierAfterLinear).to.not.be.approximately(wrongTotal, 1); // For rounding errors + }); + + it("should give multiplier based on exponential growth", async function () { + const client = await loadFixture(getClient); + const IRewardMultiplierFacet = await client.pure.IRewardMultiplierFacet(); + + /* ------ Set exponential multiplier ------ */ + const blockNumber = await currentBlockNumber(); + const pastBlock = Math.max(0, blockNumber - MAX_BLOCKS_PASSED); + + await IRewardMultiplierFacet.setMultiplierTypeExponential( + "nonsense", + pastBlock, + INITIAL_AMOUNT_18, + BASE_N, + BASE_D + ); + const multiplierAfterExponential = + await IRewardMultiplierFacet.getMultiplier("nonsense"); + + // Calculate modifier + growth in js with BigNumber for precision + const exponent = blockNumber - pastBlock; + const multiplier = calculateExponentialGrowth(exponent); + + expect(multiplierAfterExponential).to.be.approximately(multiplier, 1); // For rounding errors + + // Check that the multiplier is not approximately the same if the exponent is different + const wrongMultiplier = calculateExponentialGrowth(exponent + 1); + + expect(multiplierAfterExponential).to.be.not.approximately( + wrongMultiplier, + INITIAL_AMOUNT_18.div(DECIMALS_18) + ); // For rounding errors + }); + + it("should apply multiplier to reward", async function () { + const client = await loadFixture(getClient); + const IRewardMultiplierFacet = await client.pure.IRewardMultiplierFacet(); + + /* ------ Set exponential multiplier ------ */ + const blockNumber = await currentBlockNumber(); + const pastBlock = Math.max(0, blockNumber - MAX_BLOCKS_PASSED); + + await IRewardMultiplierFacet.setMultiplierTypeExponential( + "nonsense", + pastBlock, + INITIAL_AMOUNT_18, + BASE_N, + BASE_D + ); + const multipliedReward = await IRewardMultiplierFacet.applyMultiplier( + "nonsense", + BASE_REWARD_18 + ); + + /* Calculate modifier + growth in js with BigNumber for precision */ + const exponent = blockNumber - pastBlock; + const bigGrowth = calculateExponentialAppliedMultiplier(exponent); + expect(multipliedReward).to.be.approximately(bigGrowth, 1); // For rounding errors + + /* Check that the multiplier is not approximately the same if the exponent is different */ + const wrongMultiplier = calculateExponentialAppliedMultiplier(exponent + 1); + expect(multipliedReward).to.be.not.approximately(wrongMultiplier, 1); // For rounding errors + }); +}); + +const calculateLinearGrowth = (blocksPassed: number): BigNumber => { + const { amount, exponent: numShifted } = tenFoldUntilLimit(SLOPE_N / SLOPE_D); + const growth = BigNumber.from(amount) + .mul(blocksPassed) + .mul(10 ** (18 - numShifted)); + return INITIAL_AMOUNT_18.add(growth); +}; + +const calculateExponentialGrowth = (exponent: number): BigNumber => { + const { amount, exponent: numShifted } = tenFoldUntilLimit(BASE_N / BASE_D); + const base = BigNumber.from(amount); // Needs Math.round due to rounding errors with division + const growth = base.pow(exponent).mul(INITIAL_AMOUNT_18); + return growth.div(BigNumber.from(10 ** numShifted).pow(exponent)); +}; + +const calculateExponentialAppliedMultiplier = (exponent: number): BigNumber => { + const { amount, exponent: numShifted } = tenFoldUntilLimit(BASE_N / BASE_D); + const base = BigNumber.from(amount); // Needs Math.round due to rounding errors with division + const growth = base + .pow(exponent) + .mul(BASE_REWARD_18) + .mul(INITIAL_AMOUNT_18) + .div(DECIMALS_18); + return growth.div(BigNumber.from(10 ** numShifted).pow(exponent)); +}; diff --git a/test/Test_SDK.ts b/test/Test_SDK.ts deleted file mode 100644 index 3841961..0000000 --- a/test/Test_SDK.ts +++ /dev/null @@ -1,215 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { ethers } from "hardhat"; - -// Tests -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; - -// Utils -import { deployAragonDAOAndVerifyFixture } from "../utils/verificationHelper"; - -// Types -import { Stamp } from "../sdk/index"; -import { BigNumber } from "ethers"; - -// Other -import { deployAragonDAOWithFramework } from "../deployments/deploy_AragonDAO"; -import { Action, DiamondGovernanceClient } from "../sdk/index"; -import { getVotingPower } from "./Test_PartialVoting"; -import { createSignature } from "../utils/signatureHelper"; -import { days, now } from "../utils/timeUnits"; - -async function CheckProposalWithAction(actions : Action[]) { - return; // Test should be reactived after IPFS doesnt require secrets anymore - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - await getVotingPower(DiamondGovernance); - const [owner] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - const title = "title"; - const description = "description"; - const body = "body"; - const metadata = { - title: title, - description: description, - body: body, - resources: [] - }; - const start = new Date(); - start.setTime(start.getTime() + 20 * 60 * 1000); // 20 minutes - const end = new Date(); - end.setTime(start.getTime() + 2 * 24 * 60 * 60 * 1000); // 2 days - await client.sugar.CreateProposal(metadata, actions, start, end); - - const proposal = await client.sugar.GetProposal(0); - expect(proposal.actions).to.have.deep.members(actions); -} - -// Tests as described in https://eips.ethereum.org/EIPS/eip-165 -describe("SDK", function () { - it("should support the ERC165 interfaceid", async function () { - const { DiamondGovernance } = await loadFixture(deployAragonDAOWithFramework); - const [owner] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - const IERC165 = await client.pure.IERC165(); - expect(await IERC165.supportsInterface("0x01ffc9a7")).to.be.true; //ERC165 ID - }); - - it("shouldnt support an invalid interfaceid", async function () { - const { DiamondGovernance } = await loadFixture(deployAragonDAOWithFramework); - const [owner] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - const IERC165 = await client.pure.IERC165(); - expect(await IERC165.supportsInterface("0xffffffff")).to.be.false; //INVALID ID - }); - - it("should return same metadata on proposal creation and get", async function () { - return; // Test should be reactived after IPFS doesnt require secrets anymore - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - await getVotingPower(DiamondGovernance); - const [owner] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - const title = "title"; - const description = "description"; - const body = "body"; - const resource1Name = "Google"; - const resource1Url = "www.google.com"; - const metadata = { - title: title, - description: description, - body: body, - resources: [ { - name: resource1Name, - url: resource1Url - }] - }; - const start = new Date(); - start.setTime(start.getTime() + 20 * 60 * 1000); // 20 minutes - const end = new Date(); - end.setTime(start.getTime() + 2 * 24 * 60 * 60 * 1000); // 2 days - await client.sugar.CreateProposal(metadata, [], start, end); - const proposals = await client.sugar.GetProposals(); - const firstProposal = await client.sugar.GetProposal(0); - const proposalCount = await client.sugar.GetProposalCount(); - - expect(proposals[0]).to.be.equal(firstProposal); - expect(proposals).to.be.lengthOf(1); - expect(proposalCount).to.be.equal(1); - expect(proposals[0].metadata.title).to.be.equal(title); - expect(proposals[0].metadata.description).to.be.equal(description); - expect(proposals[0].metadata.body).to.be.equal(body); - expect(proposals[0].metadata.resources).to.be.lengthOf(metadata.resources.length); - expect(proposals[0].metadata.resources[0].name).to.be.equal(resource1Name); - expect(proposals[0].metadata.resources[0].url).to.be.equal(resource1Url); - }); - - // Test for proposal statusses - - // Test for sorting - - // Test for action parsing - it("actions", async function () { - const action = { - interface: "IERC165", - method: "supportsInterface(bytes4)", - params: { - interfaceId: "0xffffffff" - } - } - await CheckProposalWithAction([action]); - }); - - // Test for github pull request proposal creation - it("github pr action", async function () { - const action = { - interface: "IGithubPullRequestFacet", - method: "merge(string,string,string)", - params: { - _owner: "SecureSECO-DAO", - _repo: "dao-webapp", - _pull_number: "1", - } - } - await CheckProposalWithAction([action]); - }); - - // Test to retrieve threshold history - it("get verification threshold history", async function () { - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - await getVotingPower(DiamondGovernance); - const [owner] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - const thresholdHistory = await client.verification.GetThresholdHistory(); - - expect(thresholdHistory).to.be.lengthOf(1); - expect(thresholdHistory[0][1]).to.be.equal(60); - }); - - // Test if verification works - // This tests the following functions: - // - Verify - // - Unverify - // - GetStamps - // - GetThresholdHistory - // - GetExpiration - // - GetVerificationContract - // - GetVerificationContractAddress - it("(un)verifies correctly & retrieves stamps", async function() { - return; // Test needs fixing - const { DiamondGovernance } = await loadFixture(deployAragonDAOAndVerifyFixture); - const [owner, alice] = await ethers.getSigners(); - - const client = new DiamondGovernanceClient(DiamondGovernance.address, owner); - - // Manually verify owner with github - const timestamp = now(); - const userHash = - "x"; - const dataHexString = await createSignature(timestamp, alice.address, userHash, owner); - - // This is technically a reverification, because the initial deployment already verifies the user with github but with another userHash - await client.verification.Verify( - alice.address, - userHash, - timestamp, - "github", - dataHexString - ); - - const stamps: Stamp[] = await client.verification.GetStamps(alice.address); - const expectedStamp: Stamp = ["github", userHash, [BigNumber.from(timestamp)]]; - - // Check if the stamp is correct - expect(stamps).to.be.lengthOf(1); - expect(stamps[0]).to.be.deep.equal(expectedStamp); - - // Check if the expiration is correct - const expiration = await client.verification.GetExpiration(stamps[0]); - const expectedExpiration = { - verified: true, - expired: false, - timeLeftUntilExpiration: ((timestamp + 60 * days) - now()), - threshold: BigNumber.from(60), // 60 days - }; - expect(expiration.timeLeftUntilExpiration).to.be.closeTo(expectedExpiration.timeLeftUntilExpiration, 60); // Arbitrary 60 seconds tolerance - - // Unverify - await client.verification.Unverify("github"); - const newStamps: Stamp[] = await client.verification.GetStamps(alice.address); - - // Check if the stamp is correct - expect(newStamps).to.be.lengthOf(0); - }); -}); \ No newline at end of file diff --git a/test/Test_SearchSECORewarding.ts b/test/Test_SearchSECORewarding.ts deleted file mode 100644 index 50e0b35..0000000 --- a/test/Test_SearchSECORewarding.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework -import { deployBaseAragonDAO } from "../deployments/deploy_BaseAragonDAO"; -import { - DiamondDeployedContractsBase, - addFacetToDiamondWithInit, -} from "../deployments/deploy_DGSelection"; - -// Tests -import { expect } from "chai"; -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers } from "hardhat"; - -// Utils - -// Types - -// Other - -describe("SearchSECORewarding", function () { - it("try deploy/cut rewarding facet", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture( - deployBaseAragonDAO - ); - - // Contract names - const contractNames = { - facetContractName: "SearchSECORewardingFacet", - facetInitContractName: "SearchSECORewardingFacetInit", - diamondInitName: "DISearchSECORewarding", - }; - - // Deploy facet contract - const rewardingSettings = { - users: [], - hashCounts: [], - }; - - await addFacetToDiamondWithInit( - diamondGovernanceContracts, - DiamondGovernance.address, - contractNames, - rewardingSettings - ); - - const SearchSECORewardingFacet = await ethers.getContractAt( - "SearchSECORewardingFacet", - DiamondGovernance.address - ); - - const hashCount = await SearchSECORewardingFacet.getHashCount( - ethers.constants.AddressZero - ); - - expect(hashCount).to.equal(0); - }); -}); diff --git a/test/Test_SearchSECORewardingFacet.ts b/test/Test_SearchSECORewardingFacet.ts new file mode 100644 index 0000000..ced285e --- /dev/null +++ b/test/Test_SearchSECORewardingFacet.ts @@ -0,0 +1,272 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// AUTHOR: H.R.A. Heijnen + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { expect } from "chai"; +import { BigNumber } from "ethers"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { GetTypedContractAt } from "../utils/contractHelper"; +import { ERC20MonetaryToken, ExecuteAnythingFacet } from "../typechain-types"; +import { ether } from "../utils/etherUnits"; +import { createSignature2 } from "../utils/signatureHelper"; +import { DiamondGovernanceClient } from "../sdk/index"; +import { DECIMALS_18, to18Decimal } from "../utils/decimals18Helper"; +import { FixedSupplyDeployer } from "../deployments/deploy_MonetaryToken"; + +// Types + +// Other + +// Constants +const TREASURY_RATIO = 200_000; // 20% +const MINING_REWARD_POOL_PAYOUT_RATIO = 0.01; // 1%, never used except for calculating the 18 decimal version +const MINING_REWARD_POOL_PAYOUT_RATIO_18 = to18Decimal( + MINING_REWARD_POOL_PAYOUT_RATIO.toString() +); +const INITIAL_MINT_AMOUNT = 1_000_000; +const REP_FRAC = 400_000; // 40% +const NUM_HASHES_MINED = 100; +const NUM_HASHES_QUERY = 100; +const HASH_DEVALUATION_FACTOR = 8; + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const deployer = new FixedSupplyDeployer(); + const monetaryToken = await deployer.beforeDAODeploy(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const SearchSECORewardingFacetSettings = { + signer: owner.address, + miningRewardPoolPayoutRatio: MINING_REWARD_POOL_PAYOUT_RATIO_18, + hashDevaluationFactor: HASH_DEVALUATION_FACTOR, + }; + const SearchSECOMonetizationFacetSettings = { + hashCost: 1, + treasuryRatio: TREASURY_RATIO, + }; + const MonetaryTokenFacetSettings = { + monetaryTokenContractAddress: monetaryToken, + }; + const GovernanceERC20FacetSettings = { + _ERC20VotesFacetInitParams: { + _ERC20PermitFacetInitParams: { + _ERC20FacetInitParams: { + name: "Token", + symbol: "TOK", + }, + }, + }, + }; + const RewardMultiplierSettings = { + name: "inflation", + startBlock: await owner.provider?.getBlockNumber(), + initialAmount: DECIMALS_18, + slopeN: 0, + slopeD: 1, + }; + const cut: DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.SearchSECORewardingFacet, [ + SearchSECORewardingFacetSettings, + ]), + await DiamondCut.All(diamondGovernance.SearchSECOMonetizationFacet, [ + SearchSECOMonetizationFacetSettings, + ]), + await DiamondCut.All(diamondGovernance.MonetaryTokenFacet, [ + MonetaryTokenFacetSettings, + ]), + await DiamondCut.All(diamondGovernance.MiningRewardPoolFacet), + await DiamondCut.All(diamondGovernance.GovernanceERC20Facet, [ + GovernanceERC20FacetSettings, + ]), + await DiamondCut.All(diamondGovernance.ExecuteAnythingFacet), + await DiamondCut.All(diamondGovernance.RewardMultiplierFacet, [ + RewardMultiplierSettings, + ]), + ]; + const client = await createTestingDao(cut); + // const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + // await deployer.afterDAODeploy(await IDAOReferenceFacet.dao(), client.pure.pluginAddress); + return client; +} + +const getERC20MonetaryTokenContract = async ( + client: DiamondGovernanceClient +) => { + const [owner] = await ethers.getSigners(); + const tokenAddress = await ( + await client.pure.IChangeableTokenContract() + ).getTokenContractAddress(); + const ERC20MonetaryToken = await GetTypedContractAt( + "ERC20MonetaryToken", + tokenAddress, + owner + ); + await ERC20MonetaryToken.init(owner.address, ether.mul(INITIAL_MINT_AMOUNT)); + + return ERC20MonetaryToken; +}; + +describe("SearchSECORewarding", function () { + it("should get/set mining reward pool payout ratio correctly", async function () { + const client = await loadFixture(getClient); + const ISearchSECORewardingFacet = + await client.pure.ISearchSECORewardingFacet(); + + const ratio = + await ISearchSECORewardingFacet.getMiningRewardPoolPayoutRatio(); + expect(ratio).to.be.approximately(MINING_REWARD_POOL_PAYOUT_RATIO_18, 1); + + const miningRewardPoolPayoutRatioTwice = + MINING_REWARD_POOL_PAYOUT_RATIO_18.mul(2); + await ISearchSECORewardingFacet.setMiningRewardPoolPayoutRatio( + miningRewardPoolPayoutRatioTwice + ); + const ratio2 = + await ISearchSECORewardingFacet.getMiningRewardPoolPayoutRatio(); + expect(ratio2).to.be.approximately(miningRewardPoolPayoutRatioTwice, 1); + }); + + it("should reward for hashes/mining properly", async function () { + const client = await loadFixture(getClient); + const ERC20MonetaryToken = await getERC20MonetaryTokenContract(client); + const [owner] = await ethers.getSigners(); + + const ISearchSECORewardingFacet = + await client.pure.ISearchSECORewardingFacet(); + const ISearchSECOMonetizationFacet = + await client.pure.ISearchSECOMonetizationFacet(); + const IDAOReferenceFacet = await client.pure.IDAOReferenceFacet(); + const IMiningRewardPoolFacet = await client.pure.IMiningRewardPoolFacet(); + const daoAddress = await IDAOReferenceFacet.dao(); + + // NOTE: account "owner" has 1 million monetary tokens + + /* --------------------- MONETIZATION ------------------------ */ + // (us) Approve plugin to spend (our) tokens: this is needed for the plugin to transfer tokens from our account + const cost = await ISearchSECOMonetizationFacet.getHashCost(); + const costWei = cost.mul(NUM_HASHES_QUERY); + await ERC20MonetaryToken.approve(client.pure.pluginAddress, costWei); + + // Pay for hashes to get money in the mining reward pool + await ISearchSECOMonetizationFacet.payForHashes( + NUM_HASHES_QUERY, + "someUniqueId" + ); + // Check if money is in the mining reward pool / treasury + // const balance = await ERC20MonetaryToken.balanceOf(daoAddress); + // expect(balance).to.be.equal(costWei); + const miningRewardPoolBalance = + await IMiningRewardPoolFacet.getMiningRewardPool(); + expect(miningRewardPoolBalance).to.be.equal( + costWei.mul(TREASURY_RATIO).div(1_000_000) + ); + + /* --------------------- REWARDING ------------------------ */ + // (DAO) Approve plugin to spend tokens: this is needed for the plugin to transfer tokens from the DAO + await ( + await GetTypedContractAt( + "ExecuteAnythingFacet", + client.pure.pluginAddress, + owner + ) + ).executeAnything([ + { + to: ERC20MonetaryToken.address, + value: 0, + data: ERC20MonetaryToken.interface.encodeFunctionData("approve", [ + client.pure.pluginAddress, + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + ]), + }, + ]); + + // Create signature for proof + const dataHexString = await createSignature2( + owner.address, + NUM_HASHES_MINED, + 0, + owner + ); + await ISearchSECORewardingFacet.rewardMinerForHashes( + owner.address, + NUM_HASHES_MINED, + 0, + REP_FRAC, + dataHexString + ); + + // Get all relevant (updated) balances + const newBalanceMe = await ERC20MonetaryToken.balanceOf(owner.address); + const newBalanceTreasury = await ERC20MonetaryToken.balanceOf(daoAddress); + const newBalanceMiningRewardPool = + await IMiningRewardPoolFacet.getMiningRewardPool(); + + /* -------------------- CALCULATE REWARD --------------------- */ + const miningRewardPoolBeforeReward = costWei // costWei is how much tokens were transferred to the treasury (from the monetization) + .mul(TREASURY_RATIO) + .div(1_000_000); + const decimals18 = BigNumber.from(10).pow(18); + const coinFrac = Math.round( + (NUM_HASHES_MINED * (1_000_000 - REP_FRAC)) / + 1_000_000 / + HASH_DEVALUATION_FACTOR + ); + const decimals18PowHashes = decimals18.pow(coinFrac); + const reversePayoutRatio = decimals18 + .sub(decimals18.mul(MINING_REWARD_POOL_PAYOUT_RATIO_18).div(DECIMALS_18)) + .pow(coinFrac); + const payoutRatio = decimals18PowHashes.sub(reversePayoutRatio); + const payout = payoutRatio + .mul(miningRewardPoolBeforeReward) + .div(decimals18PowHashes); + const expectedReward = payout; + + expect(newBalanceMe).to.be.equal( + ether.mul(INITIAL_MINT_AMOUNT).sub(costWei).add(expectedReward) + ); + expect(newBalanceTreasury).to.be.equal(costWei.sub(expectedReward)); + expect(newBalanceMiningRewardPool).to.be.equal( + miningRewardPoolBeforeReward.sub(expectedReward) + ); + + /* --------------------- REWARDING (pt.2) ------------------------ */ + // Test if it properly handles rewarding when current amount of hashes > 0 + + const NEW_HASHES_MINED = 50000; + + // Create signature for proof + const dataHexString2 = await createSignature2( + owner.address, + NUM_HASHES_MINED + NEW_HASHES_MINED, + NUM_HASHES_MINED, + owner + ); + await ISearchSECORewardingFacet.rewardMinerForHashes( + owner.address, + NUM_HASHES_MINED + NEW_HASHES_MINED, + NUM_HASHES_MINED, + REP_FRAC, + dataHexString2 + ); + + // Get all relevant (updated) balances + const newBalanceMe2 = await ERC20MonetaryToken.balanceOf(owner.address); + + expect(newBalanceMe2).to.be.greaterThan(newBalanceMe); + }); +}); diff --git a/test/Test_Verification.ts b/test/Test_Verification.ts new file mode 100644 index 0000000..08441a6 --- /dev/null +++ b/test/Test_Verification.ts @@ -0,0 +1,67 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Framework +import { ethers } from "hardhat"; + +// Tests +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; + +// Utils +import { getDeployedDiamondGovernance } from "../utils/deployedContracts"; +import { createTestingDao, deployTestNetwork } from "./utils/testDeployer"; +import { DiamondCut } from "../utils/diamondGovernanceHelper"; +import { now } from "../utils/timeUnits"; +import { createSignature } from "../utils/signatureHelper"; + +// Types + +// Other + +async function getClient() { + await loadFixture(deployTestNetwork); + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + + // Providers and rewards are not used in this test + const verificationSettings = { + verificationContractAddress: diamondGovernance.SignVerification.address, + providers: ["github"], + rewards: [1], + } + const cut: DiamondCut[] = [ + await DiamondCut.All(diamondGovernance.VerificationFacet, [verificationSettings]), + ]; + return createTestingDao(cut); +} + +// Very basic test to check if integration went successfully +describe("SignVerification", () => { + it("should verify an account", async () => { + const client = await loadFixture(getClient); + const IGithubPullRequestFacet = await client.pure.IVerificationFacet(); + const verificationContractAddress = await IGithubPullRequestFacet.getVerificationContractAddress(); + + const [owner] = await ethers.getSigners(); + const standaloneVerificationContract = await ethers.getContractAt("SignVerification", verificationContractAddress); + + // Manually verify owner with github + const timestamp = now(); + const userHash = + "090d4910f4b4038000f6ea86644d55cb5261a1dc1f006d928dcc049b157daff8"; + const dataHexString = await createSignature(timestamp, owner.address, userHash, owner); + + // Throws if verification fails + await standaloneVerificationContract.verifyAddress(owner.address, userHash, timestamp, "github", dataHexString); + + // Check if verification is successful + const stamps = await standaloneVerificationContract.getStamps(owner.address); + expect(stamps.length).to.equal(1); + }); +}); \ No newline at end of file diff --git a/test/Tests.todo b/test/Tests.todo new file mode 100644 index 0000000..9a6af16 --- /dev/null +++ b/test/Tests.todo @@ -0,0 +1,10 @@ +Facet init and deinit events firing +One time reward facet +Proposal creation refund facet +Proposal vote refund facet +Proposal status and execution +erc20 tiered claimable facet +erc20 one time verification reward facet +SearchSECORewarding facet +Verification facet +Aragon facets (DAOReference, Auth) \ No newline at end of file diff --git a/test/facet-selection/Test_FacetSelection.ts b/test/facet-selection/Test_FacetSelection.ts deleted file mode 100644 index ddd6514..0000000 --- a/test/facet-selection/Test_FacetSelection.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. - * © Copyright Utrecht University (Department of Information and Computing Sciences) - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// Framework - -// Tests -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; - -// Utils - -// Types - -// Other -import { deployBaseAragonDAO } from "../../deployments/deploy_BaseAragonDAO"; -import { searchSecoMonetization, verification } from "./addSingleFacet"; - -// async function deployDiamondWithTest1Facet() { -// const { DAO, DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); -// return { DAO, DiamondGovernance, diamondGovernanceContracts }; -// } - -describe("", () => { - it("try deploy/cut verification facet", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - - await verification(diamondGovernanceContracts, DiamondGovernance.address); - }); - - it("try deploy/cut searchseco monetization", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - - await searchSecoMonetization(diamondGovernanceContracts, DiamondGovernance.address); - }); - - it("try deploy/cut verification then monetization", async () => { - const { DiamondGovernance, diamondGovernanceContracts } = await loadFixture(deployBaseAragonDAO); - - await verification(diamondGovernanceContracts, DiamondGovernance.address); - await searchSecoMonetization(diamondGovernanceContracts, DiamondGovernance.address); - }); -}); \ No newline at end of file diff --git a/test/facet-selection/addSingleFacet.ts b/test/facet-selection/addSingleFacet.ts deleted file mode 100644 index 2bc5e44..0000000 --- a/test/facet-selection/addSingleFacet.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { DiamondDeployedContractsBase, addFacetToDiamondWithInit } from "../../deployments/deploy_DGSelection"; -import { deployStandaloneVerificationContract } from "../../deployments/deploy_StandaloneVerificationContract"; - -const searchSecoMonetization = async (diamondGovernanceContracts: DiamondDeployedContractsBase, diamondGovernanceAddress: string) => { - // Contract names - const contractNames = { - facetContractName: "SearchSECOMonetizationFacet", - facetInitContractName: "SearchSECOMonetizationFacetInit", - diamondInitName: "DISearchSECOMonetization", - } - - // Deploy facet contract - const searchSECOMonetizationSettings = { - hashCost: 1, - } - await addFacetToDiamondWithInit(diamondGovernanceContracts, diamondGovernanceAddress, contractNames, searchSECOMonetizationSettings); -} - -const verification = async (diamondGovernanceContracts: DiamondDeployedContractsBase, diamondGovernanceAddress: string) => { - // Deploy standalone contract - const StandaloneVerificationContract = await deployStandaloneVerificationContract(); - - // Contract names - const contractNames = { - facetContractName: "VerificationFacet", - facetInitContractName: "VerificationFacetInit", - diamondInitName: "DIVerification", - } - - // Deploy facet contract - const settings = { - verificationContractAddress: StandaloneVerificationContract.address, //address - providers: ["github", "proofofhumanity"], //string[] - rewards: [3, 10], //uint256[] - }; - await addFacetToDiamondWithInit(diamondGovernanceContracts, diamondGovernanceAddress, contractNames, settings); -} - -export { searchSecoMonetization, verification } \ No newline at end of file diff --git a/test/utils/testDeployer.ts b/test/utils/testDeployer.ts new file mode 100644 index 0000000..b08a50e --- /dev/null +++ b/test/utils/testDeployer.ts @@ -0,0 +1,60 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { ethers } from "hardhat"; +import { deployAragonFrameworkWithEns } from "../../deployments/deploy_AragonOSxFramework"; +import { deployDiamondGovernance } from "../../deployments/deploy_DiamondGovernance"; +import { DiamondCut, createDiamondGovernanceRepo, DAOCreationSettings, CreateDAO } from "../../utils/diamondGovernanceHelper"; +import { setDeployedENS, setDeployedAragon, setDeployedDiamondGovernance, setDiamondGovernanceRepo, getDeployedDiamondGovernance } from "../../utils/deployedContracts"; +import { DiamondGovernanceClient } from "../../sdk/index"; +import { customIpfsAdd, customIpfsGet } from "../../utils/ipfsHelper"; + +const ipfs : any[] = []; + +export async function deployTestNetwork() { + const [owner] = await ethers.getSigners(); + const { ensFramework, aragonOSxFramework } = await deployAragonFrameworkWithEns(); + const diamondGovernanceFramework = await deployDiamondGovernance(); + setDeployedENS(ensFramework); + setDeployedAragon(aragonOSxFramework); + setDeployedDiamondGovernance(diamondGovernanceFramework, owner); + setDiamondGovernanceRepo(await createDiamondGovernanceRepo("diamondgovernance", owner)); + customIpfsAdd(async (json) => { return (ipfs.push(JSON.parse(json)) - 1).toString(); }); + customIpfsGet(async (hash) => { return ipfs[Number(hash)]; }) +} + +export async function defaultDiamondCut(diamondGovernance : any) : Promise { + return [ + await DiamondCut.All(diamondGovernance.DiamondCutFacet), + await DiamondCut.All(diamondGovernance.DiamondLoupeFacet), + await DiamondCut.All(diamondGovernance.DAOReferenceFacet), + await DiamondCut.All(diamondGovernance.PluginFacet), + await DiamondCut.All(diamondGovernance.AlwaysAcceptAuthFacet) + ]; +} + +export async function createTestingDao(diamondCut : DiamondCut[], addDefault : boolean = true) : Promise { + const [owner] = await ethers.getSigners(); + const diamondGovernance = await getDeployedDiamondGovernance(owner); + const cut : DiamondCut[] = diamondCut.concat(addDefault ? await defaultDiamondCut(diamondGovernance) : []); + const settings : DAOCreationSettings = { + trustedForwarder: ethers.constants.AddressZero, + daoURI: "https://plopmenz.com", + subdomain: "mydao", + metadata: { + name: "Name", + description: "Description", + links: [], + avatar: "Avatar" + }, + diamondCut: cut, + additionalPlugins: [] + }; + const dao = await CreateDAO(settings, owner); + return new DiamondGovernanceClient(dao.diamondGovernance.address, owner); +} \ No newline at end of file diff --git a/test/utils/verificationHelper.ts b/test/utils/verificationHelper.ts new file mode 100644 index 0000000..81f0353 --- /dev/null +++ b/test/utils/verificationHelper.ts @@ -0,0 +1,42 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// // Framework +// import { ethers } from "hardhat"; + +// // Tests +// import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +// // Utils +// import { createSignature } from "../../utils/signatureHelper"; +// import { now } from "../../utils/timeUnits"; + +// // Types + +// // Other +// import { deployAragonDAOWithFramework } from "../../deployments/deploy_AragonDAO"; + +// async function verify(verificationContractAddress : string) { +// const [owner] = await ethers.getSigners(); +// const standaloneVerificationContract = await ethers.getContractAt("GithubVerification", verificationContractAddress); + +// // Manually verify owner with github +// const timestamp = now(); +// const userHash = +// "090d4910f4b4038000f6ea86644d55cb5261a1dc1f006d928dcc049b157daff8"; +// const dataHexString = await createSignature(timestamp, owner.address, userHash, owner); +// await standaloneVerificationContract.verifyAddress(owner.address, userHash, timestamp, "github", dataHexString); +// } + +// async function deployAragonDAOAndVerifyFixture() { +// const { DiamondGovernance, diamondGovernanceContracts, verificationContractAddress, DAO } = await loadFixture(deployAragonDAOWithFramework); +// await verify(verificationContractAddress); +// return { DiamondGovernance, diamondGovernanceContracts, verificationContractAddress, DAO }; +// } + +// export { verify, deployAragonDAOAndVerifyFixture } \ No newline at end of file diff --git a/utils/contractHelper.ts b/utils/contractHelper.ts new file mode 100644 index 0000000..17da589 --- /dev/null +++ b/utils/contractHelper.ts @@ -0,0 +1,51 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Contract } from "ethers"; +import { Signer } from "@ethersproject/abstract-signer"; +import abisJson from "../generated/abis.json"; +import functionSelectors from "../generated/functionSelectors.json"; + +export class NamedContract extends Contract { + public contractName: string; + + constructor(name : string, address : string, signer : Signer) { + super(address, GetAbi(name), signer); + this.contractName = name; + } +} + +export function NameContract(name : string, contract : Contract) : NamedContract { + return new NamedContract(name, contract.address, contract.signer); +} + +export async function GetContractAt(name : string, address : string, signer : Signer) : Promise { + return new NamedContract(name, address, signer); +} + +export async function GetTypedContractAt(name : string, address : string, signer : Signer) : Promise { + return await GetContractAt(name, address, signer) as T & NamedContract; +} + +export function GetAbi(name : string) : any[] { + const abis = abisJson as { [contractName : string]: any[] }; + if (!abis.hasOwnProperty(name)) { + throw new Error(`Abi of contract ${name} not found, perhaps you need to regenerate abis.json?`); + } + + return abis[name]; +} + +export function ReverseFunctionSelectorLookup(functionSelector : string) : string { + const selectorLookup = functionSelectors as { [selector : string]: string }; + if (!selectorLookup.hasOwnProperty(functionSelector)) { + throw new Error(`Function selector ${functionSelector} not found, perhaps you need to regenerate functionSelectors.json?`); + } + + return selectorLookup[functionSelector]; +} \ No newline at end of file diff --git a/utils/decimals18Helper.ts b/utils/decimals18Helper.ts new file mode 100644 index 0000000..8d27e02 --- /dev/null +++ b/utils/decimals18Helper.ts @@ -0,0 +1,46 @@ +import { BigNumber } from "ethers"; + +/** + * Convert any (decimal) number to 18 decimals + * @remarks This function can only take numbers in the format of "123.456" (note the dot and no spaces). + * @param value The number to convert to 18 decimals (as a string) + * @returns The corresponding BigNumber in 18 decimals + */ +export const to18Decimal = (value: string): BigNumber => { + const valueAsNumber = Number(value); + if (valueAsNumber < 0) + throw new Error("Cannot convert negative number to 18 decimals"); + + const valueRounded18 = BigNumber.from(Math.floor(valueAsNumber)).mul(BigNumber.from(10).pow(18)); + + if (Math.floor(valueAsNumber) === valueAsNumber) { + return valueRounded18; + } else { + const afterTheComma = value.split(".")[1]; + // pad with zeros + const afterTheCommaPadded = afterTheComma.padEnd(18, "0").substring(0, 18); + + return valueRounded18.add(BigNumber.from(afterTheCommaPadded)); + } +}; + +/** + * Multiply a number by 10 until it reaches the maximum safe integer + * @param amount The number to multiply + * @returns The multiplied number and the exponent + */ +export const tenFoldUntilLimit = ( + amount: number +): { amount: number; exponent: number } => { + let i = 0; + for (; i < 18; i++) { + if (Number.MAX_SAFE_INTEGER / 10 < amount) { + break; + } + amount *= 10; + } + + return { amount: Math.round(amount), exponent: i }; +}; + +export const DECIMALS_18 = to18Decimal("1"); diff --git a/utils/deployedContracts.ts b/utils/deployedContracts.ts new file mode 100644 index 0000000..bce7e2b --- /dev/null +++ b/utils/deployedContracts.ts @@ -0,0 +1,164 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { ENSFrameworkContracts, AragonOSxFrameworkContracts } from "../deployments/deploymentTypes"; +import { Signer } from "@ethersproject/abstract-signer"; +import { GetTypedContractAt, GetContractAt, NamedContract } from "./contractHelper"; +import { DAO, DAOFactory, DAORegistry, ENS, ENSSubdomainRegistrar, PluginRepoFactory, PluginRepoRegistry, PluginSetupProcessor, PublicResolver } from "../typechain-types"; +import { DiamondGovernanceJson } from "./jsonTypes"; + +import deployed_ENSFrameworkJson from "../deployments/deployed-contracts/deployed_ENSFramework.json"; +import deployed_AragonOSxFrameworkJson from "../deployments/deployed-contracts/deployed_AragonOSxFramework.json"; +import deployed_DiamondGovernanceJson from "../generated/deployed_DiamondGovernance.json"; +import DiamondGovernanceRepoJson from "../generated/diamondGovernanceRepo.json"; + +let deployedENS: ENSFrameworkContracts | undefined; +let deployedAragon: AragonOSxFrameworkContracts | undefined; +let deployedDiamondGovernance: any | undefined; +let diamondGovernanceRepo: string; + +export function setDeployedENS(_deployedENS : ENSFrameworkContracts) { + deployedENS = _deployedENS; +} + +export function setDeployedAragon(_deployedAragon : AragonOSxFrameworkContracts) { + deployedAragon = _deployedAragon; +} + +export async function setDeployedDiamondGovernance(_deployedDiamondGovernanceJson : DiamondGovernanceJson, signer : Signer) { + deployedDiamondGovernance = await diamondGovernanceJsonToContracts(_deployedDiamondGovernanceJson, signer); +} + +export function setDiamondGovernanceRepo(_diamondGovernanceRepo : string) { + diamondGovernanceRepo = _diamondGovernanceRepo; +} + +// Convert from network provider name to human-readable name +function networkName(providerName : string) : string { + switch (providerName) { + case "maticmum": + return "mumbai"; + case "unknown": + // Questionnable + return "hardhat"; + default: + return providerName; + } +} + +/** + * @returns The ENSFramework contracts + */ +export async function getDeployedENSFramework(signer : Signer) : Promise { + if (deployedENS != undefined) { + return deployedENS; + } + + const providerNetwork = await signer.provider?.getNetwork(); + if (providerNetwork == undefined) { + throw new Error("Undefined network"); + } + const network = networkName(providerNetwork.name); + + const deployedContracts : { [networkName : string]: any } = deployed_ENSFrameworkJson; + if (!deployedContracts.hasOwnProperty(network)) { + throw new Error(`Network ${network} doesnt exist in known deployed ENS frameworks`); + } + const existingContractAddresses = deployedContracts[network]; + deployedENS = { + ens: await GetTypedContractAt("ENS", existingContractAddresses.ens, signer), + daoResolver: await GetTypedContractAt("PublicResolver", existingContractAddresses.daoResolver, signer), + pluginResolver: await GetTypedContractAt("PublicResolver", existingContractAddresses.pluginResolver, signer), + }; + return deployedENS; + } + + /** + * @returns The AragonOSxFramework contracts + */ + export async function getDeployedAragonOSxFramework(signer : Signer) : Promise { + if (deployedAragon != undefined) { + return deployedAragon; + } + + const providerNetwork = await signer.provider?.getNetwork(); + if (providerNetwork == undefined) { + throw new Error("Undefined network"); + } + const network = networkName(providerNetwork.name); + + const deployedContracts : { [networkName : string]: any } = deployed_AragonOSxFrameworkJson; + if (!deployedContracts.hasOwnProperty(network)) { + throw new Error(`Network ${network} doesnt exist in known deployed AragonOSx frameworks`); + } + const existingContractAddresses = deployedContracts[network]; + deployedAragon = { + ManagingDAO: await GetTypedContractAt("DAO", existingContractAddresses.managingDAO, signer), + DAO_ENSSubdomainRegistrar: await GetTypedContractAt("ENSSubdomainRegistrar", existingContractAddresses.DAO_ENSSubdomainRegistrar, signer), + Plugin_ENSSubdomainRegistrar: await GetTypedContractAt("ENSSubdomainRegistrar", existingContractAddresses.Plugin_ENSSubdomainRegistrar, signer), + DAORegistry: await GetTypedContractAt("DAORegistry", existingContractAddresses.DAORegistry, signer), + PluginRepoRegistry: await GetTypedContractAt("PluginRepoRegistry", existingContractAddresses.PluginRepoRegistry, signer), + PluginRepoFactory: await GetTypedContractAt("PluginRepoFactory", existingContractAddresses.PluginRepoFactory, signer), + PluginSetupProcessor: await GetTypedContractAt("PluginSetupProcessor", existingContractAddresses.PluginSetupProcessor, signer), + DAOFactory: await GetTypedContractAt("DAOFactory", existingContractAddresses.DAOFactory, signer), + }; + return deployedAragon; +} + + /** + * @returns The DiamondGovernance contracts + */ + export async function getDeployedDiamondGovernance(signer : Signer) : Promise { + if (deployedDiamondGovernance != undefined) { + return deployedDiamondGovernance; + } + + const providerNetwork = await signer.provider?.getNetwork(); + if (providerNetwork == undefined) { + throw new Error("Undefined network"); + } + const network = networkName(providerNetwork.name); + + const deployedContracts : { [networkName : string]: DiamondGovernanceJson } = deployed_DiamondGovernanceJson; + if (!deployedContracts.hasOwnProperty(network)) { + throw new Error(`Network ${network} doesnt exist in known deployed Diamond Governance frameworks`); + } + const existingContractAddresses = deployedContracts[network]; + deployedDiamondGovernance = await diamondGovernanceJsonToContracts(existingContractAddresses, signer); + return deployedDiamondGovernance; +} + +export async function getDiamondGovernanceRepo(signer : Signer) : Promise { + if (diamondGovernanceRepo != undefined) { + return diamondGovernanceRepo; + } + + const providerNetwork = await signer.provider?.getNetwork(); + if (providerNetwork == undefined) { + throw new Error("Undefined network"); + } + const network = networkName(providerNetwork.name); + + const deployedContracts : { [networkName : string]: { repo: string; } } = DiamondGovernanceRepoJson; + if (!deployedContracts.hasOwnProperty(network)) { + throw new Error(`Network ${network} doesnt exist in known Diamond Governance repos`); + } + const existingContractAddresses = deployedContracts[network]; + diamondGovernanceRepo = existingContractAddresses.repo; + return diamondGovernanceRepo; +} + +async function diamondGovernanceJsonToContracts(diamondGovernanceJson : DiamondGovernanceJson, signer : Signer) : Promise<{ [contractName : string]: NamedContract }> { + const contractNames = Object.keys(diamondGovernanceJson); + const diamondGovernance : { [contractName : string]: NamedContract } = { }; + for (let i = 0; i < contractNames.length; i++) { + const contractName = contractNames[i]; + diamondGovernance[contractName] = await GetContractAt(contractName, diamondGovernanceJson[contractName].address, signer); + } + return diamondGovernance; +} \ No newline at end of file diff --git a/utils/diamondGovernanceHelper.ts b/utils/diamondGovernanceHelper.ts new file mode 100644 index 0000000..96d1626 --- /dev/null +++ b/utils/diamondGovernanceHelper.ts @@ -0,0 +1,194 @@ +/** + * This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. + * © Copyright Utrecht University (Department of Information and Computing Sciences) + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { getSelectors, Selectors } from "./diamondHelper"; +import { ethers, Contract } from "ethers"; +import { Signer } from "@ethersproject/abstract-signer" +import { DAO, DAOFactory, DiamondGovernance, IDiamondCut } from "../typechain-types"; +import { GetTypedContractAt, NamedContract } from "./contractHelper"; + +import { getDeployedAragonOSxFramework, getDeployedDiamondGovernance, getDiamondGovernanceRepo } from "../utils/deployedContracts"; +import { toBytes, getEvents } from "../utils/utils"; +import { addToIpfs } from "../utils/ipfsHelper"; + +import buildMetadataJson from "../contracts/build-metadata.json"; +import releaseMetadataJson from "../contracts/release-metadata.json"; + +export enum DiamondCutAction { Add, Replace, Remove, AddWithInit, RemoveWithDeinit } + +export class DiamondCut { + private facet : Contract | undefined; + private action : DiamondCutAction; + private methods : Selectors; + private params: string; + + private constructor() { + this.facet = undefined; + this.action = DiamondCutAction.Add; + this.methods = new Selectors([], undefined); + this.params = ""; + } + + public static async All(facet : NamedContract, params : any[] = [], action : DiamondCutAction = DiamondCutAction.AddWithInit) : Promise { + let diamondCut = new DiamondCut(); + diamondCut.facet = facet; + diamondCut.action = action; + diamondCut.methods = getSelectors(facet); + if (action == DiamondCutAction.AddWithInit) { + const expectedInternalInitStart = `__${facet.contractName}_init`; + const internalInitName = Object.keys(facet.interface.functions).find(f => f.startsWith(expectedInternalInitStart)); + + if (params.length > 0 && internalInitName == undefined) { + throw new Error(`Could not find init method (${expectedInternalInitStart}). Does this faucet require initing? Otherwise give params = [] or change action`); + } + const inputs = internalInitName == undefined ? [] : facet.interface.functions[internalInitName].inputs; + if (params.length == 0 && inputs.length > 0) { + throw new Error(`Params not provided, but there is a init method (${expectedInternalInitStart}) present. Please provide params. (${inputs})`); + } + + try { + const paramBytes = facet.interface._abiCoder.encode(inputs, params); + diamondCut.params = facet.interface.encodeFunctionData("init(bytes)", [paramBytes]); + } catch (error) { + console.log("Error while encoding", expectedInternalInitStart, "with", params); + throw error; + } + } else if (action == DiamondCutAction.RemoveWithDeinit) { + diamondCut.params = facet.interface.encodeFunctionData("deinit()", []); + } else { + diamondCut.params = "0x"; + } + return diamondCut; + } + + public static async Only(facet : NamedContract, methods : string[], params : any[] = [], action : DiamondCutAction = DiamondCutAction.AddWithInit) : Promise { + let diamondCut = await DiamondCut.All(facet, params, action); + diamondCut.methods = diamondCut.methods.get(methods); + return diamondCut; + } + + public static async Except(facet : NamedContract, methods : string[], params : any[] = [], action : DiamondCutAction = DiamondCutAction.AddWithInit) : Promise { + let diamondCut = await DiamondCut.All(facet, params, action); + diamondCut.methods = diamondCut.methods.remove(methods); + return diamondCut; + } + + public ToBlockchain() : IDiamondCut.FacetCutStruct { + return { + facetAddress: this.facet?.address ?? ethers.constants.AddressZero, + action: this.action, + functionSelectors: this.methods.selectors, + initCalldata: this.params, + } + } +} + + +/** + * Registers DiamondGoverannce with the Aragon PluginRepoFactory + * @returns The address of the newly created PluginRepo + */ +export async function createDiamondGovernanceRepo(ensSubdomain : string, signer : Signer) : Promise { + const buildMetadata = JSON.stringify(buildMetadataJson); + const releaseMetadata = JSON.stringify(releaseMetadataJson); + const buildMetadataUri = "ipfs://" + await addToIpfs(buildMetadata); + const releaseMetadataUri = "ipfs://" + await addToIpfs(releaseMetadata); + + const aragonOSxFramework = await getDeployedAragonOSxFramework(signer); + const diamondGovernance = await getDeployedDiamondGovernance(signer); + + const tx = await aragonOSxFramework.PluginRepoFactory.createPluginRepoWithFirstVersion( + ensSubdomain, + diamondGovernance.DiamondGovernanceSetup.address, + await signer.getAddress(), + toBytes(buildMetadataUri), + toBytes(releaseMetadataUri) + ); + const receipt = await tx.wait(); + const PluginRepoAddress = getEvents( + aragonOSxFramework.PluginRepoRegistry, + "PluginRepoRegistered", + receipt + )[0].args.pluginRepo; + + return PluginRepoAddress; +} + +export interface DiamondGovernanceDAO { + dao: DAO; + diamondGovernance: DiamondGovernance; +} + +export interface DAOCreationSettings { + trustedForwarder: string, //address + daoURI: string, //string + subdomain: string, //string + metadata: DAOMetadata, + diamondCut : DiamondCut[], + additionalPlugins : string[] //PluginInstallation[] +} + +export interface DAOMetadata { + name: string; + description: string; + links : { name: string, url: string }[] + avatar: string; //or file and upload ipfs in create? +} + +export async function CreateDAO(settings : DAOCreationSettings, signer : Signer) : Promise { + const aragonOSxFramework = await getDeployedAragonOSxFramework(signer); + const metadataUri = "ipfs://" + await addToIpfs(JSON.stringify(settings.metadata)); + const repo = await getDiamondGovernanceRepo(signer); + + const constructionFormat = buildMetadataJson.pluginSetupABI.prepareInstallation; + const pluginConstructionBytes = ethers.utils.defaultAbiCoder.encode( + constructionFormat, + [ + settings.diamondCut.map(c => c.ToBlockchain()) + ] + ); + + const tag = { + release: 1, //uint8 + build: 1, //uint16 + }; + + const pluginSetupRef = { + versionTag: tag, //PluginRepo.Tag + pluginSetupRepo: repo, //PluginRepo + }; + + const diamondGovernancePluginSettings = { + pluginSetupRef: pluginSetupRef, //PluginSetupRef + data: pluginConstructionBytes, //bytes + }; + + const DAOFactorySettings : DAOFactory.DAOSettingsStruct = { + trustedForwarder: settings.trustedForwarder, + daoURI: settings.daoURI, + subdomain: settings.subdomain, + metadata: toBytes(metadataUri), + } + + // Create DAO + const tx = await aragonOSxFramework.DAOFactory.createDao(DAOFactorySettings, [diamondGovernancePluginSettings]); + const receipt = await tx.wait(); + + // Retrieve addresses from DAO creation log + const DAOAddress = getEvents(aragonOSxFramework.DAORegistry, "DAORegistered", receipt)[0].args.dao; + const pluginAddresses = getEvents(aragonOSxFramework.PluginSetupProcessor, "InstallationApplied", receipt).map((log : any) => log.args.plugin); + + // Link DAO and plugin address to Contracts + const DAO = await GetTypedContractAt("DAO", DAOAddress, signer); + const DiamondGovernance = await GetTypedContractAt("DiamondGovernance", pluginAddresses[0], signer); + + return { + dao: DAO, + diamondGovernance: DiamondGovernance + }; +} \ No newline at end of file diff --git a/utils/diamondHelper.ts b/utils/diamondHelper.ts index 0986934..e76c79c 100644 --- a/utils/diamondHelper.ts +++ b/utils/diamondHelper.ts @@ -7,7 +7,8 @@ */ // Framework -import { ethers } from "hardhat" +import { ethers } from "ethers" +import { IDiamondLoupe } from "../typechain-types"; // Utils @@ -15,65 +16,65 @@ import { ethers } from "hardhat" // Other -enum FacetCutAction { Add, Replace, Remove } +enum FacetCutAction { Add, Replace, Remove, AddWithInit, RemoveWithDeinit } + +class Selectors { + public selectors : string[]; + private contract : ethers.Contract | undefined; + + + constructor(selectors : string[], contract : ethers.Contract | undefined) { + this.selectors = selectors; + this.contract = contract; + } + + public copy (this : Selectors) : Selectors { + return new Selectors(this.selectors, this.contract); + } + + // used with getSelectors to remove selectors from an array of selectors + // functionNames argument is an array of function signatures + public remove (this : Selectors, functionNames : string[]) : Selectors { + this.selectors = this.selectors.filter((v : string) => { + for (const functionName of functionNames) { + if (v === this.contract?.interface.getSighash(functionName)) { + return false; + } + } + return true; + }); + return this; + } + + // used with getSelectors to get selectors from an array of selectors + // functionNames argument is an array of function signatures + public get (this : Selectors, functionNames : string[]) : Selectors{ + this.selectors = this.selectors.filter((v : any) => { + for (const functionName of functionNames) { + if (v === this.contract?.interface.getSighash(functionName)) { + return true; + } + } + return false; + }); + return this; + } +} // get function selectors from ABI -function getSelectors (contract : any) { +function getSelectors (contract : ethers.Contract) : Selectors { const signatures = Object.keys(contract.interface.functions); const selectors = signatures.reduce((acc, val) => { - if (val !== 'init(bytes)') { + if (val !== 'init(bytes)' && val !== 'deinit()' && !val.startsWith("__")) { acc.push(contract.interface.getSighash(val)); } return acc; }, []); - selectors.contract = contract; - selectors.remove = remove; - selectors.get = get; - return selectors; -} - -// get function selector from function signature -function getSelector (func : any) { - const abiInterface = new ethers.utils.Interface([func]); - return abiInterface.getSighash(ethers.utils.Fragment.from(func)); -} - -// used with getSelectors to remove selectors from an array of selectors -// functionNames argument is an array of function signatures -function remove (this : any, functionNames : any) { - const selectors = this.filter((v : any) => { - for (const functionName of functionNames) { - if (v === this.contract.interface.getSighash(functionName)) { - return false; - } - } - return true; - }); - selectors.contract = this.contract; - selectors.remove = this.remove; - selectors.get = this.get; - return selectors; -} - -// used with getSelectors to get selectors from an array of selectors -// functionNames argument is an array of function signatures -function get (this : any, functionNames : any) { - const selectors = this.filter((v : any) => { - for (const functionName of functionNames) { - if (v === this.contract.interface.getSighash(functionName)) { - return true; - } - } - return false; - }); - selectors.contract = this.contract; - selectors.remove = this.remove; - selectors.get = this.get; - return selectors; + return new Selectors(selectors, contract); } // remove selectors using an array of signatures -function removeSelectors (selectors : any, signatures : any) { +function removeSelectors (selectors : string[], signatures : string[]) { const iface = new ethers.utils.Interface(signatures.map((v : any) => 'function ' + v)); const removeSelectors = signatures.map((v : any) => iface.getSighash(v)); selectors = selectors.filter((v : any) => !removeSelectors.includes(v)); @@ -81,7 +82,7 @@ function removeSelectors (selectors : any, signatures : any) { } // find a particular address position in the return value of diamondLoupeFacet.facets() -function findAddressPositionInFacets (facetAddress : any, facets : any) : number { +function findAddressPositionInFacets (facetAddress : string, facets : IDiamondLoupe.FacetStructOutput[]) : number { for (let i = 0; i < facets.length; i++) { if (facets[i].facetAddress === facetAddress) { return i; @@ -90,4 +91,4 @@ function findAddressPositionInFacets (facetAddress : any, facets : any) : number return -1; } -export { FacetCutAction, getSelectors, getSelector, remove, get, removeSelectors, findAddressPositionInFacets } \ No newline at end of file +export { Selectors, FacetCutAction, getSelectors, removeSelectors, findAddressPositionInFacets } \ No newline at end of file diff --git a/utils/ensHelper.ts b/utils/ensHelper.ts index caf9053..7830564 100644 --- a/utils/ensHelper.ts +++ b/utils/ensHelper.ts @@ -7,7 +7,7 @@ */ // Framework -import { ethers } from "hardhat"; +import { ethers } from "ethers"; //Utils diff --git a/utils/etherUnits.ts b/utils/etherUnits.ts index 3276270..89bd0b3 100644 --- a/utils/etherUnits.ts +++ b/utils/etherUnits.ts @@ -7,7 +7,8 @@ */ // Various ether units per Solidity spec +import { BigNumber } from "ethers"; -export const wei = 1; -export const gwei = 1e9; -export const ether = 1e18; \ No newline at end of file +export const wei = BigNumber.from(1); +export const gwei = BigNumber.from(10).pow(9); +export const ether = BigNumber.from(10).pow(18); \ No newline at end of file diff --git a/utils/ipfsHelper.ts b/utils/ipfsHelper.ts index 1f3b475..188a2ac 100644 --- a/utils/ipfsHelper.ts +++ b/utils/ipfsHelper.ts @@ -6,44 +6,53 @@ * LICENSE file in the root directory of this source tree. */ -import { IPFS_PINATA_TOKEN } from "../secrets"; import axios from "axios"; +import FormData from "form-data"; + +let ipfsAdd : ((json : string) => Promise) | undefined = undefined; +let ipfsGet : ((hash : string) => Promise) | undefined = undefined; + +export function customIpfsAdd(customAdd: (json : string) => Promise) { + ipfsAdd = customAdd; +} + +export function customIpfsGet(customGet: (hash : string) => Promise) { + ipfsGet = customGet; +} /** Upload a file to the cluster and pin it */ export async function addToIpfs(json: string): Promise { - // const config = { - // method: "POST", - // url: "https://ipfs-0.aragon.network/api/v0/add", - // headers: { - // "Content-Type": "text/plain", // Incorrect - // "X-API-KEY": "b477RhECf8s8sdM7XrkLBs2wHc4kCMwpbcFC55Kt" // Publicly known Aragon IPFS node API key - // }, - // params: { - // "path": json - // }, - // }; - - // const res = await axios(config); - // console.log(res.data); - + if (ipfsAdd != undefined) { + return ipfsAdd(json); + } + + let data = new FormData(); + data.append("path", json); + const config = { method: "POST", - url: "https://api.pinata.cloud/pinning/pinJSONToIPFS", - headers: { - "Content-Type": "application/json", - "Authorization": "Bearer " + IPFS_PINATA_TOKEN() + url: "https://ipfs-0.aragon.network/api/v0/add", + headers: { + "X-API-KEY": "b477RhECf8s8sdM7XrkLBs2wHc4kCMwpbcFC55Kt" // Publicly known Aragon IPFS node API key }, - data: json + data: data }; const res = await axios(config); - return res.data.IpfsHash; + return res.data.Hash; } -export async function getFromIpfs(hash: string): Promise { +export async function getFromIpfs(hash: string): Promise { + if (ipfsGet != undefined) { + return ipfsGet(hash); + } + const config = { - method: "GET", - url: "https://ipfs.io/ipfs/" + hash, + method: "POST", + url: "https://ipfs-0.aragon.network/api/v0/cat?arg=" + hash, + headers: { + "X-API-KEY": "b477RhECf8s8sdM7XrkLBs2wHc4kCMwpbcFC55Kt" // Publicly known Aragon IPFS node API key + }, }; const res = await axios(config); diff --git a/utils/jsonTypes.ts b/utils/jsonTypes.ts new file mode 100644 index 0000000..8689b33 --- /dev/null +++ b/utils/jsonTypes.ts @@ -0,0 +1,12 @@ +export type DiamondGovernanceJson = { [contractName: string]: { address: string } }; + +export type FunctionSelectorsJson = { [selector: string]: string }; + +export type VariableSelectorsJson = { + [variableSelector: string]: { + facetName: string; + variableName: string; + variableType: string; + setSelector: string; + } +}; \ No newline at end of file diff --git a/utils/signatureHelper.ts b/utils/signatureHelper.ts index 5e7a38e..72eb996 100644 --- a/utils/signatureHelper.ts +++ b/utils/signatureHelper.ts @@ -8,7 +8,7 @@ // Framework import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { ethers } from "hardhat"; +import { ethers } from "ethers"; /** * @@ -25,4 +25,14 @@ export const createSignature = async (timestamp: number, toVerify: string, userH const hashPackedMessage = ethers.utils.keccak256(packedMessage); return owner.signMessage(ethers.utils.arrayify(hashPackedMessage)); -}; \ No newline at end of file +}; + +export const createSignature2 = async (toReward: string, hashCount: number, nonce: number, owner:SignerWithAddress) => { + const packedMessage = ethers.utils.solidityPack( + ["address", "uint256", "uint256"], [toReward, hashCount, nonce] + ); + + const hashPackedMessage = ethers.utils.keccak256(packedMessage); + + return owner.signMessage(ethers.utils.arrayify(hashPackedMessage)); +} \ No newline at end of file diff --git a/utils/utils.ts b/utils/utils.ts index 05caa7d..1d0dd4a 100644 --- a/utils/utils.ts +++ b/utils/utils.ts @@ -7,7 +7,7 @@ */ // Framework -import { ethers } from "hardhat"; +import { ethers, Contract, ContractReceipt } from "ethers"; import { id } from "@ethersproject/hash"; // Utils @@ -20,8 +20,8 @@ export function toBytes(str : string) : string { return ethers.utils.hexlify(ethers.utils.toUtf8Bytes(str)); } -export function getEvents(contract : any, eventName : string, receipt : any) { +export function getEvents(contract : Contract, eventName : string, receipt : ContractReceipt) : ethers.utils.LogDescription[] { const event = id(contract.interface.getEvent(eventName).format("sighash")); - const logsOfEvent = receipt.logs?.filter((e : any) => e.topics[0] === event); - return logsOfEvent.map((log : any) => contract.interface.parseLog(log)); + const logsOfEvent = receipt.logs.filter(e => e.topics[0] === event); + return logsOfEvent.map(log => contract.interface.parseLog(log)); } \ No newline at end of file diff --git a/utils/verificationHelper.ts b/utils/verificationHelper.ts deleted file mode 100644 index e2fce0d..0000000 --- a/utils/verificationHelper.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Framework -import { ethers } from "hardhat"; - -// Tests -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; - -// Utils -import { createSignature } from "./signatureHelper"; -import { now } from "./timeUnits"; - -// Types - -// Other -import { deployAragonDAOWithFramework } from "../deployments/deploy_AragonDAO"; - -async function verify(verificationContractAddress : string) { - const [owner] = await ethers.getSigners(); - const standaloneVerificationContract = await ethers.getContractAt("GithubVerification", verificationContractAddress); - - // Manually verify owner with github - const timestamp = now(); - const userHash = - "090d4910f4b4038000f6ea86644d55cb5261a1dc1f006d928dcc049b157daff8"; - const dataHexString = await createSignature(timestamp, owner.address, userHash, owner); - await standaloneVerificationContract.verifyAddress(owner.address, userHash, timestamp, "github", dataHexString); -} - -async function deployAragonDAOAndVerifyFixture() { - const { DiamondGovernance, diamondGovernanceContracts, verificationContractAddress, DAO } = await loadFixture(deployAragonDAOWithFramework); - await verify(verificationContractAddress); - return { DiamondGovernance, diamondGovernanceContracts, verificationContractAddress, DAO }; -} - -export { verify, deployAragonDAOAndVerifyFixture } \ No newline at end of file