diff --git a/.editorconfig b/.editorconfig deleted file mode 100755 index 48fe40a1..00000000 --- a/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = LF -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.env.example b/.env.example deleted file mode 100644 index 74c5f05d..00000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -MNEMONIC=test test test test test test test test test test test test -REPORT_GAS=true -INFURA_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -ETHERSCAN_API_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 0187e16d..00000000 --- a/.eslintrc +++ /dev/null @@ -1,22 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": [ - "plugin:@typescript-eslint/recommended" - ], - "plugins": [ - "prettier", - "@typescript-eslint" - ], - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "rules": { - "no-console": "off", - "prettier/prettier": "error", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/camelcase": "off", - "@typescript-eslint/no-explicit-any": "off" - } -} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 0a08d197..00000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Lint -on: - push: - branches: - - develop - pull_request: -jobs: - run-linters: - name: Run Linters - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v2 - - - name: Set up node - uses: actions/setup-node@v1 - with: - node-version: 14 - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - name: Cache yarn dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - yarn- - - - name: Install yarn dependencies - run: yarn install --no-progress --non-interactive - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install dependencies - run: | - sudo apt install -y libgmp3-dev - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Run Linters - run: yarn check-format diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..1c03bf27 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,69 @@ +name: SX-Starknet Workflow + +on: + push: + branches: + - develop + pull_request: + +jobs: + solidity: + strategy: + fail-fast: true + + name: Forge tests + runs-on: ubuntu-latest + steps: + - name: Step 1 - Check out main branch + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Step 2 - Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Step 3 - Check formatting + working-directory: ./ethereum + run: forge fmt --check + + - name: Step 4 - Build Solidity contracts + working-directory: ./ethereum + run: | + forge --version + forge build --sizes + id: build + + - name: Step 5 - Run Forge tests + working-directory: ./ethereum + run: | + forge test -vvv + id: test + + cairo: + strategy: + fail-fast: true + + name: Cairo tests + runs-on: ubuntu-latest + steps: + - name: Step 1 - Check out main branch + uses: actions/checkout@v3 + + - name: Step 2 - Install Scarb + uses: software-mansion/setup-scarb@v1 + with: + scarb-version: 0.5.1 + + - name: Step 3 - Check formatting + working-directory: ./starknet + run: scarb fmt --check + + - name: Step 4 - Build Cairo contracts + working-directory: ./starknet + run: scarb build --verbose + + - name: Step 4 - Running Cairo tests + working-directory: ./starknet + run: scarb test --verbose \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 7f1c1ff3..00000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Tests -on: - push: - branches: - - develop - pull_request: -jobs: - unit-tests: - name: Unit Tests - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v2 - -# - name: Install Fossil submodule -# run: git submodule update --init --recursive - - - name: Set up node - uses: actions/setup-node@v1 - with: - node-version: 14 - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - name: Cache yarn dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - yarn- - - name: Install yarn dependencies - run: yarn install --no-progress --non-interactive - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install dependencies - run: | - sudo apt install -y libgmp3-dev - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Compile Contracts - run: yarn compile - - - name: Run Cross Chain Tests - run: yarn test:crosschain:ci - - - name: Run L1 tests - run: yarn test:l1 - - - name: Run L2 tests - run: yarn test:l2:ci diff --git a/.gitignore b/.gitignore index 74774f91..b4b4cec3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,13 @@ -node_modules -**/__pycache__ - -#Hardhat files -cache -artifacts -starknet-artifacts -factories -typechain -typechain-types -abi -coverage -coverage.json - -.yarn +target +node_modules/ .env +cairo_project.toml -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +cache/ +out/ -# Local deployments -deployed_contracts/local.json +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ -*.DS_Store +docs/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 042de970..6cd1da66 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,20 @@ -[submodule "contracts/starknet/fossil"] - path = contracts/starknet/fossil - url = https://github.com/OilerNetwork/fossil.git +[submodule "ethereum/lib/forge-std"] + path = ethereum/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/forge-std"] + branch = v1.5.6 +[submodule "ethereum/lib/openzeppelin-contracts-upgradeable"] + path = ethereum/lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/openzeppelin-contracts-upgradeable"] + branch = v4.9.1 +[submodule "ethereum/lib/zodiac"] + path = ethereum/lib/zodiac + url = https://github.com/gnosis/zodiac +[submodule "lib/zodiac"] + branch = v3.3.2 +[submodule "ethereum/lib/safe-contracts"] + path = ethereum/lib/safe-contracts + url = https://github.com/safe-global/safe-contracts +[submodule "lib/safe-contracts"] + branch = v1.4.0 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index bc0ebee2..00000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "printWidth": 100, - "tabWidth": 2 -} diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 3186f3f0..00000000 --- a/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 index a0bb1250..2dc061d8 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) Snapshot Labs +Copyright (c) 2023 Snapshot Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md deleted file mode 100644 index 9017cd76..00000000 --- a/README.md +++ /dev/null @@ -1,130 +0,0 @@ -[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/snapshot-labs/sx-core/master/LICENSE) - -# Snapshot X - -Programmable governance on StarkNet. Refer to the [documentation](https://docs.snapshotx.xyz) for more information. - -## Contracts Blueprint -```ml -contracts -├─ starknet -│ ├─ Authenticators -│ │ ├─ EthTx.cairo — "Authenticate user via an Ethereum transaction" -│ │ ├─ EthSig.cairo — "Authenticate user via an Ethereum signature" -│ │ ├─ EthSigSessionKey.cairo — "Authenticate user via a Session key which has been authorized with an Ethereum signature" -│ │ ├─ EthTxSessionKey.cairo — "Authenticate user via a Session key which has been authorized with an Ethereum transaction" -│ │ ├─ StarkTx.cairo — "Authenticate user via a StarkNet transaction" -│ │ ├─ StarkSig.cairo — "Authenticate user via a Starknet signature" -│ │ └─ Vanilla.cairo — "Dummy authentication" -│ ├─ VotingStrategies -│ │ ├─ EthBalanceOf.cairo — "Voting power found from Ethereum token balances" -│ │ ├─ Vanilla.cairo — "Voting power of 1 for every user" -│ │ └─ Whitelist.cairo — "Predetermined voting power for members in a whitelist, otherwise zero" -│ ├─ ExecutionStrategies -│ │ ├─ Vanilla.cairo — "Dummy execution" -│ │ └─ EthRelayer.cairo — "Strategy to execute proposal transactions on Ethereum" -│ ├─ Interfaces -│ │ ├─ IExecutionStrategy.cairo — "Interface for all execution strategies" -│ │ ├─ IVotingStrategy.cairo — "Interface for all voting strategies" -│ │ ├─ ISpaceAccount.cairo — "Interface for the space contract" -│ │ └─ ISpaceFactory.cairo — "Interface for the space factory" -│ ├─ lib -│ │ ├─ array_utils.cairo — "A library containing various array utilities" -│ │ ├─ choice.cairo — "The set of choices one can make for a vote" -│ │ ├─ eip712.cairo — "Library for Ethereum typed data signature verification" -│ │ ├─ eth_tx.cairo — "Libary for authenticating users via an Ethereum transaction" -│ │ ├─ execute.cairo — "contract call wrapper" -│ │ ├─ general_address.cairo — "Generic address type" -│ │ ├─ math_utils.cairo — "A library containing various math utilities" -│ │ ├─ proposal.cairo — "Proposal metadata type" -│ │ ├─ proposal_info.cairo — "Proposal vote data type" -│ │ ├─ proposal_outcome.cairo — "The set of proposal outcomes" -│ │ ├─ slot_key.cairo — "Library for finding EVM slot keys" -│ │ ├─ voting.cairo — "Core library that implements the logic for the space contract" -│ │ ├─ vote.cairo — "User vote data type" -│ │ ├─ session_key.cairo — "Library to handle session key logic" -│ │ ├─ stark_eip191.cairo — "Library for Starknet typed data signature verification" -│ │ ├─ single_slot_proof.cairo — "Library to enable values from the Ethereum state to be used for voting power" -│ │ └─ timestamp - "Library to handle timestamp to block number conversions within the single slot proof library" -│ ├─ SpaceAccount.cairo - "The base contract for each Snapshot X space" -│ └─ SpaceFactory.cairo - "Handles the deployment and tracking of Space contracts" -└─ ethereum - ├─ Interfaces - │ └─ IStarknetCore.sol — "Interface of the StarkNet core contract" - ├─ StarkNetCommit - │ └─ StarknetCommit.sol — "Bridge contract to enable Ethereum transaction authentication" - └─ ZodiacModule - ├─ ProposalRelayer.sol — "Provides functionality for recieving proposal data from StarkNet" - └─ SnapshotXL1Executor.sol — "Execute proposal transactions using a Gnosis Safe" -``` - -## Usage - -### Clone repository: - -```bash -git clone https://github.com/snapshot-labs/sx-core.git -git submodule update --init --recursive -``` -Note: The submodule included in the repo is the [Fossil](https://github.com/OilerNetwork/fossil) Storage Verifier - -### Install Python and Yarn requirements: - -```bash -python3.9 -m venv ~/cairo_venv -source ~/cairo_venv/bin/activate -pip3 install -r requirements.txt -yarn -``` - -### Compile all contracts: - -```bash -yarn compile -# You can also use yarn compile:l1 to just compile solidity contracts -# or yarn compile:l2 to just compile cairo contracts -``` - -### Deploy to Alpha Goerli: - -```bash -yarn deploy:goerli -``` -Will deploy an example space contract and a set of authenticators, voting strategies and execution strategies to the alpha goerli testnet. - -### Testing - -Tests are separated into three categories: - -- Ethereum tests in `tests/ethereum`: Tests for our solidity contracts -- Starknet tests in `tests/starknet`: Tests for our cairo contracts -- Cross chain tests in `tests/crosschain`: Tests that will cover interaction between solidity and cairo contracts. - -To run these tests locally: - -#### Install and run [StarkNet Devnet](https://github.com/Shard-Labs/starknet-devnet) (In a separate terminal): -```bash -yarn chain:l2 -``` - -#### Run an ethereum hardhat node (In a separate terminal) - -```bash -yarn chain:l1 -``` - -#### Run tests: -```bash -yarn test:l1 -yarn test:l2 -yarn test:crosschain -``` - -## DISCLAIMER: STILL IN DEVELOPMENT - -This project is still under heavy development. Feel free to contact us on [Discord](https://discord.snapshot.org)! - -## License - -Snapshot X contracts are open-source software licensed under the © [MIT license](LICENSE). - diff --git a/contracts/ethereum/Interfaces/IStarknetCore.sol b/contracts/ethereum/Interfaces/IStarknetCore.sol deleted file mode 100644 index 9beef216..00000000 --- a/contracts/ethereum/Interfaces/IStarknetCore.sol +++ /dev/null @@ -1,17 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.6; - -interface IStarknetCore { - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external returns (bytes32); - - function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) - external - returns (bytes32); - - function l2ToL1Messages(bytes32 msgHash) external view returns (uint256); -} diff --git a/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol b/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol deleted file mode 100644 index 00c46d77..00000000 --- a/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol +++ /dev/null @@ -1,48 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; -// import '../Interfaces/IStarknetCore.sol'; -// For testing purposes, we use a mock StarkNet messaging contract. -import 'contracts/ethereum/TestContracts/MockStarknetMessaging.sol'; - -/** - * @title StarkNet Commit Contract - * @author @Orland0x - - * @notice Allows StarkNet transactions to be committed via a transaction on L1. The contract works in combination with a corresponding authenticator contract on StarkNet. - * @dev This contract is designed to be a generic standard that that can be used by any StarkNet protocol that wants to allow interactions via an L1 transaction. - */ -contract StarkNetCommit is Initializable { - /// The StarkNet core contract. - // IStarknetCore public immutable starknetCore; - /// Using a mock here for testing purposes - MockStarknetMessaging public immutable starknetCore; - - /** - * @dev Selector for the L1 handler in the authenticator on StarkNet, found via: - * from starkware.starknet.compiler.compile import get_selector_from_name - * print(get_selector_from_name('commit')) - */ - uint256 private constant L1_COMMIT_HANDLER = - 674623595553689999852507866835294387286428733459551884504121875060358224925; - - /** - * @dev Constructor - * @param _starknetCore The StarkNet Core contract. - */ - constructor(MockStarknetMessaging _starknetCore) { - starknetCore = _starknetCore; - } - - /** - * @dev Commit a hash and the sender address to StarkNet. - * @param _hash The hash to commit - */ - function commit(uint256 starknetAuthenticator, uint256 _hash) external { - uint256[] memory payload = new uint256[](2); - payload[0] = uint256(uint160(msg.sender)); - payload[1] = _hash; - starknetCore.sendMessageToL2(starknetAuthenticator, L1_COMMIT_HANDLER, payload); - } -} diff --git a/contracts/ethereum/TestContracts/IStarknetMessaging.sol b/contracts/ethereum/TestContracts/IStarknetMessaging.sol deleted file mode 100644 index 4f72081f..00000000 --- a/contracts/ethereum/TestContracts/IStarknetMessaging.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -interface IStarknetMessaging { - event LogMessageToL1(uint256 indexed from_address, address indexed to_address, uint256[] payload); - - // An event that is raised when a message is sent from L1 to L2. - event LogMessageToL2( - address indexed from_address, - uint256 indexed to_address, - uint256 indexed selector, - uint256[] payload, - uint256 nonce - ); - - // An event that is raised when a message from L2 to L1 is consumed. - event ConsumedMessageToL1( - uint256 indexed from_address, - address indexed to_address, - uint256[] payload - ); - - // An event that is raised when a message from L1 to L2 is consumed. - event ConsumedMessageToL2( - address indexed from_address, - uint256 indexed to_address, - uint256 indexed selector, - uint256[] payload, - uint256 nonce - ); - - /** - Sends a message to an L2 contract. - Returns the hash of the message. - */ - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external returns (bytes32); - - /** - Consumes a message that was sent from an L2 contract. - Returns the hash of the message. - */ - function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) - external - returns (bytes32); -} diff --git a/contracts/ethereum/TestContracts/MockStarknetMessaging.sol b/contracts/ethereum/TestContracts/MockStarknetMessaging.sol deleted file mode 100644 index 7058db7a..00000000 --- a/contracts/ethereum/TestContracts/MockStarknetMessaging.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -import './StarknetMessaging.sol'; - -contract MockStarknetMessaging is StarknetMessaging { - /** - Mocks a message from L2 to L1. - */ - function mockSendMessageFromL2( - uint256 from_address, - uint256 to_address, - uint256[] calldata payload - ) external { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, to_address, payload.length, payload) - ); - l2ToL1Messages()[msgHash] += 1; - } - - /** - Mocks consumption of a message from L1 to L2. - */ - function mockConsumeMessageToL2( - uint256 from_address, - uint256 to_address, - uint256 selector, - uint256[] calldata payload, - uint256 nonce - ) external { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, to_address, nonce, selector, payload.length, payload) - ); - - require(l1ToL2Messages()[msgHash] > 0, 'INVALID_MESSAGE_TO_CONSUME'); - l1ToL2Messages()[msgHash] -= 1; - } -} diff --git a/contracts/ethereum/TestContracts/NamedStorage.sol b/contracts/ethereum/TestContracts/NamedStorage.sol deleted file mode 100644 index eeaaa745..00000000 --- a/contracts/ethereum/TestContracts/NamedStorage.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -/* - Library to provide basic storage, in storage location out of the low linear address space. - New types of storage variables should be added here upon need. -*/ -library NamedStorage { - function bytes32ToUint256Mapping(string memory tag_) - internal - pure - returns (mapping(bytes32 => uint256) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function bytes32ToAddressMapping(string memory tag_) - internal - pure - returns (mapping(bytes32 => address) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function addressToBoolMapping(string memory tag_) - internal - pure - returns (mapping(address => bool) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function getUintValue(string memory tag_) internal view returns (uint256 retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setUintValue(string memory tag_, uint256 value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } - - function setUintValueOnce(string memory tag_, uint256 value) internal { - require(getUintValue(tag_) == 0, 'ALREADY_SET'); - setUintValue(tag_, value); - } - - function getAddressValue(string memory tag_) internal view returns (address retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setAddressValue(string memory tag_, address value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } - - function setAddressValueOnce(string memory tag_, address value) internal { - require(getAddressValue(tag_) == address(0x0), 'ALREADY_SET'); - setAddressValue(tag_, value); - } - - function getBoolValue(string memory tag_) internal view returns (bool retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setBoolValue(string memory tag_, bool value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } -} diff --git a/contracts/ethereum/TestContracts/StarknetMessaging.sol b/contracts/ethereum/TestContracts/StarknetMessaging.sol deleted file mode 100644 index b3b58bd0..00000000 --- a/contracts/ethereum/TestContracts/StarknetMessaging.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -import './IStarknetMessaging.sol'; -import './NamedStorage.sol'; - -/** - Implements sending messages to L2 by adding them to a pipe and consuming messages from L2 by - removing them from a different pipe. A deriving contract can handle the former pipe and add items - to the latter pipe while interacting with L2. -*/ -contract StarknetMessaging is IStarknetMessaging { - /** - Random slot storage elements and accessors. - */ - string constant L1L2_MESSAGE_MAP_TAG = 'STARKNET_1.0_MSGING_L1TOL2_MAPPPING_V2'; - string constant L2L1_MESSAGE_MAP_TAG = 'STARKNET_1.0_MSGING_L2TOL1_MAPPPING'; - - string constant L1L2_MESSAGE_NONCE_TAG = 'STARKNET_1.0_MSGING_L1TOL2_NONCE'; - - function l1ToL2Messages(bytes32 msgHash) external view returns (uint256) { - return l1ToL2Messages()[msgHash]; - } - - function l2ToL1Messages(bytes32 msgHash) external view returns (uint256) { - return l2ToL1Messages()[msgHash]; - } - - function l1ToL2Messages() internal pure returns (mapping(bytes32 => uint256) storage) { - return NamedStorage.bytes32ToUint256Mapping(L1L2_MESSAGE_MAP_TAG); - } - - function l2ToL1Messages() internal pure returns (mapping(bytes32 => uint256) storage) { - return NamedStorage.bytes32ToUint256Mapping(L2L1_MESSAGE_MAP_TAG); - } - - function l1ToL2MessageNonce() public view returns (uint256) { - return NamedStorage.getUintValue(L1L2_MESSAGE_NONCE_TAG); - } - - /** - Sends a message to an L2 contract. - */ - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external override returns (bytes32) { - uint256 nonce = l1ToL2MessageNonce(); - NamedStorage.setUintValue(L1L2_MESSAGE_NONCE_TAG, nonce + 1); - emit LogMessageToL2(msg.sender, to_address, selector, payload, nonce); - bytes32 msgHash = keccak256( - abi.encodePacked( - uint256(uint160(address(msg.sender))), - to_address, - nonce, - selector, - payload.length, - payload - ) - ); - l1ToL2Messages()[msgHash] += 1; - - return msgHash; - } - - /** - Consumes a message that was sent from an L2 contract. - Returns the hash of the message. - */ - function consumeMessageFromL2(uint256 from_address, uint256[] calldata payload) - external - override - returns (bytes32) - { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, uint256(uint160(address(msg.sender))), payload.length, payload) - ); - - require(l2ToL1Messages()[msgHash] > 0, 'INVALID_MESSAGE_TO_CONSUME'); - emit ConsumedMessageToL1(from_address, msg.sender, payload); - l2ToL1Messages()[msgHash] -= 1; - return msgHash; - } -} diff --git a/contracts/ethereum/ZodiacModule/ProposalRelayer.sol b/contracts/ethereum/ZodiacModule/ProposalRelayer.sol deleted file mode 100644 index ebbb0977..00000000 --- a/contracts/ethereum/ZodiacModule/ProposalRelayer.sol +++ /dev/null @@ -1,79 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/zodiac/contracts/guard/Guardable.sol'; -// import '../Interfaces/IStarknetCore.sol'; - -import 'contracts/ethereum/TestContracts/MockStarknetMessaging.sol'; - -/** - * @title Snapshot X L1 Proposal Relayer - * @author @Orland0x - - * @dev Work in progress - */ -contract SnapshotXProposalRelayer is Guardable { - /// The StarkNet Core contract - // IStarknetCore public starknetCore; - - MockStarknetMessaging public starknetCore; - - /// Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - uint256 public l2ExecutionRelayer; - - /** - * @dev Emitted when the StarkNet execution relayer contract is changed - * @param _l2ExecutionRelayer The new execution relayer contract - */ - event ChangedL2ExecutionRelayer(uint256 _l2ExecutionRelayer); - - // /** - // * @dev Initialization of the functionality. Called internally by the setUp function - // * @param _starknetCore Address of the StarkNet Core contract - // * @param _l2ExecutionRelayer Address of the new execution relayer contract - // */ - // function setUpSnapshotXProposalRelayer(address _starknetCore, uint256 _l2ExecutionRelayer) - // internal - // { - // starknetCore = IStarknetCore(_starknetCore); - // l2ExecutionRelayer = _l2ExecutionRelayer; - // } - - function setUpSnapshotXProposalRelayer(address _starknetCore, uint256 _l2ExecutionRelayer) - internal - { - starknetCore = MockStarknetMessaging(_starknetCore); - l2ExecutionRelayer = _l2ExecutionRelayer; - } - - /** - * @dev Changes the StarkNet execution relayer contract - * @param _l2ExecutionRelayer Address of the new execution relayer contract - */ - function changeL2ExecutionRelayer(uint256 _l2ExecutionRelayer) public onlyOwner { - l2ExecutionRelayer = _l2ExecutionRelayer; - emit ChangedL2ExecutionRelayer(_l2ExecutionRelayer); - } - - /** - * @dev Receives L2 -> L1 message containing proposal execution details - * @param executionHashLow Lowest 128 bits of the hash of all the transactions in the proposal - * @param executionHashHigh Highest 128 bits of the hash of all the transactions in the proposal - * @param proposalOutcome Whether the proposal has been accepted / rejected / cancelled - */ - function _receiveFinalizedProposal( - uint256 callerAddress, - uint256 proposalOutcome, - uint256 executionHashLow, - uint256 executionHashHigh - ) internal { - uint256[] memory payload = new uint256[](4); - payload[0] = callerAddress; - payload[1] = proposalOutcome; - payload[2] = executionHashLow; - payload[3] = executionHashHigh; - - /// Returns the message Hash. If proposal execution message did not exist/not received yet, then this will fail - starknetCore.consumeMessageFromL2(l2ExecutionRelayer, payload); - } -} diff --git a/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol b/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol deleted file mode 100644 index a393157d..00000000 --- a/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol +++ /dev/null @@ -1,409 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/zodiac/contracts/core/Module.sol'; -import './ProposalRelayer.sol'; - -/** - * @title Snapshot X L1 execution Zodiac module - * @author @Orland0x - - * @notice Trustless L1 execution of Snapshot X decisions via a Gnosis Safe - * @dev Work in progress - */ -contract SnapshotXL1Executor is Module, SnapshotXProposalRelayer { - /// @dev keccak256("EIP712Domain(uint256 chainId,address verifyingContract)"); - bytes32 public constant DOMAIN_SEPARATOR_TYPEHASH = - 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218; - - /// @dev keccak256("Transaction(address to,uint256 value,bytes data,uint8 operation,uint256 nonce)"); - bytes32 public constant TRANSACTION_TYPEHASH = - 0x72e9670a7ee00f5fbf1049b8c38e3f22fab7e9b85029e85cf9412f17fdd5c2ad; - - /// Counter that is incremented each time a proposal is received. - uint256 public proposalIndex; - - /// Mapping of whitelisted contracts (addresses should be L2 space contracts) - mapping(uint256 => bool) public whitelistedSpaces; - - /// The state of a proposal index exists in one of the 5 categories. This can be queried using the getProposalState view function - enum ProposalState { - NotReceived, - Executing, - Executed, - Cancelled - } - - /// Stores the execution details and execution progress of each proposal received - struct ProposalExecution { - // array of Transaction Hashes for each transaction in the proposal - bytes32[] txHashes; - // counter which stores the index of the next transaction in the proposal that should be executed - uint256 executionCounter; - // whether the proposal has been cancelled. Required to fully define the proposal state as a function of this struct - bool cancelled; - } - - /// Map of proposal index to the corresponding proposal execution struct - mapping(uint256 => ProposalExecution) public proposalIndexToProposalExecution; - - /* EVENTS */ - - /** - * @dev Emitted when a new module proxy instance has been deployed - * @param initiator Address of contract deployer - * @param _owner Address of the owner of this contract - * @param _avatar Address that will ultimately execute function calls - * @param _target Address that this contract will pass transactions to - * @param _l2ExecutionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - * @param _starknetCore Address of the StarkNet Core contract - */ - event SnapshotXL1ExecutorSetUpComplete( - address indexed initiator, - address indexed _owner, - address indexed _avatar, - address _target, - uint256 _l2ExecutionRelayer, - address _starknetCore - ); - - /** - * @dev Emitted when a new proposal is received from StarkNet - * @param proposalIndex Index of proposal - */ - event ProposalReceived(uint256 proposalIndex); - - /** - * @dev Emitted when a Transaction in a proposal is executed. - * @param proposalIndex Index of proposal - * @param txHash The transaction hash - * @notice Could remove to save some gas and only emit event when all txs are executed - */ - event TransactionExecuted(uint256 proposalIndex, bytes32 txHash); - - /** - * @dev Emitted when all transactions in a proposal have been executed - * @param proposalIndex Index of proposal - */ - event ProposalExecuted(uint256 proposalIndex); - - /** - * @dev Emitted when a proposal get cancelled - * @param proposalIndex Index of proposal - */ - event ProposalCancelled(uint256 proposalIndex); - - /* Constructor */ - - /** - * @dev Constructs the master contract - * @param _owner Address of the owner of this contract - * @param _avatar Address that will ultimately execute function calls - * @param _target Address that this contract will pass transactions to - * @param _starknetCore Address of the StarkNet Core contract - * @param _l2ExecutionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - * @param _l2SpacesToWhitelist Array of spaces deployed on L2 that are allowed to interact with this contract - */ - constructor( - address _owner, - address _avatar, - address _target, - address _starknetCore, - uint256 _l2ExecutionRelayer, - uint256[] memory _l2SpacesToWhitelist - ) { - bytes memory initParams = abi.encode( - _owner, - _avatar, - _target, - _starknetCore, - _l2ExecutionRelayer, - _l2SpacesToWhitelist - ); - setUp(initParams); - } - - /** - * @dev Proxy constructor - * @param initParams Initialization parameters - */ - function setUp(bytes memory initParams) public override initializer { - ( - address _owner, - address _avatar, - address _target, - address _starknetCore, - uint256 _l2ExecutionRelayer, - uint256[] memory _l2SpacesToWhitelist - ) = abi.decode(initParams, (address, address, address, address, uint256, uint256[])); - __Ownable_init(); - transferOwnership(_owner); - avatar = _avatar; - target = _target; - setUpSnapshotXProposalRelayer(_starknetCore, _l2ExecutionRelayer); - - for (uint256 i = 0; i < _l2SpacesToWhitelist.length; i++) { - whitelistedSpaces[_l2SpacesToWhitelist[i]] = true; - } - - emit SnapshotXL1ExecutorSetUpComplete( - msg.sender, - _owner, - _avatar, - _target, - _l2ExecutionRelayer, - _starknetCore - ); - } - - /* External */ - - /** - * @dev Updates the list of accepted spaces on l2. Only callable by the `owner`. - * @param toAdd List of addresses to add to the whitelist. - * @param toRemove List of addressess to remove from the whitelist. - */ - function editWhitelist(uint256[] memory toAdd, uint256[] calldata toRemove) external onlyOwner { - // Add the requested entries - for (uint256 i = 0; i < toAdd.length; i++) { - whitelistedSpaces[toAdd[i]] = true; - } - - // Remove the requested entries - for (uint256 i = 0; i < toRemove.length; i++) { - whitelistedSpaces[toRemove[i]] = false; - } - } - - /** - * @dev Initializes a new proposal execution struct on the receival of a completed proposal from StarkNet - * @param callerAddress The StarkNet space address which contained the proposal - * @param proposalOutcome Whether the proposal was accepted / rejected / cancelled - * @param executionHashLow Lowest 128 bits of the hash of all the transactions in the proposal - * @param executionHashHigh Highest 128 bits of the hash of all the transactions in the proposal - * @param _txHashes Array of transaction hashes in proposal - */ - function receiveProposal( - uint256 callerAddress, - uint256 proposalOutcome, - uint256 executionHashLow, - uint256 executionHashHigh, - bytes32[] memory _txHashes - ) external { - require(proposalOutcome != 0, 'Proposal did not pass'); - require(_txHashes.length > 0, 'proposal must contain transactions'); - require(whitelistedSpaces[callerAddress] == true, 'Invalid caller'); - - // Call to the StarkNet core contract will fail if finalized proposal message was not received on L1. - _receiveFinalizedProposal(callerAddress, proposalOutcome, executionHashLow, executionHashHigh); - - // Re-assemble the lowest and highest bytes to get the full execution hash - uint256 executionHash = (executionHashHigh << 128) + executionHashLow; - require(bytes32(executionHash) == keccak256(abi.encode(_txHashes)), 'Invalid execution'); - - proposalIndexToProposalExecution[proposalIndex].txHashes = _txHashes; - proposalIndex++; - emit ProposalReceived(proposalIndex); - } - - /** - * @dev Initializes a new proposal execution struct (To test execution without actually receiving message) - * @param executionHash Hash of all the transactions in the proposal - * @param proposalOutcome Whether proposal was accepted / rejected / cancelled - * @param _txHashes Array of transaction hashes in proposal - * @notice TODO: REMEMBER TO REMOVE BEFORE PROD - */ - function receiveProposalTest( - uint256 callerAddress, - uint256 executionHash, - uint256 proposalOutcome, - bytes32[] memory _txHashes - ) external { - require(callerAddress != 0); - require(proposalOutcome == 1, 'Proposal did not pass'); - require(_txHashes.length > 0, 'proposal must contain transactions'); - require(bytes32(executionHash) == keccak256(abi.encode(_txHashes)), 'Invalid execution'); - proposalIndexToProposalExecution[proposalIndex].txHashes = _txHashes; - proposalIndex++; - emit ProposalReceived(proposalIndex); - } - - /** - * @dev Cancels a set of proposals - * @param _proposalIndexes Array of proposal indexes that should be cancelled - */ - function cancelProposals(uint256[] memory _proposalIndexes) external onlyOwner { - for (uint256 i = 0; i < _proposalIndexes.length; i++) { - require( - getProposalState(_proposalIndexes[i]) != ProposalState.NotReceived, - 'Proposal not received, nothing to cancel' - ); - require( - getProposalState(_proposalIndexes[i]) != ProposalState.Executed, - 'Execution completed, nothing to cancel' - ); - require( - proposalIndexToProposalExecution[_proposalIndexes[i]].cancelled == false, - 'proposal is already cancelled' - ); - // To cancel a proposal, we can set the execution counter for the proposal to the number of transactions in the proposal. - // We must also set a boolean in the Proposal Execution struct to true, without this there would be no way for the state to differentiate between a cancelled and an executed proposal. - // proposalIndexToProposalExecution[_proposalIndexes[i]] - // .executionCounter = proposalIndexToProposalExecution[_proposalIndexes[i]].txHashes.length; - proposalIndexToProposalExecution[_proposalIndexes[i]].cancelled = true; - emit ProposalCancelled(_proposalIndexes[i]); - } - } - - /** - * @dev Executes a single transaction in a proposal - * @param _proposalIndex Index of proposal - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - */ - function executeProposalTx( - uint256 _proposalIndex, - address to, - uint256 value, - bytes memory data, - Enum.Operation operation - ) public { - require( - getProposalState(_proposalIndex) == ProposalState.Executing, - 'Proposal is not in executing state' - ); - bytes32 txHash = getTransactionHash(to, value, data, operation); - require( - proposalIndexToProposalExecution[_proposalIndex].txHashes[ - proposalIndexToProposalExecution[_proposalIndex].executionCounter - ] == txHash, - 'Invalid transaction or invalid transaction order' - ); - proposalIndexToProposalExecution[_proposalIndex].executionCounter++; - require(exec(to, value, data, operation), 'Module transaction failed'); - emit TransactionExecuted(_proposalIndex, txHash); - if (getProposalState(_proposalIndex) == ProposalState.Executed) { - emit ProposalExecuted(_proposalIndex); - } - } - - /** - * @dev Wrapper function around executeProposalTx that will execute all transactions in a proposal - * @param _proposalIndex Index of proposal - * @param tos Array of contracts to be called by the avatar - * @param values Array of ether values to pass with the calls - * @param data Array of data to be executed from the calls - * @param operations Array of Call or DelegateCall indicators - */ - function executeProposalTxBatch( - uint256 _proposalIndex, - address[] memory tos, - uint256[] memory values, - bytes[] memory data, - Enum.Operation[] memory operations - ) external { - for (uint256 i = 0; i < tos.length; i++) { - executeProposalTx(_proposalIndex, tos[i], values[i], data[i], operations[i]); - } - } - - /* VIEW FUNCTIONS */ - - /** - * @dev Returns state of proposal - * @param _proposalIndex Index of proposal - */ - function getProposalState(uint256 _proposalIndex) public view returns (ProposalState) { - ProposalExecution storage proposalExecution = proposalIndexToProposalExecution[_proposalIndex]; - if (proposalExecution.txHashes.length == 0) { - return ProposalState.NotReceived; - } else if (proposalExecution.cancelled) { - return ProposalState.Cancelled; - } else if (proposalExecution.txHashes.length == proposalExecution.executionCounter) { - return ProposalState.Executed; - } else { - return ProposalState.Executing; - } - } - - /** - * @dev Gets number of transactions in a proposal - * @param _proposalIndex Index of proposal - * @return numTx Number of transactions in the proposal - */ - function getNumOfTxInProposal(uint256 _proposalIndex) public view returns (uint256 numTx) { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - return proposalIndexToProposalExecution[_proposalIndex].txHashes.length; - } - - /** - * @dev Gets hash of transaction in a proposal - * @param _proposalIndex Index of proposal - * @param txIndex Index of transaction in proposal - * @param txHash Transaction Hash - */ - function getTxHash(uint256 _proposalIndex, uint256 txIndex) public view returns (bytes32 txHash) { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - require(txIndex < proposalIndexToProposalExecution[_proposalIndex].txHashes.length); - return proposalIndexToProposalExecution[_proposalIndex].txHashes[txIndex]; - } - - /** - * @dev Gets whether transaction has been executed - * @param _proposalIndex Index of proposal - * @param txIndex Index of transaction in proposal - * @param isExecuted Is transaction executed - */ - function isTxExecuted(uint256 _proposalIndex, uint256 txIndex) - public - view - returns (bool isExecuted) - { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - require(txIndex < proposalIndexToProposalExecution[_proposalIndex].txHashes.length); - return proposalIndexToProposalExecution[_proposalIndex].executionCounter > txIndex; - } - - /** - * @dev Generates the data for the module transaction hash (required for signing) - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - * @return txHashData Transaction hash data - */ - function generateTransactionHashData( - address to, - uint256 value, - bytes memory data, - Enum.Operation operation, - uint256 nonce - ) public view returns (bytes memory txHashData) { - uint256 chainId = block.chainid; - bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this)); - bytes32 transactionHash = keccak256( - abi.encode(TRANSACTION_TYPEHASH, to, value, keccak256(data), operation, nonce) - ); - return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator, transactionHash); - } - - /** - * @dev Generates transaction hash - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - * @return txHash Transaction hash - */ - function getTransactionHash( - address to, - uint256 value, - bytes memory data, - Enum.Operation operation - ) public view returns (bytes32 txHash) { - // No nonce is required here because we prevent tx replays via the execution counter - return keccak256(generateTransactionHashData(to, value, data, operation, 0)); - } -} diff --git a/contracts/ethereum/ZodiacModule/deps.sol b/contracts/ethereum/ZodiacModule/deps.sol deleted file mode 100644 index df9e7557..00000000 --- a/contracts/ethereum/ZodiacModule/deps.sol +++ /dev/null @@ -1,9 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/safe-contracts/contracts/GnosisSafeL2.sol'; -import '@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol'; -import '@gnosis.pm/zodiac/contracts/factory/ModuleProxyFactory.sol'; -import '@gnosis.pm/zodiac/contracts/guard/Guardable.sol'; -import '@gnosis.pm/zodiac/contracts/core/Module.sol'; diff --git a/contracts/starknet/Authenticators/EthSig.cairo b/contracts/starknet/Authenticators/EthSig.cairo deleted file mode 100644 index 304b18ff..00000000 --- a/contracts/starknet/Authenticators/EthSig.cairo +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_secp.signature import verify_eth_signature_uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) - -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Ethereum Signature Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via an Ethereum signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via an Ethereum signature -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, bitwise_ptr: BitwiseBuiltin* -}( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, -) -> () { - if (function_selector == PROPOSAL_SELECTOR) { - EIP712.verify_propose_sig(r, s, v, salt, target, calldata_len, calldata); - } else { - if (function_selector == VOTE_SELECTOR) { - EIP712.verify_vote_sig(r, s, v, salt, target, calldata_len, calldata); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/EthSigSessionKey.cairo b/contracts/starknet/Authenticators/EthSigSessionKey.cairo deleted file mode 100644 index 2034e8c7..00000000 --- a/contracts/starknet/Authenticators/EthSigSessionKey.cairo +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) - -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.session_key import SessionKey - -// -// @title Session key Authenticator with Ethereum Signature Authorization -// @author SnapshotLabs -// @notice Contract to allow authentication with a session key that can be authorized and revoked with an Ethereum signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via a StarkNet session key signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -// @param session_public_key The StarkNet session public key that was used to generate the signature -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, - session_public_key: felt, -) { - let eth_address = calldata[0]; - SessionKey.assert_valid(session_public_key, eth_address); - - // Check signature with session key - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} - -// @dev Registers a session key via authorization from an Ethereum signature -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param eth_address Owner's Ethereum Address that was used to create the signature -// @param session_public_key The StarkNet session public key that should be registered -// @param session_duration The number of seconds that the session key is valid -@external -func authorizeSessionKeyWithSig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, -) { - SessionKey.authorize_with_sig(r, s, v, salt, eth_address, session_public_key, session_duration); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the session key itself -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithSessionKeySig{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}(r: felt, s: felt, salt: felt, session_public_key: felt) { - SessionKey.revoke_with_session_key_sig(r, s, salt, session_public_key); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the owner Ethereum account -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithOwnerSig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - ecdsa_ptr: SignatureBuiltin*, -}(r: Uint256, s: Uint256, v: felt, salt: Uint256, session_public_key: felt) { - SessionKey.revoke_with_owner_sig(r, s, v, salt, session_public_key); - return (); -} - -// @dev Returns owner of a session key if it exists, otherwise throws -// @param session_public_key The StarkNet session public key -// @return owner The owner Ethereum address -@view -func getSessionKeyOwner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) -> (eth_address: felt) { - let (eth_address) = SessionKey.get_owner(session_public_key); - return (eth_address,); -} diff --git a/contracts/starknet/Authenticators/EthTx.cairo b/contracts/starknet/Authenticators/EthTx.cairo deleted file mode 100644 index 631d4ca6..00000000 --- a/contracts/starknet/Authenticators/EthTx.cairo +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.memcpy import memcpy - -from contracts.starknet.lib.array_utils import ArrayUtils -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eth_tx import EthTx - -// -// @title Ethereum Transaction Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via an Ethereum transaction -// - -// @dev Constructor -// @param starknet_commit_address Address of the StarkNet Commit Ethereum contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt -) { - EthTx.initializer(starknet_commit_address); - return (); -} - -// @dev Authentication of an action (vote or propose) via an Ethereum transaction -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) { - alloc_locals; - // Cast arguments to single array and hash them - let (input_array: felt*) = alloc(); - assert input_array[0] = target; - assert input_array[1] = function_selector; - memcpy(input_array + 2, calldata, calldata_len); - let (hash) = ArrayUtils.hash(calldata_len + 2, input_array); - - // Checks that hash matches a commit and that the commit was created by the correct address - let address = calldata[0]; - EthTx.consume_commit(hash, address); - - // Execute the function call with calldata supplied. - execute(target, function_selector, calldata_len, calldata); - return (); -} - -// @dev L1 handler that receives hash from StarkNet Commit contract and stores it in state -// @param from_address Origin contract address of the L1 message -// @param sender_address Address of user that initiated the L1 message transaction -// @param hash The commit payload -@l1_handler -func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - from_address: felt, sender_address: felt, hash: felt -) { - EthTx.commit(from_address, sender_address, hash); - return (); -} diff --git a/contracts/starknet/Authenticators/EthTxSessionKey.cairo b/contracts/starknet/Authenticators/EthTxSessionKey.cairo deleted file mode 100644 index d8320826..00000000 --- a/contracts/starknet/Authenticators/EthTxSessionKey.cairo +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin - -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eth_tx import EthTx -from contracts.starknet.lib.session_key import SessionKey -from contracts.starknet.lib.stark_eip191 import StarkEIP191 - -// -// @title Session key Authenticator with Ethereum Transaction Authorization -// @author SnapshotLabs -// @notice Contract to allow authentication with a session key that can be authorized and revoked with an Ethereum transaction -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Constructor -// @param starknet_commit_address Address of the StarkNet Commit Ethereum contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt -) { - EthTx.initializer(starknet_commit_address); - return (); -} - -// @dev Authentication of an action (vote or propose) via an StarkNet session key signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -// @param session_public_key The StarkNet session public key that was used to generate the signature -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, - session_public_key: felt, -) { - let eth_address = calldata[0]; - SessionKey.assert_valid(session_public_key, eth_address); - - // Check signature with session key - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - // Invalid selector - return (); - } - } - - // Call the contract - execute(target, function_selector, calldata_len, calldata); - - return (); -} - -// @dev Registers a session key via authorization from an Ethereum transaction -// @note Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function -// @param eth_address Owner's Ethereum Address that was used to commit the hash on Ethereum -// @param session_public_key The StarkNet session public key that should be registered -// @param session_duration The number of seconds that the session key is valid -@external -func authorizeSessionKeyWithTx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt -) { - SessionKey.authorize_with_tx(eth_address, session_public_key, session_duration); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the session key itself -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithSessionKeySig{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}(r: felt, s: felt, salt: felt, session_public_key: felt) { - SessionKey.revoke_with_session_key_sig(r, s, salt, session_public_key); - return (); -} - -// @dev Revokes a session key via authorization from an Ethereum transaction by the owner -// @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propagated to L2 before calling this function -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithOwnerTx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) { - SessionKey.revoke_with_owner_tx(session_public_key); - return (); -} - -// @dev Returns owner of a session key if it exists, otherwise throws -// @param session_public_key The StarkNet session public key -// @return owner The owner Ethereum address -@view -func getSessionKeyOwner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) -> (eth_address: felt) { - let (eth_address) = SessionKey.get_owner(session_public_key); - return (eth_address,); -} - -// @dev L1 handler that receives hash from StarkNet Commit contract and stores it in state -// @param from_address Origin contract address of the L1 message -// @param sender_address Address of user that initiated the L1 message transaction -// @param hash The commit payload -@l1_handler -func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - from_address: felt, sender_address: felt, hash: felt -) { - EthTx.commit(from_address, sender_address, hash); - return (); -} diff --git a/contracts/starknet/Authenticators/StarkSig.cairo b/contracts/starknet/Authenticators/StarkSig.cairo deleted file mode 100644 index 852c6d06..00000000 --- a/contracts/starknet/Authenticators/StarkSig.cairo +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin - -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.execute import execute - -// -// @title StarkNet Signature Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via a StarkNet signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via a StarkNet signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{ - syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, -) -> () { - // The public key of the voter or proposer is stored at the start of the calldata array - let public_key = calldata[0]; - - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig(r, s, salt, target, calldata_len, calldata, public_key); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig(r, s, salt, target, calldata_len, calldata, public_key); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/StarkTx.cairo b/contracts/starknet/Authenticators/StarkTx.cairo deleted file mode 100644 index a4e76fdf..00000000 --- a/contracts/starknet/Authenticators/StarkTx.cairo +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address - -from contracts.starknet.lib.execute import execute - -// -// @title StarkNet Transaction Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via a StarkNet transaction -// - -// @dev Authentication of an action (vote or propose) via a StarkNet transaction -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - let (caller_address) = get_caller_address(); - with_attr error_message("Incorrect caller") { - assert caller_address = calldata[0]; - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/Vanilla.cairo b/contracts/starknet/Authenticators/Vanilla.cairo deleted file mode 100644 index e4ebe72b..00000000 --- a/contracts/starknet/Authenticators/Vanilla.cairo +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from contracts.starknet.lib.execute import execute - -// -// @title Vanilla Authenticator -// @author SnapshotLabs -// @notice Contract to allow bypassing of authentication for Snapshot X users -// - -@external -func authenticate{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/ExecutionStrategies/EthRelayer.cairo b/contracts/starknet/ExecutionStrategies/EthRelayer.cairo deleted file mode 100644 index d51ed019..00000000 --- a/contracts/starknet/ExecutionStrategies/EthRelayer.cairo +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.starknet.common.messages import send_message_to_l1 - -// -// @title Ethereum Relayer Execution Strategy -// @author SnapshotLabs -// @notice Contract to allow executing proposal transactions on Ethereum mainnet -// - -// @dev Relays an execution hash to Ethereum after a proposal is finalized or cancelled -// @param proposal_outcome The outcome of a proposal -// @param execution_params The array of execution parameters -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - alloc_locals; - // NOTE: This function can be called by anyone so it is important that the destination contract checks that caller_address is the correct space contract - let (caller_address) = get_caller_address(); - - with_attr error_message("EthRelayer: Invalid execution param array") { - assert execution_params_len = 3; - } - let l1_destination_address = execution_params[0]; - let execution_hash_low = execution_params[1]; - let execution_hash_high = execution_params[2]; - - // Create the payload - let (message_payload: felt*) = alloc(); - assert message_payload[0] = caller_address; - assert message_payload[1] = proposal_outcome; - assert message_payload[2] = execution_hash_low; - assert message_payload[3] = execution_hash_high; - let payload_size = 4; - - // Send message to L1 Contract - send_message_to_l1( - to_address=l1_destination_address, payload_size=payload_size, payload=message_payload - ); - return (); -} diff --git a/contracts/starknet/ExecutionStrategies/Vanilla.cairo b/contracts/starknet/ExecutionStrategies/Vanilla.cairo deleted file mode 100644 index d2cf36db..00000000 --- a/contracts/starknet/ExecutionStrategies/Vanilla.cairo +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -// -// @title Vanilla Execution Strategy -// @author SnapshotLabs -// @notice Dummy Execution Strategy -// - -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - return (); -} diff --git a/contracts/starknet/Interfaces/IExecutionStrategy.cairo b/contracts/starknet/Interfaces/IExecutionStrategy.cairo deleted file mode 100644 index 71c45a07..00000000 --- a/contracts/starknet/Interfaces/IExecutionStrategy.cairo +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -@contract_interface -namespace IExecutionStrategy { - func execute(proposal_outcome: felt, execution_params_len: felt, execution_params: felt*) { - } -} diff --git a/contracts/starknet/Interfaces/ISpaceAccount.cairo b/contracts/starknet/Interfaces/ISpaceAccount.cairo deleted file mode 100644 index e0034c3e..00000000 --- a/contracts/starknet/Interfaces/ISpaceAccount.cairo +++ /dev/null @@ -1,113 +0,0 @@ -%lang starknet - -from openzeppelin.account.library import AccountCallArray -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal_info import ProposalInfo -from starkware.cairo.common.uint256 import Uint256 - -@contract_interface -namespace ISpaceaccount { - func getPublicKey() -> (publicKey: felt) { - } - - func supportsInterface(interfaceId: felt) -> (success: felt) { - } - - func setPublicKey(newPublicKey: felt) { - } - - func isValidSignature(hash: felt, signature_len: felt, signature: felt*) -> (isValid: felt) { - } - - func __validate__( - call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt* - ) { - } - - func __validate_declare__(hash: felt) { - } - - func __execute__( - call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt* - ) -> (response_len: felt, response: felt*) { - } - - func propose( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, - ) -> () { - } - - func vote( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - ) -> () { - } - - func finalize_proposal(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - } - - func cancel_proposal(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - } - - func has_voted(proposal_id: felt, voter_address: Address) -> (voted: felt) { - } - - func get_proposal_info(proposal_id: felt) -> (proposal_info: ProposalInfo) { - } - - func update_controller(new_controller: felt) { - } - - func update_quorum(new_quorum: Uint256) { - } - - func update_voting_delay(new_delay: felt) { - } - - func update_min_voting_duration(new_min_voting_duration: felt) { - } - - func update_max_voting_duration(new_max_voting_duration: felt) { - } - - func update_proposal_threshold(new_proposal_threshold: Uint256) { - } - - func update_metadata_uri(new_metadata_uri_len: felt, new_metadata_uri: felt*) { - } - - func add_execution_strategies(addresses_len: felt, addresses: felt*) { - } - - func remove_execution_strategies(addresses_len: felt, addresses: felt*) { - } - - func add_voting_strategies( - addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt* - ) { - } - - func remove_voting_strategies(indexes_len: felt, indexes: felt*) { - } - - func add_authenticators(addresses_len: felt, addresses: felt*) { - } - - func remove_authenticators(addresses_len: felt, addresses: felt*) { - } -} diff --git a/contracts/starknet/Interfaces/ISpaceFactory.cairo b/contracts/starknet/Interfaces/ISpaceFactory.cairo deleted file mode 100644 index 9a749574..00000000 --- a/contracts/starknet/Interfaces/ISpaceFactory.cairo +++ /dev/null @@ -1,27 +0,0 @@ -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -@contract_interface -namespace ISpacefactory { - func deploy_space( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - voting_strategies_len: felt, - voting_strategies: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategy_len: felt, - execution_strategy: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, - ) { - } -} diff --git a/contracts/starknet/Interfaces/IVotingStrategy.cairo b/contracts/starknet/Interfaces/IVotingStrategy.cairo deleted file mode 100644 index e7c48f6d..00000000 --- a/contracts/starknet/Interfaces/IVotingStrategy.cairo +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address - -@contract_interface -namespace IVotingStrategy { - func getVotingPower( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, - ) -> (voting_power: Uint256) { - } -} diff --git a/contracts/starknet/SpaceAccount.cairo b/contracts/starknet/SpaceAccount.cairo deleted file mode 100644 index c12dced4..00000000 --- a/contracts/starknet/SpaceAccount.cairo +++ /dev/null @@ -1,423 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.starknet.common.syscalls import get_tx_info -from starkware.cairo.common.uint256 import Uint256 - -from openzeppelin.account.library import Account, AccountCallArray -from openzeppelin.access.ownable.library import Ownable - -from contracts.starknet.lib.voting import Voting -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal_info import ProposalInfo -from contracts.starknet.lib.vote import Vote - -// -// @title Snapshot X Space Account -// @author SnapshotLabs -// @notice Core contract for Snapshot X, each DAO should deploy their own instance -// - -// @dev Constructor -// @param public_key The public key that can execute transactions via this account - Can set to zero if this functionality is unwanted -// @param voting_delay The delay between when a proposal is created, and when the voting starts -// @param min_voting_duration The minimum duration of the voting period -// @param max_voting_duration The maximum duration of the voting period -// @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space -// @param controller The address of the controller account for the space -// @param quorum The minimum total voting power required for a proposal to pass -// @param voting_strategies Array of whitelisted voting strategy contract addresses -// @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters -// @param authenticators Array of whitelisted authenticator contract addresses -// @param execution_strategies Array of whitelisted execution strategy contract addresses -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, -) { - Account.initializer(public_key); - Ownable.initializer(controller); - Voting.initializer( - voting_delay, - min_voting_duration, - max_voting_duration, - proposal_threshold, - quorum, - voting_strategies_len, - voting_strategies, - voting_strategy_params_flat_len, - voting_strategy_params_flat, - authenticators_len, - authenticators, - execution_strategies_len, - execution_strategies, - ); - return (); -} - -// ----- OZ Account Functionality ----- - -// -// Getters -// - -@view -func getPublicKey{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> ( - publicKey: felt -) { - let (publicKey: felt) = Account.get_public_key(); - return (publicKey=publicKey); -} - -@view -func supportsInterface{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - interfaceId: felt -) -> (success: felt) { - return Account.supports_interface(interfaceId); -} - -// -// Setters -// - -@external -func setPublicKey{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - newPublicKey: felt -) { - Account.set_public_key(newPublicKey); - return (); -} - -// -// Business logic -// - -@view -func isValidSignature{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(hash: felt, signature_len: felt, signature: felt*) -> (isValid: felt) { - let (isValid: felt) = Account.is_valid_signature(hash, signature_len, signature); - return (isValid=isValid); -} - -@external -func __validate__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __validate_declare__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(class_hash: felt) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __validate_deploy__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(class_hash: felt, salt: felt, publicKey: felt) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __execute__{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) -> ( - response_len: felt, response: felt* -) { - let (response_len, response) = Account.execute( - call_array_len, call_array, calldata_len, calldata - ); - return (response_len, response); -} - -// ----- Space Contract Functionality ----- - -// @dev Creates a proposal -// @param proposer_address The address of the proposal creator -// @param metadata_uri_string_len The string length of the metadata URI (required for keccak hashing) -// @param metadata_uri The metadata URI for the proposal -// @param used_voting_strategies The voting strategies (within the whitelist for the space) that the proposal creator has non-zero voting power with -// @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used -// @param execution_params Execution parameters for the proposal -@external -func propose{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, -) -> () { - Voting.propose( - proposer_address, - metadata_uri_string_len, - metadata_uri_len, - metadata_uri, - execution_strategy, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_flat_len, - user_voting_strategy_params_flat, - execution_params_len, - execution_params, - ); - return (); -} - -// @dev Casts a vote on a proposal -// @param voter_address The address of the voter -// @param proposal_id The ID of the proposal in the space -// @param choice The voter's choice (FOR, AGAINST, ABSTAIN) -// @param used_voting_strategies The voting strategies (within the whitelist for the space) that the voter has non-zero voting power with -// @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used -@external -func vote{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr: felt, -}( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, -) -> () { - Voting.vote( - voter_address, - proposal_id, - choice, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_flat_len, - user_voting_strategy_params_flat, - ); - return (); -} - -// @dev Finalizes a proposal, triggering execution via the chosen execution strategy -// @param proposal_id The ID of the proposal -// @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) -@external -func finalizeProposal{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, -}(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - Voting.finalize_proposal(proposal_id, execution_params_len, execution_params); - return (); -} - -// @dev Cancels a proposal. Only callable by the controller. -// @param proposal_id The ID of the proposal -// @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) -@external -func cancelProposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, execution_params_len: felt, execution_params: felt* -) { - Ownable.assert_only_owner(); - Voting.cancel_proposal(proposal_id, execution_params_len, execution_params); - return (); -} - -// @dev Checks to see whether a given address has voted in a proposal -// @param proposal_id The proposal ID -// @param voter_address The voter's address -// @return voted 1 if user has voted, otherwise 0 -@view -func hasVoted{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, voter_address: Address -) -> (voted: felt) { - return Voting.has_voted(proposal_id, voter_address); -} - -// @dev Returns proposal information -// @param proposal_id The proposal ID -// @return proposal_info Struct containing proposal information -@view -func getProposalInfo{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt -) -> (proposal_info: ProposalInfo) { - return Voting.get_proposal_info(proposal_id); -} - -// @dev Updates the controller -// @param new_controller The new controller account address -@external -func setController{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_controller: felt -) { - Ownable.assert_only_owner(); - Ownable.transfer_ownership(new_controller); - return (); -} - -// @dev Updates the quorum -// @param new_quorum The new quorum -@external -func setQuorum{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_quorum: Uint256 -) { - Ownable.assert_only_owner(); - Voting.update_quorum(new_quorum); - return (); -} - -// @dev Updates the voting delay -// @param new_voting_delay The new voting delay -@external -func setVotingDelay{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_delay: felt -) { - Ownable.assert_only_owner(); - Voting.update_voting_delay(new_delay); - return (); -} - -// @dev Updates the minimum voting duration -// @param new_min_voting_duration The new minimum voting duration -@external -func setMinVotingDuration{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_min_voting_duration: felt -) { - Ownable.assert_only_owner(); - Voting.update_min_voting_duration(new_min_voting_duration); - return (); -} - -// @dev Updates the maximum voting duration -// @param new_max_voting_duration The new maximum voting duration -@external -func setMaxVotingDuration{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_max_voting_duration: felt -) { - Ownable.assert_only_owner(); - Voting.update_max_voting_duration(new_max_voting_duration); - return (); -} - -// @dev Updates the proposal threshold -// @param new_proposal_threshold The new proposal threshold -@external -func setProposalThreshold{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_proposal_threshold: Uint256 -) { - Ownable.assert_only_owner(); - Voting.update_proposal_threshold(new_proposal_threshold); - return (); -} - -// @dev Updates the metadata URI -// @param new_metadata_uri The new metadata URI -@external -func setMetadataUri{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_metadata_uri_len: felt, new_metadata_uri: felt* -) { - Ownable.assert_only_owner(); - Voting.update_metadata_uri(new_metadata_uri_len, new_metadata_uri); - return (); -} - -// @dev Adds execution strategy contracts to the whitelist -// @param addresses Array of execution strategy contract addresses -@external -func addExecutionStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.add_execution_strategies(addresses_len, addresses); - return (); -} - -// @dev Removes execution strategy contracts from the whitelist -// @param addresses Array of execution strategy contract addresses -@external -func removeExecutionStrategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - Ownable.assert_only_owner(); - Voting.remove_execution_strategies(addresses_len, addresses); - return (); -} - -// @dev Adds voting strategy contracts to the whitelist -// @param addresses Array of voting strategy contract addresses -// @param params_flat Flattened 2D array of voting strategy parameters -@external -func addVotingStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt* -) { - Ownable.assert_only_owner(); - Voting.add_voting_strategies(addresses_len, addresses, params_flat_len, params_flat); - return (); -} - -// @dev Removes voting strategy contracts from the whitelist -// @param indexes Array of voting strategy indexes to remove -@external -func removeVotingStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - indexes_len: felt, indexes: felt* -) { - Ownable.assert_only_owner(); - Voting.remove_voting_strategies(indexes_len, indexes); - return (); -} - -// @dev Adds authenticator contracts to the whitelist -// @param addresses Array of authenticator contract addresses -@external -func addAuthenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.add_authenticators(addresses_len, addresses); - return (); -} - -// @dev Removes authenticator contracts from the whitelist -// @param addresses Array of authenticator contract addresses -@external -func removeAuthenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.remove_authenticators(addresses_len, addresses); - return (); -} diff --git a/contracts/starknet/SpaceFactory.cairo b/contracts/starknet/SpaceFactory.cairo deleted file mode 100644 index 27b8c48e..00000000 --- a/contracts/starknet/SpaceFactory.cairo +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.memcpy import memcpy -from starkware.starknet.common.syscalls import deploy, get_caller_address - -// -// @title Snapshot X Space Factory -// @author SnapshotLabs -// @notice Contract to deploy space contracts in a trackable way -// @notice The space contract needs to be declared on StarkNet first, which will return the clash hash that is passed to the constructor of this contract -// - -// @dev Stores a counter to ensure a unique salt for each deployment -@storage_var -func SpaceFactory_salt() -> (value: felt) { -} - -// @dev Stores the clash hash for the space contract -@storage_var -func SpaceFactory_space_class_hash_store() -> (value: felt) { -} - -@event -func space_deployed( - deployer_address: felt, - space_address: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, -) { -} - -// @dev Constructor -// @param space_class_hash Class hash of the space contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - space_class_hash: felt -) { - SpaceFactory_space_class_hash_store.write(space_class_hash); - return (); -} - -// @dev Deploys a space contract instance -// @param public_key The public key that can execute transactions via this account - Can set to zero if this functionality is unwanted -// @param voting_delay The delay between when a proposal is created, and when the voting starts -// @param min_voting_duration The minimum duration of the voting period -// @param max_voting_duration The maximum duration of the voting period -// @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space -// @param controller The address of the controller account for the space -// @param quorum The minimum total voting power required for a proposal to pass -// @param voting_strategies Array of whitelisted voting strategy contract addresses -// @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters -// @param authenticators Array of whitelisted authenticator contract addresses -// @param execution_strategies Array of whitelisted execution strategy contract addresses -// @param metadata_uri The metadata URI for the space -@external -func deploySpace{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, -) { - alloc_locals; - let (calldata: felt*) = alloc(); - assert calldata[0] = public_key; - assert calldata[1] = voting_delay; - assert calldata[2] = min_voting_duration; - assert calldata[3] = max_voting_duration; - assert calldata[4] = proposal_threshold.low; - assert calldata[5] = proposal_threshold.high; - assert calldata[6] = controller; - assert calldata[7] = quorum.low; - assert calldata[8] = quorum.high; - assert calldata[9] = voting_strategies_len; - memcpy(calldata + 10, voting_strategies, voting_strategies_len); - assert calldata[10 + voting_strategies_len] = voting_strategy_params_flat_len; - memcpy( - calldata + 11 + voting_strategies_len, - voting_strategy_params_flat, - voting_strategy_params_flat_len, - ); - assert calldata[11 + voting_strategies_len + voting_strategy_params_flat_len] = authenticators_len; - memcpy( - calldata + 12 + voting_strategies_len + voting_strategy_params_flat_len, - authenticators, - authenticators_len, - ); - assert calldata[12 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len] = execution_strategies_len; - memcpy( - calldata + 13 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len, - execution_strategies, - execution_strategies_len, - ); - // NOTE: The metadata URI is not stored in the contract state (its just emitted as an event). Therefore it does not need to be passed as a parameter in the space deployment - let (deployer_address) = get_caller_address(); - let calldata_len = 13 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len + execution_strategies_len; - let (current_salt) = SpaceFactory_salt.read(); - let (space_class_hash) = SpaceFactory_space_class_hash_store.read(); - let (space_address) = deploy( - class_hash=space_class_hash, - contract_address_salt=current_salt, - constructor_calldata_size=calldata_len, - constructor_calldata=calldata, - deploy_from_zero=0, - ); - SpaceFactory_salt.write(value=current_salt + 1); - - space_deployed.emit( - deployer_address, - space_address, - voting_delay, - min_voting_duration, - max_voting_duration, - proposal_threshold, - controller, - quorum, - voting_strategies_len, - voting_strategies, - voting_strategy_params_flat_len, - voting_strategy_params_flat, - authenticators_len, - authenticators, - execution_strategies_len, - execution_strategies, - metadata_uri_len, - metadata_uri, - ); - return (); -} diff --git a/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo b/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo deleted file mode 100644 index 084ef470..00000000 --- a/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo +++ /dev/null @@ -1,17 +0,0 @@ -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from contracts.starknet.lib.proposal_outcome import ProposalOutcome - -// Throws if `proposal_outcome` is `REJECTED`. -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - if (proposal_outcome == ProposalOutcome.REJECTED) { - with_attr error_message("TestExecutionStrategy: Proposal was rejected") { - assert 1 = 0; - } - } - return (); -} diff --git a/contracts/starknet/TestContracts/README.md b/contracts/starknet/TestContracts/README.md deleted file mode 100644 index c5ac0b28..00000000 --- a/contracts/starknet/TestContracts/README.md +++ /dev/null @@ -1 +0,0 @@ -These contracts are used to test library functionality in isolation. \ No newline at end of file diff --git a/contracts/starknet/TestContracts/Test_ArrayUtils.cairo b/contracts/starknet/TestContracts/Test_ArrayUtils.cairo deleted file mode 100644 index 6f00bc33..00000000 --- a/contracts/starknet/TestContracts/Test_ArrayUtils.cairo +++ /dev/null @@ -1,30 +0,0 @@ -%lang starknet -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_builtins import HashBuiltin -from contracts.starknet.lib.array_utils import ArrayUtils, Immutable2DArray - -@view -func testArray2D{range_check_ptr}(flat_array_len: felt, flat_array: felt*, index: felt) -> ( - array_len: felt, array: felt* -) { - alloc_locals; - let (array2d: Immutable2DArray) = ArrayUtils.construct_array2d(flat_array_len, flat_array); - let (array_len, array) = ArrayUtils.get_sub_array(array2d, index); - return (array_len, array); -} - -@view -func testHashArray{range_check_ptr, pedersen_ptr: HashBuiltin*}(array_len: felt, array: felt*) -> ( - hash: felt -) { - let (hash) = ArrayUtils.hash(array_len, array); - return (hash,); -} - -@view -func test_assert_no_duplicates{range_check_ptr, pedersen_ptr: HashBuiltin*}( - array_len: felt, array: felt* -) { - ArrayUtils.assert_no_duplicates(array_len, array); - return (); -} diff --git a/contracts/starknet/TestContracts/Test_MathUtils.cairo b/contracts/starknet/TestContracts/Test_MathUtils.cairo deleted file mode 100644 index f3f9f6a4..00000000 --- a/contracts/starknet/TestContracts/Test_MathUtils.cairo +++ /dev/null @@ -1,29 +0,0 @@ -%lang starknet -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from contracts.starknet.lib.math_utils import MathUtils - -@view -func testWordsToUint256{range_check_ptr}(word1: felt, word2: felt, word3: felt, word4: felt) -> ( - uint256: Uint256 -) { - let (uint256) = MathUtils.words_to_uint256(word1, word2, word3, word4); - return (uint256,); -} - -@view -func testPackFelt{range_check_ptr}(num1: felt, num2: felt, num3: felt, num4: felt) -> ( - packed: felt -) { - let (packed) = MathUtils.pack_4_32_bit(num1, num2, num3, num4); - return (packed,); -} - -@view -func testUnpackFelt{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(packed: felt) -> ( - num1: felt, num2: felt, num3: felt, num4: felt -) { - alloc_locals; - let (num1, num2, num3, num4) = MathUtils.unpack_4_32_bit(packed); - return (num1, num2, num3, num4); -} diff --git a/contracts/starknet/TestContracts/Test_Merkle.cairo b/contracts/starknet/TestContracts/Test_Merkle.cairo deleted file mode 100644 index cf9408e8..00000000 --- a/contracts/starknet/TestContracts/Test_Merkle.cairo +++ /dev/null @@ -1,13 +0,0 @@ -%lang starknet -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_builtins import HashBuiltin -from contracts.starknet.lib.merkle import Merkle - -@view -func testAssertValidLeaf{range_check_ptr, pedersen_ptr: HashBuiltin*}( - root: felt, leaf_len: felt, leaf: felt*, proof_len: felt, proof: felt* -) { - alloc_locals; - Merkle.assert_valid_leaf(root, leaf_len, leaf, proof_len, proof); - return (); -} diff --git a/contracts/starknet/VotingStrategies/EthBalanceOf.cairo b/contracts/starknet/VotingStrategies/EthBalanceOf.cairo deleted file mode 100644 index dabd70c9..00000000 --- a/contracts/starknet/VotingStrategies/EthBalanceOf.cairo +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.single_slot_proof import SingleSlotProof - -// -// @title Ethereum Balance Of Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow Ethereum token balances to be used as voting power -// - -// @dev Constructor -// @param fact_registry_address Address of the Fossil fact registry contract -// @param l1_headers_store_address Address of the Fossil L1 headers store contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - fact_registry_address: felt, l1_headers_store_address: felt -) { - SingleSlotProof.initializer(fact_registry_address, l1_headers_store_address); - return (); -} - -// @dev Returns the voting power for a user -// @param timestamp The snapshot timestamp -// @param voter_address The address of the user -// @param params Configuration parameter array that is the same for every voter in the proposal. Should be as follows: -// params[0] = The address of the Ethereum token contract -// params[1] = The index of the slot within the token contract where the balances[_address] mapping resides -// @param user_params Array containing storage proofs for the users balance within the token contract -// @return voting_power The value of the balances[_address] mapping corresponding to the user's address -@view -func getVotingPower{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, bitwise_ptr: BitwiseBuiltin* -}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - let (voting_power) = SingleSlotProof.get_storage_slot( - timestamp, voter_address.value, params_len, params, user_params_len, user_params - ); - return (voting_power,); -} diff --git a/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo b/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo deleted file mode 100644 index c4f85042..00000000 --- a/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.memcpy import memcpy -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.math import assert_nn_le - -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.merkle import Merkle - -// -// @title Merkle Whitelist Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow a merkle tree based whitelist to be used to compute voting power for each user -// - -// @dev Returns the voting power for a user obtained from the whitelist -// @param timestamp The snapshot timestamp (not used) -// @param voter_address The address of the user -// @param params Configuration parameter array that is the same for every voter in the proposal. Should be as follows: -// params[0] = The merkle root of the whitelist data, should be computed off-chain -// @param user_params Array containing the leaf and merkle proof data. Should be as follows: -// user_params[0] = address of the whitelisted user -// user_params[1] = Low 128 bits of the voting power of the user -// user_params[2] = High 128 bits of the voting power of the user -// @return voting_power The voting power of the user as a Uint256 -@view -func getVotingPower{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - alloc_locals; - - with_attr error_message("MerkleWhitelist: Invalid parameters supplied") { - assert_nn_le(3, user_params_len); - } - - // Extracting leaf data from user params array - let (leaf: felt*) = alloc(); - let leaf_len = 3; - memcpy(leaf, user_params, leaf_len); - - // Checking that the leaf corresponds to the voter's address - with_attr error_message("MerkleWhitelist: Invalid proof supplied") { - // The address resides at the beginning of the leaf data array - assert leaf[0] = voter_address.value; - } - - // Extracting proof from user params array - let (proof: felt*) = alloc(); - let proof_len = user_params_len - leaf_len; - memcpy(proof, user_params + leaf_len, proof_len); - - // Extracting merkle root from params array - let merkle_root = params[0]; - - // Checking the merkle proof - Merkle.assert_valid_leaf(merkle_root, leaf_len, leaf, proof_len, proof); - - // Extract voting power from leaf and cast to Uint256 - let voting_power = Uint256(leaf[1], leaf[2]); - - return (voting_power,); -} diff --git a/contracts/starknet/VotingStrategies/Vanilla.cairo b/contracts/starknet/VotingStrategies/Vanilla.cairo deleted file mode 100644 index b167e260..00000000 --- a/contracts/starknet/VotingStrategies/Vanilla.cairo +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address - -// -// @title Vanilla Voting Strategy -// @author SnapshotLabs -// @notice Contract to every user 1 voting power -// - -@view -func getVotingPower{range_check_ptr}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - return (Uint256(1, 0),); -} diff --git a/contracts/starknet/VotingStrategies/Whitelist.cairo b/contracts/starknet/VotingStrategies/Whitelist.cairo deleted file mode 100644 index 604676e1..00000000 --- a/contracts/starknet/VotingStrategies/Whitelist.cairo +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.general_address import Address - -// -// @title Whitelist Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow a whitelist to be used to compute voting power for each user -// - -// @dev Mapping between each address in the whitelist and the voting power assigned to them -@storage_var -func whitelist(address: Address) -> (voting_power: Uint256) { -} - -@event -func whitelisted(address: Address, voting_power: Uint256) { -} - -// @dev Constructor -// @param whitelist Array containing the whitelist -// @notice The whitelist array should be as follows: -// whitelist[0]: The 1st user's address -// whitelist[1]: The low 128 bits of the 1st user's voting power -// whitelist[2]: The high 128 bits of the 1st user's voting power -// whitelist[4]: The 2nd user's address -// etc... -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - whitelist_len: felt, whitelist: felt* -) { - _register_whitelist(whitelist_len, whitelist); - return (); -} - -// @dev Returns the voting power for a user obtained from the whitelist -// @param timestamp The snapshot timestamp -// @param voter_address The address of the user -// @param params Empty array -// @param user_params Empty array -// @return voting_power The voting power of the user -@view -func getVotingPower{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - let (power) = whitelist.read(voter_address); - // `power` will be set to 0 if voter is not whitelisted - return (power,); -} - -func _register_whitelist{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - _whitelist_len: felt, _whitelist: felt* -) { - if (_whitelist_len == 0) { - return (); - } else { - let address = Address(_whitelist[0]); - // Add it to the whitelist - let voting_power = Uint256(_whitelist[1], _whitelist[2]); - - MathUtils.assert_valid_uint256(voting_power); - - whitelist.write(address, voting_power); - whitelisted.emit(address, voting_power); - _register_whitelist(_whitelist_len - 3, &_whitelist[3]); - return (); - } -} diff --git a/contracts/starknet/fossil b/contracts/starknet/fossil deleted file mode 160000 index b900ab93..00000000 --- a/contracts/starknet/fossil +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b900ab933df4c2bff9745d0a05daee4e7c10b405 diff --git a/contracts/starknet/lib/array_utils.cairo b/contracts/starknet/lib/array_utils.cairo deleted file mode 100644 index 8e4d4486..00000000 --- a/contracts/starknet/lib/array_utils.cairo +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.hash_state import hash_init, hash_update, hash_finalize -from starkware.cairo.common.bool import TRUE, FALSE -from starkware.cairo.common.math import assert_not_equal - -// -// @title Array Utilities Library -// @author SnapshotLabs -// @notice A library containing various array utilities -// - -struct Immutable2DArray { - offsets_len: felt, // The length of the offsets array is the number of sub arrays in the 2d array - offsets: felt*, // offsets[i] is the index of elements where the ith array starts - elements_len: felt, - elements: felt*, // elements stores all the values of each sub array in the 2d array -} - -namespace ArrayUtils { - // @dev Computes the pedersen hash of an array of felts - // @param array The array of felts - // @return hash The hash of the array - func hash{pedersen_ptr: HashBuiltin*}(array_len: felt, array: felt*) -> (hash: felt) { - let (hash_state_ptr) = hash_init(); - let (hash_state_ptr) = hash_update{hash_ptr=pedersen_ptr}(hash_state_ptr, array, array_len); - let (hash) = hash_finalize{hash_ptr=pedersen_ptr}(hash_state_ptr); - return (hash,); - } - - // Asserts that the array does not contain any duplicates. - // O(N^2) as it loops over each element N times. - func assert_no_duplicates{}(array_len: felt, array: felt*) { - if (array_len == 0) { - return (); - } else { - _assert_not_in_array(array[0], array_len - 1, &array[1]); - assert_no_duplicates(array_len - 1, &array[1]); - return (); - } - } - - // Construct an Immutable2D array from a flat encoding. - // The structure of the flat array that is passed should be as follows: - // flat_array[0] = num_arrays - // flat_array[1:1+num_arrays] = offsets - // flat_array[1+num_arrays:] = elements - func construct_array2d{range_check_ptr}(flat_array_len: felt, flat_array: felt*) -> ( - array2d: Immutable2DArray - ) { - let offsets_len = flat_array[0]; - let offsets = &flat_array[1]; - let elements_len = flat_array_len - offsets_len - 1; - let elements = &flat_array[1 + offsets_len]; - let array2d = Immutable2DArray(offsets_len, offsets, elements_len, elements); - return (array2d,); - } - - // Extracts sub array at the specified index from an Immutable2DArray - func get_sub_array{range_check_ptr}(array2d: Immutable2DArray, index: felt) -> ( - array_len: felt, array: felt* - ) { - let offset = array2d.offsets[index]; - let array = &array2d.elements[offset]; - - if (index == array2d.offsets_len - 1) { - // If the index points to the final array in the 2d array, the length of the sub array is the length of the 2d array elements minus the offset of the final array - tempvar array_len = array2d.elements_len - offset; - } else { - // Otherwise the length of the sub array is the offset of the next array minus the offset of the current array - tempvar array_len = array2d.offsets[index + 1] - offset; - } - return (array_len, array); - } -} - -// @dev Asserts that a value is not present in an array -// @param value The value -// @param array The array -func _assert_not_in_array{}(value: felt, array_len: felt, array: felt*) { - if (array_len == 0) { - return (); - } - with_attr error_message("ArrayUtils: Duplicate entry found") { - assert_not_equal(value, array[0]); - } - _assert_not_in_array(value, array_len - 1, &array[1]); - return (); -} diff --git a/contracts/starknet/lib/choice.cairo b/contracts/starknet/lib/choice.cairo deleted file mode 100644 index fd3624e3..00000000 --- a/contracts/starknet/lib/choice.cairo +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -namespace Choice { - const FOR = 1; - const AGAINST = 2; - const ABSTAIN = 3; -} diff --git a/contracts/starknet/lib/eip712.cairo b/contracts/starknet/lib/eip712.cairo deleted file mode 100644 index d22847f4..00000000 --- a/contracts/starknet/lib/eip712.cairo +++ /dev/null @@ -1,640 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_contract_address -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_secp.signature import verify_eth_signature_uint256 -from starkware.cairo.common.bitwise import bitwise_and -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math import unsigned_div_rem -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_uint256s_bigend, - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) -from starkware.cairo.common.uint256 import ( - Uint256, - uint256_eq, - uint256_le, - uint256_mul, - uint256_unsigned_div_rem, -) - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title EIP712 Library -// @author SnapshotLabs -// @notice A library for verifying Ethereum EIP712 signatures on typed data required for Snapshot X -// @dev Refer to the official EIP for more information: https://eips.ethereum.org/EIPS/eip-712 -// - -const ETHEREUM_PREFIX = 0x1901; - -// Domain Separator: (Goerli chain id) -// name: 'snapshot-x', -// version: '1' -// chainId: '5' -const DOMAIN_HASH_HIGH = 0x8aba6bf30572474cf5acb579ce4c27aa; -const DOMAIN_HASH_LOW = 0x01d7dbffc7a8de3d601367229ba8a687; - -// keccak256("Propose(bytes32 authenticator,bytes32 space,address author,string metadata_uri,bytes32 executor,bytes32 execution_hash,bytes32 strategies_hash,bytes32 strategies_params_hash,uint256 salt)") -const PROPOSAL_TYPE_HASH_HIGH = 0x53ca73f14c436dd8e4088b71987f1dad; -const PROPOSAL_TYPE_HASH_LOW = 0x4187b44b32f86ed0ba765a166eaa687e; - -// keccak256("Vote(bytes32 authenticator,bytes32 space,address voter,uint256 proposal,uint256 choice,bytes32 strategies_hash,bytes32 strategies_params_hash,uint256 salt)") -const VOTE_TYPE_HASH_HIGH = 0x7c25de9274f16730816515e2132f9775; -const VOTE_TYPE_HASH_LOW = 0x17f55b8568b810cc267dc2999edce64a; - -// keccak256("SessionKey(address address,bytes32 sessionPublicKey,uint256 sessionDuration,uint256 salt)") -const SESSION_KEY_INIT_TYPE_HASH_HIGH = 0x53f1294cb551b4ff97c8fd4caefa8ec6; -const SESSION_KEY_INIT_TYPE_HASH_LOW = 0xaa9d835345c95b1a435ddff5ae910083; - -// keccak256("RevokeSessionKey(bytes32 sessionPublicKey,uint256 salt)") -const SESSION_KEY_REVOKE_TYPE_HASH_HIGH = 0x0a5ba214c2c419ff474ecb96dc30103d; -const SESSION_KEY_REVOKE_TYPE_HASH_LOW = 0x8166de3d410abc781e23aae247360fa9; - -// @dev Signature salts store -@storage_var -func EIP712_salts(eth_address: felt, salt: Uint256) -> (already_used: felt) { -} - -namespace EIP712 { - // @dev Asserts that a signature to cast a vote is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is casting a vote - // @param calldata Vote calldata - func verify_vote_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - calldata_len: felt, - calldata: felt*, - ) { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - let voter_address = calldata[0]; - let (authenticator_address) = get_contract_address(); - let (auth_address_u256) = MathUtils.felt_to_uint256(authenticator_address); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(voter_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - let (space) = MathUtils.felt_to_uint256(target); - - let (voter_address_u256) = MathUtils.felt_to_uint256(voter_address); - - let (proposal_id) = MathUtils.felt_to_uint256(calldata[1]); - let (choice) = MathUtils.felt_to_uint256(calldata[2]); - - let used_voting_strategies_len = calldata[3]; - let used_voting_strategies = &calldata[4]; - let (used_voting_strategies_hash) = _get_padded_hash( - used_voting_strategies_len, used_voting_strategies - ); - - let user_voting_strategy_params_flat_len = calldata[4 + used_voting_strategies_len]; - let user_voting_strategy_params_flat = &calldata[5 + used_voting_strategies_len]; - let (user_voting_strategy_params_flat_hash) = _get_padded_hash( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - // Now construct the data hash (hashStruct) - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(VOTE_TYPE_HASH_LOW, VOTE_TYPE_HASH_HIGH); - assert data[1] = auth_address_u256; - assert data[2] = space; - assert data[3] = voter_address_u256; - assert data[4] = proposal_id; - assert data[5] = choice; - assert data[6] = used_voting_strategies_hash; - assert data[7] = user_voting_strategy_params_flat_hash; - assert data[8] = salt; - - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(9, data); - - // Prepare the encoded data - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required in order to call `keccak`) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(hash, r, s, v - 27, voter_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(voter_address, salt, 1); - return (); - } - - // @dev Asserts that a signature to create a proposal is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is creating a proposal - // @param calldata Propose calldata - func verify_propose_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - calldata_len: felt, - calldata: felt*, - ) { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Proposer address should be located in calldata[0] - let proposer_address = calldata[0]; - - let (authenticator_address) = get_contract_address(); - let (auth_address_u256) = MathUtils.felt_to_uint256(authenticator_address); - - // Ensure proposer has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(proposer_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - - // We don't need to pad because calling `.address` with starknet.js - // already left pads the address with 0s - let (space) = MathUtils.felt_to_uint256(target); - - // Proposer address - let (proposer_address_u256) = MathUtils.felt_to_uint256(proposer_address); - - // Metadata URI - let metadata_uri_string_len = calldata[1]; - let metadata_uri_len = calldata[2]; - let metadata_uri: felt* = &calldata[3]; - let (metadata_uri_hash) = _keccak_ints_sequence{keccak_ptr=keccak_ptr}( - metadata_uri_string_len, metadata_uri_len, metadata_uri - ); - - // Execution Strategy - let execution_strategy = calldata[3 + metadata_uri_len]; - let (execution_strategy_u256) = MathUtils.felt_to_uint256(execution_strategy); - - // Used voting strategies - let used_voting_strats_len = calldata[4 + metadata_uri_len]; - let used_voting_strats = &calldata[5 + metadata_uri_len]; - let (used_voting_strategies_hash) = _get_padded_hash( - used_voting_strats_len, used_voting_strats - ); - - // User voting strategy params flat - let user_voting_strat_params_flat_len = calldata[5 + metadata_uri_len + used_voting_strats_len]; - let user_voting_strat_params_flat = &calldata[6 + metadata_uri_len + used_voting_strats_len]; - let (user_voting_strategy_params_flat_hash) = _get_padded_hash( - user_voting_strat_params_flat_len, user_voting_strat_params_flat - ); - - // Execution hash - let execution_params_len = calldata[6 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let execution_params_ptr: felt* = &calldata[7 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let (execution_hash) = _get_padded_hash(execution_params_len, execution_params_ptr); - - // Now construct the data hash (hashStruct) - let (data: Uint256*) = alloc(); - - assert data[0] = Uint256(PROPOSAL_TYPE_HASH_LOW, PROPOSAL_TYPE_HASH_HIGH); - assert data[1] = auth_address_u256; - assert data[2] = space; - assert data[3] = proposer_address_u256; - assert data[4] = metadata_uri_hash; - assert data[5] = execution_strategy_u256; - assert data[6] = execution_hash; - assert data[7] = used_voting_strategies_hash; - assert data[8] = user_voting_strategy_params_flat_hash; - assert data[9] = salt; - - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(10, data); - - // Prepare the encoded data - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required in order to call `keccak`) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(hash, r, s, v - 27, proposer_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(proposer_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to authorize a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func verify_session_key_auth_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, - ) -> () { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Ensure user has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(eth_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - // Encode data - let (eth_address_u256) = MathUtils.felt_to_uint256(eth_address); - - let (session_public_key_u256) = MathUtils.felt_to_uint256(session_public_key); - let (padded_session_public_key) = _pad_right(session_public_key_u256); - - let (session_duration_u256) = MathUtils.felt_to_uint256(session_duration); - - // Now construct the data array - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(SESSION_KEY_INIT_TYPE_HASH_LOW, SESSION_KEY_INIT_TYPE_HASH_HIGH); - assert data[1] = eth_address_u256; - assert data[2] = padded_session_public_key; - assert data[3] = session_duration_u256; - assert data[4] = salt; - - // Hash the data array - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(5, data); - - // Prepend the domain separator hash - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required for the cairo keccak implementation) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (msg_hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(msg_hash, r, s, v - 27, eth_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(eth_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to revoke a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be revoked - func verify_session_key_revoke_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, s: Uint256, v: felt, salt: Uint256, eth_address: felt, session_public_key: felt - ) -> () { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Ensure user has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(eth_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - // Encode data - let (session_public_key_u256) = MathUtils.felt_to_uint256(session_public_key); - let (padded_session_public_key) = _pad_right(session_public_key_u256); - - // Now construct the data array - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(SESSION_KEY_REVOKE_TYPE_HASH_LOW, SESSION_KEY_REVOKE_TYPE_HASH_HIGH); - assert data[1] = padded_session_public_key; - assert data[2] = salt; - - // Hash the data array - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(3, data); - - // Prepend the domain separator hash - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required for the cairo keccak implementation) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (msg_hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(msg_hash, r, s, v - 27, eth_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(eth_address, salt, 1); - - return (); - } -} - -// -// Private Functions -// - -// Adds a 2 bytes (16 bits) `prefix` to a 16 bytes (128 bits) `value`. -func _add_prefix128{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(value: felt, prefix: felt) -> ( - result: felt, carry: felt -) { - // Shift the prefix by 128 bits - let shifted_prefix = prefix * 2 ** 128; - // `with_prefix` is now 18 bytes long - let with_prefix = shifted_prefix + value; - // Create 2 bytes mask - let overflow_mask = 2 ** 16 - 1; - // Extract the last two bytes of `with_prefix` - let (carry) = bitwise_and(with_prefix, overflow_mask); - // Compute the new number, right shift by 16 - let result = (with_prefix - carry) / 2 ** 16; - return (result, carry); -} - -// Concatenates a 2 bytes long `prefix` and `input` to `output`. -// `input_len` is the number of `Uint256` in `input`. -func _prepend_prefix_2bytes{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}( - prefix: felt, output: Uint256*, input_len: felt, input: Uint256* -) { - if (input_len == 0) { - // Done, simlpy store the prefix in the `.high` part of the last Uint256, and - // make sure we left shift it by 28 (32 - 4) - assert output[0] = Uint256(0, prefix * 16 ** 28); - return (); - } else { - let num = input[0]; - - let (w1, high_carry) = _add_prefix128(num.high, prefix); - let (w0, low_carry) = _add_prefix128(num.low, high_carry); - - let res = Uint256(w0, w1); - assert output[0] = res; - - // Recurse, using the `low_carry` as `prefix` - _prepend_prefix_2bytes(low_carry, &output[1], input_len - 1, &input[1]); - return (); - } -} - -// Computes the `keccak256` hash from an array of `Uint256`. Does NOT call `finalize_keccak`, -// so the caller needs to make she calls `finalize_keccak` on the `keccak_ptr` once she's done -// with it. -func _get_keccak_hash{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: felt*}( - uint256_words_len: felt, uint256_words: Uint256* -) -> (hash: Uint256) { - let (hash) = keccak_uint256s_bigend{keccak_ptr=keccak_ptr}(uint256_words_len, uint256_words); - - return (hash,); -} - -// Returns the number of digits needed to represent `num` in hexadecimal. -// Similar to doing `len(hex(num)[2:])` in Python. -// E.g.: -// - `0x123` will return `3` -// - `0x1` will return `1` -// - `0xa3b1d4` will return `6` -// Notice: Will not work for `0x0` (will return `0` for `0x0` instead of `1`). -func _get_base16_len{range_check_ptr}(num: Uint256) -> (res: felt) { - let (is_eq) = uint256_eq(num, Uint256(0, 0)); - if (is_eq == 1) { - return (0,); - } - let (lt) = uint256_le(Uint256(16 ** 32, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 32, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 32,); - } - let (lt) = uint256_le(Uint256(16 ** 16, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 16, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 16,); - } - let (lt) = uint256_le(Uint256(16 ** 8, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 8, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 8,); - } - let (lt) = uint256_le(Uint256(16 ** 4, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 4, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 4,); - } - let (lt) = uint256_le(Uint256(16 ** 2, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 2, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 2,); - } - let (lt) = uint256_le(Uint256(16 ** 1, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 1, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 1,); - } - return (1,); -} - -// Computes `base ** exp` where `base` and `exp` are both `felts` and returns the result as a `Uint256`. -func _u256_pow{range_check_ptr}(base: felt, exp: felt) -> (res: Uint256) { - alloc_locals; - - if (exp == 0) { - // Any number to the power of 0 is 1 - return (Uint256(1, 0),); - } else { - // Compute `base ** exp - 1` - let (recursion) = _u256_pow(base, exp - 1); - - let (uint256_base) = MathUtils.felt_to_uint256(base); - - // Multiply the result by `base` - let (res, overflow) = uint256_mul(recursion, uint256_base); - - with_attr error_message("EIP712: Overflow happened") { - let (no_overflow) = uint256_eq(overflow, Uint256(0, 0)); - assert no_overflow = 1; - } - - return (res,); - } -} - -// Right pads `num` with `0` to make it 32 bytes long. -// E.g: -// - right_pad(0x1) -> (0x0100000000000000000000000000000000000000000000000000000000000000) -// - right_pad(0xaa) -> (0xaa00000000000000000000000000000000000000000000000000000000000000) -func _pad_right{range_check_ptr}(num: Uint256) -> (res: Uint256) { - let (len_base16) = _get_base16_len(num); - - let (_, rem) = unsigned_div_rem(len_base16, 2); - if (rem == 1) { - // Odd-length: add one (a byte is two characters long) - tempvar len_base16 = len_base16 + 1; - } else { - tempvar len_base16 = len_base16; - } - - let base = 16; - let exp = 64 - len_base16; - let (power_16) = _u256_pow(base, exp); - - // Left shift - let (low, high) = uint256_mul(num, power_16); - - with_attr error_message("EIP712: Overflow happened") { - assert high.low = 0; - assert high.high = 0; - } - - return (low,); -} - -func _keccak_ints_sequence{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: felt*}( - nb_bytes: felt, sequence_len: felt, sequence: felt* -) -> (res: Uint256) { - return keccak_bigend(inputs=sequence, n_bytes=nb_bytes); -} - -func _get_padded_hash{range_check_ptr, pedersen_ptr: HashBuiltin*}( - input_len: felt, input: felt* -) -> (res: Uint256) { - alloc_locals; - - let (hash) = ArrayUtils.hash(input_len, input); - let (hash_u256) = MathUtils.felt_to_uint256(hash); - let (padded_hash) = _pad_right(hash_u256); - - return (res=padded_hash); -} diff --git a/contracts/starknet/lib/eth_tx.cairo b/contracts/starknet/lib/eth_tx.cairo deleted file mode 100644 index a6e40d7e..00000000 --- a/contracts/starknet/lib/eth_tx.cairo +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math import assert_not_equal - -// -// @title Ethereum Transaction Authentication Library -// @author SnapshotLabs -// @notice A library to handle the authorization of actions within Snapshot X via transactions with an Ethereum account -// - -// @dev Address of the StarkNet Commit Ethereum contract which acts as the origin address of the messages sent to the contract -@storage_var -func EthTx_starknet_commit_address_store() -> (res: felt) { -} - -// @dev Stores the sender address for each hash committed to the contract -@storage_var -func EthTx_commit_store(hash: felt) -> (address: felt) { -} - -namespace EthTx { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param starknet_commit_address The address of the StarkNet Commit contract on Ethereum - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt - ) { - EthTx_starknet_commit_address_store.write(value=starknet_commit_address); - return (); - } - - // @dev Stores a hash that was committed on Ethereum, this should be called by the @l1_handler in the contract only - // @param origin_address The address of the origin Ethereum contract for the L1->L2 message - // @param sender_address The Ethereum address of the user that committed the hash to the StarkNet Commit contract - func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - origin_address: felt, sender_address: felt, hash: felt - ) { - // Check L1 message origin address is equal to the StarkNet Commit address. - let (starknet_commit_address) = EthTx_starknet_commit_address_store.read(); - with_attr error_message("EthTx: Invalid message origin_address address") { - assert origin_address = starknet_commit_address; - } - // Note: If the same hash is committed twice by the same sender, then the mapping will be overwritten but with the same value as before. - EthTx_commit_store.write(hash, sender_address); - return (); - } - - // @dev Checks to see if a commit exists and was made by a specified address, if so clears it from the contract. Otherwise throws - // @param hash The commit hash to consume - // @param sender_address The sender address to check the commit against - func consume_commit{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - hash: felt, sender_address: felt - ) { - // Check that the hash has been received by the contract from the StarkNet Commit contract - let (stored_address) = EthTx_commit_store.read(hash); - with_attr error_message("EthTx: Hash not yet committed or already executed") { - assert_not_equal(stored_address, 0); - } - // The sender of the commit on L1 must be the same as the address in the calldata. - with_attr error_message("EthTx: Commit made by invalid L1 address") { - assert sender_address = stored_address; - } - EthTx_commit_store.write(hash, 0); - return (); - } -} diff --git a/contracts/starknet/lib/execute.cairo b/contracts/starknet/lib/execute.cairo deleted file mode 100644 index 7565c558..00000000 --- a/contracts/starknet/lib/execute.cairo +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.starknet.common.syscalls import call_contract - -func execute{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - call_contract( - contract_address=target, - function_selector=function_selector, - calldata_size=calldata_len, - calldata=calldata, - ); - return (); -} diff --git a/contracts/starknet/lib/general_address.cairo b/contracts/starknet/lib/general_address.cairo deleted file mode 100644 index 4115f646..00000000 --- a/contracts/starknet/lib/general_address.cairo +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT - -// @dev Generalized type used to represent addresses in Snapshot X. Eg Ethereum, Starknet, etc. -struct Address { - value: felt, -} diff --git a/contracts/starknet/lib/math_utils.cairo b/contracts/starknet/lib/math_utils.cairo deleted file mode 100644 index 7a528438..00000000 --- a/contracts/starknet/lib/math_utils.cairo +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.math import unsigned_div_rem, split_felt, assert_nn_le -from starkware.cairo.common.bitwise import bitwise_and -from starkware.cairo.common.uint256 import Uint256, uint256_check - -const MAX_32 = 2 ** 32 - 1; - -const SHIFT_32 = 2 ** 32; -const SHIFT_64 = 2 ** 64; -const SHIFT_96 = 2 ** 96; - -const MASK_4 = 2 ** 32 - 1; -const MASK_3 = 2 ** 64 - 2 ** 32; -const MASK_2 = 2 ** 96 - 2 ** 64; -const MASK_1 = 2 ** 128 - 2 ** 96; - -// -// @title Math Utilities Library -// @author SnapshotLabs -// @notice A library containing various math utilities -// - -namespace MathUtils { - // @dev Converts 4 words of 64 bits each to a Uint256 - // @param word1 1st word (most significant word) - // @param word2 2nd word - // @param word3 3rd word - // @param word4 4th word (least significant word) - // @return uint256 The Uint256 - func words_to_uint256{range_check_ptr}(word1: felt, word2: felt, word3: felt, word4: felt) -> ( - uint256: Uint256 - ) { - let word1_shifted = word1 * SHIFT_64; - let word3_shifted = word3 * SHIFT_64; - let result = Uint256(low=word3_shifted + word4, high=word1_shifted + word2); - MathUtils.assert_valid_uint256(result); - return (result,); - } - - // @dev Converts a felt to a Uint256 - // @param value The felt - // @return uint256 The Uint256 - func felt_to_uint256{range_check_ptr}(value: felt) -> (uint256: Uint256) { - let (high, low) = split_felt(value); - return (Uint256(low=low, high=high),); - } - - // @dev Packs 4 32 bit numbers into a single felt - // @param num1 1st number - // @param num2 2nd number - // @param num3 3rd number - // @param num4 4th number - // @return packed_felt The packed felt - func pack_4_32_bit{range_check_ptr}(num1: felt, num2: felt, num3: felt, num4: felt) -> ( - packed_felt: felt - ) { - with_attr error_message("MathUtils: number too big to be packed") { - assert_nn_le(num1, MAX_32); - assert_nn_le(num2, MAX_32); - assert_nn_le(num3, MAX_32); - assert_nn_le(num4, MAX_32); - } - let packed_felt = num4 + num3 * SHIFT_32 + num2 * SHIFT_64 + num1 * SHIFT_96; - return (packed_felt,); - } - - // @dev Unpacks a felt into 4 32 bit numbers - // @param packed_felt The packed felt - // @return num1 1st number - // @return num2 2nd number - // @return num3 3rd number - // @return num4 4th number - func unpack_4_32_bit{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(packed_felt: felt) -> ( - num1: felt, num2: felt, num3: felt, num4: felt - ) { - let (num4) = bitwise_and(packed_felt, MASK_4); - let (num3) = bitwise_and(packed_felt, MASK_3); - let (num3, _) = unsigned_div_rem(num3, SHIFT_32); - let (num2) = bitwise_and(packed_felt, MASK_2); - let (num2, _) = unsigned_div_rem(num2, SHIFT_64); - let (num1) = bitwise_and(packed_felt, MASK_1); - let (num1, _) = unsigned_div_rem(num1, SHIFT_96); - return (num1, num2, num3, num4); - } - - // @dev Asserts that a uint256 is valid - // @param uint256 The Uint256 - func assert_valid_uint256{range_check_ptr}(uint256: Uint256) { - with_attr error_message("MathUtils: Invalid Uint256") { - uint256_check(uint256); - } - return (); - } -} diff --git a/contracts/starknet/lib/merkle.cairo b/contracts/starknet/lib/merkle.cairo deleted file mode 100644 index 0790c038..00000000 --- a/contracts/starknet/lib/merkle.cairo +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math_cmp import is_le_felt -from starkware.cairo.common.hash import hash2 - -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title Merkle Proof Library -// @author SnapshotLabs -// @notice A library to to verify merkle proofs -// - -namespace Merkle { - // @dev Asserts a given leaf is a member of the set with the specified root by verifing a proof - // @param root The merkle root of the data - // @param leaf The leaf data array - // @param proof The proof - func assert_valid_leaf{pedersen_ptr: HashBuiltin*, range_check_ptr}( - root: felt, leaf_len: felt, leaf: felt*, proof_len: felt, proof: felt* - ) { - let (leaf_node) = ArrayUtils.hash(leaf_len, leaf); - let (computed_root) = _compute_merkle_root(leaf_node, proof_len, proof); - with_attr error_message("Merkle: Invalid proof") { - assert root = computed_root; - } - return (); - } -} - -func _compute_merkle_root{pedersen_ptr: HashBuiltin*, range_check_ptr}( - curr: felt, proof_len: felt, proof: felt* -) -> (root: felt) { - alloc_locals; - - if (proof_len == 0) { - return (curr,); - } - - let le = is_le_felt(curr, proof[0]); - if (le == 1) { - let (n) = hash2{hash_ptr=pedersen_ptr}(curr, proof[0]); - tempvar node = n; - } else { - let (n) = hash2{hash_ptr=pedersen_ptr}(proof[0], curr); - tempvar node = n; - } - - let (root) = _compute_merkle_root(node, proof_len - 1, &proof[1]); - return (root,); -} diff --git a/contracts/starknet/lib/proposal.cairo b/contracts/starknet/lib/proposal.cairo deleted file mode 100644 index 9821fb2b..00000000 --- a/contracts/starknet/lib/proposal.cairo +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.uint256 import Uint256 - -struct Proposal { - quorum: Uint256, - // timestamps contains the following packed into a single felt (each one is 32 bit): - // snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - timestamps: felt, - execution_strategy: felt, - execution_hash: felt, -} diff --git a/contracts/starknet/lib/proposal_info.cairo b/contracts/starknet/lib/proposal_info.cairo deleted file mode 100644 index e6c0916f..00000000 --- a/contracts/starknet/lib/proposal_info.cairo +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.proposal import Proposal - -struct ProposalInfo { - proposal: Proposal, - power_for: Uint256, - power_against: Uint256, - power_abstain: Uint256, -} diff --git a/contracts/starknet/lib/proposal_outcome.cairo b/contracts/starknet/lib/proposal_outcome.cairo deleted file mode 100644 index 7b3c038f..00000000 --- a/contracts/starknet/lib/proposal_outcome.cairo +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -namespace ProposalOutcome { - const ACCEPTED = 1; - const REJECTED = 2; - const CANCELLED = 3; -} diff --git a/contracts/starknet/lib/session_key.cairo b/contracts/starknet/lib/session_key.cairo deleted file mode 100644 index d6703d4f..00000000 --- a/contracts/starknet/lib/session_key.cairo +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_block_timestamp -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.math import assert_lt, assert_not_zero, assert_nn_le -from starkware.cairo.common.alloc import alloc - -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.eth_tx import EthTx -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title Session Key Library -// @author SnapshotLabs -// @notice A library to handle the authorization and revokation of StarkNet session keys from an Ethereum account -// - -// @dev Stores the owner Ethereum address for a given session key -@storage_var -func SessionKey_owner_store(session_public_key: felt) -> (eth_address: felt) { -} - -// @dev Stores the timestamp at which a session key is no longer valid -@storage_var -func SessionKey_end_timestamp_store(session_public_key: felt) -> (timestamp: felt) { -} - -@event -func session_key_registered(eth_address: felt, session_public_key: felt, session_duration: felt) { -} - -@event -func session_key_revoked(session_public_key: felt) { -} - -namespace SessionKey { - // @dev Registers a session key via authorization from an Ethereum EIP712 signature - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func authorize_with_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, - ) { - alloc_locals; - - EIP712.verify_session_key_auth_sig( - r, s, v, salt, eth_address, session_public_key, session_duration - ); - _register(eth_address, session_public_key, session_duration); - return (); - } - - // @dev Registers a session key via authorization from an Ethereum transaction - // @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function - // @param eth_address Owner's Ethereum Address that was used to commit the hash on Ethereum - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func authorize_with_tx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt - ) { - alloc_locals; - let (commit_array: felt*) = alloc(); - assert commit_array[0] = eth_address; - assert commit_array[1] = session_public_key; - assert commit_array[2] = session_duration; - let (commit_hash) = ArrayUtils.hash(3, commit_array); - - // Checks that the hash matches a commit and that the commit was created by the correct address - EthTx.consume_commit(commit_hash, eth_address); - - _register(eth_address, session_public_key, session_duration); - return (); - } - - // @dev Revokes a session key via authorization from a signature from the session key itself - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_session_key_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: felt, s: felt, salt: felt, session_public_key: felt) { - alloc_locals; - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - StarkEIP191.verify_session_key_revoke_sig(r, s, salt, session_public_key); - _revoke(session_public_key); - return (); - } - - // @dev Revokes a session key via authorization from a signature from the owner Ethereum account - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_owner_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: Uint256, s: Uint256, v: felt, salt: Uint256, session_public_key: felt) { - alloc_locals; - - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - EIP712.verify_session_key_revoke_sig(r, s, v, salt, eth_address, session_public_key); - _revoke(session_public_key); - return (); - } - - // @dev Revokes a session key via authorization from an Ethereum transaction by the owner - // @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_owner_tx{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - session_public_key: felt - ) { - alloc_locals; - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - let (commit_array: felt*) = alloc(); - assert commit_array[0] = eth_address; - assert commit_array[1] = session_public_key; - let (commit_hash) = ArrayUtils.hash(2, commit_array); - - // Checks that hash maches a commit and that the commit was created by the correct address - EthTx.consume_commit(commit_hash, eth_address); - - _revoke(session_public_key); - - return (); - } - - // @dev Returns owner of a session key if it exists, otherwise throws - // @param session_public_key The StarkNet session public key - // return owner The owner Ethereum address - func get_owner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt - ) -> (owner: felt) { - let (owner) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(owner); - } - - let (end_timestamp) = SessionKey_end_timestamp_store.read(session_public_key); - let (current_timestamp) = get_block_timestamp(); - with_attr error_message("SessionKey: Session has ended") { - assert_lt(current_timestamp, end_timestamp); - } - return (owner,); - } - - // @dev Asserts that a session key exists and has an owner equal to _owner - // @param session_public_key The StarkNet session public key - // @param _owner An Ethereum address - func assert_valid{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt, _owner: felt - ) { - let (owner) = get_owner(session_public_key); - with_attr error_message("SessionKey: Invalid owner") { - assert _owner = owner; - } - return (); - } -} - -// -// Internal Functions -// - -func _register{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt -) { - // It is valid to give a session duration of zero - if so it means the session is only valid during the same block as when it was registered - let (current_timestamp) = get_block_timestamp(); - let end_timestamp = current_timestamp + session_duration; - with_attr error_message("SessionKey: Invalid session duration") { - // Asserts that 0 <= session_duration <= end_timestamp < RANGE_CHECK_BOUND - assert_nn_le(session_duration, end_timestamp); - } - SessionKey_owner_store.write(session_public_key, eth_address); - SessionKey_end_timestamp_store.write(session_public_key, end_timestamp); - session_key_registered.emit(eth_address, session_public_key, session_duration); - return (); -} - -func _revoke{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) { - SessionKey_owner_store.write(session_public_key, 0); - session_key_revoked.emit(session_public_key); - return (); -} diff --git a/contracts/starknet/lib/single_slot_proof.cairo b/contracts/starknet/lib/single_slot_proof.cairo deleted file mode 100644 index 5a1bf180..00000000 --- a/contracts/starknet/lib/single_slot_proof.cairo +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256, uint256_add, uint256_eq -from starkware.cairo.common.math import assert_nn_le - -from contracts.starknet.lib.timestamp import Timestamp -from contracts.starknet.lib.slot_key import SlotKey -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Ethereum single slot proof library -// @author SnapshotLabs -// @notice A library to prove values from the Ethereum state on StarkNet using the Fossil storage verifier -// - -struct StorageSlot { - word_1: felt, - word_2: felt, - word_3: felt, - word_4: felt, -} - -@contract_interface -namespace IFactsRegistry { - func get_storage_uint( - block: felt, - account_160: felt, - slot: StorageSlot, - proof_sizes_bytes_len: felt, - proof_sizes_bytes: felt*, - proof_sizes_words_len: felt, - proof_sizes_words: felt*, - proofs_concat_len: felt, - proofs_concat: felt*, - ) -> (res: Uint256) { - } -} - -// @dev Stores the address of the Fossil fact registry contract -@storage_var -func SingleSlotProof_fact_registry_store() -> (res: felt) { -} - -namespace SingleSlotProof { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param fact_registry_address Address of the Fossil fact registry contract - // @param l1_headers_store_address Address of the Fossil L1 headers store contract - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - fact_registry_address: felt, l1_headers_store_address: felt - ) { - SingleSlotProof_fact_registry_store.write(value=fact_registry_address); - Timestamp.initializer(l1_headers_store_address); - return (); - } - - // @dev Returns the value of a mapping and block number of the Ethereum state if a valid proof is supplied - // @param timestamp The snapshot timestamp, which will get mapped to a block number - // @param mapping_key The key of the mapping that one wants the value from (eg. _address for balances[_address]) - // @param params Array of parameters required to verify the storage proof - // @param proofs Array containing encoded storage proof data - // @return storage_slot The slot value - func get_storage_slot{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - timestamp: felt, - mapping_key: felt, - params_len: felt, - params: felt*, - proofs_len: felt, - proofs: felt*, - ) -> (storage_slot: Uint256) { - alloc_locals; - let (fact_registry_addr) = SingleSlotProof_fact_registry_store.read(); - - // Mapping timestamp to an ethereum block number - let (eth_block_number) = Timestamp.get_eth_block_number(timestamp); - let eth_block_number = eth_block_number - 1; // temp shift - waiting for Fossil fix - - // Decoding encoded proof data - let ( - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ) = _decode_param_array(proofs_len, proofs); - - // Extracting individual parameters from parameter array - with_attr error_message("SingleSlotProof: Invalid size parameters array") { - assert params_len = 2; - } - // Contract address where the desired slot resides - let contract_address = params[0]; - // Index of the desired slot - let slot_index = params[1]; - - let (valid_slot) = SlotKey.get_mapping_slot_key(slot_index, mapping_key); - let (slot_uint256) = MathUtils.words_to_uint256( - slot.word_1, slot.word_2, slot.word_3, slot.word_4 - ); - with_attr error_message("SingleSlotProof: Invalid slot proof provided") { - // Checking that the slot proof corresponds to the correct slot - assert valid_slot = slot_uint256; - // Calling Fossil Fact Registry to verify the storage proof of the slot value - let (storage_slot) = IFactsRegistry.get_storage_uint( - fact_registry_addr, - eth_block_number, - contract_address, - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ); - } - - let (is_zero) = uint256_eq(Uint256(0, 0), storage_slot); - with_attr error_message("SingleSlotProof: Slot is zero") { - is_zero = 0; - } - - return (storage_slot,); - } -} - -func _decode_param_array{range_check_ptr}(param_array_len: felt, param_array: felt*) -> ( - slot: StorageSlot, - proof_sizes_bytes_len: felt, - proof_sizes_bytes: felt*, - proof_sizes_words_len: felt, - proof_sizes_words: felt*, - proofs_concat_len: felt, - proofs_concat: felt*, -) { - assert_nn_le(5, param_array_len); - let slot: StorageSlot = StorageSlot( - param_array[0], param_array[1], param_array[2], param_array[3] - ); - let num_nodes = param_array[4]; - let proof_sizes_bytes_len = num_nodes; - let proof_sizes_bytes = param_array + 5; - let proof_sizes_words_len = num_nodes; - let proof_sizes_words = param_array + 5 + num_nodes; - let proofs_concat = param_array + 5 + 2 * num_nodes; - let proofs_concat_len = param_array_len - 5 - 2 * num_nodes; - - return ( - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ); -} diff --git a/contracts/starknet/lib/slot_key.cairo b/contracts/starknet/lib/slot_key.cairo deleted file mode 100644 index 7f96cd7f..00000000 --- a/contracts/starknet/lib/slot_key.cairo +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.keccak import unsafe_keccak -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.math import split_felt - -// -// @title EVM Slot key Library -// @author SnapshotLabs -// @notice A library to find the key of a slot in the EVM -// @notice Currently only has functionality for mappings -// @dev Refer to this section of the Solidity compiler documentation for more information: https://docs.soliditylang.org/en/v0.8.11/internals/layout_in_storage.html -// - -namespace SlotKey { - // @dev Computes the EVM slot key for mappings - // @dev UNSAFE: This is not safe to use in production code due to unsafe keccak - waiting for safe optimized version - // @param slot_index The index of the mapping variable in the contract - // @param mapping_key The key of the mapping in the contract. Key can be any value type as long as it fits inside a felt - func get_mapping_slot_key{range_check_ptr}(slot_index: felt, mapping_key: felt) -> ( - slot_key: Uint256 - ) { - alloc_locals; - let (encoded_array: felt*) = alloc(); - let (slot_index_high, slot_index_low) = split_felt(slot_index); - let (mapping_key_high, mapping_key_low) = split_felt(mapping_key); - encoded_array[0] = mapping_key_high; - encoded_array[1] = mapping_key_low; - encoded_array[2] = slot_index_high; - encoded_array[3] = slot_index_low; - let (low, high) = unsafe_keccak(encoded_array, 64); - let slot_key = Uint256(low=low, high=high); - return (slot_key,); - } -} diff --git a/contracts/starknet/lib/stark_eip191.cairo b/contracts/starknet/lib/stark_eip191.cairo deleted file mode 100644 index 073e2930..00000000 --- a/contracts/starknet/lib/stark_eip191.cairo +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address, get_contract_address -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin -from starkware.cairo.common.math import assert_not_zero -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.signature import verify_ecdsa_signature - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title StarkNet EIP191 Library -// @author SnapshotLabs -// @notice A library for verifying StarkNet EIP191 signatures on typed data required for Snapshot X -// @dev Refer to the official EIP for more information: https://eips.ethereum.org/EIPS/eip-191 -// - -// NOTE: We will need to update chain ID for prod -// { name: 'snapshot-x', version: '1', chainId: '0x534e5f474f45524c49'} (chainID: SN_GOERLI) -const DOMAIN_HASH = 0x7b887e96718721a64b601a4873454d4a9e26a4b798d660c8d6b96d2045c8404; - -const STARKNET_MESSAGE = 0x537461726b4e6574204d657373616765; - -// getSelectorFromName("Propose(space:felt,author:felt,metadata_uri:felt*,executor:felt,execution_hash:felt,strategies_hash:felt,strategies_params_hash:felt,salt:felt)") -const PROPOSAL_TYPE_HASH = 0x2092032d2957beaa83248292f326648fd2ad923d97f59c75296e41d924c5355; - -// getSelectorFromName("Vote(space:felt,voter:felt,proposal:felt,choice:felt,strategies_hash:felt,strategies_params_hash:felt,salt:felt)") -const VOTE_TYPE_HASH = 0x31236321e2e03bd76ca3b07ff9544b3d50aa3e677b473a2850a894dcd983781; - -// getSelectorFromName("RevokeSessionKey(salt:felt)") -const REVOKE_SESSION_KEY_TYPE_HASH = 0x31F0BF4E2BBD12ECBA02E325F0EA3231350A638FC633AF8EBF244F50663ACE8; - -// @dev Signature salts store -@storage_var -func StarkEIP191_salts(user: felt, salt: felt) -> (already_used: felt) { -} - -namespace StarkEIP191 { - // @dev Asserts that a signature to create a proposal is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is creating a proposal - // @param calldata Propose calldata - // @public_key The StarkNet key that was used to generate the signature - func verify_propose_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }( - r: felt, - s: felt, - salt: felt, - target: felt, - calldata_len: felt, - calldata: felt*, - public_key: felt, - ) { - alloc_locals; - - let proposer_address = calldata[0]; - - let (authenticator) = get_contract_address(); - - // Ensure proposer has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(proposer_address, salt); - - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - // Metadata URI - let metadata_uri_string_len = calldata[1]; - let metadata_uri_len = calldata[2]; - let metadata_uri: felt* = &calldata[3]; - let (metadata_uri_hash) = ArrayUtils.hash(metadata_uri_len, metadata_uri); - - // Execution strategy - let execution_strategy = calldata[3 + metadata_uri_len]; - let (execution_strategy_u256) = MathUtils.felt_to_uint256(execution_strategy); - - // Used voting strategies - let used_voting_strats_len = calldata[4 + metadata_uri_len]; - let used_voting_strats = &calldata[5 + metadata_uri_len]; - let (used_voting_strategies_hash) = ArrayUtils.hash( - used_voting_strats_len, used_voting_strats - ); - - // User voting strategy params flat - let user_voting_strat_params_flat_len = calldata[5 + metadata_uri_len + used_voting_strats_len]; - let user_voting_strat_params_flat = &calldata[6 + metadata_uri_len + used_voting_strats_len]; - let (user_voting_strategy_params_flat_hash) = ArrayUtils.hash( - user_voting_strat_params_flat_len, user_voting_strat_params_flat - ); - - // Execution hash - let execution_params_len = calldata[6 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let execution_params_ptr: felt* = &calldata[7 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let (execution_hash) = ArrayUtils.hash(execution_params_len, execution_params_ptr); - - let (structure: felt*) = alloc(); - - assert structure[0] = PROPOSAL_TYPE_HASH; - assert structure[1] = target; - assert structure[2] = proposer_address; - assert structure[3] = metadata_uri_hash; - assert structure[4] = execution_strategy; - assert structure[5] = execution_hash; - assert structure[6] = used_voting_strategies_hash; - assert structure[7] = user_voting_strategy_params_flat_hash; - assert structure[8] = salt; - - let (hash_struct) = ArrayUtils.hash(9, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(proposer_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to cast a vote is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is casting a vote - // @param calldata Vote calldata - // @public_key The StarkNet key that was used to generate the signature - func verify_vote_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }( - r: felt, - s: felt, - salt: felt, - target: felt, - calldata_len: felt, - calldata: felt*, - public_key: felt, - ) { - alloc_locals; - - let voter_address = calldata[0]; - - let (authenticator) = get_contract_address(); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(voter_address, salt); - - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - let proposal_id = calldata[1]; - let choice = calldata[2]; - - let used_voting_strategies_len = calldata[3]; - let used_voting_strategies = &calldata[4]; - let (used_voting_strategies_hash) = ArrayUtils.hash( - used_voting_strategies_len, used_voting_strategies - ); - - let user_voting_strategy_params_flat_len = calldata[4 + used_voting_strategies_len]; - let user_voting_strategy_params_flat = &calldata[5 + used_voting_strategies_len]; - let (user_voting_strategy_params_flat_hash) = ArrayUtils.hash( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - // Now construct the data hash (hashStruct) - let (structure: felt*) = alloc(); - assert structure[0] = VOTE_TYPE_HASH; - assert structure[1] = target; - assert structure[2] = voter_address; - assert structure[3] = proposal_id; - assert structure[4] = choice; - assert structure[5] = used_voting_strategies_hash; - assert structure[6] = user_voting_strategy_params_flat_hash; - assert structure[7] = salt; - - let (hash_struct) = ArrayUtils.hash(8, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(voter_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to revoke a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @public_key The StarkNet key that was used to generate the signature - func verify_session_key_revoke_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: felt, s: felt, salt: felt, public_key: felt) { - alloc_locals; - - let (authenticator) = get_contract_address(); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(public_key, salt); - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - // Now construct the data hash (hashStruct) - let (structure: felt*) = alloc(); - assert structure[0] = REVOKE_SESSION_KEY_TYPE_HASH; - assert structure[1] = salt; - - let (hash_struct) = ArrayUtils.hash(2, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(public_key, salt, 1); - - return (); - } -} diff --git a/contracts/starknet/lib/timestamp.cairo b/contracts/starknet/lib/timestamp.cairo deleted file mode 100644 index 1bc2fe71..00000000 --- a/contracts/starknet/lib/timestamp.cairo +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin - -// -// @title Timestamp Resolver Library -// @author SnapshotLabs -// @notice Snapshot X uses timestamps for a proposal snapshot, however certain voting strategies require Ethereum block numbers -// @notice This library provides the functionality to resolve timestamps to Ethereum block numbers with a one-to-one mapping -// - -@contract_interface -namespace IL1HeadersStore { - func get_latest_l1_block() -> (number: felt) { - } -} - -// @dev Stores the address of the Fossil L1 Headers Store contract -@storage_var -func Timestamp_l1_headers_store() -> (res: felt) { -} - -// @dev Stores the timestamp to Ethereum block number mapping -@storage_var -func Timestamp_timestamp_to_eth_block_number_store(timestamp: felt) -> (eth_block_number: felt) { -} - -namespace Timestamp { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param l1_headers_store_address Address of the Fossil L1 headers store contract - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - l1_headers_store_address: felt - ) { - Timestamp_l1_headers_store.write(value=l1_headers_store_address); - return (); - } - - // @dev Resolves a provided timestamp to an Ethereum block number with a one-to-one mapping - // @dev timestamp The timestamp that should be resolved - // @return eth_block_number The Ethereum block number - func get_eth_block_number{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - timestamp: felt - ) -> (eth_block_number: felt) { - let (eth_block_number) = Timestamp_timestamp_to_eth_block_number_store.read(timestamp); - if (eth_block_number != 0) { - // The timestamp has already be queried in fossil and stored. Therefore we can just return the stored value - // This branch will be taken whenever a vote is cast as the mapping value would be set at proposal creation. - return (eth_block_number,); - } else { - // The timestamp has not yet been queried in fossil. Therefore we must query Fossil for the latest eth block - // number stored there and store it here in the mapping indexed by the timestamp provided. - // This branch will be taken whenever a proposal is created, except for the (rare) case of multiple proposals - // being created in the same block. - let (l1_headers_store_address) = Timestamp_l1_headers_store.read(); - let (eth_block_number) = IL1HeadersStore.get_latest_l1_block(l1_headers_store_address); - Timestamp_timestamp_to_eth_block_number_store.write(timestamp, eth_block_number); - return (eth_block_number,); - } - } -} diff --git a/contracts/starknet/lib/vote.cairo b/contracts/starknet/lib/vote.cairo deleted file mode 100644 index b4fc875a..00000000 --- a/contracts/starknet/lib/vote.cairo +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -struct Vote { - choice: felt, - voting_power: Uint256, -} diff --git a/contracts/starknet/lib/voting.cairo b/contracts/starknet/lib/voting.cairo deleted file mode 100644 index e75764b7..00000000 --- a/contracts/starknet/lib/voting.cairo +++ /dev/null @@ -1,1154 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address, get_block_timestamp, get_tx_info -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.uint256 import Uint256, uint256_add, uint256_lt, uint256_le, uint256_eq -from starkware.cairo.common.bool import TRUE, FALSE -from starkware.cairo.common.hash_state import hash_init, hash_update -from starkware.cairo.common.math_cmp import is_le -from starkware.cairo.common.math import assert_lt, assert_le, assert_nn, assert_not_zero - -from openzeppelin.account.library import Account, AccountCallArray, Call -from openzeppelin.security.safemath.library import SafeUint256 - -from contracts.starknet.Interfaces.IVotingStrategy import IVotingStrategy -from contracts.starknet.Interfaces.IExecutionStrategy import IExecutionStrategy -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal import Proposal -from contracts.starknet.lib.proposal_info import ProposalInfo -from contracts.starknet.lib.vote import Vote -from contracts.starknet.lib.choice import Choice -from contracts.starknet.lib.proposal_outcome import ProposalOutcome -from contracts.starknet.lib.array_utils import ArrayUtils, Immutable2DArray -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Snapshot X Voting Library -// @author SnapshotLabs -// @notice Library that implements the core functionality of Snapshot X -// - -// -// Storage -// - -@storage_var -func Voting_voting_delay_store() -> (delay: felt) { -} - -@storage_var -func Voting_min_voting_duration_store() -> (period: felt) { -} - -@storage_var -func Voting_max_voting_duration_store() -> (period: felt) { -} - -@storage_var -func Voting_proposal_threshold_store() -> (threshold: Uint256) { -} - -@storage_var -func Voting_quorum_store() -> (value: Uint256) { -} - -@storage_var -func Voting_authenticators_store(authenticator_address: felt) -> (is_valid: felt) { -} - -@storage_var -func Voting_execution_strategies_store(execution_strategy_address: felt) -> (is_valid: felt) { -} - -@storage_var -func Voting_voting_strategies_store(strategy_index: felt) -> (strategy_address: felt) { -} - -@storage_var -func Voting_num_voting_strategies_store() -> (num: felt) { -} - -@storage_var -func Voting_voting_strategy_params_store(strategy_index: felt, param_index: felt) -> (param: felt) { -} - -@storage_var -func Voting_next_proposal_nonce_store() -> (nonce: felt) { -} - -@storage_var -func Voting_proposal_registry_store(proposal_id: felt) -> (proposal: Proposal) { -} - -@storage_var -func Voting_executed_proposals_store(proposal_id: felt) -> (executed: felt) { -} - -@storage_var -func Voting_vote_registry_store(proposal_id: felt, voter_address: Address) -> (voted: felt) { -} - -@storage_var -func Voting_vote_power_store(proposal_id: felt, choice: felt) -> (power: Uint256) { -} - -// -// Events -// - -@event -func proposal_created( - proposal_id: felt, - proposer_address: Address, - proposal: Proposal, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_params_len: felt, - execution_params: felt*, -) { -} - -@event -func vote_created(proposal_id: felt, voter_address: Address, vote: Vote) { -} - -@event -func quorum_updated(previous: Uint256, new_quorum: Uint256) { -} - -@event -func voting_delay_updated(previous: felt, new_voting_delay: felt) { -} - -@event -func min_voting_duration_updated(previous: felt, new_voting_duration: felt) { -} - -@event -func max_voting_duration_updated(previous: felt, new_voting_duration: felt) { -} - -@event -func proposal_threshold_updated(previous: Uint256, new_proposal_threshold: Uint256) { -} - -@event -func metadata_uri_updated(new_metadata_uri_len: felt, new_metadata_uri: felt*) { -} - -@event -func authenticators_added(added_len: felt, added: felt*) { -} - -@event -func authenticators_removed(removed_len: felt, removed: felt*) { -} - -@event -func execution_strategies_added(added_len: felt, added: felt*) { -} - -@event -func execution_strategies_removed(removed_len: felt, removed: felt*) { -} - -@event -func voting_strategies_added(added_len: felt, added: felt*) { -} - -@event -func voting_strategies_removed(removed_len: felt, removed: felt*) { -} - -namespace Voting { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param voting_delay The delay between when a proposal is created, and when the voting starts - // @param min_voting_duration The minimum duration of the voting period - // @param max_voting_duration The maximum duration of the voting period - // @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space - // @param quorum The minimum total voting power required for a proposal to pass - // @param voting_strategies Array of whitelisted voting strategy contract addresses - // @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters - // @param authenticators Array of whitelisted authenticator contract addresses - // @param execution_strategies Array of whitelisted execution strategy contract addresses - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - ) { - alloc_locals; - - with_attr error_message("Voting: Invalid constructor parameters") { - assert_nn(voting_delay); - assert_le(min_voting_duration, max_voting_duration); - assert_not_zero(voting_strategies_len); - assert_not_zero(authenticators_len); - assert_not_zero(execution_strategies_len); - MathUtils.assert_valid_uint256(proposal_threshold); - MathUtils.assert_valid_uint256(quorum); - } - - // Initialize the storage variables - Voting_voting_delay_store.write(voting_delay); - Voting_min_voting_duration_store.write(min_voting_duration); - Voting_max_voting_duration_store.write(max_voting_duration); - Voting_proposal_threshold_store.write(proposal_threshold); - Voting_quorum_store.write(quorum); - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - // Currently there is no way to pass struct types with pointers in calldata, so we must do it this way. - let (voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - voting_strategy_params_flat_len, voting_strategy_params_flat - ); - - _unchecked_add_voting_strategies( - voting_strategies_len, voting_strategies, voting_strategy_params_all - ); - _unchecked_add_authenticators(authenticators_len, authenticators); - _unchecked_add_execution_strategies(execution_strategies_len, execution_strategies); - - // The first proposal in a space will have a proposal ID of 1. - Voting_next_proposal_nonce_store.write(1); - - return (); - } - - // @dev Updates the quorum - // @param new_quorum The new quorum - func update_quorum{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_quorum: Uint256 - ) { - MathUtils.assert_valid_uint256(new_quorum); - let (previous_quorum) = Voting_quorum_store.read(); - Voting_quorum_store.write(new_quorum); - quorum_updated.emit(previous_quorum, new_quorum); - return (); - } - - // @dev Updates the voting delay - // @param new_voting_delay The new voting delay - func update_voting_delay{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_voting_delay: felt - ) { - let (previous_delay) = Voting_voting_delay_store.read(); - Voting_voting_delay_store.write(new_voting_delay); - voting_delay_updated.emit(previous_delay, new_voting_delay); - return (); - } - - // @dev Updates the minimum voting duration - // @param new_min_voting_duration The new minimum voting duration - func update_min_voting_duration{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_min_voting_duration: felt) { - let (previous_min_voting_duration) = Voting_min_voting_duration_store.read(); - let (max_voting_duration) = Voting_max_voting_duration_store.read(); - with_attr error_message( - "Voting: Min voting duration must be less than max voting duration") { - assert_le(new_min_voting_duration, max_voting_duration); - } - Voting_min_voting_duration_store.write(new_min_voting_duration); - min_voting_duration_updated.emit(previous_min_voting_duration, new_min_voting_duration); - return (); - } - - // @dev Updates the maximum voting duration - // @param new_max_voting_duration The new maximum voting duration - func update_max_voting_duration{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_max_voting_duration: felt) { - let (previous_max_voting_duration) = Voting_max_voting_duration_store.read(); - let (min_voting_duration) = Voting_min_voting_duration_store.read(); - with_attr error_message( - "Voting: Max voting duration must be greater than min voting duration") { - assert_le(min_voting_duration, new_max_voting_duration); - } - Voting_max_voting_duration_store.write(new_max_voting_duration); - max_voting_duration_updated.emit(previous_max_voting_duration, new_max_voting_duration); - return (); - } - - // @dev Updates the proposal threshold - // @param new_proposal_threshold The new proposal threshold - func update_proposal_threshold{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_proposal_threshold: Uint256) { - MathUtils.assert_valid_uint256(new_proposal_threshold); - let (previous_proposal_threshold) = Voting_proposal_threshold_store.read(); - Voting_proposal_threshold_store.write(new_proposal_threshold); - proposal_threshold_updated.emit(previous_proposal_threshold, new_proposal_threshold); - return (); - } - - // @dev Updates the metadata URI - // @param new_metadata_uri The new metadata URI - // @notice We do not store the metadata URI in the contract state, it is just emitted as an event which allows it to be picked up by an indexer - func update_metadata_uri{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_metadata_uri_len: felt, new_metadata_uri: felt* - ) { - alloc_locals; - metadata_uri_updated.emit(new_metadata_uri_len, new_metadata_uri); - return (); - } - - // @dev Adds execution strategy contracts to the whitelist - // @param addresses Array of execution strategy contract addresses - func add_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _unchecked_add_execution_strategies(addresses_len, addresses); - execution_strategies_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes execution strategy contracts from the whitelist - // @param addresses Array of execution strategy contract addresses - func remove_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _unchecked_remove_execution_strategies(addresses_len, addresses); - execution_strategies_removed.emit(addresses_len, addresses); - return (); - } - - // @dev Adds voting strategy contracts to the whitelist - // @param addresses Array of voting strategy contract addresses - // @param params_flat Flattened 2D array of voting strategy parameters - func add_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt*) { - alloc_locals; - _assert_no_active_proposal(); - let (params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - params_flat_len, params_flat - ); - _unchecked_add_voting_strategies(addresses_len, addresses, params_all); - voting_strategies_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes voting strategy contracts from the whitelist - // @param indexes Array of voting strategy indexes to remove - func remove_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(indexes_len: felt, indexes: felt*) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_remove_voting_strategies(indexes_len, indexes); - voting_strategies_removed.emit(indexes_len, indexes); - return (); - } - - // @dev Adds authenticator contracts to the whitelist - // @param addresses Array of authenticator contract addresses - func add_authenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* - ) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_add_authenticators(addresses_len, addresses); - authenticators_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes authenticator contracts from the whitelist - // @param addresses Array of authenticator contract addresses - func remove_authenticators{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_remove_authenticators(addresses_len, addresses); - authenticators_removed.emit(addresses_len, addresses); - return (); - } - - // @dev Casts a vote on a proposal - // @param voter_address The address of the voter - // @param proposal_id The ID of the proposal in the space - // @param choice The voter's choice (FOR, AGAINST, ABSTAIN) - // @used_voting_strategies The voting strategies (within the whitelist for the space) that the voter has non-zero voting power with - // @user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used - func vote{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr: felt, - }( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - ) -> () { - alloc_locals; - - // Verify that the caller is the authenticator contract. - _assert_valid_authenticator(); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - - // Unpacking the timestamps from the packed value - let ( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ) = MathUtils.unpack_4_32_bit(proposal.timestamps); - - with_attr error_message("Voting: Proposal does not exist") { - // Asserting start timestamp is not zero because start timestamp - // is necessarily > 0 when creating a new proposal. - assert_not_zero(start_timestamp); - } - - let (current_timestamp) = get_block_timestamp(); - // Make sure proposal is still open for voting - with_attr error_message("Voting: Voting period has ended") { - assert_lt(current_timestamp, max_end_timestamp); - } - - // Make sure proposal has started - with_attr error_message("Voting: Voting has not started yet") { - assert_le(start_timestamp, current_timestamp); - } - - // Make sure voter has not already voted - let (prev_vote) = Voting_vote_registry_store.read(proposal_id, voter_address); - with_attr error_message("Voting: User already voted") { - assert prev_vote = 0; - } - - // Make sure `choice` is a valid choice - with_attr error_message("Voting: Invalid choice") { - assert (choice - Choice.ABSTAIN) * (choice - Choice.FOR) * (choice - Choice.AGAINST) = 0; - } - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - let (user_voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - let (user_voting_power) = _get_cumulative_voting_power( - snapshot_timestamp, - voter_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - 0, - ); - - let (no_voting_power) = uint256_eq(Uint256(0, 0), user_voting_power); - with_attr error_message("Voting: No voting power for user") { - assert no_voting_power = 0; - } - - let (previous_voting_power) = Voting_vote_power_store.read(proposal_id, choice); - with_attr error_message("Voting: Overflow in voting power") { - let (new_voting_power) = SafeUint256.add(user_voting_power, previous_voting_power); - } - - Voting_vote_power_store.write(proposal_id, choice, new_voting_power); - Voting_vote_registry_store.write(proposal_id, voter_address, 1); - - // Emit event - let vote = Vote(choice=choice, voting_power=user_voting_power); - vote_created.emit(proposal_id, voter_address, vote); - - return (); - } - - // @dev Creates a proposal - // @param proposer_address The address of the proposal creator - // @param metadata_uri_string_len The string length of the metadata URI (required for keccak hashing) - // @param metadata_uri The metadata URI for the proposal - // @param used_voting_strategies The voting strategies (within the whitelist for the space) that the proposal creator has non-zero voting power with - // @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used - // @param execution_params Execution parameters for the proposal - func propose{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, - ) -> () { - alloc_locals; - - // Verify that the caller is the authenticator contract. - _assert_valid_authenticator(); - - // Verify that the execution strategy address is one of the whitelisted addresses - _assert_valid_execution_strategy(execution_strategy); - - // The snapshot for the proposal is the current timestamp at proposal creation - // We use a timestamp instead of a block number to define a snapshot so that the system can generalize to multi-chain - // TODO: Need to consider what sort of guarantees we have on the timestamp returned being correct. - let (snapshot_timestamp) = get_block_timestamp(); - let (delay) = Voting_voting_delay_store.read(); - - let (min_voting_duration) = Voting_min_voting_duration_store.read(); - let (max_voting_duration) = Voting_max_voting_duration_store.read(); - - // Define start_timestamp, min_end and max_end - let start_timestamp = snapshot_timestamp + delay; - let min_end_timestamp = start_timestamp + min_voting_duration; - let max_end_timestamp = start_timestamp + max_voting_duration; - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - let (user_voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - let (voting_power) = _get_cumulative_voting_power( - snapshot_timestamp, - proposer_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - 0, - ); - - // Verify that the proposer has enough voting power to trigger a proposal - let (threshold) = Voting_proposal_threshold_store.read(); - let (has_enough_vp) = uint256_le(threshold, voting_power); - with_attr error_message("Voting: Not enough voting power") { - assert has_enough_vp = 1; - } - - // Hash the execution params - // Storing arrays inside a struct is impossible so instead we just store a hash and then reconstruct the array in finalize_proposal - let (execution_hash) = ArrayUtils.hash(execution_params_len, execution_params); - - let (quorum) = Voting_quorum_store.read(); - - // Packing the timestamps into a single felt to reduce storage usage - let (packed_timestamps) = MathUtils.pack_4_32_bit( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ); - - // Create the proposal and its proposal id - let proposal = Proposal(quorum, packed_timestamps, execution_strategy, execution_hash); - - let (proposal_id) = Voting_next_proposal_nonce_store.read(); - - // Store the proposal - Voting_proposal_registry_store.write(proposal_id, proposal); - - // Emit event - proposal_created.emit( - proposal_id, - proposer_address, - proposal, - metadata_uri_len, - metadata_uri, - execution_params_len, - execution_params, - ); - - // Increase the proposal nonce - Voting_next_proposal_nonce_store.write(proposal_id + 1); - - return (); - } - - // @dev Finalizes a proposal, triggering execution via the chosen execution strategy - // @param proposal_id The ID of the proposal - // @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) - @external - func finalize_proposal{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - alloc_locals; - - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - - // Unpacking the the timestamps from the packed value - let ( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ) = MathUtils.unpack_4_32_bit(proposal.timestamps); - - with_attr error_message("Voting: Invalid proposal id") { - // Checks that the proposal id exists. If it doesn't exist, then the whole `Proposal` struct will - // be set to 0, hence the snapshot timestamp will be set to 0 too. - assert_not_zero(snapshot_timestamp); - } - - // Make sure proposal period has ended - let (current_timestamp) = get_block_timestamp(); - with_attr error_message("Voting: Min voting period has not elapsed") { - assert_le(min_end_timestamp, current_timestamp); - } - - // Make sure execution params match the ones sent at proposal creation by checking that the hashes match - let (recovered_hash) = ArrayUtils.hash(execution_params_len, execution_params); - with_attr error_message("Voting: Invalid execution parameters") { - assert recovered_hash = proposal.execution_hash; - } - - // Count votes for - let (for) = Voting_vote_power_store.read(proposal_id, Choice.FOR); - - // Count votes abstaining - let (abstain) = Voting_vote_power_store.read(proposal_id, Choice.ABSTAIN); - - // Count votes against - let (against) = Voting_vote_power_store.read(proposal_id, Choice.AGAINST); - - let (partial_power, overflow1) = uint256_add(for, abstain); - - let (total_power, overflow2) = uint256_add(partial_power, against); - - let quorum = proposal.quorum; - let (is_lower_or_equal) = uint256_le(quorum, total_power); - - // If overflow1 or overflow2 happened, then quorum has necessarily been reached because `quorum` is by definition smaller or equal to Uint256::MAX. - // If `is_lower_or_equal` (meaning `_quorum` is smaller than `total_power`), then quorum has been reached (definition of quorum). - // So if `overflow1 || overflow2 || is_lower_or_equal`, we have reached quorum. If we sum them and find `0`, then they're all equal to 0, which means - // quorum has not been reached. - if (overflow1 + overflow2 + is_lower_or_equal == 0) { - let voting_period_has_ended = is_le(max_end_timestamp, current_timestamp + 1); - if (voting_period_has_ended == FALSE) { - with_attr error_message("Voting: Quorum has not been reached") { - assert 1 = 0; - return (); - } - } else { - // Voting period has ended but quorum hasn't been reached: proposal should be `REJECTED` - tempvar proposal_outcome = ProposalOutcome.REJECTED; - - // Cairo trick to prevent revoked reference - tempvar range_check_ptr = range_check_ptr; - } - } else { - // Quorum has been reached: set proposal outcome accordingly - // Note: The proposal is rejected if for and against votes are equal. - let (has_passed) = uint256_lt(against, for); - - if (has_passed == 1) { - tempvar proposal_outcome = ProposalOutcome.ACCEPTED; - } else { - tempvar proposal_outcome = ProposalOutcome.REJECTED; - } - - // Cairo trick to prevent revoked reference - tempvar range_check_ptr = range_check_ptr; - } - - let (is_valid) = Voting_execution_strategies_store.read(proposal.execution_strategy); - if (is_valid == 0) { - // execution_strategy has been removed from the whitelist. Cancel this execution. - tempvar proposal_outcome = ProposalOutcome.CANCELLED; - } else { - // Cairo trick to prevent revoked reference - tempvar proposal_outcome = proposal_outcome; - } - - // Execute proposal Transactions - // There are 2 situations: - // 1) Starknet execution strategy - then txs are executed directly by this contract. - // 2) Other execution strategy - then tx are executed by the specified execution strategy contract. - - if (proposal.execution_strategy == 1) { - // Starknet execution strategy so we execute the proposal txs directly - if (proposal_outcome == ProposalOutcome.ACCEPTED) { - let (call_array_len, call_array, calldata_len, calldata) = _decode_execution_params( - execution_params_len, execution_params - ); - let (response_len, response) = _execute_proposal_txs( - call_array_len, call_array, calldata_len, calldata - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } else { - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } - } else { - // Other execution strategy, so we forward the txs to the specified execution strategy contract. - IExecutionStrategy.execute( - contract_address=proposal.execution_strategy, - proposal_outcome=proposal_outcome, - execution_params_len=execution_params_len, - execution_params=execution_params, - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } - - // Flag this proposal as executed - Voting_executed_proposals_store.write(proposal_id, 1); - - return (); - } - - // @dev Cancels a proposal - // @param proposal_id The ID of the proposal - // @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) - func cancel_proposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, execution_params_len: felt, execution_params: felt* - ) { - alloc_locals; - - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - with_attr error_message("Voting: Invalid proposal id") { - // Checks that the proposal id exists. If it doesn't exist, then the whole `Proposal` struct will - // be set to 0, hence the timestamps value will be set to 0 too. - assert_not_zero(proposal.timestamps); - } - - // Make sure execution params match the ones sent at proposal creation by checking that the hashes match - let (recovered_hash) = ArrayUtils.hash(execution_params_len, execution_params); - with_attr error_message("Voting: Invalid execution parameters") { - assert recovered_hash = proposal.execution_hash; - } - - let proposal_outcome = ProposalOutcome.CANCELLED; - - if (proposal.execution_strategy != 1) { - // Custom execution strategies may have different processes to follow when a proposal is cancelled. - // Therefore, we still forward the execution payload to the specified strategy contract. - IExecutionStrategy.execute( - contract_address=proposal.execution_strategy, - proposal_outcome=proposal_outcome, - execution_params_len=execution_params_len, - execution_params=execution_params, - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - } else { - // In the case of starknet execution we do nothing if the proposal is cancelled. - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - } - - // Flag this proposal as executed - Voting_executed_proposals_store.write(proposal_id, 1); - - return (); - } - - // @dev Checks to see whether a given address has voted in a proposal - // @param proposal_id The proposal ID - // @param voter_address The voter's address - // @return voted 1 if user has voted, otherwise 0 - func has_voted{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, voter_address: Address - ) -> (voted: felt) { - return Voting_vote_registry_store.read(proposal_id, voter_address); - } - - // @dev Returns proposal information - // @param proposal_id The proposal ID - // @return proposal_info Struct containing proposal information - func get_proposal_info{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt - ) -> (proposal_info: ProposalInfo) { - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - with_attr error_message("Voting: Proposal does not exist") { - assert_not_zero(proposal.timestamps); - } - - let (power_against) = Voting_vote_power_store.read(proposal_id, Choice.AGAINST); - let (power_for) = Voting_vote_power_store.read(proposal_id, Choice.FOR); - let (power_abstain) = Voting_vote_power_store.read(proposal_id, Choice.ABSTAIN); - return ( - ProposalInfo(proposal=proposal, power_for=power_for, power_against=power_against, power_abstain=power_abstain), - ); - } -} - -// -// Internal Functions -// - -func _unchecked_add_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_execution_strategies_store.write(addresses[0], 1); - _unchecked_add_execution_strategies(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_remove_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_execution_strategies_store.write(addresses[0], 0); - _unchecked_remove_execution_strategies(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_add_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(addresses_len: felt, addresses: felt*, params_all: Immutable2DArray) { - alloc_locals; - let (prev_index) = Voting_num_voting_strategies_store.read(); - _unchecked_add_voting_strategies_recurse(addresses_len, addresses, params_all, prev_index, 0); - // Incrementing the voting strategies counter by the number of strategies added - Voting_num_voting_strategies_store.write(prev_index + addresses_len); - return (); -} - -func _unchecked_add_voting_strategies_recurse{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}( - addresses_len: felt, - addresses: felt*, - params_all: Immutable2DArray, - next_index: felt, - index: felt, -) { - alloc_locals; - if (addresses_len == 0) { - return (); - } else { - Voting_voting_strategies_store.write(next_index, addresses[0]); - // Extract voting params for the voting strategy - let (params_len, params) = ArrayUtils.get_sub_array(params_all, index); - // We store the length of the voting strategy params array at index zero - Voting_voting_strategy_params_store.write(next_index, 0, params_len); - // The following elements are the actual params - _unchecked_add_voting_strategy_params(next_index, 1, params_len, params); - _unchecked_add_voting_strategies_recurse( - addresses_len - 1, &addresses[1], params_all, next_index + 1, index + 1 - ); - return (); - } -} - -func _unchecked_add_voting_strategy_params{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(strategy_index: felt, param_index: felt, params_len: felt, params: felt*) { - if (params_len == 0) { - // List is empty - return (); - } else { - // Store voting parameter - Voting_voting_strategy_params_store.write(strategy_index, param_index, params[0]); - _unchecked_add_voting_strategy_params( - strategy_index, param_index + 1, params_len - 1, ¶ms[1] - ); - return (); - } -} - -func _unchecked_remove_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(indexes_len: felt, indexes: felt*) { - if (indexes_len == 0) { - return (); - } else { - Voting_voting_strategies_store.write(indexes[0], 0); - // The length of the voting strategy params is stored at index zero - let (params_len) = Voting_voting_strategy_params_store.read(indexes[0], 0); - Voting_voting_strategy_params_store.write(indexes[0], 0, 0); - // Removing voting strategy params - _unchecked_remove_voting_strategy_params(indexes[0], params_len, 1); - _unchecked_remove_voting_strategies(indexes_len - 1, &indexes[1]); - return (); - } -} - -func _unchecked_remove_voting_strategy_params{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(strategy_index: felt, param_index: felt, params_len: felt) { - if (params_len == 0) { - // List is empty - return (); - } - if (param_index == params_len + 1) { - // All params have been removed from the array - return (); - } - // Remove voting parameter - Voting_voting_strategy_params_store.write(strategy_index, param_index, 0); - _unchecked_remove_voting_strategy_params(strategy_index, param_index + 1, params_len); - return (); -} - -func _unchecked_add_authenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - addresses_len: felt, addresses: felt* -) { - if (addresses_len == 0) { - return (); - } else { - Voting_authenticators_store.write(addresses[0], 1); - _unchecked_add_authenticators(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_remove_authenticators{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_authenticators_store.write(addresses[0], 0); - _unchecked_remove_authenticators(addresses_len - 1, &addresses[1]); - } - return (); -} - -// Throws if the caller address is not a member of the set of whitelisted authenticators (stored in the `authenticators` mapping) -func _assert_valid_authenticator{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - ) { - let (caller_address) = get_caller_address(); - let (is_valid) = Voting_authenticators_store.read(caller_address); - with_attr error_message("Voting: Invalid authenticator") { - assert_not_zero(is_valid); - } - - return (); -} - -// Throws if `execution_strategy` is not a member of the set of whitelisted execution_strategies -func _assert_valid_execution_strategy{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(execution_strategy: felt) { - let (is_valid) = Voting_execution_strategies_store.read(execution_strategy); - with_attr error_message("Voting: Invalid execution strategy") { - assert is_valid = 1; - } - - return (); -} - -func _assert_no_active_proposal_recurse{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(proposal_id: felt) { - if (proposal_id == 0) { - return (); - } else { - // Ensure each proposal has been executed - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - assert has_been_executed = 1; - _assert_no_active_proposal_recurse(proposal_id - 1); - return (); - } -} - -func _assert_no_active_proposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() { - let (next_proposal) = Voting_next_proposal_nonce_store.read(); - // Using `next_proposal - 1` because `next_proposal` corresponds to the *next* nonce - // so we need to substract one. This is safe because latest_proposal is at least 1 because - // the constructor initializes the nonce to 1. - let latest_proposal = next_proposal - 1; - with_attr error_message("Voting: Some proposals are still active") { - _assert_no_active_proposal_recurse(latest_proposal); - } - return (); -} - -// Computes the cumulated voting power of a user by iterating over the voting strategies of `used_voting_strategies`. -// TODO: In the future we will need to transition to an array of `voter_address` because they might be different for different voting strategies. -func _get_cumulative_voting_power{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - current_timestamp: felt, - voter_address: Address, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_all: Immutable2DArray, - index: felt, -) -> (voting_power: Uint256) { - // Make sure there are no duplicates to avoid an attack where people double count a voting strategy - ArrayUtils.assert_no_duplicates(used_voting_strategies_len, used_voting_strategies); - - return _unchecked_get_cumulative_voting_power( - current_timestamp, - voter_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - index, - ); -} - -// Actual computation of voting power. Unchecked because duplicates are not checked in `used_voting_strategies`. The caller is -// expected to check for duplicates before calling this function. -func _unchecked_get_cumulative_voting_power{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}( - current_timestamp: felt, - voter_address: Address, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_all: Immutable2DArray, - index: felt, -) -> (voting_power: Uint256) { - alloc_locals; - - if (used_voting_strategies_len == 0) { - // Reached the end, stop iteration - return (Uint256(0, 0),); - } - - let strategy_index = used_voting_strategies[0]; - - let (strategy_address) = Voting_voting_strategies_store.read(strategy_index); - - with_attr error_message("Voting: Invalid voting strategy") { - assert_not_zero(strategy_address); - } - - // Extract voting params array for the voting strategy specified by the index - let (user_voting_strategy_params_len, user_voting_strategy_params) = ArrayUtils.get_sub_array( - user_voting_strategy_params_all, index - ); - - // Initialize empty array to store voting params - let (voting_strategy_params: felt*) = alloc(); - - // Check that voting strategy params exist by the length which is stored in the first element of the array - let (voting_strategy_params_len) = Voting_voting_strategy_params_store.read(strategy_index, 0); - - let (voting_strategy_params_len, voting_strategy_params) = _get_voting_strategy_params( - strategy_index, voting_strategy_params_len, voting_strategy_params, 1 - ); - - let (user_voting_power) = IVotingStrategy.getVotingPower( - contract_address=strategy_address, - timestamp=current_timestamp, - voter_address=voter_address, - params_len=voting_strategy_params_len, - params=voting_strategy_params, - user_params_len=user_voting_strategy_params_len, - user_params=user_voting_strategy_params, - ); - - let (additional_voting_power) = _get_cumulative_voting_power( - current_timestamp, - voter_address, - used_voting_strategies_len - 1, - &used_voting_strategies[1], - user_voting_strategy_params_all, - index + 1, - ); - - let (voting_power, overflow) = uint256_add(user_voting_power, additional_voting_power); - with_attr error_message("Voting: Overflow while computing voting power") { - assert overflow = 0; - } - - return (voting_power,); -} - -// Function to reconstruct voting param array for voting strategy specified -func _get_voting_strategy_params{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - strategy_index: felt, params_len: felt, params: felt*, index: felt -) -> (params_len: felt, params: felt*) { - // If there are no parameters, we just return an empty array - if (params_len == 0) { - return (0, params); - } - let (param) = Voting_voting_strategy_params_store.read(strategy_index, index); - assert params[index - 1] = param; - // All parameters have been added to the array so we can return it - if (index == params_len) { - return (params_len, params); - } - let (params_len, params) = _get_voting_strategy_params( - strategy_index, params_len, params, index + 1 - ); - return (params_len, params); -} - -// Decodes an array into the data required to perform a set of calls according to the OZ account standard -func _decode_execution_params{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - execution_params_len: felt, execution_params: felt* -) -> (call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) { - assert_le(4, execution_params_len); // Min execution params length is 4 (corresponding to 1 tx with no calldata) - let call_array_len = (execution_params[0] - 1) / 4; // Number of calls in the proposal payload - let call_array = cast(&execution_params[1], AccountCallArray*); - let calldata_len = execution_params_len - execution_params[0]; - let calldata = &execution_params[execution_params[0]]; - return (call_array_len, call_array, calldata_len, calldata); -} - -// Same as OZ `execute` just without the assert get_caller_address() = 0 -// This is a reentrant call guard which prevents another account calling execute -// In the context of proposal txs, reentrancy is not an issue as the transactions are trusted to be non malicious -func _execute_proposal_txs{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) -> ( - response_len: felt, response: felt* -) { - alloc_locals; - let (tx_info) = get_tx_info(); - with_attr error_message("Voting: invalid tx version") { - assert tx_info.version = 1; - } - // TMP: Convert `AccountCallArray` to 'Call'. - let (calls: Call*) = alloc(); - Account._from_call_array_to_call(call_array_len, call_array, calldata, calls); - let calls_len = call_array_len; - // execute call - let (response: felt*) = alloc(); - let (response_len) = Account._execute_list(calls_len, calls, response); - return (response_len=response_len, response=response); -} diff --git a/deployments/goerli1.json b/deployments/goerli1.json deleted file mode 100644 index 4c0d5913..00000000 --- a/deployments/goerli1.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "space": { - "address": "0x56f0102b537fae4a9f94c362473d7f03025e92af246502074d9f204c027058b", - "authenticators": { - "StarkTx": "0x327d3a82cf938e7dcef065db5d3f4c40d2b495b27912e352817cf3da41643f9", - "Vanilla": "0x28511c7039691e7298c92b753e28d79ebf8253acc0fa508bb159dd12adea0b6" - }, - "controller": "0x0070d911463b2cb48de8bfec826483631cdc492a6c5798917651297769fc9d68", - "executionStrategies": { - "Vanilla": "0x5d4a61e5ea572b1e956c19ca76678336c2e0472a7988b0b5979fa18719b5652", - "zodiacRelayer": "0x5c512fbf7f4dc97bd2a68e7096968ce8ecd65d42583cbacaf3fdcc7a1800f80" - }, - "maxVotingDuration": "0x7d0", - "minVotingDuration": "0x0", - "name": "Test space", - "proposalThreshold": "0x1", - "quorum": "0x1", - "votingStrategies": { - "SingleSlotProof": { - "address": "0x78f994cdf794bebd68027ef9e2ee0bf309983d87755efb4f5bded8d26980514", - "parameters": [ - "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "0x0" - ] - }, - "Vanilla": { - "address": "0x61b900e2c3b8beb266e1fe9abe837a9b8276cac39509b3b25ad10a20767763a", - "parameters": [ - ] - } - } - } -} \ No newline at end of file diff --git a/deployments/goerli2.json b/deployments/goerli2.json deleted file mode 100644 index 9945abf6..00000000 --- a/deployments/goerli2.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "space": { - "address": "0x794d325db8a7e60b1671c7280e697260433af01b017235f9ce092e775dacdf8", - "authenticators": { - "StarkTx": "0x6b468438f5692139f657f42ba54ac89a8944eda73088173489fe3cae08addfb", - "Vanilla": "0x406c761687627770ffe3913904215c4652bd9f06b72046b301ce4aee093329f" - }, - "controller": "0x0070d911463b2cb48de8bfec826483631cdc492a6c5798917651297769fc9d68", - "executionStrategies": { - "Starknet": "0x76c99e71d34564a754c3a4bba02ff7c45c6e4264afce540827085348b4dc6aa", - "Vanilla": "0x4194fa1be0fce6f70e8b8d3e2b4730467f80637878f9e5111db0cefefb0da72", - "zodiacRelayer": "0xcf166a5c95d1d49109d058fc4a89b6a5ae6e2abc4f487f24a5d9fb6ee947b0" - }, - "maxVotingDuration": "0x7d0", - "minVotingDuration": "0x0", - "name": "Test space", - "proposalThreshold": "0x1", - "quorum": "0x1", - "votingStrategies": { - "SingleSlotProof": { - "address": "0x275b259a35fe0be03d9f211aefcc04c5f5e3fec89e87b8681f84bae87535b51", - "parameters": [ - "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "0x0" - ] - }, - "Vanilla": { - "address": "0x244949da6544e5b8281e4bb2b06107fa0cbfd7169d89762e4f960379eb6b3b2", - "parameters": [ - ] - } - } - } -} \ No newline at end of file diff --git a/docs/images/governance_trilemma.png b/docs/images/governance_trilemma.png deleted file mode 100644 index e710e871..00000000 Binary files a/docs/images/governance_trilemma.png and /dev/null differ diff --git a/docs/images/offchain_architecture.png b/docs/images/offchain_architecture.png deleted file mode 100644 index c8b89d4b..00000000 Binary files a/docs/images/offchain_architecture.png and /dev/null differ diff --git a/docs/images/onchain_architecture.png b/docs/images/onchain_architecture.png deleted file mode 100644 index 91492938..00000000 Binary files a/docs/images/onchain_architecture.png and /dev/null differ diff --git a/docs/milestones/1.md b/docs/milestones/1.md deleted file mode 100644 index aae92542..00000000 --- a/docs/milestones/1.md +++ /dev/null @@ -1,102 +0,0 @@ -# Milestone 1 - -The first milestone includes 3 contracts (in red on the diagram below): A space contract holding votes and proposals, an authenticator contract approving signed messages for casting a vote or creating a proposal, and a voting strategy where 1 address is equal to 1 voting power. Execution, custom settings, or storage proof calculations are not part of this milestone. - -![](https://user-images.githubusercontent.com/16245250/155883647-8f853411-bea9-4a73-bd69-2be850d4ffc9.png) - -Source: https://whimsical.com/snapshot-x-design-proposal-Gy1y3P6zTs4rdE4cStaKW4 - -## Requirements - -Here are the actions to cover in this milestone: -- Use auth contract as proxy -- Create a proposal -- Cast a vote -- Store votes and proposals - -## Interfaces - -### Space contract - -This is the main contract, previously called "voting contract". The contract is responsible for storing proposals and votes, it also defines and stores parameters for the space. - -#### Storage vars - -- **voting_delay** = 600 -The time in seconds to wait between when a proposal is created and when the proposal voting period starts. - -- **voting_duration** = 3600 -The duration of a proposal in seconds. - -- **proposal_threshold** = 1 -The minimum amount of voting power that is required to submit a proposal. - -- **voting_strategy** = 0x123... -The voting strategy contract address that is used to calculate the voting power for each voter, the strategy will return 1 voting power for any address. - -- **auth** = 0x123... -The authenticator contract address that is used to verify the addresses of voters and proposers. - -- **next_proposal_nonce** = 1 -An increasing nonce to make the proposal id unique. - -- **proposals** = { 1: { start: 123.., end: 456.., execution_hash: '0x123...', scores: { 0: 123, 1: 45, 3: 6 }] -A mapping of proposals by ids with required information: execution_hash, start, end, scores with a counter for the vote For, Against and Abstain. - -- **has_voted** = { 1: [0x123..., 0x456...], 2: [0x789...] } -A mapping of addresses who voted by proposal id. - -#### Functions - -- **vote(address, proposal, choice)** -Function to cast a vote, the payload is made up of the Ethereum address of the voter, the proposal id and the choice. - -- **propose(address, execution_hash, metadata_uri)** -Submit a new proposal. The **address** is an Ethereum address, **execution_hash** is a hash from EIP-712 that include execution details, here is an example https://gist.github.com/bonustrack/45fdb2f0235d6ad3ccffa328234379aa the **metadata_uri** is an URL string that leads to a JSON file which includes proposal metadata like title or body, this is similar to NFT tokenURI. It can be "ipfs://AbC..." or "https://..." URL. - -### Voting strategy contract - -The role of the voting strategy contract is to calculate voting power for a specific user. On this milestone we just need a voting strategy that always return 1 as voting power. - -#### Functions - -- **get_voting_power(address, at, data)** -Returns the voting power for a specific address at a specific timestamp "at", "data" are the params required to run the voting power calculation, in milestone 1 it's just an empty array. - -### Auth contract - -The authenticator acts as a proxy to the space contract, the contract is here to validate that an address is authorized to do actions. - -#### Functions - -- **execute(target, data)** -This function is a proxy to call another contract at address **target** with **data** as payload. The payload **data** would include a **function_selector**, a **sig** as well as the action params, example for **propose** it will require an **address**, **execution_hash**, and **metadata_uri** - - -## Flows - -Here is the flows for the actions. The assumption here is that all the transactions sent on StarkNet are not sent by the author of the vote or proposal itself but instead by an account that sponsors the transaction fee, ie the relayer (https://github.com/snapshot-labs/sx-relayer). - -### Create a proposal - -This is the flow to create a proposal. - -- 1: User signs a proposal message on a test frontend, the message includes an **execution_hash** and **metadata_uri**. -- 2: This message and the signature are sent to the authenticator contract using **execute**, with the space contract address as **target** and the **sig**, **execution_hash**, and **metadata_uri** as **data**. -- 3: The authenticator contract will accept the tx regardless of the signature being correct or not and relay that tx to the defined space. -- 4: The space contract verifies that the tx comes from the authenticator contract address defined in the state variable **auth**. -- 5: The space contract verifies that the publisher of the proposal has a voting power equal or higher than the **proposal_threshold**. -- 6: The space contract stores the proposal in the variable **proposals**, this include an id defined by **next_proposal_nonce**, a **start** and **end** date in plain defined using the current block timestamp, the space **delay** and **period**. -- 7: The Space contract increments **next_proposal_nonce** by 1. - -### Cast a vote - -This is the flow to cast a vote. - -- 1: User signs a proposal message on a test frontend, the message includes a **proposal** id and **choice**. -- 2: This message and the signature are sent to the authenticator contract using **execute**, with the space contract as **target** and the **sig**, **proposal**, and **choice** as **data**. -- 3: The authenticator contract accepts the tx regardless of the signature being correct or not and relays that tx to the defined space. -- 4: The space contract verifies that the tx comes from the authenticator contract address defined in the state variable **auth**. -- 5: The space contract verifies that the proposal exists and it's currently open for vote (between **start** and **end**). -- 6: The space contract obtains the user's voting power by calling the voting strategy contract. -- 7: The space contract stores the vote in the variable **votes** with his **address**, voting power **vp**, and **choice**. diff --git a/docs/milestones/2.md b/docs/milestones/2.md deleted file mode 100644 index 569e4919..00000000 --- a/docs/milestones/2.md +++ /dev/null @@ -1,104 +0,0 @@ -# Milestone 2 - -The second milestone builds on Milestone 1 by including a single slot proof voting strategy, an L1 execution strategy, and finally an L1 interaction [1] contract that we call StarkNet Commit along with a corresponding auth contract for this type of interaction on L2. Additionally, we update the space contract to take an array of voting and auth strategies rather than just a single option for each. - -![](../images/onchain_architecture.png) - -[Source](https://whimsical.com/snapshot-x-milestone-2-7UJARrFFC3LbnZexGEtQQB) - -### Changes to the space contract - -We add one function (**finalize_proposal**), and modify the constructor to take a list of authenticators and voting strategies. Modify **propose** to take a **execution_params** as a parameter. - -#### Functions - -- **finalize_proposal(proposal_id: felt)** - -Finalizes the proposal, counts the votes FOR and AGAINST, calls the **executor_contract** by providing **proposal_outcome**, **executionHash** and **executions_params** as parameters. Callable by anyone. - -### Single Slot Proof Voting Strategy Contract - -We add the principal voting strategy of Snapshot X to this milestone. The single slot proof strategy will allow the balances of the majority [2] of ERC20 and ERC721 tokens to be used to find voting power. - -#### Functions - -- **get_voting_power(address: EthAddress, ethereum_block_number: felt, params: felt array)** -Returns the voting power for a specific address at a specific Ethereum block number **block_number**, **params** are the storage proof data required by the Fossil module to prove the contents of a slot. In the case of finding the voting power from an ERC20 balance, the slot will correspond to the storage slot in the ERC20 contract where the balance of **address** is stored. - -### StarkNet Commit Contract - -This global contract will allow an alternate way to interact with Snapshot X: Via an L1 transaction. The core benefit of this feature is to allow one to interact with Snapshot X without a signature. This will give smart contract accounts such as multi-sig wallets the ability to participate. - -The contract will have a single storage variable: The address of the global L1 Auth contract on StarkNet. This will be an immutable variable set at construction of the contract. - -#### Functions - -- **commit(hash: bytes32)** \ -Sends the hash provided to the StarkNet messaging bridge with the L1 Auth contract as the destination address. - -### L1 Auth Contract - -Auth contract for interactions with Snapshot X via L1. - -#### Functions - -- **commit_handler(hash: felt array)** \ -L1 handler function that receives the hash sent by the Starknet Commit contract and stores it in its state. - -- **execute(to : felt, function_selector : felt, calldata : felt array)** \ -General purpose authentication for all types of interaction where the interaction parameters are sent and hashed to check that they match a hash recieved from L1. If so, the function given by **function_selector** at the **to** address is called with **calldata** as parameters. - -### Zodiac Execution Strategy Contract (L2) - -Receives the message from the space contract. Decode the L1 contract address from the **execution_params**. Then forwards **proposal_outcome**, **execution_hash** and **execution_params**, and the **caller_address** to the L1 contract address. - -### Zodiac Module Contract (L1) - -A way to execute Gnosis Safe transactions that are included in a proposal, once the vote has concluded successfully. -It holds an **l2_caller_whitelist** list of whitelisted l2 caller corresponding to the spaces deployed that could interact with the Zodiac Module Contract. This whitelist needs to be updated everytime a new space (that will interact with the Zodiac Module Contract) gets deployed on L2. - -#### Functions - -**receiveProposal(executionDetails: Uint256, proposalOutcome: Uint256, caller: Uint256, txHashes: bytes32[])** \ -Consumes message from StarkNet bridge, checks proposal has passed, checks that **caller** is a member of the **l2_caller_whitelist**, and then hashes the **txHashes** array to check it is equal to **executionDetails**. If so, it stores the **txHashes** ready to be executed in a following transaction. - -**executeProposalTxBatch(proposalIndex: Uint256, Raw Tx parameter arrays ...)** \ -Hashes each transaction in turn and checks that it is equal to the corresponding txHash stored. If correct, executes that transaction. - -**updateWhitelist(add: Uint256[], remove: Uint256[])** \ -Only callable by the **owner**. Updates the **l2_caller_whitelist** mapping by adding every element in **add** and removing every element in **remove**. - -## Flows - -The additional flows added to Milestone 2 are the processes of voting and proposing via an L1 transaction, along with executing a proposal via a Zodiac module. - -### Interact via L1 - -The flows for all interactions via L1 start in the same way: - -- 1: User submits a transaction to the Starknet Commit contract containing the hash of the parameters for the action one wants to take. -- 2: The contract then submits a transaction to StarkNet over the messaging bridge with the destination address immutably set in the contract as the L1 Tx Authenticator, and the payload as the hash supplied. -- 3: The L1 Tx Authenticator receives the message and stores the payload parameters, it now waits for the strategy parameters to be submitted. - -#### Propose via L1 -- 4a: User submits a StarkNet transaction to the **propose_via_L1** function of L1 Auth contract with the proposal parameters as arguments: The address of the space the user wants to create a proposal in **space**, the hash of the execution details **execution_hash**, the URI of the metadata **metadata_uri**, and the parameters required to get the voting power of the user **params** (This will most commonly be an encoded storage proof). -- 5a: The contract computes the hash of the parameters and checks that it matches a hash received via the bridge (in step 3). -- 6a: The contract then submits an internal transaction to the **propose** function of the of the space contract specified by **space** with the **execution_hash**, the **metadata_uri**, and the **params** as arguments. -- 7a: The proposal creation flow then continues just as specified in milestone 1 from point 4 onwards. - -#### Cast a vote via L1 -- 4b: User submits a StarkNet transaction to the **vote_via_L1** function of L1 Auth contract with the vote parameters as arguments: The address of the space the user wants to create a proposal in **space**, the ID of the proposal **proposal_id**, the voter's choice **choice**, and the parameters required to get the voting power of the user **params** (This will most commonly be an encoded storage proof). -- 5b: The contract computes the hash of the parameters and checks that it matches a hash received via the bridge (in step 3). -- 6b: The contract then submits an internal transaction to the **vote** function of the space contract specified by **space** with the **proposal_id**, the **choice**, and the **params** as arguments. -- 7b: The vote submission flow then continues just as specified in milestone 1 from point 4 onwards. - -### Execute Proposal with Zodiac Module - -- 1: Call **finalize_proposal** on the space contract by providing the **proposal_id** to execute. -- 2: On L1, call **receiveProposal** on the Zodiac Module Contract, providing the **executionHash**, **proposalOutcome**, **_txHashes** and **execution_params** parameters. -- 3: On L1, call **executeProposalTxBatch** to execute the transactions! - -#### Notes - -[1] We define interacting with Snapshot X to be the actions of: Creating a new proposal, and Voting. More may be added in future, such as updating space settings and delegation. -[2] Certain implementations of ERC20 and ERC721 have non standard balanceOf implementations and will therefore need a custom strategy to work with Snapshot X. diff --git a/ethereum/foundry.toml b/ethereum/foundry.toml new file mode 100644 index 00000000..7f9f1fcf --- /dev/null +++ b/ethereum/foundry.toml @@ -0,0 +1,7 @@ +[profile.default] +src = 'src' +out = 'out' +libs = ['lib'] +solc = "0.8.19" + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/ethereum/lib/forge-std b/ethereum/lib/forge-std new file mode 160000 index 00000000..e8a047e3 --- /dev/null +++ b/ethereum/lib/forge-std @@ -0,0 +1 @@ +Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e diff --git a/ethereum/lib/openzeppelin-contracts-upgradeable b/ethereum/lib/openzeppelin-contracts-upgradeable new file mode 160000 index 00000000..43b82754 --- /dev/null +++ b/ethereum/lib/openzeppelin-contracts-upgradeable @@ -0,0 +1 @@ +Subproject commit 43b82754979c35abcd3ccad7b795754146c62ade diff --git a/ethereum/lib/safe-contracts b/ethereum/lib/safe-contracts new file mode 160000 index 00000000..e870f514 --- /dev/null +++ b/ethereum/lib/safe-contracts @@ -0,0 +1 @@ +Subproject commit e870f514ad34cd9654c72174d6d4a839e3c6639f diff --git a/ethereum/lib/zodiac b/ethereum/lib/zodiac new file mode 160000 index 00000000..88b96ecd --- /dev/null +++ b/ethereum/lib/zodiac @@ -0,0 +1 @@ +Subproject commit 88b96ecd5867d5167852cccd3626539c3e4375c8 diff --git a/ethereum/remappings.txt b/ethereum/remappings.txt new file mode 100644 index 00000000..ca7495c7 --- /dev/null +++ b/ethereum/remappings.txt @@ -0,0 +1 @@ +@gnosis.pm/safe-contracts=lib/safe-contracts \ No newline at end of file diff --git a/ethereum/src/StarknetCommit.sol b/ethereum/src/StarknetCommit.sol new file mode 100644 index 00000000..6b13d0e2 --- /dev/null +++ b/ethereum/src/StarknetCommit.sol @@ -0,0 +1,32 @@ +/// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.19; + +import "./interfaces/IStarknetCore.sol"; + +/// @title Starknet Commit Contract +/// @notice Allows data to be committed to Starknet via a transaction on L1. The contract works in combination with a corresponding authenticator contract on Starknet. +contract StarkNetCommit { + /// @notice The Starknet core contract. + IStarknetCore public immutable starknetCore; + + /// @dev Selector for the L1 handler in the authenticator on StarkNet, found via: + /// from starkware.starknet.compiler.compile import get_selector_from_name + /// print(get_selector_from_name('commit')) + uint256 private constant L1_COMMIT_HANDLER = + 674623595553689999852507866835294387286428733459551884504121875060358224925; + + constructor(IStarknetCore _starknetCore) { + starknetCore = _starknetCore; + } + + /// @notice Commits a hash and the sender address to Starknet. + /// @param starknetAuthenticator The address of the authenticator contract on Starknet that will receive the message. + ///@param _hash The hash to commit + function commit(uint256 starknetAuthenticator, uint256 _hash) external { + uint256[] memory payload = new uint256[](2); + payload[0] = uint256(uint160(msg.sender)); + payload[1] = _hash; + starknetCore.sendMessageToL2(starknetAuthenticator, L1_COMMIT_HANDLER, payload); + } +} diff --git a/ethereum/src/execution-strategies/L1AvatarExecutionStrategy.sol b/ethereum/src/execution-strategies/L1AvatarExecutionStrategy.sol new file mode 100644 index 00000000..b4f6f78c --- /dev/null +++ b/ethereum/src/execution-strategies/L1AvatarExecutionStrategy.sol @@ -0,0 +1,184 @@ +/// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.19; + +import "zodiac/interfaces/IAvatar.sol"; +import "../interfaces/IStarknetCore.sol"; +import {SimpleQuorumExecutionStrategy} from "./SimpleQuorumExecutionStrategy.sol"; +import "../types.sol"; +/** + * @title Snapshot X L1 execution Zodiac module + * @author Snapshot Labs + * @notice Trustless L1 execution of Snapshot X decisions via an Avatar contract such as a Gnosis Safe + * @dev Work in progress + */ + +contract L1AvatarExecutionStrategy is SimpleQuorumExecutionStrategy { + /// @dev Address of the avatar that this module will pass transactions to. + address public target; + + /// The StarkNet Core contract + address public starknetCore; + + /// Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message + uint256 public executionRelayer; + + /// @dev Emitted each time the Target is set. + event TargetSet(address indexed newTarget); + + /// @dev Emitted each time the Execution Relayer is set. + event ExecutionRelayerSet(uint256 indexed newExecutionRelayer); + + /** + * @dev Emitted when a new module proxy instance has been deployed + * @param _owner Address of the owner of this contract + * @param _target Address that this contract will pass transactions to + * @param _starknetCore Address of the StarkNet Core contract + * @param _executionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message + */ + event SXAvatarExecutorSetUp( + address indexed _owner, + address _target, + address _starknetCore, + uint256 _executionRelayer, + uint256[] _starknetSpaces + ); + + /** + * @dev Constructs the master contract + * @param _owner Address of the owner of this contract + * @param _target Address that this contract will pass transactions to + * @param _starknetCore Address of the StarkNet Core contract + * @param _executionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message + * @param _starknetSpaces of spaces deployed on StarkNet that are allowed to execute proposals via this contract + */ + constructor( + address _owner, + address _target, + address _starknetCore, + uint256 _executionRelayer, + uint256[] memory _starknetSpaces + ) { + bytes memory initParams = abi.encode(_owner, _target, _starknetCore, _executionRelayer, _starknetSpaces); + setUp(initParams); + } + + /** + * @dev Proxy constructor + * @param initParams Initialization parameters + */ + function setUp(bytes memory initParams) public initializer { + ( + address _owner, + address _target, + address _starknetCore, + uint256 _executionRelayer, + uint256[] memory _starknetSpaces + ) = abi.decode(initParams, (address, address, address, uint256, uint256[])); + __Ownable_init(); + transferOwnership(_owner); + __SpaceManager_init(_starknetSpaces); + target = _target; + starknetCore = _starknetCore; + executionRelayer = _executionRelayer; + + emit SXAvatarExecutorSetUp(_owner, _target, _starknetCore, _executionRelayer, _starknetSpaces); + } + + /** + * @dev Changes the StarkNet execution relayer contract + * @param _executionRelayer Address of the new execution relayer contract + */ + function setExecutionRelayer(uint256 _executionRelayer) external onlyOwner { + executionRelayer = _executionRelayer; + emit ExecutionRelayerSet(_executionRelayer); + } + + /// @notice Sets the target address + /// @param _target Address of the avatar that this module will pass transactions to. + function setTarget(address _target) external onlyOwner { + target = _target; + emit TargetSet(_target); + } + + /// @notice Executes a proposal + /// @param space The address of the space that the proposal was created in. + /// @param proposal The proposal struct. + /// @param votesFor The number of votes for the proposal. + /// @param votesAgainst The number of votes against the proposal. + /// @param votesAbstain The number of votes abstaining from the proposal. + /// @param executionHash The hash of the execution payload. + /// @param payload The encoded execution payload. + function execute( + uint256 space, + Proposal memory proposal, + uint256 votesFor, + uint256 votesAgainst, + uint256 votesAbstain, + bytes32 executionHash, + bytes memory payload + ) external onlySpace(space) { + // Call to the Starknet core contract will fail if finalized proposal message was not received on L1. + _receiveProposal(space, proposal, votesFor, votesAgainst, votesAbstain, executionHash); + + ProposalStatus proposalStatus = getProposalStatus(proposal, votesFor, votesAgainst, votesAbstain); + if ((proposalStatus != ProposalStatus.Accepted) && (proposalStatus != ProposalStatus.VotingPeriodAccepted)) { + revert InvalidProposalStatus(proposalStatus); + } + + if (executionHash != keccak256(payload)) revert InvalidPayload(); + + _execute(payload); + } + + /// @dev Reverts if the expected message was not received from L2. + function _receiveProposal( + uint256 space, + Proposal memory proposal, + uint256 votesFor, + uint256 votesAgainst, + uint256 votesAbstain, + bytes32 executionHash + ) internal { + uint256[] memory payload = new uint256[](15); + payload[0] = space; + // The serialized Proposal struct + // TODO: this is probably an incorrect serialization + payload[1] = uint256(proposal.snapshotTimestamp); + payload[2] = uint256(proposal.startTimestamp); + payload[3] = uint256(proposal.minEndTimestamp); + payload[4] = uint256(proposal.maxEndTimestamp); + payload[5] = proposal.executionPayloadHash; + payload[6] = uint256(uint160(proposal.executionStrategy)); + payload[7] = uint256(uint160(proposal.author)); + payload[8] = uint256(proposal.finalizationStatus); + payload[9] = proposal.activeVotingStrategies; + + payload[10] = votesFor; + payload[11] = votesAgainst; + payload[12] = votesAbstain; + + payload[13] = uint256(executionHash >> 128); // High 128 bits of executionHash + payload[14] = uint256(executionHash) & (2 ** 128 - 1); // Low 128 bits of executionHash + + // If proposal execution message did not exist/not received yet, then this will revert. + IStarknetCore(starknetCore).consumeMessageFromL2(executionRelayer, payload); + } + + /// @dev Decodes and executes the payload via the avatar. + function _execute(bytes memory payload) internal { + MetaTransaction[] memory transactions = abi.decode(payload, (MetaTransaction[])); + for (uint256 i = 0; i < transactions.length; i++) { + bool success = IAvatar(target).execTransactionFromModule( + transactions[i].to, transactions[i].value, transactions[i].data, transactions[i].operation + ); + // If any transaction fails, the entire execution will revert. + if (!success) revert ExecutionFailed(); + } + } + + /// @notice Returns the type of execution strategy. + function getStrategyType() external pure override returns (string memory) { + return "SimpleQuorumL1AvatarExecutionStrategy"; + } +} diff --git a/ethereum/src/execution-strategies/SimpleQuorumExecutionStrategy.sol b/ethereum/src/execution-strategies/SimpleQuorumExecutionStrategy.sol new file mode 100644 index 00000000..8dcd68b7 --- /dev/null +++ b/ethereum/src/execution-strategies/SimpleQuorumExecutionStrategy.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.18; + +import {IExecutionStrategy} from "../interfaces/IExecutionStrategy.sol"; +import {FinalizationStatus, Proposal, ProposalStatus} from "../types.sol"; +import {StarknetSpaceManager} from "./StarknetSpaceManager.sol"; + +/// @title Simple Quorum Base Execution Strategy +abstract contract SimpleQuorumExecutionStrategy is IExecutionStrategy, StarknetSpaceManager { + /// @notice The quorum required to execute a proposal using this strategy. + uint256 public quorum; + + /// @dev Initializer + // solhint-disable-next-line func-name-mixedcase + function __SimpleQuorumExecutionStrategy_init(uint256 _quorum) internal onlyInitializing { + quorum = _quorum; + } + + /// @notice Returns the status of a proposal that uses a simple quorum. + /// A proposal is accepted if the for votes exceeds the against votes + /// and a quorum of total votes (for + against + abstain) is reached. + /// @param proposal The proposal struct. + /// @param votesFor The number of votes for the proposal. + /// @param votesAgainst The number of votes against the proposal. + /// @param votesAbstain The number of votes abstaining from the proposal. + function getProposalStatus(Proposal memory proposal, uint256 votesFor, uint256 votesAgainst, uint256 votesAbstain) + public + view + override + returns (ProposalStatus) + { + bool accepted = + _quorumReached(quorum, votesFor, votesAgainst, votesAbstain) && _supported(votesFor, votesAgainst); + if (proposal.finalizationStatus == FinalizationStatus.Cancelled) { + return ProposalStatus.Cancelled; + } else if (proposal.finalizationStatus == FinalizationStatus.Executed) { + return ProposalStatus.Executed; + } else if (block.timestamp < proposal.startTimestamp) { + return ProposalStatus.VotingDelay; + } else if (block.timestamp < proposal.minEndTimestamp) { + return ProposalStatus.VotingPeriod; + } else if (block.timestamp < proposal.maxEndTimestamp) { + if (accepted) { + return ProposalStatus.VotingPeriodAccepted; + } else { + return ProposalStatus.VotingPeriod; + } + } else if (accepted) { + return ProposalStatus.Accepted; + } else { + return ProposalStatus.Rejected; + } + } + + function _quorumReached(uint256 _quorum, uint256 _votesFor, uint256 _votesAgainst, uint256 _votesAbstain) + internal + pure + returns (bool) + { + uint256 totalVotes = _votesFor + _votesAgainst + _votesAbstain; + return totalVotes >= _quorum; + } + + function _supported(uint256 _votesFor, uint256 _votesAgainst) internal pure returns (bool) { + return _votesFor > _votesAgainst; + } + + function getStrategyType() external view virtual override returns (string memory); +} diff --git a/ethereum/src/execution-strategies/StarknetSpaceManager.sol b/ethereum/src/execution-strategies/StarknetSpaceManager.sol new file mode 100644 index 00000000..af5a99f6 --- /dev/null +++ b/ethereum/src/execution-strategies/StarknetSpaceManager.sol @@ -0,0 +1,58 @@ +/// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.19; + +import "openzeppelin/access/OwnableUpgradeable.sol"; + +/// @title Space Manager - A contract that manages SX spaces on Starknet that are able to execute transactions via this contract +/// @author Snapshot Labs +contract StarknetSpaceManager is OwnableUpgradeable { + error InvalidSpace(); + + /// @dev Mapping of spaces that are enabled. + /// A uint256 is used as Starknet addresses cannot be cast to a solidity address type. + mapping(uint256 => bool) internal spaces; + + /// @notice Emitted when a space is enabled. + event SpaceEnabled(uint256 space); + + /// @notice Emitted when a space is disabled. + event SpaceDisabled(uint256 space); + + /// @notice Initialize the contract with a list of spaces. Called only once. + /// @param _spaces List of spaces. + function __SpaceManager_init(uint256[] memory _spaces) internal onlyInitializing { + for (uint256 i = 0; i < _spaces.length; i++) { + if (_spaces[i] == 0 || isSpaceEnabled(_spaces[i])) revert InvalidSpace(); + spaces[_spaces[i]] = true; + } + } + + /// @notice Enable a space. + /// @param space Address of the space. + function enableSpace(uint256 space) public onlyOwner { + if (space == 0 || isSpaceEnabled(space)) revert InvalidSpace(); + spaces[space] = true; + emit SpaceEnabled(space); + } + + /// @notice Disable a space. + /// @param space Address of the space. + function disableSpace(uint256 space) public onlyOwner { + if (!spaces[space]) revert InvalidSpace(); + spaces[space] = false; + emit SpaceDisabled(space); + } + + /// @notice Check if a space is enabled. + /// @param space Address of the space. + /// @return bool whether the space is enabled. + function isSpaceEnabled(uint256 space) public view returns (bool) { + return spaces[space]; + } + + modifier onlySpace(uint256 callerAddress) { + if (!isSpaceEnabled(callerAddress)) revert InvalidSpace(); + _; + } +} diff --git a/ethereum/src/interfaces/IExecutionStrategy.sol b/ethereum/src/interfaces/IExecutionStrategy.sol new file mode 100644 index 00000000..71afc38e --- /dev/null +++ b/ethereum/src/interfaces/IExecutionStrategy.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.18; + +import {Proposal, ProposalStatus} from "../types.sol"; + +/// @title Execution Strategy Interface +interface IExecutionStrategy { + /// @notice Thrown when the current status of a proposal does not allow the desired action. + /// @param status The current status of the proposal. + error InvalidProposalStatus(ProposalStatus status); + + /// @notice Thrown when the execution of a proposal fails. + error ExecutionFailed(); + + /// @notice Thrown when the execution payload supplied to the execution strategy is not equal + /// to the payload supplied when the proposal was created. + error InvalidPayload(); + + function getProposalStatus(Proposal memory proposal, uint256 votesFor, uint256 votesAgainst, uint256 votesAbstain) + external + view + returns (ProposalStatus); + + function getStrategyType() external view returns (string memory); +} diff --git a/ethereum/src/interfaces/IStarknetCore.sol b/ethereum/src/interfaces/IStarknetCore.sol new file mode 100644 index 00000000..acf07402 --- /dev/null +++ b/ethereum/src/interfaces/IStarknetCore.sol @@ -0,0 +1,13 @@ +/// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.6; + +interface IStarknetCore { + function sendMessageToL2(uint256 to_address, uint256 selector, uint256[] calldata payload) + external + returns (bytes32); + + function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) external returns (bytes32); + + function l2ToL1Messages(bytes32 msgHash) external view returns (uint256); +} diff --git a/ethereum/src/types.sol b/ethereum/src/types.sol new file mode 100644 index 00000000..3bf9b9e6 --- /dev/null +++ b/ethereum/src/types.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.18; + +import {Enum} from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol"; + +struct MetaTransaction { + address to; + uint256 value; + bytes data; + Enum.Operation operation; +} + +/// @notice The set of possible finalization statuses for a proposal. +/// This is stored inside each Proposal struct. +enum FinalizationStatus { + Pending, + Executed, + Cancelled +} + +// TODO: Equivalence with sx-evm Proposal struct +/// @notice The data stored for each proposal when it is created. +struct Proposal { + // The timestamp at which voting power for the proposal is calculated. Overflows at year ~2106. + uint64 snapshotTimestamp; + // We store the following 3 timestamps for each proposal despite the fact that they can be + // inferred from the votingDelay, minVotingDuration, and maxVotingDuration state variables + // because those variables may be updated during the lifetime of a proposal. + uint64 startTimestamp; + uint64 minEndTimestamp; + uint64 maxEndTimestamp; + // The hash of the execution payload. We do not store the payload itself to save gas. + uint256 executionPayloadHash; + // The address of execution strategy used for the proposal. + address executionStrategy; + // The address of the proposal creator. + address author; + // An enum that stores whether a proposal is pending, executed, or cancelled. + FinalizationStatus finalizationStatus; + // Bit array where the index of each each bit corresponds to whether the voting strategy. + // at that index is active at the time of proposal creation. + uint256 activeVotingStrategies; +} + +/// @notice The set of possible statuses for a proposal. +enum ProposalStatus { + VotingDelay, + VotingPeriod, + VotingPeriodAccepted, + Accepted, + Executed, + Rejected, + Cancelled +} diff --git a/hardhat.config.ts b/hardhat.config.ts deleted file mode 100644 index 51ca8c21..00000000 --- a/hardhat.config.ts +++ /dev/null @@ -1,79 +0,0 @@ -import dotenv from 'dotenv'; -dotenv.config(); -import { task } from 'hardhat/config'; -import { HardhatUserConfig } from 'hardhat/types'; -import '@shardlabs/starknet-hardhat-plugin'; -import '@nomiclabs/hardhat-waffle'; -import '@typechain/hardhat'; -import '@nomiclabs/hardhat-ethers'; -import '@nomiclabs/hardhat-waffle'; -import 'hardhat-gas-reporter'; -import '@nomiclabs/hardhat-etherscan'; -import 'solidity-coverage'; - -// const chainIds = { -// ganache: 1337, -// goerli: 5, -// hardhat: 31337, -// kovan: 42, -// mainnet: 1, -// rinkeby: 4, -// ropsten: 3, -// }; - -// const MNEMONIC = process.env.MNEMONIC || ''; -// const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || ''; -// const INFURA_API_KEY = process.env.INFURA_API_KEY || ''; -// const ALCHEMY_KEY = process.env.ALCHEMY_KEY || ''; - -task('accounts', 'Prints the list of accounts', async (args, hre) => { - const accounts = await hre.ethers.getSigners(); - - for (const account of accounts) { - console.log(await account.getAddress()); - } -}); - -const config: HardhatUserConfig = { - solidity: { - version: '0.8.9', - settings: { - optimizer: { - enabled: true, - runs: 10, - }, - }, - }, - networks: { - ropsten: { - url: process.env.ROPSTEN_URL || '', - accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], - }, - ethereumLocal: { - url: 'http://localhost:8545', - chainId: 31337, - }, - starknetLocal: { - url: 'http://localhost:8000', - }, - }, - gasReporter: { - enabled: process.env.REPORT_GAS !== undefined, - currency: 'USD', - }, - etherscan: { - apiKey: process.env.ETHERSCAN_API_KEY, - }, - starknet: { - venv: 'active', - network: 'starknetLocal', - }, - paths: { - cairoPaths: [ - './contracts/starknet/fossil/contracts', - './contracts/starknet/starknet-felt-packing', - ], - }, -}; - -export default config; diff --git a/package.json b/package.json index 2f7aa27b..2c141701 100644 --- a/package.json +++ b/package.json @@ -1,75 +1,8 @@ { - "name": "snapshot-x", + "name": "sx", "version": "1.0.0", - "repository": "snapshot-labs/snapshot-x", - "license": "MIT", - "scripts": { - "compile:l1": "hardhat compile", - "compile:l2": "hardhat starknet-compile ./contracts/starknet/SpaceAccount.cairo --account-contract && hardhat starknet-compile ./contracts/starknet/SpaceFactory.cairo && hardhat starknet-compile ./contracts/starknet/**/", - "compile": "yarn compile:l1 && yarn compile:l2", - "deploy": "sh deploy.sh", - "test:l1": "yarn hardhat test test/ethereum/*.ts", - "test:l2": "yarn hardhat test test/starknet/*.ts --starknet-network 'starknetLocal'", - "test:l2:ci": "concurrently './scripts/chain-l2.sh' './scripts/test-l2.sh'", - "test:crosschain": "'./scripts/test-crosschain.sh'", - "test:crosschain:ci": "concurrently './scripts/chain.sh' './scripts/test-crosschain.sh'", - "deploy:goerli": "yarn hardhat run ./scripts/deployTestSpace.ts", - "chain:l1": "hardhat node", - "chain:l2": "starknet-devnet -p 8000 --lite-mode", - "chain": "concurrently 'yarn chain:l1' 'yarn chain:l2'", - "format:l1": "prettier --write 'contracts/**/*.sol'", - "check-format:l1": "prettier -c 'contracts/**/*.sol'", - "format:l2": "cairo-format -i --one_item_per_line contracts/starknet/**/*.cairo && cairo-format -i --one_item_per_line contracts/starknet/*.cairo", - "check-format:l2": "cairo-format -c --one_item_per_line contracts/starknet/**/*.cairo && cairo-format -c --one_item_per_line contracts/starknet/*.cairo", - "format:ts": "eslint . --ext .ts --fix", - "check-format:ts": "eslint . --ext .ts", - "format:json": "json-format ./deployments/*.json", - "format": "yarn format:l1 && yarn format:l2 && yarn format:ts && yarn format:json", - "check-format": "yarn check-format:l1 && yarn check-format:l2 && yarn check-format:ts" - }, - "dependencies": { - "@gnosis.pm/safe-contracts": "^1.3.0", - "@gnosis.pm/zodiac": "^1.1.5", - "@openzeppelin/contracts": "^4.7.3", - "@shardlabs/starknet-hardhat-plugin": "0.6.8", - "@snapshot-labs/sx": "0.1.0-beta.12", - "concurrently": "^7.4.0", - "starknet": "^4.4.2", - "wait-on": "^6.0.1" - }, - "devDependencies": { - "@nomiclabs/hardhat-ethers": "^2.1.1", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@nomiclabs/hardhat-solhint": "^2.0.1", - "@nomiclabs/hardhat-waffle": "^2.0.2", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.3", - "@types/chai": "^4.3.3", - "@types/mocha": "^9.1.0", - "@types/node": "^18.7.21", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "chai": "^4.3.5", - "dotenv": "^16.0.2", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.0.1", - "ethereum-waffle": "^3.4.0", - "ethers": "^5.7.1", - "hardhat": "^2.11.2", - "hardhat-gas-reporter": "^1.0.9", - "json-format-cli": "^1.1.1", - "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-dev.23", - "solhint": "^3.3.6", - "solhint-plugin-prettier": "^0.0.5", - "solidity-coverage": "^0.8.2", - "ts-node": "^10.9.1", - "typechain": "^8.1.0", - "typescript": "^4.8.3" - } + "description": "Cairo 1 implementation of the Snapshot X Protocol", + "repository": "https://github.com/snapshot-labs/sx-starknet-2.git", + "author": "Snapshot Labs", + "license": "MIT" } diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 402e8272..00000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -https://github.com/starkware-libs/cairo-lang/releases/download/v0.10.2/cairo-lang-0.10.2.zip -openzeppelin-cairo-contracts==0.5.1 -starknet-devnet==0.4.1 diff --git a/scripts/chain-l2.sh b/scripts/chain-l2.sh deleted file mode 100755 index 73770adc..00000000 --- a/scripts/chain-l2.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -yarn chain:l2 -exit 0 \ No newline at end of file diff --git a/scripts/chain.sh b/scripts/chain.sh deleted file mode 100755 index bedfd5f1..00000000 --- a/scripts/chain.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -yarn chain -exit 0 \ No newline at end of file diff --git a/scripts/deployModules.ts b/scripts/deployModules.ts deleted file mode 100644 index bc86f30b..00000000 --- a/scripts/deployModules.ts +++ /dev/null @@ -1,97 +0,0 @@ -import fs from 'fs'; -import { defaultProvider, Account, ec, json } from 'starknet'; -import { utils } from '@snapshot-labs/sx'; - -async function main() { - const starkAccount = new Account( - defaultProvider, - process.env.ARGENT_X_ADDRESS!, - ec.getKeyPair(process.env.ARGENT_X_PK!) - ); - - const compiledVanillaAuthenticator = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/Authenticators/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledEthSigAuthenticator = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/Authenticators/EthSig.cairo/EthSig.json' - ) - .toString('ascii') - ); - const compiledVanillaVotingStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/VotingStrategies/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledSingleSlotProofVotingStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/VotingStrategies/SingleSlotProof.cairo/SingleSlotProof.json' - ) - .toString('ascii') - ); - const compiledVanillaExecutionStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/ExecutionStrategies/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledSpaceFactory = json.parse( - fs - .readFileSync('./starknet-artifacts/contracts/starknet/SpaceFactory.cairo/SpaceFactory.json') - .toString('ascii') - ); - const compiledSpace = json.parse( - fs - .readFileSync('./starknet-artifacts/contracts/starknet/SpaceAccount.cairo/SpaceAccount.json') - .toString('ascii') - ); - const spaceClassHash = '0x75fe4cc03bb9bf2252455199b5ee6757800ea02719b3f1b7d968a46b3ddaa78'; - const fossilFactRegistryAddress = - '0x363108ac1521a47b4f7d82f8ba868199bc1535216bbedfc1b071ae93cc406fd'; - const fossilL1HeadersStoreAddress = - '0x6ca3d25e901ce1fff2a7dd4079a24ff63ca6bbf8ba956efc71c1467975ab78f'; - - const deployTxs = [ - defaultProvider.deployContract({ contract: compiledVanillaAuthenticator }), - defaultProvider.deployContract({ contract: compiledEthSigAuthenticator }), - defaultProvider.deployContract({ contract: compiledVanillaVotingStrategy }), - defaultProvider.deployContract({ - contract: compiledSingleSlotProofVotingStrategy, - constructorCalldata: [fossilFactRegistryAddress, fossilL1HeadersStoreAddress], - }), - defaultProvider.deployContract({ contract: compiledVanillaExecutionStrategy }), - defaultProvider.deployContract({ - contract: compiledSpaceFactory, - constructorCalldata: [spaceClassHash], - }), - ]; - const responses = await Promise.all(deployTxs); - const vanillaAuthenticatorAddress = responses[0].address!; - const ethSigAuthenticatorAddress = responses[1].address!; - const vanillaVotingStrategyAddress = responses[2].address!; - const singleSlotProofVotingStrategyAddress = responses[3].address!; - const vanillaExecutionStrategyAddress = responses[4].address!; - const spaceFactoryAddress = responses[5].address!; - console.log('vanillaAuthenticatorAddress', vanillaAuthenticatorAddress); - console.log('ethSigAuthenticatorAddress', ethSigAuthenticatorAddress); - console.log('vanillaVotingStrategyAddress', vanillaVotingStrategyAddress); - console.log('singleSlotProofVotingStrategyAddress', singleSlotProofVotingStrategyAddress); - console.log('vanillaExecutionStrategyAddress', vanillaExecutionStrategyAddress); - console.log('spaceFactoryAddress', spaceFactoryAddress); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/scripts/deployTestSpace.ts b/scripts/deployTestSpace.ts deleted file mode 100644 index ed8222c1..00000000 --- a/scripts/deployTestSpace.ts +++ /dev/null @@ -1,171 +0,0 @@ -import fs from 'fs'; -import { defaultProvider, json } from 'starknet'; -import { SplitUint256 } from '../test/shared/types'; -import { flatten2DArray } from '../test/shared/helpers'; - -async function main() { - const compiledVanillaAuthenticator = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/Authenticators/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledStarkTxAuthenticator = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/Authenticators/StarkTx.cairo/StarkTx.json' - ) - .toString('ascii') - ); - const compiledVanillaVotingStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/VotingStrategies/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledSingleSlotProofVotingStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/VotingStrategies/SingleSlotProof.cairo/SingleSlotProof.json' - ) - .toString('ascii') - ); - const compiledVanillaExecutionStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/ExecutionStrategies/Vanilla.cairo/Vanilla.json' - ) - .toString('ascii') - ); - const compiledZodiacRelayerExecutionStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/ExecutionStrategies/ZodiacRelayer.cairo/ZodiacRelayer.json' - ) - .toString('ascii') - ); - const compiledStarknetExecutionStrategy = json.parse( - fs - .readFileSync( - './starknet-artifacts/contracts/starknet/ExecutionStrategies/Starknet.cairo/Starknet.json' - ) - .toString('ascii') - ); - const compiledSpace = json.parse( - fs - .readFileSync('./starknet-artifacts/contracts/starknet/SpaceAccount.cairo/SpaceAccount.json') - .toString('ascii') - ); - - const deployTxs = [ - defaultProvider.deployContract({ contract: compiledVanillaAuthenticator }), - defaultProvider.deployContract({ contract: compiledStarkTxAuthenticator }), - defaultProvider.deployContract({ contract: compiledVanillaVotingStrategy }), - defaultProvider.deployContract({ contract: compiledSingleSlotProofVotingStrategy }), - defaultProvider.deployContract({ contract: compiledVanillaExecutionStrategy }), - defaultProvider.deployContract({ contract: compiledZodiacRelayerExecutionStrategy }), - defaultProvider.deployContract({ contract: compiledStarknetExecutionStrategy }), - ]; - const responses = await Promise.all(deployTxs); - const vanillaAuthenticatorAddress = responses[0].address!; - const starkTxAuthenticatorAddress = responses[1].address!; - const vanillaVotingStrategyAddress = responses[2].address!; - const singleSlotProofVotingStrategyAddress = responses[3].address!; - const vanillaExecutionStrategyAddress = responses[4].address!; - const zodiacRelayerExecutionStrategyAddress = responses[5].address!; - const starknetExecutionStrategyAddress = responses[6].address!; - console.log(responses); - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: bigint[] = [ - BigInt(vanillaVotingStrategyAddress), - BigInt(singleSlotProofVotingStrategyAddress), - ]; - const votingStrategyParams: bigint[][] = [ - [], - [BigInt('0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'), BigInt(0)], - ]; // vanilla and Aave token voting - const votingStrategyParamsFlat: bigint[] = flatten2DArray(votingStrategyParams); - const authenticators: bigint[] = [ - BigInt(vanillaAuthenticatorAddress), - BigInt(starkTxAuthenticatorAddress), - ]; - const executors: bigint[] = [ - BigInt(vanillaExecutionStrategyAddress), - BigInt(zodiacRelayerExecutionStrategyAddress), - BigInt(starknetExecutionStrategyAddress), - ]; - const quorum: SplitUint256 = SplitUint256.fromUint(BigInt(1)); // Quorum of one for the vanilla test - const proposalThreshold: SplitUint256 = SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const controllerAddress = '0x0070d911463b2cb48de8bfec826483631cdc492a6c5798917651297769fc9d68'; // Controller address (orlando's argent x) - - const spaceDeploymentCalldata: bigint[] = [ - votingDelay, - minVotingDuration, - maxVotingDuration, - proposalThreshold.low, - proposalThreshold.high, - BigInt(controllerAddress), - quorum.low, - quorum.high, - BigInt(votingStrategyParamsFlat.length), - ...votingStrategyParamsFlat, - BigInt(votingStrategies.length), - ...votingStrategies, - BigInt(authenticators.length), - ...authenticators, - BigInt(executors.length), - ...executors, - ]; - const spaceDeploymentCalldataHex = spaceDeploymentCalldata.map((x) => '0x' + x.toString(16)); - const spaceResponse = await defaultProvider.deployContract({ - contract: compiledSpace, - constructorCalldata: spaceDeploymentCalldataHex, - }); - - const spaceAddress = spaceResponse.address!; - - const deployments = { - space: { - name: 'Test space', - address: spaceAddress, - controller: controllerAddress, - minVotingDuration: '0x' + minVotingDuration.toString(16), - maxVotingDuration: '0x' + maxVotingDuration.toString(16), - proposalThreshold: proposalThreshold.toHex(), - quorum: quorum.toHex(), - authenticators: { - Vanilla: vanillaAuthenticatorAddress, - StarkTx: starkTxAuthenticatorAddress, - }, - votingStrategies: { - Vanilla: { - address: vanillaVotingStrategyAddress, - parameters: [], - }, - SingleSlotProof: { - address: singleSlotProofVotingStrategyAddress, - parameters: ['0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9', '0x0'], - }, - }, - executionStrategies: { - Vanilla: vanillaExecutionStrategyAddress, - zodiacRelayer: zodiacRelayerExecutionStrategyAddress, - Starknet: starknetExecutionStrategyAddress, - }, - }, - }; - - fs.writeFileSync('./deployments/goerli2.json', JSON.stringify(deployments)); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/scripts/test-crosschain.sh b/scripts/test-crosschain.sh deleted file mode 100755 index f4370fa5..00000000 --- a/scripts/test-crosschain.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -yarn wait-on tcp:8000 && -wait-on tcp:8545 && -yarn hardhat test test/crosschain/ZodiacExecution.test.ts --network 'ethereumLocal' --starknet-network 'starknetLocal' && -sleep 10 && -yarn hardhat test test/crosschain/EthTxAuth.test.ts --network 'ethereumLocal' --starknet-network 'starknetLocal' && -sleep 10 && -yarn hardhat test test/crosschain/EthTxSessionKeyAuth.test.ts --network 'ethereumLocal' --starknet-network 'starknetLocal' - -if [ $? -eq 0 ] -then - kill -9 $(lsof -t -i:8545) - kill -9 $(lsof -t -i:8000) - exit 0 -else - kill -9 $(lsof -t -i:8545) - kill -9 $(lsof -t -i:8000) - echo "Tests failed" - exit 1 -fi \ No newline at end of file diff --git a/scripts/test-l2.sh b/scripts/test-l2.sh deleted file mode 100755 index 1b766920..00000000 --- a/scripts/test-l2.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -yarn wait-on tcp:8000 && -yarn test:l2 -if [ $? -eq 0 ] -then - kill -9 $(lsof -t -i:8000) - exit 0 -else - kill -9 $(lsof -t -i:8000) - echo "Tests failed" - exit 1 -fi \ No newline at end of file diff --git a/starknet/Scarb.toml b/starknet/Scarb.toml new file mode 100644 index 00000000..e6c83010 --- /dev/null +++ b/starknet/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "sx" +version = "0.1.0" + +# See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest + +[[target.starknet-contract]] +allowed-libfuncs-list.name = "all" + +[dependencies] +starknet = ">=2.0.1" + +[scripts] +run-lib = "cairo-run src/lib.cairo" \ No newline at end of file diff --git a/starknet/src/authenticators.cairo b/starknet/src/authenticators.cairo new file mode 100644 index 00000000..3b2fa347 --- /dev/null +++ b/starknet/src/authenticators.cairo @@ -0,0 +1,5 @@ +mod vanilla; + +mod eth_tx; + +mod eth_sig; diff --git a/starknet/src/authenticators/eth_sig.cairo b/starknet/src/authenticators/eth_sig.cairo new file mode 100644 index 00000000..6a6ec0fa --- /dev/null +++ b/starknet/src/authenticators/eth_sig.cairo @@ -0,0 +1,155 @@ +use starknet::ContractAddress; +use starknet::SyscallResult; +use sx::utils::types::{Strategy, IndexedStrategy, Choice}; + +#[starknet::interface] +trait IEthSigAuthenticator { + fn authenticate_propose( + ref self: TContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array, + salt: u256, + ); + fn authenticate_vote( + ref self: TContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ); + fn authenticate_update_proposal( + ref self: TContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy, + salt: u256 + ); +} + +#[starknet::contract] +mod EthSigAuthenticator { + use super::IEthSigAuthenticator; + use starknet::ContractAddress; + use starknet::syscalls::call_contract_syscall; + use core::array::{ArrayTrait, SpanTrait}; + use clone::Clone; + use sx::space::space::{ISpaceDispatcher, ISpaceDispatcherTrait}; + use sx::utils::types::{Strategy, IndexedStrategy, Choice}; + use sx::utils::signatures; + + #[storage] + struct Storage { + _domain_hash: u256, + _used_salts: LegacyMap::<(ContractAddress, u256), bool> + } + + #[external(v0)] + impl EthSigAuthenticator of IEthSigAuthenticator { + fn authenticate_propose( + ref self: ContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array, + salt: u256, + ) { + signatures::verify_propose_sig( + r, + s, + v, + self._domain_hash.read(), + target, + author, + execution_strategy.clone(), + user_proposal_validation_params.clone(), + salt, + ); + self._used_salts.write((author, salt), true); + + ISpaceDispatcher { + contract_address: target + }.propose(author, execution_strategy, user_proposal_validation_params); + } + + fn authenticate_vote( + ref self: ContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ) { + signatures::verify_vote_sig( + r, + s, + v, + self._domain_hash.read(), + target, + voter, + proposal_id, + choice, + user_voting_strategies.clone() + ); + + // No need to check salts here, as double voting is prevented by the space itself. + + ISpaceDispatcher { + contract_address: target + }.vote(voter, proposal_id, choice, user_voting_strategies); + } + + fn authenticate_update_proposal( + ref self: ContractState, + r: u256, + s: u256, + v: u256, + target: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy, + salt: u256 + ) { + signatures::verify_update_proposal_sig( + r, + s, + v, + self._domain_hash.read(), + target, + author, + proposal_id, + execution_strategy.clone(), + salt + ); + self._used_salts.write((author, salt), true); + + ISpaceDispatcher { + contract_address: target + }.update_proposal(author, proposal_id, execution_strategy); + } + } + + #[constructor] + fn constructor(ref self: ContractState, name: felt252, version: felt252) { + // TODO: domain hash is immutable so could be placed in the contract code instead of storage to save on reads. + self._domain_hash.write(signatures::get_domain_hash(name, version)); + } +} diff --git a/starknet/src/authenticators/eth_tx.cairo b/starknet/src/authenticators/eth_tx.cairo new file mode 100644 index 00000000..526afce6 --- /dev/null +++ b/starknet/src/authenticators/eth_tx.cairo @@ -0,0 +1,134 @@ +use starknet::ContractAddress; +use sx::utils::types::{Strategy, IndexedStrategy, Choice}; + +#[starknet::interface] +trait IEthTxAuthenticator { + fn authenticate_propose( + ref self: TContractState, + target: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array + ); + fn authenticate_vote( + ref self: TContractState, + target: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ); + fn authenticate_update_proposal( + ref self: TContractState, + target: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy + ); +// TODO: Should L1 handlers be part of the interface? +} + +#[starknet::contract] +mod EthTxAuthenticator { + use super::IEthTxAuthenticator; + use starknet::{ContractAddress, contract_address_to_felt252}; + use starknet::syscalls::call_contract_syscall; + use core::serde::Serde; + use core::array::{ArrayTrait, SpanTrait}; + use sx::space::space::{ISpaceDispatcher, ISpaceDispatcherTrait}; + use sx::utils::types::{Strategy, IndexedStrategy, Choice}; + use sx::utils::constants::{PROPOSE_SELECTOR, VOTE_SELECTOR, UPDATE_PROPOSAL_SELECTOR}; + + #[storage] + struct Storage { + _starknet_commit_address: felt252, + _commits: LegacyMap:: + } + + #[external(v0)] + impl EthTxAuthenticator of IEthTxAuthenticator { + fn authenticate_propose( + ref self: ContractState, + target: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array + ) { + let mut payload = ArrayTrait::::new(); + target.serialize(ref payload); + PROPOSE_SELECTOR.serialize(ref payload); + author.serialize(ref payload); + execution_strategy.serialize(ref payload); + user_proposal_validation_params.serialize(ref payload); + let payload_hash = poseidon::poseidon_hash_span(payload.span()); + + consume_commit(ref self, payload_hash, contract_address_to_felt252(author)); + + ISpaceDispatcher { + contract_address: target + }.propose(author, execution_strategy, user_proposal_validation_params); + } + + fn authenticate_vote( + ref self: ContractState, + target: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ) { + let mut payload = ArrayTrait::::new(); + target.serialize(ref payload); + VOTE_SELECTOR.serialize(ref payload); + voter.serialize(ref payload); + proposal_id.serialize(ref payload); + choice.serialize(ref payload); + user_voting_strategies.serialize(ref payload); + let payload_hash = poseidon::poseidon_hash_span(payload.span()); + + consume_commit(ref self, payload_hash, contract_address_to_felt252(voter)); + + ISpaceDispatcher { + contract_address: target + }.vote(voter, proposal_id, choice, user_voting_strategies); + } + + fn authenticate_update_proposal( + ref self: ContractState, + target: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy + ) { + let mut payload = ArrayTrait::::new(); + target.serialize(ref payload); + UPDATE_PROPOSAL_SELECTOR.serialize(ref payload); + author.serialize(ref payload); + proposal_id.serialize(ref payload); + execution_strategy.serialize(ref payload); + let payload_hash = poseidon::poseidon_hash_span(payload.span()); + + consume_commit(ref self, payload_hash, contract_address_to_felt252(author)); + + ISpaceDispatcher { + contract_address: target + }.update_proposal(author, proposal_id, execution_strategy); + } + } + + #[l1_handler] + fn commit( + ref self: ContractState, from_address: felt252, sender_address: felt252, hash: felt252 + ) { + assert(from_address == self._starknet_commit_address.read(), 'Invalid commit address'); + self._commits.write(hash, sender_address); + } + + fn consume_commit(ref self: ContractState, hash: felt252, sender_address: felt252) { + let committer_address = self._commits.read(hash); + assert(committer_address != 0, 'Commit not found'); + assert(committer_address == sender_address, 'Invalid sender address'); + // Delete the commit to prevent replay attacks. + self._commits.write(hash, 0); + } +} diff --git a/starknet/src/authenticators/vanilla.cairo b/starknet/src/authenticators/vanilla.cairo new file mode 100644 index 00000000..deb22ef0 --- /dev/null +++ b/starknet/src/authenticators/vanilla.cairo @@ -0,0 +1,32 @@ +use starknet::ContractAddress; +use starknet::SyscallResult; + +#[starknet::interface] +trait IVanillaAuthenticator { + fn authenticate( + ref self: TContractState, target: ContractAddress, selector: felt252, data: Array + ); +} + +#[starknet::contract] +mod VanillaAuthenticator { + use super::IVanillaAuthenticator; + use starknet::ContractAddress; + use starknet::syscalls::call_contract_syscall; + use core::array::{ArrayTrait, SpanTrait}; + + #[storage] + struct Storage {} + + #[external(v0)] + impl VanillaAuthenticator of IVanillaAuthenticator { + fn authenticate( + ref self: ContractState, + target: ContractAddress, + selector: felt252, + data: Array + ) { + call_contract_syscall(target, selector, data.span()).unwrap_syscall(); + } + } +} diff --git a/starknet/src/execution_strategies.cairo b/starknet/src/execution_strategies.cairo new file mode 100644 index 00000000..b0973e0c --- /dev/null +++ b/starknet/src/execution_strategies.cairo @@ -0,0 +1,3 @@ +mod vanilla; + +mod simple_quorum; diff --git a/starknet/src/execution_strategies/eth_relayer.cairo b/starknet/src/execution_strategies/eth_relayer.cairo new file mode 100644 index 00000000..464477c2 --- /dev/null +++ b/starknet/src/execution_strategies/eth_relayer.cairo @@ -0,0 +1,36 @@ +#[starknet::contract] +mod EthRelayerExecutionStrategy { + use starknet::syscalls::send_message_to_l1_syscall; + use starknet::info::get_caller_address; + use sx::interfaces::IExecutionStrategy; + use sx::utils::types::{Proposal}; + + #[external(v0)] + impl EthRelayerExecutionStrategy of IExecutionStrategy { + fn execute( + ref self: ContractState, + proposal: Proposal, + votes_for: u256, + votes_against: u256, + votes_abstain: u256, + payload: Array + ) { + let space = get_caller_address(); + + // Decode payload + let l1_destination = payload[0]; + // keccak hash of the proposal execution payload + let execution_hash = u256 { low: payload[2], high: payload[1] }; + + let mut message_payload = ArrayTrait::::new(); + space.serialize(mut message_payload); + proposal.serialize(mut message_payload); + votes_for.serialize(mut message_payload); + votes_against.serialize(mut message_payload); + votes_abstain.serialize(mut message_payload); + execution_hash.serialize(mut message_payload); + + send_message_to_l1_syscall(l1_destination, message_payload); + } + } +} diff --git a/starknet/src/execution_strategies/simple_quorum.cairo b/starknet/src/execution_strategies/simple_quorum.cairo new file mode 100644 index 00000000..c4c0762b --- /dev/null +++ b/starknet/src/execution_strategies/simple_quorum.cairo @@ -0,0 +1,64 @@ +#[starknet::contract] +mod SimpleQuorumExecutionStrategy { + use starknet::ContractAddress; + use starknet::get_caller_address; + use starknet::info; + use zeroable::Zeroable; + use sx::utils::types::{Proposal, FinalizationStatus, ProposalStatus}; + + #[storage] + struct Storage { + _quorum: u256 + } + + #[internal] + fn initializer(ref self: ContractState, quorum: u256) { + self._quorum.write(quorum); + } + + #[internal] + fn get_proposal_status( + self: @ContractState, + proposal: @Proposal, + votes_for: u256, + votes_against: u256, + votes_abstain: u256 + ) -> ProposalStatus { + let accepted = _quorum_reached(self._quorum.read(), votes_for, votes_against, votes_abstain) + & _supported(votes_for, votes_against); + + let timestamp = info::get_block_timestamp(); + if *proposal.finalization_status == FinalizationStatus::Cancelled(()) { + ProposalStatus::Cancelled(()) + } else if *proposal.finalization_status == FinalizationStatus::Executed(()) { + ProposalStatus::Executed(()) + } else if timestamp < *proposal.start_timestamp { + ProposalStatus::VotingDelay(()) + } else if timestamp < *proposal.min_end_timestamp { + ProposalStatus::VotingPeriod(()) + } else if timestamp < *proposal.max_end_timestamp { + if accepted { + ProposalStatus::VotingPeriodAccepted(()) + } else { + ProposalStatus::VotingPeriod(()) + } + } else if accepted { + ProposalStatus::Accepted(()) + } else { + ProposalStatus::Rejected(()) + } + } + + #[internal] + fn _quorum_reached( + quorum: u256, votes_for: u256, votes_against: u256, votes_abstain: u256 + ) -> bool { + let total_votes = votes_for + votes_against + votes_abstain; + total_votes >= quorum + } + + #[internal] + fn _supported(votes_for: u256, votes_against: u256) -> bool { + votes_for > votes_against + } +} diff --git a/starknet/src/execution_strategies/vanilla.cairo b/starknet/src/execution_strategies/vanilla.cairo new file mode 100644 index 00000000..20086844 --- /dev/null +++ b/starknet/src/execution_strategies/vanilla.cairo @@ -0,0 +1,50 @@ +#[starknet::contract] +mod VanillaExecutionStrategy { + use sx::interfaces::IExecutionStrategy; + use sx::utils::types::{Proposal, ProposalStatus}; + use sx::execution_strategies::simple_quorum::SimpleQuorumExecutionStrategy; + + #[storage] + struct Storage { + _num_executed: felt252 + } + + #[external(v0)] + impl VanillaExecutionStrategy of IExecutionStrategy { + fn execute( + ref self: ContractState, + proposal: Proposal, + votes_for: u256, + votes_against: u256, + votes_abstain: u256, + payload: Array + ) { + // TODO: this is probably wrong. + let mut state: SimpleQuorumExecutionStrategy::ContractState = + SimpleQuorumExecutionStrategy::unsafe_new_contract_state(); + + let proposal_status = SimpleQuorumExecutionStrategy::get_proposal_status( + @state, @proposal, votes_for, votes_against, votes_abstain + ); + assert( + (proposal_status == ProposalStatus::Accepted(())) + | (proposal_status == ProposalStatus::VotingPeriodAccepted(())), + 'Invalid Proposal Status' + ); + self._num_executed.write(self._num_executed.read() + 1); + } + } + + #[constructor] + fn constructor(ref self: ContractState, quorum: u256) { + // TODO: temporary until components are released + let mut state: SimpleQuorumExecutionStrategy::ContractState = + SimpleQuorumExecutionStrategy::unsafe_new_contract_state(); + SimpleQuorumExecutionStrategy::initializer(ref state, quorum); + } + + #[view] + fn num_executed(self: @ContractState) -> felt252 { + self._num_executed.read() + } +} diff --git a/starknet/src/external.cairo b/starknet/src/external.cairo new file mode 100644 index 00000000..cadc81b5 --- /dev/null +++ b/starknet/src/external.cairo @@ -0,0 +1 @@ +mod ownable; diff --git a/starknet/src/external/ownable.cairo b/starknet/src/external/ownable.cairo new file mode 100644 index 00000000..3de6e542 --- /dev/null +++ b/starknet/src/external/ownable.cairo @@ -0,0 +1,64 @@ +// OZ ownable module, adding here directly until OZ releases a Scarb package +// Migrated lib to v2 +#[starknet::contract] +mod Ownable { + use starknet::ContractAddress; + use starknet::get_caller_address; + use zeroable::Zeroable; + + #[storage] + struct Storage { + _owner: ContractAddress + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + OwnershipTransferred: OwnershipTransferred + } + + #[derive(Drop, starknet::Event)] + struct OwnershipTransferred { + previous_owner: ContractAddress, + new_owner: ContractAddress + } + + #[internal] + fn initializer(ref self: ContractState) { + let caller: ContractAddress = get_caller_address(); + _transfer_ownership(ref self, caller); + } + + #[internal] + fn assert_only_owner(self: @ContractState) { + let owner: ContractAddress = self._owner.read(); + let caller: ContractAddress = get_caller_address(); + assert(!caller.is_zero(), 'Caller is the zero address'); + assert(caller == owner, 'Caller is not the owner'); + } + + #[internal] + fn owner(self: @ContractState) -> ContractAddress { + self._owner.read() + } + + #[internal] + fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { + assert(!new_owner.is_zero(), 'New owner is the zero address'); + assert_only_owner(@self); + _transfer_ownership(ref self, new_owner); + } + + #[internal] + fn renounce_ownership(ref self: ContractState) { + assert_only_owner(@self); + _transfer_ownership(ref self, Zeroable::zero()); + } + + #[internal] + fn _transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { + let previous_owner: ContractAddress = self._owner.read(); + self._owner.write(new_owner); + self.emit(Event::OwnershipTransferred(OwnershipTransferred { previous_owner, new_owner })); + } +} diff --git a/starknet/src/interfaces.cairo b/starknet/src/interfaces.cairo new file mode 100644 index 00000000..010d25f7 --- /dev/null +++ b/starknet/src/interfaces.cairo @@ -0,0 +1,12 @@ +mod i_voting_strategy; +mod i_execution_strategy; +mod i_proposal_validation_strategy; + +use i_voting_strategy::{IVotingStrategy, IVotingStrategyDispatcher, IVotingStrategyDispatcherTrait}; +use i_execution_strategy::{ + IExecutionStrategy, IExecutionStrategyDispatcher, IExecutionStrategyDispatcherTrait +}; +use i_proposal_validation_strategy::{ + IProposalValidationStrategy, IProposalValidationStrategyDispatcher, + IProposalValidationStrategyDispatcherTrait +}; diff --git a/starknet/src/interfaces/i_execution_strategy.cairo b/starknet/src/interfaces/i_execution_strategy.cairo new file mode 100644 index 00000000..4b5b2f61 --- /dev/null +++ b/starknet/src/interfaces/i_execution_strategy.cairo @@ -0,0 +1,14 @@ +use array::ArrayTrait; +use sx::utils::types::Proposal; + +#[starknet::interface] +trait IExecutionStrategy { + fn execute( + ref self: TContractState, + proposal: Proposal, + votes_for: u256, + votes_against: u256, + votes_abstain: u256, + payload: Array + ); +} diff --git a/starknet/src/interfaces/i_proposal_validation_strategy.cairo b/starknet/src/interfaces/i_proposal_validation_strategy.cairo new file mode 100644 index 00000000..19089af5 --- /dev/null +++ b/starknet/src/interfaces/i_proposal_validation_strategy.cairo @@ -0,0 +1,11 @@ +use starknet::ContractAddress; + +#[starknet::interface] +trait IProposalValidationStrategy { + fn validate( + self: @TContractState, + author: ContractAddress, + params: Array, + userParams: Array + ) -> bool; +} diff --git a/starknet/src/interfaces/i_voting_strategy.cairo b/starknet/src/interfaces/i_voting_strategy.cairo new file mode 100644 index 00000000..f79c7904 --- /dev/null +++ b/starknet/src/interfaces/i_voting_strategy.cairo @@ -0,0 +1,12 @@ +use starknet::ContractAddress; + +#[starknet::interface] +trait IVotingStrategy { + fn get_voting_power( + self: @TContractState, + timestamp: u64, + voter: ContractAddress, + params: Array, + user_params: Array, + ) -> u256; +} diff --git a/starknet/src/lib.cairo b/starknet/src/lib.cairo new file mode 100644 index 00000000..c9ed1620 --- /dev/null +++ b/starknet/src/lib.cairo @@ -0,0 +1,17 @@ +mod space; + +mod proposal_validation_strategies; + +mod authenticators; + +mod execution_strategies; + +mod voting_strategies; + +mod utils; + +mod external; + +mod interfaces; + +mod tests; diff --git a/starknet/src/proposal_validation_strategies.cairo b/starknet/src/proposal_validation_strategies.cairo new file mode 100644 index 00000000..d753bcfe --- /dev/null +++ b/starknet/src/proposal_validation_strategies.cairo @@ -0,0 +1 @@ +mod vanilla; diff --git a/starknet/src/proposal_validation_strategies/vanilla.cairo b/starknet/src/proposal_validation_strategies/vanilla.cairo new file mode 100644 index 00000000..45cedb3b --- /dev/null +++ b/starknet/src/proposal_validation_strategies/vanilla.cairo @@ -0,0 +1,20 @@ +#[starknet::contract] +mod VanillaProposalValidationStrategy { + use sx::interfaces::IProposalValidationStrategy; + use starknet::ContractAddress; + + #[storage] + struct Storage {} + + #[external(v0)] + impl VanillaProposalValidationStrategy of IProposalValidationStrategy { + fn validate( + self: @ContractState, + author: ContractAddress, + params: Array, + userParams: Array + ) -> bool { + true + } + } +} diff --git a/starknet/src/space.cairo b/starknet/src/space.cairo new file mode 100644 index 00000000..ed031d54 --- /dev/null +++ b/starknet/src/space.cairo @@ -0,0 +1,2 @@ +mod space; +use space::Space; diff --git a/starknet/src/space/space.cairo b/starknet/src/space/space.cairo new file mode 100644 index 00000000..a49995c5 --- /dev/null +++ b/starknet/src/space/space.cairo @@ -0,0 +1,605 @@ +use core::traits::Destruct; +use starknet::ContractAddress; +use sx::utils::types::{Strategy, Proposal, IndexedStrategy, Choice}; + +#[starknet::interface] +trait ISpace { + // State + fn owner(self: @TContractState) -> ContractAddress; + fn max_voting_duration(self: @TContractState) -> u64; + fn min_voting_duration(self: @TContractState) -> u64; + fn next_proposal_id(self: @TContractState) -> u256; + fn voting_delay(self: @TContractState) -> u64; + fn authenticators(self: @TContractState, account: ContractAddress) -> bool; + fn voting_strategies(self: @TContractState, index: u8) -> Strategy; + fn active_voting_strategies(self: @TContractState) -> u256; + fn next_voting_strategy_index(self: @TContractState) -> u8; + fn proposal_validation_strategy(self: @TContractState) -> Strategy; + // #[view] + // fn vote_power(proposal_id: u256, choice: u8) -> u256; + // #[view] + // fn vote_registry(proposal_id: u256, voter: ContractAddress) -> bool; + fn proposals(self: @TContractState, proposal_id: u256) -> Proposal; + // #[view] + // fn get_proposal_status(proposal_id: u256) -> u8; + + // Owner Actions + fn set_max_voting_duration(ref self: TContractState, max_voting_duration: u64); + fn set_min_voting_duration(ref self: TContractState, min_voting_duration: u64); + fn set_voting_delay(ref self: TContractState, voting_delay: u64); + fn set_proposal_validation_strategy( + ref self: TContractState, proposal_validation_strategy: Strategy + ); + fn add_voting_strategies(ref self: TContractState, voting_strategies: Array); + fn remove_voting_strategies(ref self: TContractState, voting_strategy_indices: Array); + fn add_authenticators(ref self: TContractState, authenticators: Array); + fn remove_authenticators(ref self: TContractState, authenticators: Array); + fn transfer_ownership(ref self: TContractState, new_owner: ContractAddress); + fn renounce_ownership(ref self: TContractState); + // Actions + fn propose( + ref self: TContractState, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array + ); + fn vote( + ref self: TContractState, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ); + fn execute(ref self: TContractState, proposal_id: u256, execution_payload: Array); + fn update_proposal( + ref self: TContractState, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy + ); + fn cancel_proposal(ref self: TContractState, proposal_id: u256); +} + +#[starknet::contract] +mod Space { + use super::ISpace; + use starknet::{ContractAddress, info, StorageAccess}; + use zeroable::Zeroable; + use array::{ArrayTrait, SpanTrait}; + use clone::Clone; + use option::OptionTrait; + use hash::LegacyHash; + use traits::Into; + + use sx::interfaces::{ + IProposalValidationStrategyDispatcher, IProposalValidationStrategyDispatcherTrait, + IVotingStrategyDispatcher, IVotingStrategyDispatcherTrait, IExecutionStrategyDispatcher, + IExecutionStrategyDispatcherTrait + }; + use sx::utils::{ + types::{ + Choice, FinalizationStatus, Strategy, IndexedStrategy, Proposal, IndexedStrategyTrait, + IndexedStrategyImpl + }, + bits::BitSetter + }; + use sx::external::ownable::Ownable; + + #[storage] + struct Storage { + _max_voting_duration: u64, + _min_voting_duration: u64, + _next_proposal_id: u256, + _voting_delay: u64, + _active_voting_strategies: u256, + _voting_strategies: LegacyMap::, + _next_voting_strategy_index: u8, + _proposal_validation_strategy: Strategy, + _authenticators: LegacyMap::, + _proposals: LegacyMap::, + _vote_power: LegacyMap::<(u256, Choice), u256>, + _vote_registry: LegacyMap::<(u256, ContractAddress), bool>, + } + + #[event] + fn SpaceCreated( + _space: ContractAddress, + _owner: ContractAddress, + _voting_delay: u64, + _min_voting_duration: u64, + _max_voting_duration: u64, + _proposal_validation_strategy: Strategy, + _voting_strategies: Array, + _authenticators: Array + ) {} + + #[event] + fn ProposalCreated( + _proposal_id: u256, _author: ContractAddress, _proposal: Proposal, _payload: Array + ) {} + + #[event] + fn VoteCast( + _proposal_id: u256, _voter: ContractAddress, _choice: Choice, _voting_power: u256 + ) {} + + #[event] + fn ProposalExecuted(_proposal_id: u256) {} + + #[event] + fn ProposalUpdated(_proposal_id: u256, _execution_stategy: Strategy) {} + + #[event] + fn ProposalCancelled(_proposal_id: u256) {} + + fn VotingStrategiesAdded(_new_voting_strategies: Array) {} + + #[event] + fn VotingStrategiesRemoved(_voting_strategy_indices: Array) {} + + #[event] + fn AuthenticatorsAdded(_new_authenticators: Array) {} + + #[event] + fn AuthenticatorsRemoved(_authenticators: Array) {} + + #[event] + fn MaxVotingDurationUpdated(_new_max_voting_duration: u64) {} + + #[event] + fn MinVotingDurationUpdated(_new_min_voting_duration: u64) {} + + #[event] + fn ProposalValidationStrategyUpdated(_new_proposal_validation_strategy: Strategy) {} + + #[event] + fn VotingDelayUpdated(_new_voting_delay: u64) {} + + #[external(v0)] + impl Space of ISpace { + fn propose( + ref self: ContractState, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array + ) { + assert_only_authenticator(@self); + let proposal_id = self._next_proposal_id.read(); + + // Proposal Validation + let proposal_validation_strategy = self._proposal_validation_strategy.read(); + let is_valid = IProposalValidationStrategyDispatcher { + contract_address: proposal_validation_strategy.address + } + .validate( + author, proposal_validation_strategy.params, user_proposal_validation_params + ); + assert(is_valid, 'Proposal is not valid'); + + let snapshot_timestamp = info::get_block_timestamp(); + let start_timestamp = snapshot_timestamp + self._voting_delay.read(); + let min_end_timestamp = start_timestamp + self._min_voting_duration.read(); + let max_end_timestamp = start_timestamp + self._max_voting_duration.read(); + + // TODO: we use a felt252 for the hash despite felts being discouraged + // a new field would just replace the hash. Might be worth casting to a Uint256 though? + let execution_payload_hash = poseidon::poseidon_hash_span( + execution_strategy.clone().params.span() + ); + + let proposal = Proposal { + snapshot_timestamp: snapshot_timestamp, + start_timestamp: start_timestamp, + min_end_timestamp: min_end_timestamp, + max_end_timestamp: max_end_timestamp, + execution_payload_hash: execution_payload_hash, + execution_strategy: execution_strategy.address, + author: author, + finalization_status: FinalizationStatus::Pending(()), + active_voting_strategies: self._active_voting_strategies.read() + }; + + // TODO: Lots of copying, maybe figure out how to pass snapshots to events/storage writers. + self._proposals.write(proposal_id, proposal.clone()); + + self._next_proposal_id.write(proposal_id + u256 { low: 1_u128, high: 0_u128 }); + + ProposalCreated(proposal_id, author, proposal, execution_strategy.params); + } + + fn vote( + ref self: ContractState, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array + ) { + assert_only_authenticator(@self); + let proposal = self._proposals.read(proposal_id); + assert_proposal_exists(@proposal); + + let timestamp = info::get_block_timestamp(); + + assert(timestamp < proposal.max_end_timestamp, 'Voting period has ended'); + assert(timestamp >= proposal.start_timestamp, 'Voting period has not started'); + assert( + proposal.finalization_status == FinalizationStatus::Pending(()), + 'Proposal has been finalized' + ); + assert( + self._vote_registry.read((proposal_id, voter)) == false, 'Voter has already voted' + ); + + let voting_power = _get_cumulative_power( + @self, + voter, + proposal.snapshot_timestamp, + user_voting_strategies, + proposal.active_voting_strategies + ); + + assert(voting_power > u256 { low: 0_u128, high: 0_u128 }, 'User has no voting power'); + self + ._vote_power + .write( + (proposal_id, choice), + self._vote_power.read((proposal_id, choice)) + voting_power + ); + self._vote_registry.write((proposal_id, voter), true); + + VoteCast(proposal_id, voter, choice, voting_power); + } + + fn execute(ref self: ContractState, proposal_id: u256, execution_payload: Array) { + let mut proposal = self._proposals.read(proposal_id); + assert_proposal_exists(@proposal); + + IExecutionStrategyDispatcher { + contract_address: proposal.execution_strategy + } + .execute( + proposal.clone(), + self._vote_power.read((proposal_id, Choice::For(()))), + self._vote_power.read((proposal_id, Choice::Against(()))), + self._vote_power.read((proposal_id, Choice::Abstain(()))), + execution_payload + ); + + proposal.finalization_status = FinalizationStatus::Executed(()); + + self._proposals.write(proposal_id, proposal); + + ProposalExecuted(proposal_id); + } + + fn update_proposal( + ref self: ContractState, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy + ) { + assert_only_authenticator(@self); + let mut proposal = self._proposals.read(proposal_id); + assert_proposal_exists(@proposal); + assert(proposal.author == author, 'Only Author'); + assert(info::get_block_timestamp() < proposal.start_timestamp, 'Voting period started'); + + proposal.execution_strategy = execution_strategy.address; + + proposal + .execution_payload_hash = + poseidon::poseidon_hash_span(execution_strategy.clone().params.span()); + + self._proposals.write(proposal_id, proposal); + + ProposalUpdated(proposal_id, execution_strategy); + } + + fn cancel_proposal(ref self: ContractState, proposal_id: u256) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + let mut proposal = self._proposals.read(proposal_id); + assert_proposal_exists(@proposal); + assert( + proposal.finalization_status == FinalizationStatus::Pending(()), 'Already Finalized' + ); + proposal.finalization_status = FinalizationStatus::Cancelled(()); + self._proposals.write(proposal_id, proposal); + ProposalCancelled(proposal_id); + } + + fn owner(self: @ContractState) -> ContractAddress { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::owner(@state) + } + + fn max_voting_duration(self: @ContractState) -> u64 { + self._max_voting_duration.read() + } + + fn min_voting_duration(self: @ContractState) -> u64 { + self._min_voting_duration.read() + } + + fn next_proposal_id(self: @ContractState) -> u256 { + self._next_proposal_id.read() + } + + fn voting_delay(self: @ContractState) -> u64 { + self._voting_delay.read() + } + + fn authenticators(self: @ContractState, account: ContractAddress) -> bool { + self._authenticators.read(account) + } + + fn voting_strategies(self: @ContractState, index: u8) -> Strategy { + self._voting_strategies.read(index) + } + + fn active_voting_strategies(self: @ContractState) -> u256 { + self._active_voting_strategies.read() + } + + fn next_voting_strategy_index(self: @ContractState) -> u8 { + self._next_voting_strategy_index.read() + } + + fn proposal_validation_strategy(self: @ContractState) -> Strategy { + self._proposal_validation_strategy.read() + } + + + fn proposals(self: @ContractState, proposal_id: u256) -> Proposal { + self._proposals.read(proposal_id) + } + + fn set_max_voting_duration(ref self: ContractState, max_voting_duration: u64) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _set_max_voting_duration(ref self, max_voting_duration); + MaxVotingDurationUpdated(max_voting_duration); + } + + fn set_min_voting_duration(ref self: ContractState, min_voting_duration: u64) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _set_min_voting_duration(ref self, min_voting_duration); + MinVotingDurationUpdated(min_voting_duration); + } + + fn set_voting_delay(ref self: ContractState, voting_delay: u64) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _set_voting_delay(ref self, voting_delay); + VotingDelayUpdated(voting_delay); + } + + fn set_proposal_validation_strategy( + ref self: ContractState, proposal_validation_strategy: Strategy + ) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + // TODO: might be possible to remove need to clone by defining the event or setter on a snapshot. + // Similarly for all non value types. + _set_proposal_validation_strategy(ref self, proposal_validation_strategy.clone()); + ProposalValidationStrategyUpdated(proposal_validation_strategy); + } + + fn add_voting_strategies(ref self: ContractState, voting_strategies: Array) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _add_voting_strategies(ref self, voting_strategies.clone()); + VotingStrategiesAdded(voting_strategies); + } + + fn remove_voting_strategies(ref self: ContractState, voting_strategy_indices: Array) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _remove_voting_strategies(ref self, voting_strategy_indices.clone()); + VotingStrategiesRemoved(voting_strategy_indices); + } + + fn add_authenticators(ref self: ContractState, authenticators: Array) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _add_authenticators(ref self, authenticators.clone()); + AuthenticatorsAdded(authenticators); + } + + fn remove_authenticators(ref self: ContractState, authenticators: Array) { + //TODO: temporary component syntax + let state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + _remove_authenticators(ref self, authenticators.clone()); + AuthenticatorsRemoved(authenticators); + } + + fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) { + //TODO: temporary component syntax + let mut state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + Ownable::transfer_ownership(ref state, new_owner); + } + + fn renounce_ownership(ref self: ContractState) { + //TODO: temporary component syntax + let mut state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::assert_only_owner(@state); + Ownable::renounce_ownership(ref state); + } + } + + #[constructor] + fn constructor( + ref self: ContractState, + _owner: ContractAddress, + _max_voting_duration: u64, + _min_voting_duration: u64, + _voting_delay: u64, + _proposal_validation_strategy: Strategy, + _voting_strategies: Array, + _authenticators: Array, + ) { + //TODO: temporary component syntax + let mut state: Ownable::ContractState = Ownable::unsafe_new_contract_state(); + Ownable::initializer(ref state); + Ownable::transfer_ownership(ref state, _owner); + _set_max_voting_duration(ref self, _max_voting_duration); + _set_min_voting_duration(ref self, _min_voting_duration); + _set_voting_delay(ref self, _voting_delay); + _set_proposal_validation_strategy(ref self, _proposal_validation_strategy.clone()); + _add_voting_strategies(ref self, _voting_strategies.clone()); + _add_authenticators(ref self, _authenticators.clone()); + self._next_proposal_id.write(u256 { low: 1_u128, high: 0_u128 }); + SpaceCreated( + info::get_contract_address(), + _owner, + _voting_delay, + _min_voting_duration, + _max_voting_duration, + _proposal_validation_strategy, + _voting_strategies, + _authenticators + ); + } + + /// + /// Internals + /// + + fn assert_only_authenticator(self: @ContractState) { + let caller: ContractAddress = info::get_caller_address(); + assert(self._authenticators.read(caller), 'Caller is not an authenticator'); + } + + fn assert_proposal_exists(proposal: @Proposal) { + assert(!(*proposal.start_timestamp).is_zero(), 'Proposal does not exist'); + } + + fn _get_cumulative_power( + self: @ContractState, + voter: ContractAddress, + timestamp: u64, + user_strategies: Array, + allowed_strategies: u256 + ) -> u256 { + user_strategies.assert_no_duplicate_indices(); + let mut total_voting_power = u256 { low: 0_u128, high: 0_u128 }; + let mut i = 0_usize; + loop { + if i >= user_strategies.len() { + break (); + } + let strategy_index = user_strategies.at(i).index; + assert(allowed_strategies.is_bit_set(*strategy_index), 'Invalid strategy index'); + let strategy = self._voting_strategies.read(*strategy_index); + total_voting_power += IVotingStrategyDispatcher { + contract_address: strategy.address + } + .get_voting_power( + timestamp, voter, strategy.params, user_strategies.at(i).params.clone() + ); + i += 1; + }; + total_voting_power + } + + fn _set_max_voting_duration(ref self: ContractState, _max_voting_duration: u64) { + self._max_voting_duration.write(_max_voting_duration); + } + + fn _set_min_voting_duration(ref self: ContractState, _min_voting_duration: u64) { + self._min_voting_duration.write(_min_voting_duration); + } + + fn _set_voting_delay(ref self: ContractState, _voting_delay: u64) { + self._voting_delay.write(_voting_delay); + } + + fn _set_proposal_validation_strategy( + ref self: ContractState, _proposal_validation_strategy: Strategy + ) { + self._proposal_validation_strategy.write(_proposal_validation_strategy); + } + + fn _add_voting_strategies(ref self: ContractState, _voting_strategies: Array) { + let mut cachedActiveVotingStrategies = self._active_voting_strategies.read(); + let mut cachedNextVotingStrategyIndex = self._next_voting_strategy_index.read(); + assert( + cachedNextVotingStrategyIndex.into() < 256_u32 - _voting_strategies.len(), + 'Exceeds Voting Strategy Limit' + ); + let mut _voting_strategies_span = _voting_strategies.span(); + let mut i = 0_usize; + loop { + if i >= _voting_strategies.len() { + break (); + } + + let strategy = _voting_strategies_span.pop_front().unwrap().clone(); + assert(!strategy.address.is_zero(), 'Invalid voting strategy'); + cachedActiveVotingStrategies.set_bit(cachedNextVotingStrategyIndex, true); + self._voting_strategies.write(cachedNextVotingStrategyIndex, strategy); + cachedNextVotingStrategyIndex += 1_u8; + i += 1; + }; + self._active_voting_strategies.write(cachedActiveVotingStrategies); + self._next_voting_strategy_index.write(cachedNextVotingStrategyIndex); + } + + fn _remove_voting_strategies(ref self: ContractState, _voting_strategies: Array) { + let mut cachedActiveVotingStrategies = self._active_voting_strategies.read(); + let mut _voting_strategies_span = _voting_strategies.span(); + let mut i = 0_usize; + loop { + if i >= _voting_strategies.len() { + break (); + } + + let index = _voting_strategies_span.pop_front().unwrap(); + cachedActiveVotingStrategies.set_bit(*index, false); + i += 1; + }; + + if cachedActiveVotingStrategies == 0 { + panic_with_felt252('No active voting strategy left'); + } + + self._active_voting_strategies.write(cachedActiveVotingStrategies); + } + + fn _add_authenticators(ref self: ContractState, _authenticators: Array) { + let mut _authenticators_span = _authenticators.span(); + let mut i = 0_usize; + loop { + if i >= _authenticators.len() { + break (); + } + self._authenticators.write(*_authenticators_span.pop_front().unwrap(), true); + i += 1; + } + } + + fn _remove_authenticators(ref self: ContractState, _authenticators: Array) { + let mut _authenticators_span = _authenticators.span(); + let mut i = 0_usize; + loop { + if i >= _authenticators.len() { + break (); + } + self._authenticators.write(*_authenticators_span.pop_front().unwrap(), false); + i += 1; + } + } +} + diff --git a/starknet/src/tests.cairo b/starknet/src/tests.cairo new file mode 100644 index 00000000..9a42be97 --- /dev/null +++ b/starknet/src/tests.cairo @@ -0,0 +1,3 @@ +mod test_space; + +mod mocks; diff --git a/starknet/src/tests/mocks.cairo b/starknet/src/tests/mocks.cairo new file mode 100644 index 00000000..bfb307d0 --- /dev/null +++ b/starknet/src/tests/mocks.cairo @@ -0,0 +1 @@ +mod proposal_validation_always_fail; diff --git a/starknet/src/tests/mocks/proposal_validation_always_fail.cairo b/starknet/src/tests/mocks/proposal_validation_always_fail.cairo new file mode 100644 index 00000000..927c006f --- /dev/null +++ b/starknet/src/tests/mocks/proposal_validation_always_fail.cairo @@ -0,0 +1,20 @@ +#[starknet::contract] +mod AlwaysFailProposalValidationStrategy { + use starknet::ContractAddress; + + #[storage] + struct Storage {} + + #[external(v0)] + #[generate_trait] + impl AlwaysFailProposalValidationStrategy of IAlwaysFailProposalValidationStrategy { + fn validate( + self: @ContractState, + author: ContractAddress, + params: Array, + userParams: Array + ) -> bool { + false + } + } +} diff --git a/starknet/src/tests/test_space.cairo b/starknet/src/tests/test_space.cairo new file mode 100644 index 00000000..230e3f94 --- /dev/null +++ b/starknet/src/tests/test_space.cairo @@ -0,0 +1,366 @@ +#[cfg(test)] +mod tests { + use array::ArrayTrait; + use starknet::{ + class_hash::Felt252TryIntoClassHash, ContractAddress, syscalls::deploy_syscall, testing, + contract_address_const, info + }; + use traits::{Into, TryInto}; + use result::ResultTrait; + use option::OptionTrait; + use integer::u256_from_felt252; + use clone::Clone; + use debug::PrintTrait; + use serde::{Serde}; + + use sx::space::space::{Space, ISpaceDispatcher, ISpaceDispatcherTrait}; + use sx::authenticators::vanilla::{ + VanillaAuthenticator, IVanillaAuthenticatorDispatcher, IVanillaAuthenticatorDispatcherTrait + }; + use sx::execution_strategies::vanilla::VanillaExecutionStrategy; + use sx::voting_strategies::vanilla::VanillaVotingStrategy; + use sx::proposal_validation_strategies::vanilla::VanillaProposalValidationStrategy; + use sx::tests::mocks::proposal_validation_always_fail::AlwaysFailProposalValidationStrategy; + use sx::utils::types::{Strategy, IndexedStrategy, Choice, FinalizationStatus, Proposal}; + use sx::utils::constants::{PROPOSE_SELECTOR, VOTE_SELECTOR, UPDATE_PROPOSAL_SELECTOR}; + + use Space::Space as SpaceImpl; + fn setup( + deployer: ContractAddress + ) -> (ContractAddress, ContractAddress, Strategy, ContractAddress) { + testing::set_caller_address(deployer); + testing::set_contract_address(deployer); + + // Space Settings + let owner = contract_address_const::<0x123456789>(); + let max_voting_duration = 2_u64; + let min_voting_duration = 1_u64; + let voting_delay = 1_u64; + let quorum = u256_from_felt252(1); + + // Deploy Vanilla Authenticator + let (vanilla_authenticator_address, _) = deploy_syscall( + VanillaAuthenticator::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let mut authenticators = ArrayTrait::::new(); + authenticators.append(vanilla_authenticator_address); + + // Deploy Vanilla Proposal Validation Strategy + let (vanilla_proposal_validation_address, _) = deploy_syscall( + VanillaProposalValidationStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let vanilla_proposal_validation_strategy = Strategy { + address: vanilla_proposal_validation_address, params: ArrayTrait::::new() + }; + + // Deploy Vanilla Voting Strategy + let (vanilla_voting_strategy_address, _) = deploy_syscall( + VanillaVotingStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let mut voting_strategies = ArrayTrait::::new(); + voting_strategies + .append( + Strategy { + address: vanilla_voting_strategy_address, params: ArrayTrait::::new() + } + ); + + // Deploy Vanilla Execution Strategy + let mut constructor_calldata = ArrayTrait::::new(); + quorum.serialize(ref constructor_calldata); + let (vanilla_execution_strategy_address, _) = deploy_syscall( + VanillaExecutionStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + constructor_calldata.span(), + false + ) + .unwrap(); + let vanilla_execution_strategy = Strategy { + address: vanilla_execution_strategy_address, params: ArrayTrait::::new() + }; + + // Deploy Space + let mut constructor_calldata = array::ArrayTrait::::new(); + constructor_calldata.append(owner.into()); + constructor_calldata.append(max_voting_duration.into()); + constructor_calldata.append(min_voting_duration.into()); + constructor_calldata.append(voting_delay.into()); + vanilla_proposal_validation_strategy.serialize(ref constructor_calldata); + voting_strategies.serialize(ref constructor_calldata); + authenticators.serialize(ref constructor_calldata); + + let (space_address, _) = deploy_syscall( + Space::TEST_CLASS_HASH.try_into().unwrap(), 0, constructor_calldata.span(), false + ) + .unwrap(); + + (space_address, vanilla_authenticator_address, vanilla_execution_strategy, owner) + } + + #[test] + #[available_gas(100000000)] + fn test_constructor() { + let deployer = contract_address_const::<0x1234>(); + + testing::set_caller_address(deployer); + testing::set_contract_address(deployer); + + // Space Settings + let owner = contract_address_const::<0x123456789>(); + let max_voting_duration = 2_u64; + let min_voting_duration = 1_u64; + let voting_delay = 1_u64; + + // Deploy Vanilla Authenticator + let (vanilla_authenticator_address, _) = deploy_syscall( + VanillaAuthenticator::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let mut authenticators = ArrayTrait::::new(); + authenticators.append(vanilla_authenticator_address); + + // Deploy Vanilla Proposal Validation Strategy + let (vanilla_proposal_validation_address, _) = deploy_syscall( + VanillaProposalValidationStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let vanilla_proposal_validation_strategy = Strategy { + address: vanilla_proposal_validation_address, params: ArrayTrait::::new() + }; + + // Deploy Vanilla Voting Strategy + let (vanilla_voting_strategy_address, _) = deploy_syscall( + VanillaVotingStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + let mut voting_strategies = ArrayTrait::::new(); + voting_strategies + .append( + Strategy { + address: vanilla_voting_strategy_address, params: ArrayTrait::::new() + } + ); + + // Deploy Space + let mut constructor_calldata = array::ArrayTrait::::new(); + constructor_calldata.append(owner.into()); + constructor_calldata.append(max_voting_duration.into()); + constructor_calldata.append(min_voting_duration.into()); + constructor_calldata.append(voting_delay.into()); + vanilla_proposal_validation_strategy.serialize(ref constructor_calldata); + voting_strategies.serialize(ref constructor_calldata); + authenticators.serialize(ref constructor_calldata); + + let (space_address, _) = deploy_syscall( + Space::TEST_CLASS_HASH.try_into().unwrap(), 0, constructor_calldata.span(), false + ) + .unwrap(); + + let space = ISpaceDispatcher { contract_address: space_address }; + + assert(space.owner() == owner, 'owner incorrect'); + assert(space.max_voting_duration() == max_voting_duration, 'max incorrect'); + assert(space.min_voting_duration() == min_voting_duration, 'min incorrect'); + assert(space.voting_delay() == voting_delay, 'voting delay incorrect'); + assert( + space.proposal_validation_strategy() == vanilla_proposal_validation_strategy, + 'proposal validation incorrect' + ); + } + + #[test] + #[available_gas(10000000000)] + fn test__propose_update_vote_execute() { + let relayer = contract_address_const::<0x1234>(); + let (space_address, vanilla_authenticator_address, vanilla_execution_strategy, owner) = + setup( + relayer + ); + let space = ISpaceDispatcher { contract_address: space_address }; + let authenticator = IVanillaAuthenticatorDispatcher { + contract_address: vanilla_authenticator_address + }; + + let author = contract_address_const::<0x5678>(); + let mut propose_calldata = array::ArrayTrait::::new(); + author.serialize(ref propose_calldata); + vanilla_execution_strategy.serialize(ref propose_calldata); + ArrayTrait::::new().serialize(ref propose_calldata); + + // Create Proposal + authenticator.authenticate(space_address, PROPOSE_SELECTOR, propose_calldata); + + assert( + space.next_proposal_id() == u256 { low: 2_u128, high: 0_u128 }, + 'next_proposal_id should be 2' + ); + + let proposal = space.proposals(u256_from_felt252(1)); + let expected_proposal = Proposal { + snapshot_timestamp: info::get_block_timestamp(), + start_timestamp: info::get_block_timestamp() + 1_u64, + min_end_timestamp: info::get_block_timestamp() + 2_u64, + max_end_timestamp: info::get_block_timestamp() + 3_u64, + execution_payload_hash: poseidon::poseidon_hash_span( + vanilla_execution_strategy.clone().params.span() + ), + execution_strategy: vanilla_execution_strategy.address, + author: author, + finalization_status: FinalizationStatus::Pending(()), + active_voting_strategies: u256_from_felt252(1) + }; + assert(proposal == expected_proposal, 'proposal state'); + + // Update Proposal + let mut update_calldata = array::ArrayTrait::::new(); + author.serialize(ref update_calldata); + let proposal_id = u256_from_felt252(1); + proposal_id.serialize(ref update_calldata); + // Keeping the same execution strategy contract but changing the payload + let mut new_payload = ArrayTrait::::new(); + new_payload.append(1); + let execution_strategy = Strategy { + address: vanilla_execution_strategy.address, params: new_payload + }; + execution_strategy.serialize(ref update_calldata); + + authenticator.authenticate(space_address, UPDATE_PROPOSAL_SELECTOR, update_calldata); + + // Increasing block timestamp by 1 to pass voting delay + testing::set_block_timestamp(1_u64); + + let mut vote_calldata = array::ArrayTrait::::new(); + vote_calldata.append(contract_address_const::<8765>().into()); + let proposal_id = u256_from_felt252(1); + proposal_id.serialize(ref vote_calldata); + let choice = Choice::For(()); + choice.serialize(ref vote_calldata); + let mut user_voting_strategies = ArrayTrait::::new(); + user_voting_strategies + .append(IndexedStrategy { index: 0_u8, params: ArrayTrait::::new() }); + user_voting_strategies.serialize(ref vote_calldata); + + // Vote on Proposal + authenticator.authenticate(space_address, VOTE_SELECTOR, vote_calldata); + + testing::set_block_timestamp(2_u64); + + // Execute Proposal + space.execute(u256_from_felt252(1), vanilla_execution_strategy.params); + } + + #[test] + #[available_gas(100000000)] + #[should_panic(expected: ('Proposal is not valid', 'ENTRYPOINT_FAILED', 'ENTRYPOINT_FAILED'))] + fn test__propose_failed_validation() { + let relayer = contract_address_const::<0x1234>(); + let (space_address, vanilla_authenticator_address, vanilla_execution_strategy, owner) = + setup( + relayer + ); + let space = ISpaceDispatcher { contract_address: space_address }; + let authenticator = IVanillaAuthenticatorDispatcher { + contract_address: vanilla_authenticator_address + }; + assert( + space.next_proposal_id() == u256 { low: 1_u128, high: 0_u128 }, + 'next_proposal_id should be 1' + ); + + // Replace proposal validation strategy with one that always fails + let (strategy_address, _) = deploy_syscall( + AlwaysFailProposalValidationStrategy::TEST_CLASS_HASH.try_into().unwrap(), + 0, + array::ArrayTrait::::new().span(), + false + ) + .unwrap(); + testing::set_caller_address(owner); + testing::set_contract_address(owner); + space + .set_proposal_validation_strategy( + Strategy { address: strategy_address, params: ArrayTrait::::new() } + ); + + let mut propose_calldata = array::ArrayTrait::::new(); + propose_calldata.append(contract_address_const::<5678>().into()); + vanilla_execution_strategy.serialize(ref propose_calldata); + ArrayTrait::::new().serialize(ref propose_calldata); + + // Try to create Proposal + authenticator.authenticate(space_address, PROPOSE_SELECTOR, propose_calldata); + } + + #[test] + #[available_gas(10000000000)] + #[should_panic( + expected: ('Proposal has been finalized', 'ENTRYPOINT_FAILED', 'ENTRYPOINT_FAILED') + )] + fn test__cancel() { + let relayer = contract_address_const::<0x1234>(); + let (space_address, vanilla_authenticator_address, vanilla_execution_strategy, owner) = + setup( + relayer + ); + let space = ISpaceDispatcher { contract_address: space_address }; + let authenticator = IVanillaAuthenticatorDispatcher { + contract_address: vanilla_authenticator_address + }; + + let author = contract_address_const::<0x5678>(); + let mut propose_calldata = array::ArrayTrait::::new(); + author.serialize(ref propose_calldata); + vanilla_execution_strategy.serialize(ref propose_calldata); + ArrayTrait::::new().serialize(ref propose_calldata); + + // Create Proposal + authenticator.authenticate(space_address, PROPOSE_SELECTOR, propose_calldata); + let proposal_id = u256_from_felt252(1); + + // Increasing block timestamp by 1 to pass voting delay + testing::set_block_timestamp(1_u64); + let proposal = space.proposals(proposal_id); + assert(proposal.finalization_status == FinalizationStatus::Pending(()), 'pending'); + + // Cancel Proposal + testing::set_caller_address(owner); + testing::set_contract_address(owner); + space.cancel_proposal(proposal_id); + + let proposal = space.proposals(proposal_id); + assert(proposal.finalization_status == FinalizationStatus::Cancelled(()), 'cancelled'); + + // Try to cast vote on Cancelled Proposal + let mut vote_calldata = array::ArrayTrait::::new(); + vote_calldata.append(contract_address_const::<8765>().into()); + proposal_id.serialize(ref vote_calldata); + let choice = Choice::For(()); + choice.serialize(ref vote_calldata); + let mut user_voting_strategies = ArrayTrait::::new(); + user_voting_strategies + .append(IndexedStrategy { index: 0_u8, params: ArrayTrait::::new() }); + user_voting_strategies.serialize(ref vote_calldata); + authenticator.authenticate(space_address, VOTE_SELECTOR, vote_calldata); + } +} diff --git a/starknet/src/utils.cairo b/starknet/src/utils.cairo new file mode 100644 index 00000000..fc413c73 --- /dev/null +++ b/starknet/src/utils.cairo @@ -0,0 +1,12 @@ +mod types; + +mod bits; + +mod math; + +mod constants; + +mod single_slot_proof; + +mod signatures; + diff --git a/starknet/src/utils/bits.cairo b/starknet/src/utils/bits.cairo new file mode 100644 index 00000000..ba0f16b8 --- /dev/null +++ b/starknet/src/utils/bits.cairo @@ -0,0 +1,32 @@ +use traits::{Into}; +use zeroable::Zeroable; +use integer::{ + Bitwise, U256BitOr, U256BitNot, U8IntoU128, U128IntoFelt252, Felt252IntoU256, BoundedInt +}; +use sx::utils::math::pow; + +trait BitSetter { + fn set_bit(ref self: T, index: u8, bit: bool); + fn is_bit_set(self: T, index: u8) -> bool; +} + +impl U256BitSetter of BitSetter { + /// Sets the bit at the given index to 1. + #[inline(always)] + fn set_bit(ref self: u256, index: u8, bit: bool) { + let mask = pow(u256 { low: 2_u128, high: 0_u128 }, index); + if bit { + self = self | mask; + } else { + self = self & (~mask); + } + } + + /// Returns true if the bit at the given index is set to 1. + #[inline(always)] + fn is_bit_set(self: u256, index: u8) -> bool { + let mask = pow(u256 { low: 2_u128, high: 0_u128 }, index); + (self & mask).is_non_zero() + } +} + diff --git a/starknet/src/utils/constants.cairo b/starknet/src/utils/constants.cairo new file mode 100644 index 00000000..aa119ed5 --- /dev/null +++ b/starknet/src/utils/constants.cairo @@ -0,0 +1,44 @@ +const PROPOSE_SELECTOR: felt252 = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; +const VOTE_SELECTOR: felt252 = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; +const UPDATE_PROPOSAL_SELECTOR: felt252 = + 0x1f93122f646d968b0ce8c1a4986533f8b4ed3f099122381a4f77478a480c2c3; + +const ETHEREUM_PREFIX: u128 = 0x1901; + +// TODO: Decide on contents of Domain +// Name, Version, Chain ID, Verifying Contract +const DOMAIN_TYPEHASH_HIGH: u128 = 0x8b73c3c69bb8fe3d512ecc4cf759cc79; +const DOMAIN_TYPEHASH_LOW: u128 = 0x239f7b179b0ffacaa9a75d522b39400f; + +// Not sure exactly how to define the typehashes. Should we use use Solidity types or Cairo ones? +// keccak256( +// "Propose(ContractAddress space,ContractAddress author,Strategy execution_strategy," +// "uint8[] user_proposal_validation_params,uint256 salt)" +// "Strategy(ContractAddress address,uint8[] params)" +// ) +const PROPOSE_TYPEHASH_HIGH: u128 = 0xb3819ccd8da0765bcd8ddb0565804a77; +const PROPOSE_TYPEHASH_LOW: u128 = 0xf68d3517c389b0125db8929ffa949667; + +// keccak256( +// "Vote(ContractAddress space,ContractAddress voter,Choice choice," +// "IndexedStrategy[] user_voting_strategies)" +// "IndexedStrategy(uint256 index,uint8[] params)" +// ) +const VOTE_TYPEHASH_HIGH: u128 = 0x96d1d90c026a09b7b038acf99c5e292a; +const VOTE_TYPEHASH_LOW: u128 = 0x7b8d480ba77d954029dd696edd6333cc; + +// keccak256( +// "UpdateProposal(ContractAddress space,ContractAddress author,uint256 proposal_id," +// "Strategy execution_strategy)" +// "Strategy(ContractAddress address,uint8[] params)" +// ) +const UPDATE_PROPOSAL_TYPEHASH_HIGH: u128 = 0xe696044e69e092275313905ca33fa3d0; +const UPDATE_PROPOSAL_TYPEHASH_LOW: u128 = 0x2580ebe8785ab31624d10836156f45b3; + +// keccak256("Strategy(ContractAddress address,uint8[] params)") +const STRATEGY_TYPEHASH_HIGH: u128 = 0x0ccb9059759f3ea104c9200ef8a59445; +const STRATEGY_TYPEHASH_LOW: u128 = 0x78d5506febfdb18580ea361801747e63; + +// keccak256("IndexedStrategy(uint256 index,uint8[] params)") +const INDEXED_STRATEGY_TYPEHASH_HIGH: u128 = 0x894665428ec742c74109dc21d320d1ab; +const INDEXED_STRATEGY_TYPEHASH_LOW: u128 = 0x8b36195eec0090e913c01e7534729c74; diff --git a/starknet/src/utils/math.cairo b/starknet/src/utils/math.cairo new file mode 100644 index 00000000..535bc3ac --- /dev/null +++ b/starknet/src/utils/math.cairo @@ -0,0 +1,48 @@ +use zeroable::Zeroable; +use traits::Into; + +impl U64Zeroable of Zeroable { + fn zero() -> u64 { + 0 + } + #[inline(always)] + fn is_zero(self: u64) -> bool { + self == U64Zeroable::zero() + } + #[inline(always)] + fn is_non_zero(self: u64) -> bool { + self != U64Zeroable::zero() + } +} + +fn pow(base: u256, mut exp: u8) -> u256 { + let mut res = u256 { low: 1_u128, high: 0_u128 }; + loop { + if exp == 0 { + break res; + } else { + res = base * res; + } + exp = exp - 1; + } +} + +fn pow_u128(base: u128, mut exp: u8) -> u128 { + let mut res = 1_u128; + loop { + if exp == 0 { + break res; + } else { + res = base * res; + } + exp = exp - 1; + } +} + + +fn u64s_into_u256(word1: u64, word2: u64, word3: u64, word4: u64) -> u256 { + // TODO: use consts when supported + let word1_shifted = word1.into() * pow_u128(2_u128, 64_u8); + let word3_shifted = word3.into() * pow_u128(2_u128, 64_u8); + u256 { low: word1_shifted + word2.into(), high: word3_shifted + word4.into() } +} diff --git a/starknet/src/utils/signatures.cairo b/starknet/src/utils/signatures.cairo new file mode 100644 index 00000000..3710788d --- /dev/null +++ b/starknet/src/utils/signatures.cairo @@ -0,0 +1,244 @@ +use starknet::{ContractAddress, contract_address_to_felt252}; +use array::{ArrayTrait, SpanTrait}; +use traits::Into; +use clone::Clone; +use starknet::secp256k1; +use core::keccak; +use integer::u256_from_felt252; +use sx::utils::types::{Strategy, IndexedStrategy, Choice, Felt252ArrayIntoU256Array}; +use sx::utils::math::pow; +use sx::utils::constants::{ + DOMAIN_TYPEHASH_LOW, DOMAIN_TYPEHASH_HIGH, ETHEREUM_PREFIX, STRATEGY_TYPEHASH_LOW, + STRATEGY_TYPEHASH_HIGH, INDEXED_STRATEGY_TYPEHASH_LOW, INDEXED_STRATEGY_TYPEHASH_HIGH, + PROPOSE_TYPEHASH_LOW, PROPOSE_TYPEHASH_HIGH, VOTE_TYPEHASH_LOW, VOTE_TYPEHASH_HIGH, + UPDATE_PROPOSAL_TYPEHASH_LOW, UPDATE_PROPOSAL_TYPEHASH_HIGH +}; + +impl ContractAddressIntoU256 of Into { + fn into(self: ContractAddress) -> u256 { + u256_from_felt252(contract_address_to_felt252(self)) + } +} + +trait KeccakTypeHash { + fn hash(self: T) -> u256; +} + +impl KeccakTypeHashStrategy of KeccakTypeHash { + fn hash(self: Strategy) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data.append(u256 { low: STRATEGY_TYPEHASH_LOW, high: STRATEGY_TYPEHASH_HIGH }); + encoded_data.append(self.address.into()); + encoded_data.append(self.params.hash()); + keccak::keccak_u256s_le_inputs(encoded_data.span()) + } +} + +impl KeccakTypeHashArray of KeccakTypeHash> { + fn hash(self: Array) -> u256 { + // cast u8 array to u256 array so that each member is 32 bytes + let mut encoded_data: Array = self.into(); + // TODO: little or big endian? + keccak::keccak_u256s_le_inputs(encoded_data.span()) + } +} + +impl KeccakTypeHashIndexedStrategy of KeccakTypeHash { + fn hash(self: IndexedStrategy) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data + .append( + u256 { low: INDEXED_STRATEGY_TYPEHASH_LOW, high: INDEXED_STRATEGY_TYPEHASH_HIGH } + ); + let index_felt: felt252 = self.index.into(); + encoded_data.append(index_felt.into()); + encoded_data.append(self.params.hash()); + keccak::keccak_u256s_le_inputs(encoded_data.span()) + } +} + +impl KeccakTypeHashIndexedStrategyArray of KeccakTypeHash> { + fn hash(self: Array) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + let mut i: usize = 0; + loop { + if i >= self.len() { + break (); + } + encoded_data.append(self.at(i).clone().hash()); + }; + keccak::keccak_u256s_le_inputs(encoded_data.span()) + } +} + + +// Reverts if the signature was not signed by the author. +fn verify_propose_sig( + r: u256, + s: u256, + v: u256, + domain_hash: u256, + target: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array, + salt: u256, +) { + let digest: u256 = get_propose_digest( + domain_hash, target, author, execution_strategy, user_proposal_validation_params, salt + ); +// TODO: Actually verify the signature when it gets added +// secp256k1::verify_eth_signature(digest, r, s, v, author); +} + +fn verify_vote_sig( + r: u256, + s: u256, + v: u256, + domain_hash: u256, + target: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array +) { + let digest: u256 = get_vote_digest( + domain_hash, target, voter, proposal_id, choice, user_voting_strategies + ); +// TODO: Actually verify the signature when it gets added +// secp256k1::verify_eth_signature(digest, r, s, v, voter); +} + +fn verify_update_proposal_sig( + r: u256, + s: u256, + v: u256, + domain_hash: u256, + target: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy, + salt: u256 +) { + let digest: u256 = get_update_proposal_digest( + domain_hash, target, author, proposal_id, execution_strategy, salt + ); +// TODO: Actually verify the signature when it gets added +// secp256k1::verify_eth_signature(digest, r, s, v, author); +} + + +fn get_propose_digest( + domain_hash: u256, + space: ContractAddress, + author: ContractAddress, + execution_strategy: Strategy, + user_proposal_validation_params: Array, + salt: u256 +) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data.append(u256 { low: PROPOSE_TYPEHASH_LOW, high: PROPOSE_TYPEHASH_HIGH }); + encoded_data.append(space.into()); + encoded_data.append(author.into()); + encoded_data.append(execution_strategy.hash()); + encoded_data.append(user_proposal_validation_params.hash()); + encoded_data.append(salt); + let message_hash = keccak::keccak_u256s_le_inputs(encoded_data.span()); + hash_typed_data(domain_hash, message_hash) +} + +fn get_vote_digest( + domain_hash: u256, + space: ContractAddress, + voter: ContractAddress, + proposal_id: u256, + choice: Choice, + user_voting_strategies: Array +) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data.append(u256 { low: VOTE_TYPEHASH_LOW, high: VOTE_TYPEHASH_HIGH }); + encoded_data.append(space.into()); + encoded_data.append(voter.into()); + encoded_data.append(proposal_id); + encoded_data.append(choice.into()); + encoded_data.append(user_voting_strategies.hash()); + let message_hash = keccak::keccak_u256s_le_inputs(encoded_data.span()); + hash_typed_data(domain_hash, message_hash) +} + +fn get_update_proposal_digest( + domain_hash: u256, + space: ContractAddress, + author: ContractAddress, + proposal_id: u256, + execution_strategy: Strategy, + salt: u256 +) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data + .append(u256 { low: UPDATE_PROPOSAL_TYPEHASH_LOW, high: UPDATE_PROPOSAL_TYPEHASH_HIGH }); + encoded_data.append(space.into()); + encoded_data.append(author.into()); + encoded_data.append(proposal_id); + encoded_data.append(execution_strategy.hash()); + encoded_data.append(salt); + let message_hash = keccak::keccak_u256s_le_inputs(encoded_data.span()); + hash_typed_data(domain_hash, message_hash) +} + +fn get_domain_hash(name: felt252, version: felt252) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data.append(u256 { low: DOMAIN_TYPEHASH_LOW, high: DOMAIN_TYPEHASH_HIGH }); + encoded_data.append(name.into()); + encoded_data.append(version.into()); + // TODO: chain id doesnt seem like its exposed atm, so just dummy value for now + encoded_data.append(u256 { low: 'dummy', high: 0 }); + encoded_data.append(starknet::get_contract_address().into()); + keccak::keccak_u256s_le_inputs(encoded_data.span()) +} + +fn hash_typed_data(domain_hash: u256, message_hash: u256) -> u256 { + let mut encoded_data = ArrayTrait::::new(); + encoded_data.append(domain_hash); + encoded_data.append(message_hash); + let encoded_data = _add_prefix_array(encoded_data, ETHEREUM_PREFIX); + keccak::keccak_u256s_le_inputs(encoded_data.span()) +} + + +// Prefixes a 16 bit prefix to an array of 256 bit values. +fn _add_prefix_array(input: Array, mut prefix: u128) -> Array { + let mut out = ArrayTrait::::new(); + let mut i = 0_usize; + loop { + if i >= input.len() { + // left shift so that the prefix is in the high bits + let prefix_u256 = u256 { low: prefix, high: 0_u128 }; + let shifted_prefix = prefix_u256 * pow(u256 { low: 2_u128, high: 0_u128 }, 112_u8); + out.append(shifted_prefix); + break (); + } + let num = *input.at(i); + let (w1, high_carry) = _add_prefix_u128(num.high, prefix); + let (w0, low_carry) = _add_prefix_u128(num.low, high_carry); + + out.append(u256 { low: w0, high: w1 }); + prefix = low_carry; + i += 1; + }; + out +} + +// prefixes a 16 bit prefix to a 128 bit input, returning the result and a carry if it overflows 128 bits +fn _add_prefix_u128(input: u128, prefix: u128) -> (u128, u128) { + let prefix_u256 = u256 { low: prefix, high: 0_u128 }; + let shifted_prefix = prefix_u256 * pow(u256 { low: 2_u128, high: 0_u128 }, 128_u8); + let with_prefix = u256 { low: input, high: 0_u128 } + shifted_prefix; + let overflow_mask = pow(u256 { low: 2_u128, high: 0_u128 }, 16_u8) - u256 { + low: 1_u128, high: 0_u128 + }; + let carry = with_prefix & overflow_mask; + // Removing the carry and shifting back. The result fits in 128 bits. + let out = ((with_prefix - carry) / pow(u256 { low: 2_u128, high: 0_u128 }, 16_u8)); + (out.low, carry.low) +} diff --git a/starknet/src/utils/single_slot_proof.cairo b/starknet/src/utils/single_slot_proof.cairo new file mode 100644 index 00000000..76853e49 --- /dev/null +++ b/starknet/src/utils/single_slot_proof.cairo @@ -0,0 +1,106 @@ +use core::zeroable::Zeroable; +use array::ArrayTrait; + +// Each word is 64 bits +#[derive(Serde, Option, Drop)] +struct StorageSlot { + word1: felt252, + word2: felt252, + word3: felt252, + word4: felt252 +} + +#[derive(Serde, Option, Drop)] +struct Proofs { + slot: StorageSlot, + proof_size_bytes: Array, + proof_size_words: Array, + proofs_concat: Array +} + +#[starknet::interface] +trait IFactsRegistry { + fn get_storage_uint( + self: @ContractState, + block: felt252, + account_160: felt252, + slot: StorageSlot, + proof_sizes_bytes: Array, + proof_sizes_words: Array, + proofs_concat: Array + ) -> u256; +} + +#[starknet::contract] +mod SingleSlotProof { + use starknet::ContractAddress; + use zeroable::Zeroable; + use array::ArrayTrait; + use serde::Serde; + use option::OptionTrait; + use traits::{Into, TryInto}; + use super::{ + StorageSlot, Proofs, IFactsRegistry, IFactsRegistryDispatcher, IFactsRegistryDispatcherTrait + }; + use sx::utils::math; + + #[storage] + struct Storage { + _facts_registry: ContractAddress + } + + #[internal] + fn initializer(ref self: ContractState, facts_registry: ContractAddress) { + self._facts_registry.write(facts_registry); + } + + #[internal] + fn get_mapping_slot_key(slot_index: u256, mapping_key: u256) -> u256 { + let mut encoded_array = ArrayTrait::::new(); + encoded_array.append(mapping_key); + encoded_array.append(slot_index); + keccak::keccak_u256s_le_inputs(encoded_array.span()) + } + + #[internal] + fn get_storage_slot( + self: @ContractState, + block_number: u64, + contract_address: felt252, + slot_index: u256, + mapping_key: u256, + encoded_proofs: Array + ) -> u256 { + let slot_key = get_mapping_slot_key(slot_index, mapping_key); + let mut s = encoded_proofs.span(); + let proofs: Proofs = Serde::::deserialize(ref s).unwrap(); + + // Check proof corresponds to correct storage slot. + assert( + slot_key == math::u64s_into_u256( + proofs.slot.word1.try_into().unwrap(), + proofs.slot.word2.try_into().unwrap(), + proofs.slot.word3.try_into().unwrap(), + proofs.slot.word4.try_into().unwrap() + ), + 'Invalid Proof' + ); + + let slot_value = IFactsRegistryDispatcher { + contract_address: self._facts_registry.read() + } + .get_storage_uint( + block_number.into(), + contract_address, + proofs.slot, + proofs.proof_size_bytes, + proofs.proof_size_words, + proofs.proofs_concat + ); + + assert(slot_value.is_non_zero(), 'Slot is zero'); + + slot_value + } +} + diff --git a/starknet/src/utils/types.cairo b/starknet/src/utils/types.cairo new file mode 100644 index 00000000..114425d0 --- /dev/null +++ b/starknet/src/utils/types.cairo @@ -0,0 +1,536 @@ +use array::ArrayTrait; +use result::ResultTrait; +use serde::Serde; +use traits::{PartialEq, TryInto, Into}; +use hash::LegacyHash; +use option::OptionTrait; +use clone::Clone; +use integer::{U8IntoU128}; +use starknet::{ + ContractAddress, StorageAccess, StorageBaseAddress, SyscallResult, storage_write_syscall, + storage_read_syscall, storage_address_from_base_and_offset, storage_base_address_from_felt252, + contract_address::Felt252TryIntoContractAddress, syscalls::deploy_syscall, + class_hash::Felt252TryIntoClassHash +}; +use sx::utils::math::pow; + +impl Felt252ArrayIntoU256Array of Into, Array> { + fn into(self: Array) -> Array { + let mut arr = ArrayTrait::::new(); + let mut i = 0_usize; + loop { + if i >= self.len() { + break (); + } + arr.append((*self.at(i)).into()); + i += 1; + }; + arr + } +} + +#[derive(Copy, Drop, Serde)] +enum Choice { + Against: (), + For: (), + Abstain: (), +} + +#[derive(Copy, Drop, Serde, PartialEq)] +enum FinalizationStatus { + Pending: (), + Executed: (), + Cancelled: (), +} + +#[derive(Copy, Drop, Serde, PartialEq)] +enum ProposalStatus { + VotingDelay: (), + VotingPeriod: (), + VotingPeriodAccepted: (), + Accepted: (), + Executed: (), + Rejected: (), + Cancelled: () +} + +impl ChoiceIntoU8 of Into { + fn into(self: Choice) -> u8 { + match self { + Choice::Against(_) => 0_u8, + Choice::For(_) => 1_u8, + Choice::Abstain(_) => 2_u8, + } + } +} + +impl ChoiceIntoU256 of Into { + fn into(self: Choice) -> u256 { + ChoiceIntoU8::into(self).into() + } +} + +impl U8IntoFinalizationStatus of TryInto { + fn try_into(self: u8) -> Option { + if self == 0_u8 { + Option::Some(FinalizationStatus::Pending(())) + } else if self == 1_u8 { + Option::Some(FinalizationStatus::Executed(())) + } else if self == 2_u8 { + Option::Some(FinalizationStatus::Cancelled(())) + } else { + Option::None(()) + } + } +} + +impl FinalizationStatusIntoU8 of Into { + fn into(self: FinalizationStatus) -> u8 { + match self { + FinalizationStatus::Pending(_) => 0_u8, + FinalizationStatus::Executed(_) => 1_u8, + FinalizationStatus::Cancelled(_) => 2_u8, + } + } +} + +impl ProposalStatusIntoU8 of Into { + fn into(self: ProposalStatus) -> u8 { + match self { + ProposalStatus::VotingDelay(_) => 0_u8, + ProposalStatus::VotingPeriod(_) => 1_u8, + ProposalStatus::VotingPeriodAccepted(_) => 2_u8, + ProposalStatus::Accepted(_) => 3_u8, + ProposalStatus::Executed(_) => 4_u8, + ProposalStatus::Rejected(_) => 5_u8, + ProposalStatus::Cancelled(_) => 6_u8, + } + } +} + +impl LegacyHashChoice of LegacyHash { + fn hash(state: felt252, value: Choice) -> felt252 { + LegacyHash::hash(state, ChoiceIntoU8::into(value)) + } +} + +#[derive(Option, Clone, Drop, Serde, StorageAccess)] +struct Strategy { + address: ContractAddress, + params: Array, +} + +impl PartialEqStrategy of PartialEq { + fn eq(lhs: @Strategy, rhs: @Strategy) -> bool { + lhs.address == rhs.address + && poseidon::poseidon_hash_span( + lhs.params.span() + ) == poseidon::poseidon_hash_span(rhs.params.span()) + } + + fn ne(lhs: @Strategy, rhs: @Strategy) -> bool { + !(lhs.clone() == rhs.clone()) + } +} + +#[derive(Option, Clone, Drop, Serde)] +struct IndexedStrategy { + index: u8, + params: Array, +} + +/// NOTE: Using u64 for timestamps instead of u32 which we use in sx-evm. can change if needed. +#[derive(Clone, Drop, Serde, PartialEq, StorageAccess)] +struct Proposal { + snapshot_timestamp: u64, + start_timestamp: u64, + min_end_timestamp: u64, + max_end_timestamp: u64, + execution_payload_hash: felt252, + execution_strategy: ContractAddress, + author: ContractAddress, + finalization_status: FinalizationStatus, + active_voting_strategies: u256 +} + +// TODO: Should eventually be able to derive the StorageAccess trait on the structs and enum +// cant atm as the derive only works for simple structs I think + +impl StorageAccessFinalizationStatus of StorageAccess { + fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult { + StorageAccessFinalizationStatus::read_at_offset_internal(address_domain, base, 0) + } + + fn write( + address_domain: u32, base: StorageBaseAddress, value: FinalizationStatus + ) -> SyscallResult<()> { + StorageAccessFinalizationStatus::write_at_offset_internal(address_domain, base, 0, value) + } + + fn read_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8 + ) -> SyscallResult { + match StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset + ) { + Result::Ok(num) => { + Result::Ok(U8IntoFinalizationStatus::try_into(num).unwrap()) + }, + Result::Err(err) => Result::Err(err) + } + } + + fn write_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8, value: FinalizationStatus + ) -> SyscallResult<()> { + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset, + FinalizationStatusIntoU8::into(value) + ) + } + + fn size_internal(value: FinalizationStatus) -> u8 { + 1_u8 + } +} + +impl StorageAccessProposal of StorageAccess { + fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult { + StorageAccessProposal::read_at_offset_internal(address_domain, base, 0) + } + + fn write(address_domain: u32, base: StorageBaseAddress, value: Proposal) -> SyscallResult<()> { + StorageAccessProposal::write_at_offset_internal(address_domain, base, 0, value) + } + + fn read_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8 + ) -> SyscallResult { + Result::Ok( + Proposal { + snapshot_timestamp: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset + )?, + start_timestamp: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 1_u8).into() + ), + offset + )?, + min_end_timestamp: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 2_u8).into() + ), + offset + )?, + max_end_timestamp: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 3_u8).into() + ), + offset + )?, + execution_payload_hash: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 4_u8).into() + ), + offset + )?, + execution_strategy: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 5_u8).into() + ), + offset + )?, + author: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 6_u8).into() + ), + offset + )?, + finalization_status: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 7_u8).into() + ), + offset + )?, + active_voting_strategies: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 8_u8).into() + ), + offset + )? + } + ) + } + + fn write_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8, value: Proposal + ) -> SyscallResult<()> { + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset, + value.snapshot_timestamp + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 1_u8).into() + ), + offset, + value.start_timestamp + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 2_u8).into() + ), + offset, + value.min_end_timestamp + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 3_u8).into() + ), + offset, + value.max_end_timestamp + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 4_u8).into() + ), + offset, + value.execution_payload_hash + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 5_u8).into() + ), + offset, + value.execution_strategy + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 6_u8).into() + ), + offset, + value.author + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 7_u8).into() + ), + offset, + value.finalization_status + ); + + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 8_u8).into() + ), + offset, + value.active_voting_strategies + ) + } + + fn size_internal(value: Proposal) -> u8 { + 9_u8 + } +} + +impl StorageAccessFelt252Array of StorageAccess> { + fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult> { + StorageAccessFelt252Array::read_at_offset_internal(address_domain, base, 0) + } + + fn write( + address_domain: u32, base: StorageBaseAddress, value: Array + ) -> SyscallResult<()> { + StorageAccessFelt252Array::write_at_offset_internal(address_domain, base, 0, value) + } + + fn read_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, mut offset: u8 + ) -> SyscallResult> { + let mut arr: Array = ArrayTrait::new(); + + // Read the stored array's length. If the length is superior to 255, the read will fail. + let len: u8 = StorageAccess::::read_at_offset_internal(address_domain, base, offset) + .expect('Storage Span too large'); + offset += 1; + + // Sequentially read all stored elements and append them to the array. + let exit = len + offset; + loop { + if offset >= exit { + break; + } + + let value = StorageAccess::::read_at_offset_internal( + address_domain, base, offset + ) + .unwrap(); + arr.append(value); + offset += StorageAccess::::size_internal(value); + }; + + // Return the array. + Result::Ok(arr) + } + + fn write_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, mut offset: u8, mut value: Array + ) -> SyscallResult<()> { + // // Store the length of the array in the first storage slot. + let len: u8 = value.len().try_into().expect('Storage - Span too large'); + StorageAccess::::write_at_offset_internal(address_domain, base, offset, len); + offset += 1; + + // Store the array elements sequentially + loop { + match value.pop_front() { + Option::Some(element) => { + StorageAccess::::write_at_offset_internal( + address_domain, base, offset, element + )?; + offset += StorageAccess::::size_internal(element); + }, + Option::None(_) => { + break Result::Ok(()); + } + }; + } + } + + fn size_internal(value: Array) -> u8 { + if value.len() == 0 { + return 1; + } + 1_u8 + StorageAccess::::size_internal(*value[0]) * value.len().try_into().unwrap() + } +} + +impl StorageAccessStrategy of StorageAccess { + // #[inline(always)] + fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult { + StorageAccessStrategy::read_at_offset_internal(address_domain, base, 0) + } + // #[inline(always)] + fn write(address_domain: u32, base: StorageBaseAddress, value: Strategy) -> SyscallResult<()> { + StorageAccessStrategy::write_at_offset_internal(address_domain, base, 0, value) + } + + fn read_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8 + ) -> SyscallResult { + Result::Ok( + Strategy { + address: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset + )?, + params: StorageAccess::read_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 1_u8).into() + ), + offset + )? + } + ) + } + + fn write_at_offset_internal( + address_domain: u32, base: StorageBaseAddress, offset: u8, value: Strategy + ) -> SyscallResult<()> { + // Write value.address at offset 0 + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 0_u8).into() + ), + offset, + value.address + ); + + // Write value.params at offset 1 + StorageAccess::write_at_offset_internal( + address_domain, + storage_base_address_from_felt252( + storage_address_from_base_and_offset(base, 1_u8).into() + ), + offset, + value.params + ) + } + + fn size_internal(value: Strategy) -> u8 { + // Add 1 for the strategy address + StorageAccess::size_internal(value.params) + 1 + } +} + +trait IndexedStrategyTrait { + fn assert_no_duplicate_indices(self: @Array); +} + +impl IndexedStrategyImpl of IndexedStrategyTrait { + fn assert_no_duplicate_indices(self: @Array) { + if self.len() < 2 { + return (); + } + + let mut bit_map = u256 { low: 0_u128, high: 0_u128 }; + let mut i = 0_usize; + loop { + if i >= self.len() { + break (); + } + // Check that bit at index `strats[i].index` is not set. + let s = pow(u256 { low: 2_u128, high: 0_u128 }, *self.at(i).index); + + assert((bit_map & s) == u256 { low: 1_u128, high: 0_u128 }, 'Duplicate Found'); + // Update aforementioned bit. + bit_map = bit_map | s; + i += 1; + }; + } +} diff --git a/starknet/src/voting_strategies.cairo b/starknet/src/voting_strategies.cairo new file mode 100644 index 00000000..e5266c7b --- /dev/null +++ b/starknet/src/voting_strategies.cairo @@ -0,0 +1,3 @@ +mod vanilla; + +mod eth_balance_of; diff --git a/starknet/src/voting_strategies/eth_balance_of.cairo b/starknet/src/voting_strategies/eth_balance_of.cairo new file mode 100644 index 00000000..50214bba --- /dev/null +++ b/starknet/src/voting_strategies/eth_balance_of.cairo @@ -0,0 +1,49 @@ +#[starknet::contract] +mod EthBalanceOfVotingStrategy { + use traits::Into; + use starknet::ContractAddress; + use sx::interfaces::IVotingStrategy; + use sx::utils::single_slot_proof::SingleSlotProof; + + #[storage] + struct Storage {} + + #[external(v0)] + impl EthBalanceOfVotingStrategy of IVotingStrategy { + fn get_voting_power( + self: @ContractState, + timestamp: u64, + voter: ContractAddress, + params: Array, + user_params: Array, + ) -> u256 { + // Resolve timestamp to block number + //TODO: dummy var for now. Remove when timestamps are replaced with block numbers + let block_number = 1; + + // Decode params + let contract_address = (*params[0]).into(); + let slot_index = (*params[1]).into(); + + // TODO: temporary until components are released + let state: SingleSlotProof::ContractState = + SingleSlotProof::unsafe_new_contract_state(); + + // Get the balance of the voter at the given block number + let balance = SingleSlotProof::get_storage_slot( + @state, block_number, voter.into(), contract_address, slot_index, user_params + ); + balance + } + } + + #[constructor] + fn constructor( + ref self: ContractState, facts_registry: ContractAddress, l1_headers_store: ContractAddress + ) { + // TODO: temporary until components are released + let mut state: SingleSlotProof::ContractState = + SingleSlotProof::unsafe_new_contract_state(); + SingleSlotProof::initializer(ref state, facts_registry); + } +} diff --git a/starknet/src/voting_strategies/vanilla.cairo b/starknet/src/voting_strategies/vanilla.cairo new file mode 100644 index 00000000..3bafa444 --- /dev/null +++ b/starknet/src/voting_strategies/vanilla.cairo @@ -0,0 +1,21 @@ +#[starknet::contract] +mod VanillaVotingStrategy { + use sx::interfaces::IVotingStrategy; + use starknet::ContractAddress; + + #[storage] + struct Storage {} + + #[external(v0)] + impl VanillaVotingStrategy of IVotingStrategy { + fn get_voting_power( + self: @ContractState, + timestamp: u64, + voter: ContractAddress, + params: Array, + user_params: Array, + ) -> u256 { + u256 { low: 1_u128, high: 0_u128 } + } + } +} diff --git a/test/crosschain/EthTxAuth.test.ts b/test/crosschain/EthTxAuth.test.ts deleted file mode 100644 index 9e4f8a35..00000000 --- a/test/crosschain/EthTxAuth.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { expect } from 'chai'; -import { Contract } from 'ethers'; -import { starknet, network, ethers } from 'hardhat'; -import { StarknetContract, Account, HttpNetworkConfig } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { ethTxAuthSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; - -describe('L1 interaction with Snapshot X', function () { - this.timeout(5000000); - const networkUrl: string = (network.config as HttpNetworkConfig).url; - let signer: SignerWithAddress; - let controller: Account; - - // Contracts - let mockStarknetMessaging: Contract; - let space: StarknetContract; - let ethTxAuth: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - let starknetCommit: Contract; - - // Proposal creation parameters - let spaceAddress: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies: string[]; - let userVotingParamsAll: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - before(async function () { - const signers = await ethers.getSigners(); - signer = signers[0]; - - ({ - space, - controller, - ethTxAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - mockStarknetMessaging, - starknetCommit, - } = await ethTxAuthSetup()); - - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerEthAddress = signer.address; - spaceAddress = space.address; - usedVotingStrategies = ['0x0']; - userVotingParamsAll = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - executionParams = []; - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - usedVotingStrategies, - userVotingParamsAll, - executionParams - ); - }); - - it('should create a proposal from an l1 tx', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - // Committing the hash of the payload to the StarkNet Commit L1 contract - await starknetCommit - .connect(signer) - .commit( - ethTxAuth.address, - utils.encoding.getCommit(spaceAddress, PROPOSE_SELECTOR, proposeCalldata) - ); - // Checking that the L1 -> L2 message has been propogated - expect((await starknet.devnet.flush()).consumed_messages.from_l1).to.have.a.lengthOf(1); - // Creating proposal - await controller.invoke(ethTxAuth, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - }); - - it('The same commit should not be able to be executed multiple times', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - await starknetCommit - .connect(signer) - .commit( - ethTxAuth.address, - utils.encoding.getCommit(spaceAddress, PROPOSE_SELECTOR, proposeCalldata) - ); - await starknet.devnet.flush(); - await controller.invoke(ethTxAuth, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - // Second attempt at calling authenticate should fail - try { - await controller.invoke(ethTxAuth, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'committed multiple times' }; - } catch (err: any) { - expect(err.message).to.contain('EthTx: Hash not yet committed or already executed'); - } - }); - - it('Authentication should fail if the correct hash of the payload is not committed on l1 before execution is called', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - await starknetCommit - .connect(signer) - .commit( - ethTxAuth.address, - utils.encoding.getCommit(spaceAddress, VOTE_SELECTOR, proposeCalldata) - ); // Wrong selector - await starknet.devnet.flush(); - try { - await controller.invoke(ethTxAuth, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'succeeded without hash commit' }; - } catch (err: any) { - expect(err.message).to.contain('EthTx: Hash not yet committed or already executed'); - } - }); - - it('Authentication should fail if the commit sender address is not equal to the address in the payload', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - proposeCalldata[0] = ethers.Wallet.createRandom().address; // Random l1 address in the calldata - await starknetCommit - .connect(signer) - .commit( - ethTxAuth.address, - utils.encoding.getCommit(spaceAddress, PROPOSE_SELECTOR, proposeCalldata) - ); - await starknet.devnet.flush(); - try { - await controller.invoke(ethTxAuth, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'succeeded with invalid commit sender' }; - } catch (err: any) { - expect(err.message).to.contain('EthTx: Commit made by invalid L1 address'); - } - }); -}); diff --git a/test/crosschain/EthTxSessionKeyAuth.test.ts b/test/crosschain/EthTxSessionKeyAuth.test.ts deleted file mode 100644 index 5ac27fe5..00000000 --- a/test/crosschain/EthTxSessionKeyAuth.test.ts +++ /dev/null @@ -1,366 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { expect } from 'chai'; -import { Contract } from 'ethers'; -import { starknet, network, ethers } from 'hardhat'; -import { ec, typedData, hash, Signer } from 'starknet'; -import { StarknetContract, Account, HttpNetworkConfig } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { ethTxSessionKeyAuthSetup } from '../shared/setup'; -import { domain } from '../shared/types'; -import * as starkTypes from '../shared/starkTypes'; -import { PROPOSE_SELECTOR } from '../shared/constants'; - -const { computeHashOnElements } = hash; - -function getSessionKeyCommit( - ethAddress: string, - sessionPublicKey: string, - sessionDuration: string -): string { - return computeHashOnElements([ethAddress, sessionPublicKey, sessionDuration]); -} - -function getRevokeSessionKeyCommit(ethAddress: string, sessionPublicKey: string): string { - return computeHashOnElements([ethAddress, sessionPublicKey]); -} - -describe('Ethereum Transaction Session Keys', function () { - this.timeout(5000000); - const networkUrl: string = (network.config as HttpNetworkConfig).url; - let account: SignerWithAddress; - let account2: SignerWithAddress; - - // Contracts - let mockStarknetMessaging: Contract; - let space: StarknetContract; - let ethTxSessionKeyAuth: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - let starknetCommit: Contract; - let controller: Account; - - // Proposal creation parameters - let spaceAddress: string; - let executionHash: string; - let metadataUri: string; - let metadataUriInts: utils.intsSequence.IntsSequence; - let usedVotingStrategies1: string[]; - let usedVotingStrategiesHash1: string; - let userVotingParamsAll1: string[][]; - let userVotingStrategyParamsFlatHash1: string; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Session Keys - let sessionSigner: Signer; - let sessionPublicKey: string; - let sessionDuration: string; - let sessionSigner2: Signer; - let sessionPublicKey2: string; - - before(async function () { - const accounts = await ethers.getSigners(); - account = accounts[0]; - account2 = accounts[1]; - - sessionSigner = new Signer(ec.genKeyPair()); - sessionPublicKey = await sessionSigner.getPubKey(); - sessionDuration = '0x1111'; - - sessionSigner2 = new Signer(ec.genKeyPair()); - sessionPublicKey2 = await sessionSigner2.getPubKey(); - - ({ - space, - controller, - ethTxSessionKeyAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - mockStarknetMessaging, - starknetCommit, - } = await ethTxSessionKeyAuthSetup()); - - metadataUri = 'Hello and welcome to Snapshot X. This is the future of governance.'; - metadataUriInts = utils.intsSequence.IntsSequence.LEFromString(metadataUri); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - spaceAddress = space.address; - - executionParams = ['0x01']; // Random params - executionHash = hash.computeHashOnElements(executionParams); - usedVotingStrategiesHash1 = hash.computeHashOnElements(usedVotingStrategies1); - const userVotingStrategyParamsFlat1 = utils.encoding.flatten2DArray(userVotingParamsAll1); - userVotingStrategyParamsFlatHash1 = hash.computeHashOnElements(userVotingStrategyParamsFlat1); - - proposeCalldata = utils.encoding.getProposeCalldata( - account.address, - metadataUriInts, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - }); - - it('should authorize a session key from an L1 transaction and allow authentication via it', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - // Committing the hash of the payload to the StarkNet Commit L1 contract - await starknetCommit - .connect(account) - .commit( - ethTxSessionKeyAuth.address, - getSessionKeyCommit(account.address, sessionPublicKey, sessionDuration) - ); - // Checking that the L1 -> L2 message has been propagated - expect((await starknet.devnet.flush()).consumed_messages.from_l1).to.have.a.lengthOf(1); - await controller.invoke(ethTxSessionKeyAuth, 'authorizeSessionKeyWithTx', { - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - const { eth_address } = await ethTxSessionKeyAuth.call('getSessionKeyOwner', { - session_public_key: sessionPublicKey, - }); - expect(eth_address).to.deep.equal(BigInt(account.address)); - - // -- Creates the proposal -- - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethTxSessionKeyAuth.address); - const [r, s] = sig; - - console.log('Creating proposal...'); - await controller.invoke(ethTxSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - - // -- Attempts a replay attack on `propose` method -- - // Expected to fail - try { - console.log('Replaying transaction...'); - await controller.invoke(ethTxSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: 'replay attack worked on `propose`' }; - } catch (err: any) { - expect(err.message).to.contain('StarkEIP191: Salt already used'); - } - } - }); - - it('Authorization should fail if the correct hash of the payload is not committed on l1 before execution is called', async () => { - const fakeSessionDuration = '0xffff'; - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - await starknetCommit - .connect(account) - .commit( - ethTxSessionKeyAuth.address, - getSessionKeyCommit(account.address, sessionPublicKey, sessionDuration) - ); - await starknet.devnet.flush(); - try { - await controller.invoke(ethTxSessionKeyAuth, 'authorizeSessionKeyWithTx', { - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: fakeSessionDuration, - }); - throw { message: 'succeeded without hash commit' }; - } catch (err: any) { - expect(err.message).to.contain('EthTx: Hash not yet committed or already executed'); - } - }); - - it('Authorization should fail if the commit sender address is not equal to the address in the payload', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - await starknetCommit - .connect(account2) - .commit( - ethTxSessionKeyAuth.address, - getSessionKeyCommit(account.address, sessionPublicKey, sessionDuration) - ); - await starknet.devnet.flush(); - try { - await controller.invoke(ethTxSessionKeyAuth, 'authorizeSessionKeyWithTx', { - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - throw { message: 'succeeded with invalid commit sender' }; - } catch (err: any) { - expect(err.message).to.contain('EthTx: Commit made by invalid L1 address'); - } - }); - - it('Should allow revoking of a session key via a signature from the session key', async () => { - // -- Revokes Session Key -- - { - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - salt: salt, - }; - const msg: typedData.TypedData = { - types: starkTypes.revokeSessionKeyTypes, - primaryType: 'RevokeSessionKey', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethTxSessionKeyAuth.address); - const [r, s] = sig; - - await controller.invoke(ethTxSessionKeyAuth, 'revokeSessionKeyWithSessionKeySig', { - r: r, - s: s, - salt: salt, - session_public_key: sessionPublicKey, - }); - } - - // -- Checks that the session key can no longer be used - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethTxSessionKeyAuth.address); - const [r, s] = sig; - - try { - console.log('Creating proposal...'); - await controller.invoke(ethTxSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session does not exist'); - } - } - }).timeout(6000000); - - it('Should allow revoking of a session key via a transaction from the owner Ethereum address', async () => { - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - // -- Authenticates the session key -- - { - // Committing the hash of the payload to the StarkNet Commit L1 contract - await starknetCommit - .connect(account) - .commit( - ethTxSessionKeyAuth.address, - getSessionKeyCommit(account.address, sessionPublicKey, sessionDuration) - ); - // Checking that the L1 -> L2 message has been propogated - expect((await starknet.devnet.flush()).consumed_messages.from_l1).to.have.a.lengthOf(1); - await controller.invoke(ethTxSessionKeyAuth, 'authorizeSessionKeyWithTx', { - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - } - - // -- Revokes Session Key -- - { - // Committing the hash of the payload to the StarkNet Commit L1 contract - await starknetCommit - .connect(account) - .commit( - ethTxSessionKeyAuth.address, - getRevokeSessionKeyCommit(account.address, sessionPublicKey) - ); - await starknet.devnet.flush(); - await controller.invoke(ethTxSessionKeyAuth, 'revokeSessionKeyWithOwnerTx', { - session_public_key: sessionPublicKey, - }); - } - - // -- Checks that the session key can no longer be used - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethTxSessionKeyAuth.address); - const [r, s] = sig; - - try { - console.log('Creating proposal...'); - await controller.invoke(ethTxSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session does not exist'); - } - } - }).timeout(6000000); -}); diff --git a/test/crosschain/ZodiacExecution.test.ts b/test/crosschain/ZodiacExecution.test.ts deleted file mode 100644 index ae80ec2e..00000000 --- a/test/crosschain/ZodiacExecution.test.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { expect } from 'chai'; -import { Contract } from 'ethers'; -import hre, { starknet, network } from 'hardhat'; -import { StarknetContract, HttpNetworkConfig, Account, Wallet } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { zodiacRelayerSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; - -const VITALIK_ADDRESS = 'd8da6bf26964af9d7eed9e03e53415d37aa96045'; //removed hex prefix - -// Dummy tx -const tx1: utils.encoding.MetaTransaction = { - to: VITALIK_ADDRESS, - value: 0, - data: '0x11', - operation: 0, - nonce: 0, -}; - -// Dummy tx 2 -const tx2: utils.encoding.MetaTransaction = { - to: VITALIK_ADDRESS, - value: 0, - data: '0x22', - operation: 0, - nonce: 0, -}; - -describe('Create proposal, cast vote, and send execution to l1', function () { - this.timeout(12000000); - const networkUrl: string = (network.config as HttpNetworkConfig).url; - let signer: SignerWithAddress; - let relayerWallet: Wallet; - - // Contracts - let mockStarknetMessaging: Contract; - let space: StarknetContract; - let controller: Account; - let vanillaAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let zodiacRelayer: StarknetContract; - let zodiacModule: Contract; - - // Proposal creation parameters - let spaceAddress: bigint; - let executionHash: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterEthAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let userVotingParamsAll2: string[][]; - let voteCalldata: string[]; - - let txHashes: any; - - before(async function () { - this.timeout(800000); - const signers = await hre.ethers.getSigners(); - signer = signers[0]; - - ({ - space, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - zodiacRelayer, - zodiacModule, - mockStarknetMessaging, - } = await zodiacRelayerSetup()); - - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - ({ executionHash, txHashes } = utils.encoding.createExecutionHash( - [tx1, tx2], - zodiacModule.address, - network.config.chainId! - )); - - proposerEthAddress = signer.address; - spaceAddress = BigInt(space.address); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = zodiacRelayer.address; - executionParams = [ - zodiacModule.address, - utils.splitUint256.SplitUint256.fromHex(executionHash).low, - utils.splitUint256.SplitUint256.fromHex(executionHash).high, - ]; - - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterEthAddress = hre.ethers.Wallet.createRandom().address; - - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('should correctly receive and accept a finalized proposal on l1', async () => { - this.timeout(1200000); - - // -- Creates a proposal -- - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - // -- Casts a vote FOR -- - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - - // // -- Load messaging contract - await starknet.devnet.loadL1MessagingContract(networkUrl, mockStarknetMessaging.address); - // await starknet.devnet.loadL1MessagingContract(networkUrl); - // -- Finalize proposal and send execution hash to L1 -- - - // await controller.invoke(space, 'finalize_proposal', { - // proposal_id: proposalId, - // execution_params: executionParams, - // }); - - // // -- Flush messages and check that communication went well -- - - // const flushL2Response = await starknet.devnet.flush(); - // expect(flushL2Response.consumed_messages.from_l1).to.be.empty; - // const flushL2Messages = flushL2Response.consumed_messages.from_l2; - // expect(flushL2Messages).to.have.a.lengthOf(1); - // expect(BigInt(flushL2Messages[0].from_address)).to.equal(BigInt(zodiacRelayer.address)); - // expect(BigInt(flushL2Messages[0].to_address)).to.equal(BigInt(zodiacModule.address)); - - // // -- Check that l1 can receive the proposal correctly -- - - // const proposalOutcome = BigInt(1); - // const fakeTxHashes = txHashes.slice(0, -1); - // const callerAddress = BigInt(space.address); - // const fakeCallerAddress = BigInt(zodiacRelayer.address); - // const splitExecutionHash = utils.splitUint256.SplitUint256.fromHex(executionHash); - - // // Check that if the tx hash is incorrect, the transaction reverts. - // await expect( - // zodiacModule.receiveProposal( - // callerAddress, - // proposalOutcome, - // splitExecutionHash.low, - // splitExecutionHash.high, - // fakeTxHashes - // ) - // ).to.be.revertedWith('Invalid execution'); - - // // Check that if `proposalOutcome` parameter is incorrect, transaction reverts. - // await expect( - // zodiacModule.receiveProposal( - // callerAddress, - // 0, - // splitExecutionHash.low, - // splitExecutionHash.high, - // txHashes - // ) - // ).to.be.revertedWith('Proposal did not pass'); - - // // Check that if `callerAddress` parameter is incorrect, transaction reverts. - // await expect( - // zodiacModule.receiveProposal( - // fakeCallerAddress, - // proposalOutcome, - // splitExecutionHash.low, - // splitExecutionHash.high, - // txHashes - // ) - // ).to.be.reverted; - - // // Check that it works when provided correct parameters. - // await zodiacModule.receiveProposal( - // callerAddress, - // proposalOutcome, - // splitExecutionHash.low, - // splitExecutionHash.high, - // txHashes - // ); - }); -}); diff --git a/test/data/block.json b/test/data/block.json deleted file mode 100644 index 4d8bf323..00000000 --- a/test/data/block.json +++ /dev/null @@ -1,415 +0,0 @@ -{ - "baseFeePerGas": 99460906499, - "difficulty": "15259886720693604", - "extraData": "0x706f6f6c696e2e636f6d22bc6ba4c48c70fcc2", - "gasLimit": 29999971, - "gasUsed": 29144268, - "hash": "0x387856cf90d498fec80532ae4df987ee2eb32b9ad28bc32eb568f5e51b425d1b", - "logsBloom": "0xdfe64b874dcb398ffe319554fa75df74a1dcdcdffcf7f6e76fbffefffeecf97bdbfd317ffabefffa4efcfbfdda1dfbf75f918a0efe9bfcedfe3feb785fffff7c7f537bef7ef2d7efff7f7789efed6be27ffb25a2affa9bcfbff0be6feb6f59fd1f591fcd5ffef70effddddb2cee4ffedfbabd67b957d5c7f523ff7f7ef9d217cfb8dd71b2e65b3b7fded677fbf0fa3f77cfffdd975aaf8de69efcffef8fdcd2f7fefedbfd9ea6f3fdee3ff9ffd8fbdbb899c4bf9dee6d81fbcbf6a9ebc2b9ff95fdbfc7a6e3961ffbf8efd3bffffdd5fefebef9ff33afe7ef727f5fed6fd6ed3feffe9efbc3678d4f743bfea7df68df3eeebdc577bb3fa767fef9f7fe3b7f6ff", - "miner": "0x8F03f1a3f10c05E7CCcF75C1Fd10168e06659Be7", - "mixHash": "0x73e56d1f7d4eeddaee9dccf301504193af452a510cb4882cf58cb4c450a1ad7c", - "nonce": "0x1212ebf710999805", - "number": 14939489, - "parentHash": "0x128cd36a0f7fbecb082e0301197c0c04311063e5af90fe26f6305aff9ff0c651", - "receiptsRoot": "0x8728ef14b00e7cbdde7c110061b2724afaa73dac2f3afaf7f3154e91c236e3d6", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": 154460, - "stateRoot": "0xa6fc0ca57ec7ce9627695e82d806adc246879018c16079f97e59a3ef034de6a8", - "timestamp": 1654878896, - "totalDifficulty": "51354570627425815849450", - "transactions": [ - "0x68e7ffcfd85c94987a81420b37be17d1d4fd9752ce3d8fe0c2403a1acf371df6", - "0x4de237a880b8df0ee864990168b542afe5088a197d0d42a347292ba820a5045c", - "0x8ae613c6cc267b90cb47f3ed2520c9ea223a43a94fcfb8bfe77662111ce9b8df", - "0xb4c842544456627aa6b6fa3ff8e10d2a8b17918f14fe980ef3c0414087e73da2", - "0xba537af2f1768f4aa18e832a4bad92f6d0dfdb558b74a7b22e73c8d6105ce504", - "0xbdc36000e2896acb0429bfcf8caec3d0102cdb6a020c15d3cabdf1b349ef3988", - "0x4c86dea3fe0e29460010a3dcfa0a69223a94793813211785789388f634327da2", - "0x79e5a3ee037aa757bee0d78734ed3495e0256005ecfc1874e5fdbe6af770575c", - "0x9506a6f0f3380766d374d5e19b249dea52722804348ec1a1efcc782e3e3119ec", - "0xd9786cf114d566ecde50e1d44e62526fcb8e599fda8d7e1e146fb19332bf2135", - "0x217767be180ab6cbc881ae9fb88f1e20f92d6b59943147da1494e92a39122bce", - "0xbc18d277927b110a74751ea5b689d7873a363bd1b39be20690bcb2e32c3aa04a", - "0xabb525988618c99da5f822b5f23790c735e906806d71d15e5624a238f3f61804", - "0x8ea01f09345cd3aeb1ddb48d5fe6dfa0e86e9988074b8d79c9aa968d51b11571", - "0x33f5a9a551affd13eda43a031416ca65fd22cf175832cc0eb1dded967a7fff85", - "0x1e675dc10cc7251ea08abe1490da81c73395b7cc567561a08363fa855b7e0e32", - "0x2c469f9a5853141aaef1734476897899b7c5dd51c6b7ef00641c89ee7877b31e", - "0x1d871f95843754187f289edf0677a1190f4c41681517078e4352e92d5614560e", - "0x188856573490ac7819a4467a0a62fe7c152a775823a23492543e451a6af40ae1", - "0xdab86758d9b6d45d1c7f9e9c6247b92ddcdc998bd7ec557cc3af0c115b5f0b21", - "0x90e22b10e530e2e8e2ea9e533c1ae9400f99a244b8ed72cf80980517c343558f", - "0xd171a5516b1d0b1c8f2de29f2b9c0fabee1f9c3e1c25130b5bfb87ddc6e58dfb", - "0xc37f378dfd0f40966e6a91925957676c3932769412029ae7bb0992cbd9d8b317", - "0x9bf71dbf8475d9753bf0bbed0c7ce00a2f4cbe36f1bb243b5918bbc5a28dac27", - "0x55ff8c3d1918c130843016b9f84c2d2057d23bdaf2f3378a2a18d3c4a6a57b9d", - "0x77e105f99067c8d9e8a485e5258ba94da8aa59e48febab11c6532dfda86590bb", - "0x8e5acd0678d0cb198fdac1851b8e6e6ff9a81e5cd2a748ae8ec536e608d4abac", - "0xedc5bd3a2214315136aa46ab698ee90ca2a0c70f7d86799894cba218c6ab5afc", - "0x195bed424f1144f6da04d48b5dc8cf1f3332a3f7fa25e9b7dafd45b9f4c8d4bb", - "0x3c1b06feb22e3c6182410722596e985855fc2310925f69f78b6ece78e6e5b0ba", - "0xaba419028c801adb3c207bf597bfab8dd30313686536adce51e4c2050901fe13", - "0x986af88e1671268f6bf694f3cb19bd5ab07c908142788387ebb40173c7a796cf", - "0x0e2b839bde7d8d7f6c15c81e381097e2261f94497dd8653a789f45f8d3c1284e", - "0x43a9bc0ef2c6d4fffecdbe949d57a67f5a0233c52190b79251db9264e542efcf", - "0xa4699350d4ca48ea95fd6fac5c7f90d007b56d379ba0d0354b751faaac53223c", - "0xe39d11fa0cfe2777b1efb6e144e9c4264ae0272e837fb425f429aec9cc8f4da3", - "0x76fa7de15779f4eca9623c7d4c42a290407e2725d8588dfe8ac7e7d41e43fbdf", - "0x779cf4c4f0a91ea777df3fe4cad8881772813434b812ddca60423bf8011c08f6", - "0xcf319b0da79b1e651d2f3ffbd0d27cd8222f860e7b11754dce1baf51565985d4", - "0x012fb5604533e257782ee0392837bc718153da0ae266e2e32e4f199660fde02b", - "0x8ad798a655d45d490d9caf78df7833ea324c7f1b49729a36bcda9e151d7e1d43", - "0xeb03216d9d7b1fb5dca8a97a4412a46cb2253e54c4b12a25502f0a2aacc713ed", - "0x19d931713813ca116ab5c2e46ec280089964a71ae1468e227591de04d5b97a34", - "0xebfe6ec1bf4c3e70a05611f27e58b5fcc38c927ea4724562806737eb6ead3096", - "0xf818d433be8bdfa24fdb71b87501073f35247b4e33981ebb49e0f56c24c15ec3", - "0xcaeb9fcf515c4493c7caf451c44744b4b6e15f6c207b01883cf4602bc4372d3b", - "0xfcc7253a228988250a1d7a251d12fc7a0ad8f73b00ac15275e0b05966ce78140", - "0x886ef7496f33c82fe4aad07949735f86dc30ef1fd091f90c178e418492e3bc68", - "0x09feebee898c7ca65a76867e15cf3de54801279e102980ae561d8acf066881fa", - "0x578d83d3eb46a6f84fb2058014c957d2fa8045b0b9657e01d025c8bcb8e70bce", - "0x31904f4d2bfe60213213325334c6b57bdf22f96b7a3b76325624e62b9ea83ae6", - "0xd28d01da6c7171a6f15bb06a13012513ff8829725a88bb1f4f7f840962e05201", - "0xaaa00e1ad29813e01f1d3973459a80e6b2cfe5211c94c64af5623fce48cba92a", - "0x80d111c117cf57b8a149c85ca6771a751bf6e3961255c975c6cabf245c14b65d", - "0x22746085931311fc8b5d618792bee289756a4a9964e541ee5118bbd81d367868", - "0xb16d9677e6b7c333b89f11d1d6c5d9df17f975d96381ad31b06ac052e77b1b02", - "0x45be4e3e828f7fce70d3a4771516754a3b3cfc87311eab8a195df2a00109564d", - "0x7c0f3f8a47e163d2604a5401162e70e79e42fa859bd876a1c0dca5368a5f60d2", - "0x7813a42a3c2330d9b6bc4afd9ae0812792d1ef88f84932848dcc1d8092e3551a", - "0x3de2f720fbae2f529c7bdd691de5a811c39b9fe3e2dafec417537e95966fa0af", - "0x55efb037c4e26d6611286b164a3282014fe691f41ceaacae35bf1136827ed444", - "0xff625b5922ef5111ee423df107c5a1647ff2a7aac0111f9317395c90465c7681", - "0xd1e65fbdf421f4452fab0a0ffc83092bfdd2c3ac567b98a32a8bb8d51e5fb1ff", - "0x9e3b7c9ab367e039c60e5512fa98e92358c7e01da4c3ee728de6b6826596dac4", - "0x71d604fada824a0ccb67235d6eb7ed61c1292bca8905be445f0aa3abc1273bb1", - "0x4cb481c5182d85fb2e2a4fdf76266f6854e02fb7216eda32e6461e889e68bd6f", - "0x6cc38563150affde8ba6ed7efae8d187e2b77dcac845eed51459d9cfd03fb5d1", - "0xb6577007a83aba2b64e532538da8b8338b2ea24974b4cd3cabc5cce294685d6f", - "0xcb30f0f4cb6d5fd481a9bef882e4e3d960393c3c6d0ad606019bf105bdc20e0c", - "0x76880db19973cdaece9dceee9901d5a19fe1ebc4146613abfa531fa726ea3881", - "0x182de9aac53fb0fffc73c18f4ad4487727b562b0a2985a38fcf90de27ee8eef0", - "0x46a108c6f3061498c1257b00e5ed3f825dc05fd274bf0ed25822951c21b064ea", - "0xd65db3141f59cf176fa1b76e3690b55c6fadf8bd2410f417006ff4f41f849ebb", - "0xbdbf0773456c3ea3c97ad7359ae648b12c3c07db89da50f4a7ef9e1d56891d6c", - "0xaf2105846778400b34c112e22f3948c592951d47736ea7aca055604894001587", - "0x935d525c2a0b0f7ca3ef15e58f9be7f1f4259f0a3fc1d773f5a6326e3da93afd", - "0x83763f2d101e8b18f5c8bfe6ee81598e8f0bfa9fbc878968c9a1f5930445497f", - "0xcfe7bb4af2cb5b96811910be98abf174bd6d5a91da46d5f29a9cddea014f723a", - "0x134b09a1dec7c38a1411adfa45ffed5fa0f1d2e8103ff5f3878348be3510523c", - "0x5abbb746178d37400c3558b45a656b299762610e42e9cee9b77e48648c5fdace", - "0x74562fd04f41728b5cc73324db46b0165dc9cc81128cc613c8dcc368523bb6c7", - "0x306c3e125872b6434a1a2d584ed5cd89bdfb1b5ca25e53cf977ce3dfd3778bdb", - "0x65a2c1f8794ab5c5e955460aaddb3ba63369369c3631fcf84994c5079b3ca834", - "0xa2b1592e2fe826856beb50666f0938a8385ed865f7c2a675e0df5946a84a66fa", - "0x4bf50fcf5e0be8c251ff34f01f9fd2da8bf1454dd75132c5eba584d49c927f51", - "0x86ea917312169b653e3112653e7d7c1736f1eeaea0b4f16c42427a103a0cc26d", - "0xaeac1a6eeb4a77232702838686ca55e54f301c28be846fe2b79b69850375a335", - "0x16c16ea041d615de2369c322577bbf62fdedf33c305238c5dfae2515ccb97e00", - "0x9eec282d6278f0863add56acfdb616f76028cff03a77cda5956c8bd7c5f7b372", - "0xfb7b988e90471ac4ddae8f2da2639a7afc3641834c6c34ec9a2ef3c08b2275a1", - "0x034e621da0951ebb51ad1337f4a40233f2b574f64955ae7d9333e794ca850bde", - "0xfbd0332d8482d6ab9d005f6cef7588f336c9d63619b125c556195acd964635a2", - "0xdcf6ebe9ca3d3066138578f1c9f19d537b7f497fa6c562a5bec86aea51f2c93a", - "0xa117490b74370cb722e71e87c8d4fc3f12c46a231b3f559f111baffb0fe6b134", - "0x523a2aebc4c66bf66af240e3ed605af8c6520422f02eba3a73597223c999a414", - "0x83c2864b86aab31d69b0e6e15f73159543fb5fd26f1ee60922a1ea901192ccd7", - "0x8a5dfc053dfb5f5a726fb672fa80d22b89073ab47f4968a528ca834b217f647e", - "0x48c1d631cdfd595d77aa2cba5ea676f356dab60628f3d93ebc26f60b394736ac", - "0x2c833267eb7d93a21cdfabac4f46bc72c0ba65ec934deef4b0e33002503a6078", - "0x31933e29d19391948996f59990459c62cbb669688ec69e70d44a65916f9ae47b", - "0x170d7264d87dffaade22154e3b6cab3ed4239ac2fb85d96b2bcb01b716f1c212", - "0xbeb014795a36303c7cf8ebebea00285297fecb19628e881668bd4df6763eb649", - "0xcf818c58ae7815e13e516326a9ac5aa50bd2250d1d3dd060faffb71246016c18", - "0xd7ba7c1b02fdbd76a222cd976e727328cea4381379f85a73ec0521945c287f21", - "0xa09615e4cbc1a81f957e776943340d04afd088896c03b59607907e01ccc16e55", - "0xc8afc57004a9be086bcf7b06655bc9318c4f20af9eaad6dc4650b49f35614ff7", - "0xbe0c23209d2b025f42674a70acd88ca3dc339016fe9347f28bacae6e6782219a", - "0x5e2c798a67190b3ab48b55fffd2c30a66fe3114686fe18b231d77c08af11a3d2", - "0xc51e9fc7ba94584d3f1fff9eec1302bb3aeff4a34767f14a67ec2c452810b188", - "0x5a45b4eb3d31f18178a5a194ec29b6834cc5e4243c604a57e9aa3577d62f387c", - "0x2b020918f942f0832c0eae4b727c9b9712ee76b46076ef9841f5eb5385763cd6", - "0xdabb0174b257bc17b4c7320904c9cb8597f3f5483fa3188ae73a2d2288e349ba", - "0x6a8cb6b9bf8c478482bab73595f01befc430ce0ed275c505c7f1a56591b1876d", - "0xd8ce5a0db56354ad2cf58f44f70307f4be99533dd437a3d6719264cf9a1a3a4a", - "0x0a84a77ed81dfcad4c89efca0ea607b5773c96a3c1dea20924b0815b71dafff4", - "0xb5072ab7275303b8dcb9a5ccd4e50df408352d5d52200afcbc3b9814004aedd1", - "0x5381115a2144b75cf31e121d745746f4196c9a1e7ec28f41a59071d55837c541", - "0x11d272aad35eb4a1985b4f42bcd11f4c74dd58aa4166b4d6a4fc0e9edf54f6cb", - "0x73d6e9591d76da750f689d7c98c79f2393f119b64c8fef3a91fecbc321f496f5", - "0xc05dd1476e3fb089fb3912823e14f79a8ac5cc2cb6d9ae89f50208a9cf74abc3", - "0xd1be3500205b5ae15981a77fe3817a1c54fd8ef4b753f53c7c6722389b2c911c", - "0xb7291d9cd6d0356673731de0f87541999594286554e89b5ade7773360f95adb8", - "0xb3fc7a4d3638ea6623f47585299108de190769a2469afd1ff9a7300727c0fa01", - "0x8e2bdb0c79434fd9fef9eda4086c8f200e797f7dff401bf09a746346229bae7a", - "0xd18bedebc15d6a3b92fc1407c728d17ae7dbec6fe64634ec64397495f77a4164", - "0xb2cb332e58828fbf0926f94f2b504be49b84328ed934252f8fb5d2c5bae8da27", - "0x207171327e8fde3e56a75c7f935b7c087ff69c91cadf2c0fb407300829cbd5da", - "0x0b4878b92d3c27e85d846b62209afdb6ea3bb98d5240ee9a84bebf4eed94e1f5", - "0x8040670aa5d237812a01c91ee83487cba05133d52519e1370694ceaddaa3b9b7", - "0x2e22bde8c1ae59291b11084c28361f3cfd808a2ad09ac9c697ace6120acee38b", - "0xa112dbe1e9e6003c0655af97474fe097eae3c568afa579cf16ff78473a49f36d", - "0xe7c614af845b9820ef57d8e4fb1c5c75b7eec5e79ab036fed97f0373c113c047", - "0x6febb0c0ecad49584fcd443145c6de3c5fef62ed530ecb4228f5bb9e7f0e03b6", - "0x093845d18821c28477956e87c6f3af8329dc81c861c87a0a79208dc8d14e5e42", - "0xf473df83aea84f1b5a110e053ada68f3cb575c300b0e1ce4ea5e2aee71403336", - "0x762cd05997e8cd549654a2b52670bfc25f48be7ef1cc6acf3607912e8eb834b4", - "0x1b9b4999411bbe7e4b319ddc86581c0f22f72f6786b053ff1cd997fa84746923", - "0x2121d719fe122cf5fd5c2a83d1a120d287cd54e6e9e7aac7e663a0cbfc811a6c", - "0x150cf7552192de57c39c0cd29903993623989dc1b9abbeae56c76c2013229e63", - "0x49e208b85d17820b7e254a71461de9852bf8b551aed23941d863280352165631", - "0xd7b99e7d06821d8e583cadd4e7e8f47590ff04429c1fa104d67c39c6e6415b23", - "0x1a8fd54c490c7d7047d23f06a84b09485a4b582707dfd0bf9b6ae578a7eaf9c5", - "0x89e97ceccd1f997973d39f35afde69e44d47c846e54e7c1736389ac61a1bbfd3", - "0xffac71fde15bce3711277e04a536227b8888272cd0cfd46f56de825828472ce7", - "0xcaa626f3b5ea0e5a0b37011addb03ffc3ccd55d6148d12fdba639d2ac3645c63", - "0xad14e4e2bbedd763420af1bd803a4f9f2e40d9d73b944c009088691b0f5966a7", - "0x9b60a038c60fdd4281547293432279472fcb582d782699ab6d10b5a35c524807", - "0xf8adc5528d6a68b2d06a6194acaf03ca7d36daf62d981844611b6b3a11460b69", - "0xbf591da03a249710d0b1f2d5503fdeede65f26b03968103c1925a9f3847f55ab", - "0x08e44f64585856ef9fa8ccfceb8212965cc78d0d46eaf6f0c62d7e8f4d8e5e14", - "0x5a0e2d169bbec417562c1dc45dc3e484d89d7eac1a9ab176b8fe865e145478fe", - "0xeb6b50508e332a884281c7c91160d72516bbb184b997e839fe864bde095c3dd2", - "0x34702a7eb2be1e00c238541ee43e34b36db72efed86fb31c2095429beb07b8c5", - "0x95480730629792f61cf38cdbdb7569d794e4f43f04ee7c13d3ff15a8f7bb020f", - "0x93d763ba163e951b560f8f6a9540889f9a99b60a360dcb4881613cc107ea0d8b", - "0xdb72af86d9806e25744118caba029e55184478f3cb12ed1b9290fd6253b1c067", - "0xf1003e048ffe39806fc3d13cd78344fae1a63ebe098da8da13414bd650e0a731", - "0x653fcb2d648011a043e3e2f0c57e058193bcebad6d5f1d3b6366ea843a6b8475", - "0xe0fda3d624baf185e3c8fcf7fb619bcb7f2fdff1d427de79c28b076073e24da4", - "0x6ec249f0fa7d0885a8d05c1ca2bd7152717e7c51ab1d40f18c9f8562dc3659e8", - "0xd18893a23358c31ae3c3627d4fd001a48bf701da1fa606cdbe9d7580e6cb5c6f", - "0x38f37bc17efc28a0e6a79f77147e8ea6fa444e306a253df45b5234edcec7cde1", - "0xb08601effb9f32b3b2689b645d4fce79bdec7a8f77a7d7370fd91a3ba09af27f", - "0xd963ca4352bddc0e1089cf4f9d4f0f03a195485b830f61c771fb9ddb4013ea74", - "0x2b22b03a20e3f626a0ceb483a0a1baf371ab0031eea1a7f3a26fe3e1e989caa1", - "0x61df103f63327ee9f1b1e95788772f12dd494f125960939e1a48f5c22f2f9b84", - "0xb71cb5ac7d37752121ecb8786ade81b7898a6d3c1e09fd8e7adbeb92b7754055", - "0x189a572f192a4fa96282da37b5b81f483727d0306baaf9a22fcdaa62142b1814", - "0x612baf7f6483bb54fd1f15af6b69101c06b00f17581045268ccfef69b5792eb9", - "0x4bd8680363d48c2e85d61237de0d8d065243527429ec77572879b44ec3ee9fd4", - "0x0ba30d89a3fa968aea1a2ad0732375cf2608ff31c4e8ab3df2ff4bd09c2d44f1", - "0x1bea96df00e36f9be781ececba0767f481c8d8f7738520d8c69d02e6392ee288", - "0x120336a63cf00125b5852d119639c2ce18c6620520019e4ce90a40383251bf2a", - "0x8d633d0b9521128750f85e4f52cd794f8fc2efef85ba17ccef5f64b3f6a73f5e", - "0x1a260ed25384c200b2517fd8fdbddc4ba725caa3fc9a45ad59b856bfbab5877a", - "0x94a538c77a7f40a3687140490cad7cb48dae90ee6eea70305ff0566c09a06541", - "0x1fd0d5235e7feacf94a551c6142910223fe698647679d8afb18832d4ffd65e8e", - "0x5a276e68d9889b5ab9d1192c4ee08a05ad4fb36caea7d53d10c9c0e647be0cd9", - "0xa6221080fbc3cf570d225dcf95c481a938df44a33728fed20b3dc1574a0557e5", - "0xf44c47e3561b22b51e92e949091c1de0d9d2309369922c211831cdb1c12e2c79", - "0x9583aa856f6ea15eca78a2627a15e2aa7881014d06871ac4d8e69d4583ceca48", - "0x808b7934bda34bceccc4bcbb254ce6ef381f229852c7d44bfb9992c744f65475", - "0x79c6bd652ed782a50d9a4d1ec47c526c94609f23ed26916106fc993420635e0f", - "0x07feea5b62d92065bd15ac625bf531bc1a0a39469de628f25f3a8133927befce", - "0x7a8cb37c0ca56795ad4f31ddeb7d9d000709994b6677dae403df1f293139779d", - "0xaf887f62f585bdb0cab7d9015fd19408f2859b029ea38147b7df2f88ec832e4b", - "0x7556ba215dac3866df9a353b29738bb665f2a6a2d779b2fbda0a0773e559c1bb", - "0x4ebe4c7eabc27975504aa4deb393c6ac235b3069cad3d151a92c0d106a872348", - "0x6ddac551cb250e4e97dff6dfd638f86b48593014f80700cbc93b34e3453d61e5", - "0x75b07a5480ec4250da8b2ad5497c52e7c60ac012cb77f3a90208f95aaabbcd2e", - "0xbc36a949345d158ca7e1e26a09a5a46b7fc85f3aa0ad63db58892f55a990806e", - "0x1946610eb6d750477e54b66c283f6ff3a38face360a844f1a58254dbd80d8860", - "0x8e23e97ba1f9f6d792b1cd60269bab4a5343a5fcf35b795caf373ac4d8b693eb", - "0xbad7599bcae5c8c559ac01db8c8da33c5087c7ce50bae20c149628822eb35b62", - "0xc7c4d22fee568b2508f660592345dc5c398840182834d59df377751d6a8938cb", - "0xae08b23cd37bce380ca4c783ae6a8d9a434a8d63b8e961149cdca06e373afd67", - "0x9553e75d1d4138261a750354a1843c4e5107fa89dc9bb2a05a03c528280f5b7d", - "0xbb0a9178b896653e4f9d2bda39f89f9728c781413542f7c93f5329f5b849b407", - "0xf3d0cdef4df8d19edcc08ebea1905ba31a1acb2e351205a7694d84571bd63045", - "0xc577e452c2fd8d35ab7903bccf973f025b85c23b339de93014c570ded8505ed1", - "0x89847464ec531f1ab16c039f0debb06fb1f49589736fcd34ab8875a877056510", - "0xc06691f5bebc0eaae54bdd491205959ed4b5601facc3b1be91777b158341eb1e", - "0xbb48731e2ff3f08205d734ecc2d5ce33f0b2f5bd1078bccc63b7157be577a41e", - "0xd9af788902806c57288ed11f24c642b0e0d01124bc76d69e8c7a0b36fba2aeaf", - "0xcc3c6c96f78338f25553b70b4acbef5be368dbaf7195423ee64f2380acaf7822", - "0x61b51d5d9ce1ac14d8ff86f12e9c941b6118ba0a41e33105d24d6551e54dab14", - "0xd833432bccf8881b4ee4fa1d40a4ba7003bb08c3e3a727a45a75b14a400426a8", - "0x4f3d17473d065d3e13e1d491dfac7e33a67cf30c3bf8b36f9e3655419dbf65e4", - "0x0b8cee59daf69d65e507a2e2ccb710ec1e094f5c72d240f3f2dff52a02307bff", - "0xb0cb900354770c620020c9834ef5702ad426df023819775a76dc6e740bb387af", - "0xc441350660c8b3e312644b2911a00ac27b2d58a3ef6214f8a87b2c678e6fb270", - "0xb7733befe140d8a816cf7c4f95153dd9d3e12dd0947b7f2789517b99da1c97cb", - "0xa6c90f92203cf9c379987d39a94cb80148e261068b356789216048dfebd7c720", - "0x4da63375a192c967467168b5a040cd263e0905ab63c33b888c78e994cffe3b92", - "0x822579b4311f05b1a492b3fedcfa974a98ab21244fbe5daac2aa5aed175f4a45", - "0xddba80955a36f7723125cef57886105dd852fdd9c759361410236b575b947865", - "0x8cc0db90c6d9d2eca3333f4f03d40caa63e14ad7e41a020675be78bf5056f449", - "0x09368e50b354f5e23dbdf71078051eba215bdca26f2f77a282db697503426230", - "0xfafb8ccc8213c03f2267a28dbf945ce5ca5b5d3f3f6ed8c75091cba1bab6fbdd", - "0xb8db0956df7d47b3ba62718ebfc004fef54c5238034524ba826bdc131222abc4", - "0x3ea3c2905bcd93c153448a9ed7c2c3e2fc1aae31ebbd4c179fcf12adf3567482", - "0xb6307d4241a8d3532c5704dac37c9133453ed98449296b39e12ceabe5cf69179", - "0xcf7b4da5bd4ec575dc5b006486716940622f3900239dcacec7fade7a2ec14956", - "0xf6efe194d285263caa679935cdbae28d55edb60a2435aa23c4b299e82e5431fc", - "0xc11066d05386059f8367045dd2cfe8e8990a5948a2c3c9791a9c085736367c6b", - "0x75e018adeabaa3fe2bd9e801893cf9215f55f1059e1f0292187e95af7cc176c5", - "0x03a89af7f3267d8f154e220356d5788ae79ecfc503070e78a8e6a72b1c22303e", - "0x8b23c79f0d8fd307fd5c7cebde3c0dbb38d0efb7481db3fd1a6c0d9d53c963a9", - "0x3a355b52fd356b119b49ca98a954d55d851d4d50b83e69d7b9d53a0b53c7b633", - "0xf766c0b4e96a2addb73f61f72130166c470a0419df50d9aa17f43ffc9d765cc1", - "0xa003528c62838f5f407ac206d48a0f6b22553b0d5f196ce7d373fdea295d524b", - "0x1a11af1d664c22ca80a26ab7b7345bf73aad92e09877b738fc67c2aa3fe4033c", - "0xfdd4ba320421df4dd65d8ea3d85ceda0d8c8567569e688ca9740781a1c4aa96d", - "0xa2f4aa791b9dc69e53b28287a659d176cda1596dc6e70b94913e1366b09eb69f", - "0x8e1f46217bccb2b018cf306b2e49e11bb9d64e181487115eb444115cfc8220ee", - "0x9585f040c66b126190b91499dd5a16bb4b666fe72e11914212448d015e358478", - "0x15219369268cfbeaf951ea565038c8d78b34ac48dc1124e41314ba9977c8f5a8", - "0x090dfd4e611e3656d1f8070d6b903d04457a4a684026c76e628cd04aedc24d00", - "0x66f76c46b03605e611b7bab76f7a1555f90890858d4d7e43f1ff97d9c1d5b98f", - "0xb400aa1dc748313adca3687265a01c1bb09df2efb8bc5cd8d531024a429831b9", - "0x194a9272c3bc231ccf320b428e536b1b25d4a903deffb0a15c49127aa72dd9e1", - "0xc07e2b7c520d038b39c1d32f31f8362c5139557c979887649e5b06434d9159b4", - "0x5dc11cdecce92120caa7f0bd1564bde1c9e9803d814633728b6adfaee0e8f572", - "0x261113e1c662bc3d25f03e791d1fc5f09c080732bf758ac153cce113e82cfcf8", - "0xb10724c45513d4056a13c81326ff99e7b45145b7c90ebcef6f80a07daf3c4106", - "0x0f1e58db1df68ef420e16b514572c87a7317814c22dbe3671f2741675acc4fdd", - "0x2ca91e8f09ffd5c121f84cc01f71870f3bcd7b1029295b4886a427d7c7dfc333", - "0xc5e9a3d27c3a0c156d849fb2a16cc77643dfef2b82975f2e148f7dba1017c704", - "0xba12f486e957ffda08eb2ea9f0902fa6a3a24c9dcc40239aa580b5473a5824a9", - "0x4e4fa1309548065908493fd868825921fe0e6ee88cdbb3f678f6c13f7f2a6c42", - "0x469e8f44467b149325a8e62ad717b71b3a608bf10042a49e3c7297849efa16b2", - "0x9bf153a656d1d3693b33bcd450261461398491d957186220735f45c0110d3ab6", - "0xdd5d0bce2aa049fefe87f213d8ec7729a033c4371cc0850492c697a5e7c0826e", - "0x90cd0913677e1a2cc84d3a1d34530296a268e1500278112aa2901499b317d7ca", - "0x3330b6ad42834be1b58de1d01e4f304690e7bd3bb6f1262a52097239ca66936e", - "0x0efeb564bdbce9b07f45553e5bb24f212e36687a98ae9390ece573944bea31e3", - "0x4957e4935333b7d04e3613f8306e4a9ea10456dee49b39886368a2bf3630e51b", - "0x4c9eba197ed7fd1a153f8b9438bee045ff2fb9c67fc2e1d9e4934869c176ab9e", - "0xc64df1ccb7fc5e15e133851f6f513b4e276cf2c3b1cea27cae381a9c8e59e1fe", - "0x87c51acfe452981d3c7b96635ec25b2490a9d15691b33d9bb7fae1f91dc4db7b", - "0xab34b65f5f56319a90d87e4dd9264e013870e854e285781580936eaea1bd9a08", - "0x399866d0d1ac3f1f05a6252d5020b86ca3ee23e80708f3931a62911e45ed2ba9", - "0xf18b8000e553e6c54c154e86cc0da034f6f2a8b5c75bf1faa3a5a5d1d5d40f1f", - "0xe1a43e7b6344a7fdf5f4d148dce50f797296500a681a10537bfb824666b7f76f", - "0x440dd3de93f670929e40fbd25a20a3c86e2bef78c36462cee4be897cbd541b52", - "0xa06674c7ac7a5132301a7311c64067b211bb8ed7d61356aae81c74c1aaf7c6fc", - "0x1dc2bddedcf585f84716857da29874efd6443db844edd6315b58420a9c7febf6", - "0x7f2acab45894030ebba5a68f38b1f79fa1abb5b82ed43f7a6ea81bd246f8666b", - "0x8862f59c921f4b23a593eebcb9d70f6e12748dbf7fbecd01a3841c7b5dc0cba6", - "0x0b1194cf562d9ddfe1adbd86ce3f2bc46011583241ca3ba62804da37952801fa", - "0xd059d100dc906dbb32d2551b68da9200d63e399ad547c0e5b94d1facec932111", - "0xe69e34a9c850ba52439cf269b27a9b9d6d4da423d34d85e0fadabb7274d97076", - "0x567692d6578ac5f33a5583e7442ccc8c5d567829889c8eb2e3da3283240e495c", - "0x462ab3132d22665402ace97dbd3070d17cec45e45719c94f01613c67b380afa8", - "0x9a664e8f260e83066481bc2cc38ad61ebac872f198dc2c5c3435c8c3d54fa095", - "0x559ba180cdd0c53c4795bb7ae5c746e7f581de9eb300fe44e1a3cf06b42192b1", - "0xfbb83a5349d87e56f3fd9054e45d0343cadc5f173c900a66a45de3be7478899d", - "0xe0eb470001bab2a471dbbfb28b3760eee2fddbba658bb6929fe8cb9a22e4fcd9", - "0x99d092cd2fcae600d4d1c3327e4d15c32b43aa55fc22386af91465ffae860dba", - "0x966a66405588fd9ff7571b0ee7754f674b2c9edd7fba03f9360752ba89f8727b", - "0xd505d43a1523242cdf16737626345cfd431825c2c3068c9535ee0afeddde8e95", - "0xccdd372ad0dca5e220c9655efdbc3ab2eae668ee39235245144d349af48a5284", - "0xc26c7c7664308f31af814a3b1172f2e45c6771d19601e99c8fcb83398beeea5d", - "0x848feb143da06d08e4b25a42902642f79244a0aa431256031839e0a6e79abfe5", - "0x30cff20ec2043a942cb6a7b0124cc6e3d912f1e5aa5524318fd538c81ee2ba4b", - "0x6e568639af171b5534fb5b841a4abd62c8031b1fcaa9a47b7ff695b4da382b1a", - "0xcc454bd041e697a9309e0ac1c65887fcad438f25b728c2d80d59a2f1cfc3ff0e", - "0x82c691646d92237eacc4026b69774cf4c60481683c6086eff9aedd4d230125c6", - "0x745c6180e255351896db986d8b31ac017b05290039cf31228a5c9626ed8f0a15", - "0x855d33b9e5f84b0f2358b124633eb6476525803909110c02cb49fb22c307d76f", - "0x4a9a5636ccbed86cee2e9071aa047d009268065d84c33e790ee952921b59170f", - "0xd61451db974698d65b620399d06fbcef36317e222e378555f673512f46aa10db", - "0x331a6290365a421c5135006c9db4c8ff9ed1c6feca0f7e48ac87e8db37060228", - "0x96d3d76f14ac82239146bcd9ca85216df8d642979166c4a04581f4cca320cf21", - "0xc137b17b47de4e72b1a652eb53c30dce3cd16c2e43cc0fc5ac67b722f2fd5394", - "0x356bcf32c4fa162b4d21b92ef6f3b6a73c02f9e0864033d074b3854bd742d723", - "0xd79a0c3214c9bccec5551297bd8311c9c761b6d8b36ca6c25e47834f0370f8ee", - "0xbf33829228caead3c9b3693a4613dab9f257b71f8a6c3e1a7fbb4febdeb4bc25", - "0x049ce1ff603ecffdeed537cc8f5780b9c5e19751da69c22f0aa697467be227ea", - "0xce2a2505eaa6eb6d400954265f8b137970b3fe54a65d50ea9690e97ef14f2367", - "0x90243fc5b9968f02f2ab3420570d1c408db20dd9ba327162ecd17f9f412279e0", - "0x02fc0c97dc8a610e25ac9c6bd95acfe1abad5c4ec5fc65e8083a066decb534d4", - "0x1d01981047c18915174a9360dea68cc4a9ddfae5be7f50093398b333526e886c", - "0xad136b136a8949b3e21d70c0b37d4e4c90e29d93e90787b0e7938b5c4686b25a", - "0xb2a6b2f1cf71492cdc4cfac20220a5d4270661e5e7823be297fa4db44dfa8be4", - "0xd540f62125e3f980d906d3ca62bbea85b75df635b639c45d00054420853da55e", - "0x7f8b0e8d2371a1e26a610d809cfb021d4cae8d1ee48f4c720ff7337c6f81f85f", - "0xd2ac9267c818bbd4506cc717e571f63e51bb2871513dcf2bc1350d3f9919f653", - "0x4b149ddbd7d3fe68b36e6cff1824022d78eee93e55828ef31830bd21a62f3d49", - "0x007ad77b3867b3bc35914547af0bee1ce0d015498676f0a49dba3e99608c54c2", - "0x28b558cd14b2cbe6859d851aa228b7613472089d190a2c8514d6ed832e52147f", - "0xabf1e8c1d1f66eca5ebf21fa48210413055d53794e1fff6188e8113b5a48a7b1", - "0xca2ba366af4ebe0e849d8faf86c03f21677f84a9640ef29b7fa190935bfd56fc", - "0x15b14544eaca23ea3c4d384df57687ffef06ac7e3e75fe060a4005c8620203cf", - "0x0e824e5f0d6b60288069df07aa1f4f33ebd3a5e717ad33924a9682450aae8818", - "0xe3e238def36923171223899eb8d6c02d8c0daf1dd4573d00f1aa962ef0b8f9dc", - "0xa34c0ae261e980ce4b8df185e1dc2a0f93140f43d859540dee9c618a0b17af9d", - "0xc79513b85a0d7d889f5870164089aa8647cf6440ffed4ffc0bbcea9702ef9d14", - "0x7a9e89b64db22884c588cf021be9f9ab105828fe51014fe06741749ac6ac0e93", - "0xfab801f6a3d9b0f5fe6dc7b34cf60f88c2b85805935ceb1196188bf8fc5bb7c1", - "0x586d2b4d131ea129ca193dcffbcab1a8d5f0ee0c68e703821b2a4b55dc1977dc", - "0xec1fe197a30e23ad678d8798a9bb11402bb7a06ee7bc87ffd8b609e5afec3190", - "0xf0565f526a0d920891df06bdba1dc225aec52065012e92709086b7902b380006", - "0x9d2f547ed5c57b5b5d27b3fde8690432a122441b499cba8536190990e48df97c", - "0x5082ed2771a11fe7609951aa2f25bb6f6e1744b17b41a2a6ba03eca7d0d2036c", - "0x8cb7bcca414537fb63818ab8e34574827739864aed82cbf462c4b0b8ec5fef2a", - "0xc2e20ae12a03889003091152a4f638ca31ba7900a024f032ab7ff600003d2792", - "0x4896139e7e329de8dbebcf3875800603ca2c60d128c33232c2672a8c94756163", - "0x9d2ebdb20ec6a53846e7a7aa3f0c29ba0c7cb48c4e7002e5e7f956ae54d9b191", - "0x0c23a7db29c7708d7be36a79cd5e898db1fcec4a702664bd789d734c7c267ab3", - "0xb5b1e18c90ebb7fae5f12fd5c5a88f2eeefce25ab573fc3fb60a180328bef3a1", - "0x2a6689ecf84f2c653361f8c3416aabbe31024ffe220110e16c4b25349a161b48", - "0x89f058792447a0c3c63897a8e031ae92c92325540dafbc9e2775f1e6d7ac6779", - "0xa9c1b7123368f7a3722af5e996282c3404ae5783049bcd8e34a9c8173f149ad9", - "0x51576a3173d2b8fb4ba2faaf25324b9f0c0adcd575215c25c18e175af79b8b6f", - "0x46466bce788d4e29fe8c87e6b0cb639619c99334c03b4e34bb4ddba7fb237715", - "0x0d2d73ab6b5faf91fcc926f08a7d0b70ecaa000fdaac19386b11279884380c26", - "0xb3d722562230fbbe574f054762075c568c5b6afd1587006cd5ee7bf1ca193a21", - "0xc4af79f13088b31867326f9e4b20dce56ac4df4f96a1d4f9643348c8288f4a9d", - "0x273d0bf659bb780cb3c445f9bcdf08adf88508528790f6f7367e5fb4afbf58e8", - "0x315b356ee0ce21c48d02db8676b4f9bc7116429da3755d1eb4f305271ecbf210", - "0xf60ce550d21f637e1938deb6dc83d592a8d7bf8572d6f3dc67d0c708a8ffc2d8", - "0x2a89411e61a49c94bb65e5aa802d8fca5b8daf23fd07c6a8c1b32e108d417526", - "0xdec02eb84e1f9025f5579f857aef11a53d73c603423a71d900ce9c74a5d9a586", - "0x941d29949cf6203b1e1a73384659df5feec442df4e38a7cb6cde3e7a21b69cbb", - "0x90df183b2320567ad0dd80d6190700a7f0bae987db4dd5980ffffba7649f5953", - "0xc6b242f3e18380abdba3fd0e5d2c6f00cc7b8fdb3a440c4088696a0aefe02d0c", - "0xf1e32cacb5afff2af3af4e870a9dc92bc08e7bed82ae77f1f4c800ec907bb8b9", - "0xb3c8b915648587a7de69e37a935c5ee69582abde275386596bb725a7050e496d", - "0x71d7332c58e8a8aa96ec654a2884ce07afe6cb701159dd9d9d1e84f1294776d8", - "0xd7c1da28223cfe629e88d3871e2a406a6073f12c13621b7c6c3ffd98fdbfef8a", - "0xa258425bb503eb36e56cbd62e621b2c4f177b851a11903a2d7fec345d99efb8e", - "0xb11de25622ca3fc51c83a371376574889558d667c92ecd42af75282f2fe0eff1", - "0x8ad27e253c8cd21cf64fb5e57cc9f48c9171287a2f5bed11d3ed6d521b707969", - "0x6fd33958a755b5846b7731a90b484b0ec508297b93d13ec135e6762b22f0ec49", - "0x30e2e3c6047f75e74969c0780437734f4a8159b34c1fd5d3a7640f3eaa933cc4", - "0x4a22ae54fa94c26e3f19cba69fd3a85c514005973026dd1f45f508c89172c93f", - "0x80de5f103f85b0e1b7af2334903993cd195c8dafaab83958c399576f2861e085", - "0xd7f9f9d3ca1d89c70b02c1263c113bcff81715ea6dae73b17ecd91fd1670c4ae", - "0x71479f49175676ec48adb5cc0a41c910f63221bca88e7693f10c4644294199e2", - "0x7a0cc5d77e610303a7b379d338b357f114e83afdcd2352a19752b2b535fe0b72", - "0xd9f2d874a00c0565a3be9c023c1cedcfe3ade11747cdc49f44802f9d14756b99", - "0x8ad9ff366a638fc15fa6fe9f8a46d029173eab059fb40fc793fb720471f2b215", - "0x35e5f00655bfee1b6a8b58366a43745d19376280c3ccd2e003626961a48f7251", - "0x8ad2d295b82dfa9fe00da9b55366ae4ed73601ce5cf291512a2fa4fc721e3031", - "0xe31f3d5fe46a320f301cab0052dbdc55b83160837bdaa93a50f97b96e243a568", - "0x549fd73c5e8024c77b52cd30a7f8ab2811301c37d9a2552d0571851818a6491e", - "0x7a186a961bd184b58b751bc2a0835a680dee016e75f7e460242d8a1cce036367", - "0x8b87e86ee0113399b1907feb362010fff7743f67d5bf291f8e94c189c51009cb", - "0xe29349467d592e4ace23b1cad27cf426784a72805afb95eb2725bd4013701f81", - "0x494c37a8fb7a0203f55e9bc8ab0915588bdee574f142d662ba5aa1edf45cc9ce", - "0x644c81df9495468742421c69de7a3d331f6bb1bbeff30a8bc4f9620df47fb6c5", - "0x91fe8a5883801595ac1b43f6998508ce49440668d8e90e4057422f0e558f4361", - "0x1ebb1b61dc05e3c43be86797a951309e238195986d7817f003a819fd628968de", - "0x5944d23451babf035db698946fe745cd0fed2f0c040460481eb962db69e4c805", - "0xcb8b752b17b5ff14a04af2d3cd6934926614f7c7967238d07509834edf2bac24", - "0xc4978f7aeb87243b7ba375c62633482958249dde89365b5a0ef60083d94fd201", - "0x99640d682108795b628552a1a5592be832b328131e33d2205b9e6112d6305a0a", - "0x86967c0069f9b9cecc02504df4260661153ad0774fb69c96948e788cd79ebcc7", - "0x7cc2e6562c88378aef4dbb812a67aca06c8fc05cebc5772c52b5312b57d6b998", - "0x015db34fd966e7d975cc43dd843f9ecc81b79c75e26f60df3cf85890fb57b43e", - "0x99a5aefb175d287f8c33c144dab4258fdf0dfea37661ca3c12f493cb33b67ed2", - "0x38110d13f63435e75a19836464cf290c753d2a7ff4f154f4e56da924b8a09ecb", - "0x5ddf40046810bb44acb0493d28ab93e3efcd60d2124c0868aca9e5fcca1bb143", - "0x5f898d53c512930272b4c8f3dddd72448c9e0044b53a56cb55862c043fdc2a4b", - "0x808f8eed11e59475f40cf57b5f005ddaf3e253e3ec212cbc200d0b6323b657fb", - "0x5300e38e3d31da934bb9c0bb459cbd1511f636906773f7b3880239b59f3a1c70", - "0xd8db79f0cb0ef64984f9b2f4dbbde05a73c8ac7b08f80a09072baae3c08fc404", - "0xac1621e36d2eff527c6bcd27219456744307aafe1205741edf6139205b105303", - "0x39285ef3a8ad274b4e2d79d96f2ba6f51335a9a9d9f27291a964aec39e4aae03" - ], - "transactionsRoot": "0x62ad54755231bdd2ef0b0b5ad9b7e0dbc8f38c66ccf6260ce70fc6288550368d", - "uncles": [ - ] -} \ No newline at end of file diff --git a/test/data/proofs.json b/test/data/proofs.json deleted file mode 100644 index cf2ce2b5..00000000 --- a/test/data/proofs.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "accountProof": [ - "0xf90211a0dd3f099161c53aa0cd689b12ee7e11b1dfe12204e97fa476836a6d167cc32e0da0eeb437ceb650bf77279e8fc66e3e15be047a990608d80fb69ae96b534d685671a01338fff0cc003512b537e21e839fe6e3cae10d2b27198b84094fa209dfc198cba0b01bec031c9d2459e7648baa02a716dc4bf0f724ad5a92edcddf43a88baa2f0aa0e8cc796d55b6b1e67d22e774d284bc90ff52269d3bc0e8ac76fe4f2166a28fa9a02ced83121498a4f3259516332e130eab5b8f464f9ecf3d0f26217d49588ff5fea03dd15cce7d973420a1bd83e6a85e3b2e10eb9bf87654f5dc2578158b66d13e2aa0ddcdb368cfc7ded3f5b0b9c55ec9ba22029568411f7132a52c887049fa4eda71a0301518eebb04b9626515e3bb9502cd62ca7db330fef0718d27e100cf3e414c08a020a688e05a68661efd9e2f14fc0729cb8d9416fbd6c071a7537b8ff9a3bf1949a02ce28407b1d8807603af6085c3f0353cec7139229769b3628a6d923a0680f82aa08f7daa83af5243cb221d830cb7d5933a97732411140f23ee2aab199e07fd5ff5a06169d54da16289af0d45d06a27db565e55d629ff3da95e9c0a460af6b96795e7a086166bd5eb714baa95061432bf5e355d6411c69b5e5b2d2f12dc90bc3c9fe6eda036818a4f4ef0cf2a4ca4338a684bab5b48e873ff36809d9d7788c9399ee6468ea05ffa3a3ae6684853f8fa0a9c241549b05fdfd710d34bea8e4bddc240dd88634380", - "0xf90211a087acf18160d47f489209e9a8174ab38ff69ae1745dc9ac63afed8a3f985c9019a04f254f51675587978b298ccc401fcf10b51e553ce86992a8cdf8ccc70b8c1a4ba0c024b0c85ea363e229ba934410f30efbf89eab3ab4f2dfca888e374799c2542fa09d42de50a2f7327f411b186ef97558530dd44c7a7c7c9d85a213cb0cc5646813a02304e4ec150ef312c94b4153491cf9d9cce4267f8ab7409e1e26b7112f3d37a3a0d3be1b965111eb8ab8e5f82ff149ed54b4a3c0542b72486fe987daae7fb38451a091c8e4004c4d85915857a467eeb5896cab37324e6557ef786c8329ebd41ee6f3a08b75de581b9b06a5b29cbe24470e175986caaccaf0b290e51cabd37398ebad0aa0524fcf012296f9f1791ecab5b33bcabfa5655092db76354ba9afc09b04f20705a0cf9550e981c1c581e93fba9fc49296ba3a6b4584940fccf1c0127a85a9ea9713a0151665297a9ea63fb1e0a0d9599984ce82fcf708cebad8003bca4526a2defea8a052ee288fa7b6f07b6446b38b842ef4d386f551a4f5074d1a1618af3a4427aba0a08f77ba8f52cfc1674b47786e166c6e8c59c35bd31b99a89dec9e8aa26f20e6b0a03bd8c2a4eded49402bceb3b7cf63da2897457d3659aadeba813033323efb37c3a0a0e9039ef5596876108d3251f182a0f2ca3288e0d2c8108f549f75c2a6e34cf4a0c298c390d2ebc5371e48bd002a9567179f04aaad41b12150c887f6484b8c06e180", - "0xf90211a05dfa02fd24b0bd161535c3011f719512dca49757539de9de8cc7c0f59b8d5868a05c062f675251f7a9069fe599edc1db7651a33215f75d15ef22e1238bb15d8648a09cfce618fcb7c40586d01d34effa6b3921ed748a19de29731888cf3c14080808a0fc02d94adbc75669014887f16c4e38f47b7bce155778eea3186b267c66bf3ae1a03998487a8b65abcad9c14307fddbcc88a4c9fcd73d53de9cf2134ec25b142fc0a026de5439f5e348b16450844777927fae5284a68a7076bdf0950c0c2efff61e5ca0b51399a2b5e14dab8706cf6a3c0bc4e2687e2387ad37868b90f43059ff4f521da0cc1043a2795a97c393b1031868739005d8d2f827d26b8fac93d4c35458419bf9a008c4c6e1bd855a77fd614bebf1e9f2236288f0e75c09517fa8efb05cc2c17ac5a05b467e89268bb8993a172649e7600c2cdc01740b6bcdef1fe8a20e6a68441856a033bc256c79b9c2ac53e8e663d767144071b798f79329387c0c4c57f52ec5d87ba07d347c889cdf8dd8ced9816e04331e35bd23969ccb2a142e6625b3f46bea1328a03e7653696419067c67903436c19169064cb1e7ba9d0e7911c7c272d3e68981f5a0c5973351e783080a30c62ec1dd41e93d15ef655f4eecc1d64eeb6292e1a28eb5a065eee159c5503ecc88603d156bda3155b09d9c8d37e07a2f7652d6e9a7eb1784a0e22e20a47e88810aab266a15b0ac9fb4504b26c5f4bcec01b7f4e837a1688d9880", - "0xf90211a02ab9d7255c75ac40b80ad8c63c0e60d0445a982d9c8e168f73eb0ca6af850e2ba0356adb007f7eef536a1f3b3121d3916351bb7a863b1f974e2509c3ecd7f6c2a1a04ec5c9e5f8078119092e812edeef6aa27b39ab69c7440931d0753f050f784463a030c219849b97f0f3e53c727724f8a536111b119ec71b464612048cb2ff9122b6a05a7b0077149a03e0a92e9eef0726fe44c05316c94d0cc9e2974bf3d8d3f113eca078c0f80ec0925387367b80575e0fe5ef796c9ede12e98bceb7a9503d0146bf00a00691651fb6d765ad7d7eae17c4123706e38df9fe3b460cc5f36e7bf3c1bd4822a0fcabebb8507355012521ca5fec04ccc7c55ff147a78b5c5abaac9e1eb27cc0b5a0ab9fdd40bc981deae623127085c6c0e3d64eefe4e3fe159faaf026018e8bf44ca04ce55450e92f18db964bcada371dbec3c81297542e066aa008c15aa5d1445147a0a4bf8d5a192da5975511ad2296cd196fa68dfd3af83e4a1536ae07da428a4994a02653f7b77f012cdc8242f1f9e10bbab30d73a90edefdbf1c344ed6ea493e5379a00d7a1ca3ecb1b14748cf9e7cc7112a63acb36addc63e9728f30945c2ea69d214a0568ea2251d7fe03070f23f65d96a3a30a148d045078486e04ffe8a76c76f1912a0b7b6bbc897b196ecc6a76ebdbf43586ff30ff83e82253215f36b56f9a5af2951a08655fcdbf58b1ef1f04b8b2f4cf7c36bf10cd2fa8cbfa3e66373fe1bf5d7c10680", - "0xf90211a01fa205fc0ba5a07ac02dcacd29f3129d9c7d38900babe2ef202337f6b7b29b7ca07a2954105c8501b4ab591db1741f24f13374c0f86e936cf6e87a8f722c26d267a093d502ecf1b33c2757a6e02aa9c559e09778e1fdebd1dbdb4f2ec2836ad7f1d4a01a7d59ed637dbbc4ff6a66b3fd024eac342d4e72cfd39b315bc4aae0b39aee47a097227eb69769c263beeaeebed78d6175b7b7b6e5e2afe208972270f70d7cf5aaa04a8f26d74bd9e4df4b4d2af22a3557b01cc02c1468ee4296268d3a799953a847a0d3354c8d533d3453df3f05c5e896d676ad21ea261749e56be5b299d6db23b912a000ef7ba1189889cb1389a5fc7ec33959c92612a742b1fc2bb2afb6486d095826a0d18a2b97353dfec583670aae4c77c30f5257a7dc88de04edd8d746c5365795baa07da7dc2983191bfee9fc3931a4061a7187d053dd6d8a25a96f1e8f8811903905a0cc595228be38e47cf832367aa1a599845bc5fb8954905ee6b2f6a5785072e0a4a0ec487d8323ec9844813e04f85ec1f958eb0b4b6d4c1d236421b0e69448887828a03d4546c0904a191642c93cf7f47f29a8f405ca119dfcd68f6ac12e5e234c1e3ca06a1fa0da9c76130df45eb289eb42083231d0abc70b948e2421452130ad401a87a0f4dc7e3504bafa391477d8fe07a5ba9c930e6f05f042b6731b420d0f06ba73c4a04505202b85df9849c8d07ee736385c7450563ebbb1438ffac034870eeb938c4780", - "0xf90211a040cfc901650fc1db877002d346058643cf5758da3b8b04359fa3ed9b44ddb1cfa02d937ab7ea9acc0b049eb118ce273245be275bd179cd8c7f811fd84919abd454a0c2791cebd7cadfe99b839bf00720e6f76e2a845bdbdecbe08a74b5323d282455a037f5a4b75e2a74d9f15e703632872c6e6d4b6c16a343ae5eb983846187adf204a07faa46ab593a3effc0d8e76ba18f970d308f5368b132e1f79353c8e8cf1a42aba0fd1d93da6dcedddf74d2c894a281b2e73ca0cc62ba71fa939b30c602d3538e16a083ae30605a766490a1baa8c69d0af3cf0771ac8fd607a18c0e076a0fb29b0424a08b50a09c727cfaea7b5ac46095336f1dfd143f1cb0b472f272f1f7aab9f99484a051675d3e7a412d7c023d0b6c1c4d9ff1d320b5f34ca0686cdae26597f9d606aca075309ace68591645600028ce2807ccf3dea29014793579229862df9dfc8b1698a0d5f44755135d9a2446371d79b3a109c44b17587c380715ef28f288885790d1c2a0fbc7471d3920af36443ca0ef90e72faad59e9ba755618287c4e96ab3eb1b4cf2a01e80ea9c117ae952d6148f656f5724151439495b658fdb5e02bb06bfb6cdbb6fa08b9b7b0dfbb4667f1234a1d7349e86488fc9d48403d8a7285c6b07c86215f802a0fcf6b5021e242d4ba7f92b3806481060e316645617839d9089617671cf4cf979a0e275ded79ee8af4dc01800cec4097fe5597fbb8882883782e8ff29e174d62ee180", - "0xf8d1a0f0989e4db735b50a7f576838749e58d2806393a5d5f25ecf95e48eceda733ae580808080a048b559e96c592c2acb2ff8b026f0c835ecd314b6498f9d3b6449fae75af1cc508080a0a09681024d1ef7fac54af891ce57555bff8d7faae8fc40247fa5c1306032cc628080a060451391141f4b9e3739e5d5c229203a81cdac925d672f610deb2f6d4b91e13880a0e3a8b7d32183fc12b277d9de0e33ca2605abc2c596511ec1c2d9774eab3118f180a0ec8af58ee14b94fe0c95bbd446f57ed92857015df60f7bf4511f2dd24cc71de080", - "0xf8669d3ddc872580ed3146e0b639b103935d2a6c3ab3c4d5a4aebe058aebbe07b846f8440180a073cdc9a13c5a0a165b5ccb7f33df070facd1b2f5da53a6c4c951eb34ec61478aa098a3150c9759d754a4b31f6fb3f4828371c60c2c07fb0754cfa2b230cb601001" - ], - "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "balance": "0", - "codeHash": "0x98a3150c9759d754a4b31f6fb3f4828371c60c2c07fb0754cfa2b230cb601001", - "nonce": "1", - "storageHash": "0x73cdc9a13c5a0a165b5ccb7f33df070facd1b2f5da53a6c4c951eb34ec61478a", - "storageProof": [ - { - "key": "0x1f209fa834e9c9c92b83d1bd04d8d1914bd212e440f88fdda8a5879962bda665", - "proof": [ - "0xf90211a0e37c64a088151b1bbdf0c8c6f9a87e7266c2883da61470d2cd829fec55ab71b5a099b9b3ab83b1892c0edb5e52a2dbefe095b610a6a167bb60fd674ad554bc272aa09cc2817c21c12dc38f0a263f7c062d55c73175273a0604c3c81d26b136b071afa052005f77adf11694ad5b3eb54284bbbf447585c6cd9d5c4925e97bbc8fd13055a0229b27fb717e110ae1ea3df3cf4bcc0768f8f6f2c030355ad28a66f0258b43c1a0bf8b6f79b25512acf14e66e63b9f7bd8d413054d3a1a134608fbf8d361edafe6a08fa149eb9392fb2d36adda5dc147efedbb8c29154fbcc20b361003896c1ca0cea0c13b0c610aa108ce9b33d06f737016951cdb29b93dd60968b2fe64c1cc9ff7dfa030bfe11e8fbc4e770e7b00acba8210fce677f2347c852a8a82b633d295cd6467a0d154cc0afe45358d551d9c2b3d600ed7e7c5ddd24a4603674a166c55b21b42a8a097391d419a060372ec93cc92df9daa012f737e3c036a52e5bcf3edaa4497787ea0034c5b40f2d150b18ad61ca5810b92c0a4eb63b15a6608997915fb8fba1da062a02668d317f71efa78cd60a7425e6b8e45ab4d6538f9e23454dd5f4f502139496ea02445be229ddc2be9925ebf500b039c759fb939e757c101dec7db5ea3709b0870a0194cd8d074c7903098cc09b7721d471768d8dfb7fa3151682c06dcad2aee7614a06be75261063f4ca900359fb78f82b385b0cec9f4270f87f4b44a7df9182c261580", - "0xf90211a0b2b751f72cfc1631f6d60802a8811331766cd5657511fcf1fe98697c5c8029d3a0d8d8938945acd21c55f42528931b9e3b33034a15d2132a949e06b96c32ed4a05a02140cdcbf65d647398570f78139f04c563f9219396ac90522480d3a5317bf733a0613628434fbf2ec21c41bc14d89abaea91bc8296306241da1d6d2ae29ce6cbe3a09322f2b64d1253446a7ccc5f8d0f0d49ec44ce7ab8c03db47320a0f3d58e3faea078c5693aafcd7fa8511f021966c5a58988483f0535aacc772b0928d45a3b64caa05e1a2b39e9a896c21fa0bf85cffe9b3624c1fe6c15f448d76a5e3980325e9173a07b209c21d691744b8b230d21beaf9a82ad356ec1ca431bfa2677c976872bac50a0eed3b53bafe6b6287c3e3b6d55c3507c528aa4fe0e71d2dcd9c591c53cd69298a0e774abe2e5187acb4f2f463a4d2777f31a28c9425010da67a06cffaefd08aa05a0d04a53cdb67b1d37b31c6112753a9ab423f5b87155308b0cf71e59ec157efa96a0961c2c520dfd79bfa32900a8dfb602dcc73bdf6587469485fb81b73dae92aacca0c0f1804205caef2db35d8e0ba4b6edef99db83eb96e04d55afe2076872d7d69da0c85e863ad7a0401c9550cf550a885026c8db2fd0d93c9b79c89db9d3b5bc5c3ca0bad53e548cb46afb689ce1d67c7864a6e4199ea00a42f2bee8170ab918b78712a015760061242068c8b50253867b552aa5272593c85ba7e717a26788eb9c3b024780", - "0xf90211a04b26d92829ba2d3f7a1ce979ae9bbfe7dc49aa5a543feb7a9aa776d0cbb3e507a0e705caebb6626e6c48698cf745d7a74d1d3123d7969ed08454c83282f9398e13a060490d80cbe55f1a0c00b78026e380a4b29178ebbe0f5a53590367cb89b13ddda0a2721b8b6c84ab1e2782a64785bb010259edfe64f92ba553c6983dc434bdcea0a0139cddce330e5243ecb41277cef25964b61f6d2d3ec5ca5d8978a2112485ecd8a0586268adfe2ca2a534c6bb5ac0ef3945bb33fb31fb1530313ea7285f3a839f84a0822c22796fe4c21eb66a303b6c6eadbe7b9aa7ceddc5277f34a92c668b0499c8a00eacfa551fd56435dfdfa3f274f7b9a7aee2e9242fdd4e509fc5ded1b7479159a0e1e864f5883e192dfa881a8706947113cff5fec6b5248987dd18606a31f47631a0579e096e51c66846ec4e0fa18ffef146ac1e0958e0d6160f97860229c5a3624ca0ef4fe13bfadd3d7df1d1454f5a7cf600296d68d6166fb81853dbb4cfcfa625aea0975a4d5092c95b76ef2551117f93e97000befae22f98968a328a8ec5a4b9a4daa079e250d2b793ea66094ab2f52ef11c73e683b0e60e9b9cb4c372a7eae408faf7a09b5152fb72811be751e1665228dc6422289c0993d1645a49d2bfc87fa830b19da059a43ed1f0a99dbd5686752ed8d853bca5a8c4f16a277c576dc7dfdad6536ed9a042cc6522c1274df04e6e6171271232423598c6cd31df1be1c2a8f84cc4992ca680", - "0xf90211a0856a5ba0f76d597044552bf2144e669ed37d2d60ccf8db6806d1e6ed390793dba0bb624b17aa5413eb4f956dde91fb98d0fef735c93ef0ab2ae6423f84762511b4a03dee18d7b780f6f21457964f785941bde382c75fcd45df8103ac3bd3532d1fd2a00e50bbb3b98de7f8ce0c9507a0a015997833690415c6f540126541753ed43f4aa07c908b5eb9de44c1b1482e480e8b2f072eb4ef21b2c01c832fe78064cba8c0f9a081b39923e4499e5781218ab993a266c374e0c6d1c23befa389cccd6427af04e8a07ee20a819e430aa2f3f6c61302df74fbc8f9d270c64acd2f84f797f12d7afb88a0e53e7b15fd95c077123433979f440530a8a41d2ba77b3d70f7a4f4212619ad64a034ea6136c2031aad9abceb5f8f339e7e922e1b78c72f0338088be6c964e38a48a0144061f2472148d57aebc53a101c76d1ab2d3491257b90627fc84d08b2413a14a0f51d5eb1dba609524a8e6d1aaa69fe36228a6050dfc8bac211f1c9eed622ec79a0b1db6c68eb339fc62bda7966d46d9424c775f16ef55911b1be47a54648875f05a036f65ba9df1f7f815b6da5a06de3390d980e122126ac6d9442b2f09d96715feaa0f1dc0797404f5b021716719adb3b1e73d184a0f0886d60d6fca24b875d0af138a0b32617cf2fc5b7382632a870c301a2b9533580d9cb7709ab753011c695d15ed9a01cf3215997995bb7807021987d45a2e420d8cf1a54e6b1bc17766bba29ccd54d80", - "0xf90211a0bdbaf27abc7a7c5f56132cde2e5a16d8e5deaa36ac5b3356a6c69eddd870c0baa05c93236c537a5f18996d6e18534b1a0948dff057b8b1eb6a7ffdf5dd5e0b7884a08ba7773b621d4451766846fb2839717c23a3461778bcc79e058ec7722fb66b03a0d5279a8333868fa843fa6bab8cee6a729b759fb03adae50d0fba0f800abb7349a0a613ce723a8d950b4495a23672dd5395902c9e26c099e8de1b967336a7792c0fa0565f24504219a044acf1a394ad4a553c3f2148473119d59759c0db8b8feaeda1a0f5fd49580469d9b8c09b591a0e65082248e4cabab6d7833fa8a9772cc7ca8b08a05a8349d7fe1f8f07f4e88f32680a54d613bb445beb9017253ea33189c09b96d5a0504a582785ef1c15fb23145233c46cc8dfcdfbc8e68b1ba381b338afb32e3eb0a05e471794b1e470b3f8e6b0fbca2f73740106d4d4f9768f0d59ee6986e6cec1cba02088c14ba45d15282bf51afb27da453b293b75979752cbf30096d060e3da1423a0e6ab8c2576b89d2f61a3fbb31f84ecb94e55787bb5d6c7c0257883160bc5bfffa0d06606934c6ea66ab058742ba515dea6f44c71b7c0edc51bf2ca4fdb96f39964a05af31c24097d4da5b804eda4d82cf59a97019effa4a27c6be00f04b54167558ca0d9b85112d62aea59864c6a33cf29de40eb58d546d79886c7556c78a477936ca4a086c0569596e26001ec648290276ab8114a7ff20ea02c82f9f903063bc5eb783b80", - "0xf8f180a0747019ac2d06a786aa651055e4e863c01a35e0571f634300acc702c06289475a80a0c60807f642aadbce39ea19fa93b35b74d493068e83f19b50ef4ade078e99d72180a062c6e51015aff520c0c63d29e151a34c7d9e2ca4a309dcbb28b0cb99dfac690fa08c99a097a9e48a4d33dfc992c153a600e8ceb31fe7a9d7075020604c9e32b4eb80a0d1886ce4f7ac555d45897a1447800c6e74b54e8f318523ef5b91d868c1b6a8548080a07a70ac40546859ef4a0ae2ae35fac945559967e181be7401fa6985108a0b560380a05edbcf59dcc71f075dd64b3d12e7d3af05eedb49459c7b6974e3bd56aa9cb85e808080", - "0xeb9e208142d6decf8376a8b5493cf1b89f680a197a01627db2b6cd39f0d80c5f8b8a2a13c4b40531e0f829d7" - ], - "value": "0x2a13c4b40531e0f829d7" - }, - { - "key": "0x9dd2a912bd3f98d4e52ea66ae2fff8b73a522895d081d522fe86f592ec8467c3", - "proof": [ - "0xf90211a0e37c64a088151b1bbdf0c8c6f9a87e7266c2883da61470d2cd829fec55ab71b5a099b9b3ab83b1892c0edb5e52a2dbefe095b610a6a167bb60fd674ad554bc272aa09cc2817c21c12dc38f0a263f7c062d55c73175273a0604c3c81d26b136b071afa052005f77adf11694ad5b3eb54284bbbf447585c6cd9d5c4925e97bbc8fd13055a0229b27fb717e110ae1ea3df3cf4bcc0768f8f6f2c030355ad28a66f0258b43c1a0bf8b6f79b25512acf14e66e63b9f7bd8d413054d3a1a134608fbf8d361edafe6a08fa149eb9392fb2d36adda5dc147efedbb8c29154fbcc20b361003896c1ca0cea0c13b0c610aa108ce9b33d06f737016951cdb29b93dd60968b2fe64c1cc9ff7dfa030bfe11e8fbc4e770e7b00acba8210fce677f2347c852a8a82b633d295cd6467a0d154cc0afe45358d551d9c2b3d600ed7e7c5ddd24a4603674a166c55b21b42a8a097391d419a060372ec93cc92df9daa012f737e3c036a52e5bcf3edaa4497787ea0034c5b40f2d150b18ad61ca5810b92c0a4eb63b15a6608997915fb8fba1da062a02668d317f71efa78cd60a7425e6b8e45ab4d6538f9e23454dd5f4f502139496ea02445be229ddc2be9925ebf500b039c759fb939e757c101dec7db5ea3709b0870a0194cd8d074c7903098cc09b7721d471768d8dfb7fa3151682c06dcad2aee7614a06be75261063f4ca900359fb78f82b385b0cec9f4270f87f4b44a7df9182c261580", - "0xf90211a0447313f67244163748acdf1f5840777e33714db2fef208e4885ab23490072829a03842805a42d38927fc5b4a70f510a5728637a8ad7de8bfd9c789a7a6b56f8ccea0d105907056b875ba65f3f6b01a627223884db53c0d688e8dda36b20b55956b8aa0121d99931641abf08a59ee8ce5f96bdac8d3f3344949b2a5af396c092fb04746a0f4d91895eca9759faeb09de7ee4dfc67bbc99f50081b76b381a08e4c2c140ed2a05e699a3c2d0455fa6950ceb2a3a40a0f56552be5ec9580cd95e5951656dda5e9a040a3d6776aa70fc02574823bed73b12eab9e7a8aad55958fc25e75878eaf455ea0533a90e68b58921c8f1f7ba545ccf70bef96a1e98c8fa7e38cee4771ae806577a0648ca5e743976a02649260ff5f9944960ea6e0173ed91f80e31fd71f656327d9a0b89f728bb6f6864fe45bfddd12941ec9e79e7e4a995f61c69a9dd05917695bf7a0f9a757cabc572f9b4069f444d25dd0cd8201b6cdb475d3533444d77ff43e6cf0a045cfc98eba0134a0b3cdf6a7b3a08ed64bb232a49b07da59411b70178cce61ffa037cb5a2504fbc98bd260f9180df7e83e6131e58f8d87fc064ae0de8df8b87b3ba08c8c1b5ebbc1611e47e2f5427e6764df1aad145328bc9bbf4f3cebbf78e59819a0d377480bea81907f2b9c43cba5c373a6693ca4636dabad91ab5eba4fea0a86ada0180e6c1d308c8549de6b6d5b2f4fe0da3d35f2f03b0326659f7dacd020f5334180", - "0xf90211a07f30e7b273906a129c83a89af35ebd5a9242406a91d89374b1cca8750edca45aa0dbab208690654b915a9efbedae8d15a2a8d67ec7fc148dc4e4d91f0f7d235406a01d210b5ace433a99006c5156167f332326d70d9fd803fe4a643933224599c969a0f8f0a2036d5e14568e7f9ac2bf78408e4f71c93403afe6c67370717cd77f938aa0e98fa8fb0278fd541f6a28806ec27336965a58ba2261bd2350a80b1328076549a0456efc8ca11f9e19b6fb15c21ecbf22db5fac14eb8167ddd8aaf0fc8f5a8ed3ba07abecb085fe645779058af42c6a70505fff4d2b9dcb667497bc9498b39e7debfa06b1b7b4183e44f0a0eaef9cf5a1270a7defa990e65ba316613a3613aff125745a0ab86224583fdf7fe389066c1c8b147a45e68c5a7462d7d8192a6af2ef4a6de60a074ca70d0184db3117e0c01e3af0f5b02613f2ac77c4a6e05a952f0db2ad505cca0621f14311c3099e26a8826747dfb29396d3db0e0288faa0befa9da35f9acf5bba0288dc305e2c0894470e32b9cdee591f6f537f44fc3de8a06544a7911988315cda0448a4574183a706802190dc4c1c4e9afdbd9259c611f86d0f33cc47fa967ba1ba01fa1ac73f6c52060901d83b5f5ce5ba9528bbfe28e6fdeb362ffbda309dfb5c1a067ce918ee7f5e80d1045c14312901c4ae610446644b405ec5324fcdcb524f94aa07085d0436f0153d40fb9784e5f02ecd26d8bb885de4ef4e72efcf6c2389846a780", - "0xf90211a08f2f8a7ba420c81175f665a14c1c7b3bea6ba15d07912204a7149caff2f00fd9a0563588ee659dab63e960b82758c0f7b8de60c431ec00e904048ce73eddd931e2a06ddc62dec3e68dd797f4a7bb67f08dae4b03f0abb30b24604f2219f4e0bc4862a077c0f7f5a8335a37d9b0be1d8acdcc1cbebcce312218604e279386be572422a3a0a0b64c050d88cdd5af75cc8ad34a3fdab01258e605b74e734cab4a80765daae9a0fb1949193aa23d93499cb81623d2941f73303331c7a69927c60c39f00ad670c9a07db03d219b71bb7fb3b3d9d734589bad6cf6fa66d7653e4d773fc9a985601bcba05247e8f2d47a35d6ed5f7d6a7a790ebee994e410754e536bb22982caad20a113a0a519063ed8869d33c3f15a51b2ca278241dd340bcefff5a7897157f19042a925a0db690f50a0c948d0196057524b938de7b08ea68a593f5a2be2c9f167ad5fd326a0e7bfe1822cdebaeeb4011a67da0c30ee392ebd095d138655e8e0524691c3834da0cf47fc1f15922c3843055cc11d37aa0194df5f2a4312e34926fc6d7bf4038ac3a05c61a1650b2cc84c3065dbcd8732dff386e1f7295c2e9ebeb2bcbd1ec5e3929aa0154f6faed0ef07f57211eed43a7df39a41bc712c57858ea5a1c8137b0f3e014ca05cbefcd3262931e19908bed7041c47da7a05667cacc137f3a360352f5cfba7bba04f90a6db1466eb840eef38bea9f42e015f1694bed9603c47ac13e0df420cca7280", - "0xf90211a0b1b42a7a63ce1c45304f6eb87f0fb0b56cad5b46885639efc2e88ab00baf8d1ca0968da090125f2b7fdf5786f103372e7c62646628bc4299d912f8152782f70c38a0887ac3a58c125e86404d4bc3c415be643eb50ec06947eafcad937095c36fb00ea0f72ac4f4feba6b77785d182146b249452cbdd35f5ea4d377f2b1839c9ec44519a06986c6611ad2012e5f46193b366ed85f211c235d966c41fdf9471a3ccda68060a09be2952cea6fec638d5e9786c03125989f810165af9966a5779dfa7c570f9406a04ea3e238b8020cb0f2e2c92222021a8cd997809b8cf8fa1f8017ac07e2524a59a02fe5d06a254187accec53757da5259bc03380d0790f6beb28bf395d0effb4f47a0c9216078fe7c9c49929d59e3aebba9c79ca999600bbcfe43cbe8a0e755b1745aa0ee7c1178244a653efb7a3a1229e1f193b97a0b0a6c0d95fbf850242a6d82c741a0647951685af042eaee386f51c9316701ed010896dc9d710bc611a6ea92cce9e2a0b28a35100efa558541dbf06b6544ced188c4d1e7a8ed94ea29df78cd0c577aaaa0b3482c520a7585d264df7c4a04aed75000a8ce7eb425fba947b22910c76adb02a04faf43d428909e9cc73f55240676942ca9e3324383de038668006e7a0cd29a94a09f091556e895d455ae7c9dda680de830c828e1f5b435936fb6edc3cee0f3bdb7a01b5b04073c5dfb703b3676dea109d281212589ac86feccd177e59ff2ceb2d31280", - "0xf8d180a0f8d06f8eb9933fb3201b21fa66153ed509a86c45ef0aa62d2aa0ee04a43dfcbca00f7e3e760b71154bd2122e52a8a327f492ef2814a35e664fba2cb3c9aa58366e808080a04d00ebf62ee011be765b37542e65fa729e370ebdfb4ae1ebd5913f9f154630b7a03879424d5a9dddb56ea5831c80a857eb33f0254977c8462ddf28d8528b1d4b9e808080a04aabb69c8670d1049df120908df2328a57a008449fa7ae0a353c9b0bcdb9e583a0ed44792d495753bd25a362d9ace186e3fca69acc1d67dfdf703be408d6aac3f480808080", - "0xeb9e20d948e006fe566f96bc87ca18bf0a4bd94153e16635048b3aa405e1aac78b8a26d16aea9a19cda40000" - ], - "value": "0x26d16aea9a19cda40000" - } - ] -} \ No newline at end of file diff --git a/test/ethereum/ZodiacModule.test.ts b/test/ethereum/ZodiacModule.test.ts deleted file mode 100644 index def925b1..00000000 --- a/test/ethereum/ZodiacModule.test.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { expect } from 'chai'; -import hre, { ethers, network } from 'hardhat'; -import { _TypedDataEncoder } from '@ethersproject/hash'; -import { executeContractCallWithSigners, EIP712_TYPES } from '../shared/safeUtils'; -import { Contract } from 'ethers'; -import { safeWithZodiacSetup } from '../shared/setup'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; - -// Proposal States -const NOT_RECEIVED = 0; -const EXECUTING = 1; -const EXECUTED = 2; -const CANCELLED = 3; - -describe('Snapshot X L1 Proposal Executor:', () => { - let zodiacModule: Contract; - let safe: Contract; - let safeSigner: SignerWithAddress; - let tx1: any; - let tx2: any; - let tx3: any; - let wallet_0: SignerWithAddress; - let wallet_1: SignerWithAddress; - let wallet_2: SignerWithAddress; - let wallet_3: SignerWithAddress; - - beforeEach(async () => { - [wallet_0, wallet_1, wallet_2, wallet_3] = await hre.ethers.getSigners(); //waffle.provider.getWallets(); - ({ zodiacModule, safe, safeSigner } = await safeWithZodiacSetup()); - - tx1 = { - to: wallet_1.address, - value: 0, - data: '0x11', - operation: 0, - nonce: 0, - }; - tx2 = { - to: wallet_2.address, - value: 0, - data: '0x22', - operation: 0, - nonce: 0, - }; - tx3 = { - to: wallet_3.address, - value: 0, - data: '0x33', - operation: 0, - nonce: 0, - }; - }); - - describe('setUp', async () => { - it('can initialize and set up the SnapshotX module', async () => { - expect(await zodiacModule.avatar()).to.equal(safe.address); - expect(await zodiacModule.owner()).to.equal(safe.address); - expect(await zodiacModule.target()).to.equal(safe.address); - expect(await zodiacModule.proposalIndex()).to.equal(0); - }); - - it('The safe can register Snapshot X module', async () => { - expect(await safe.isModuleEnabled(zodiacModule.address)).to.equal(true); - }); - }); - - describe('Setters', async () => { - it('The safe can change the address of the L2 decision executor contract', async () => { - await expect( - executeContractCallWithSigners( - safe, - zodiacModule, - 'changeL2ExecutionRelayer', - [4567], - [wallet_0] - ) - ) - .to.emit(zodiacModule, 'ChangedL2ExecutionRelayer') - .withArgs(4567); - }); - it('Other accounts cannot change the address of the L2 decision executor contract', async () => { - await expect( - executeContractCallWithSigners( - safe, - zodiacModule, - 'changeL2ExecutionRelayer', - [4567], - [wallet_1] - ) - ).to.be.revertedWith('GS026'); - }); - - it('The safe can disable Snapshot X module', async () => { - await expect( - executeContractCallWithSigners( - safe, - safe, - 'disableModule', - ['0x0000000000000000000000000000000000000001', zodiacModule.address], - [wallet_0] - ) - ) - .to.emit(safe, 'DisabledModule') - .withArgs(zodiacModule.address); - - expect(await safe.isModuleEnabled(zodiacModule.address)).to.equal(false); - }); - }); - - describe('Getters', async () => { - it('The module should return the number of transactions in a proposal', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - expect(await zodiacModule.getNumOfTxInProposal(0)).to.equal(2); - }); - - it('The module should return whether a transaction in a proposal has been executed', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - expect(await zodiacModule.isTxExecuted(0, 0)).to.equal(false); - expect(await zodiacModule.isTxExecuted(0, 1)).to.equal(false); - await zodiacModule.executeProposalTx(0, tx1.to, tx1.value, tx1.data, tx1.operation); - expect(await zodiacModule.isTxExecuted(0, 0)).to.equal(true); - expect(await zodiacModule.isTxExecuted(0, 1)).to.equal(false); - }); - }); - - describe('Transaction Hashes', async () => { - it('should hash transactions correctly', async () => { - const domain = { - chainId: ethers.BigNumber.from(network.config.chainId), - verifyingContract: zodiacModule.address, - }; - - expect( - await zodiacModule.getTransactionHash(tx1.to, tx1.value, tx1.data, tx1.operation) - ).to.be.equals(_TypedDataEncoder.hash(domain, EIP712_TYPES, tx1)); - }); - }); - - describe('Proposal Receival', async () => { - it('The module can receive a proposal', async () => { - expect(await zodiacModule.getProposalState(0)).to.equal(NOT_RECEIVED); - const { tx_hash1, tx_hash2 } = await receiveProposalTest(zodiacModule, tx1, tx2); - - expect(await zodiacModule.proposalIndex()).to.equal(EXECUTING); - expect(await zodiacModule.getTxHash(0, 0)).to.equal(tx_hash1); - expect(await zodiacModule.getTxHash(0, 1)).to.equal(tx_hash2); - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - - it('The module can receive multiple proposals', async () => { - const { zodiacModule } = await safeWithZodiacSetup(); - expect(await zodiacModule.getProposalState(0)).to.equal(NOT_RECEIVED); - const { tx_hash1, tx_hash2 } = await receiveProposalTest(zodiacModule, tx1, tx2); - - expect(await zodiacModule.proposalIndex()).to.equal(1); - expect(await zodiacModule.getTxHash(0, 0)).to.equal(tx_hash1); - expect(await zodiacModule.getTxHash(0, 1)).to.equal(tx_hash2); - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - }); - - describe('Proposal Cancellation', async () => { - it('The safe can cancel a proposal', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - expect( - await executeContractCallWithSigners( - safe, - zodiacModule, - 'cancelProposals', - [[0]], - [wallet_0] - ) - ) - .to.emit(zodiacModule, 'ProposalCancelled') - .withArgs(0); - expect(await zodiacModule.getProposalState(0)).to.equal(CANCELLED); - }); - - it('proposal cancel should revert with only owner', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - await expect(zodiacModule.cancelProposals([0])).to.be.revertedWith( - 'Ownable: caller is not the owner' - ); - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - - it('Cancellation should fail if all transactions in proposal have been executed', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - await zodiacModule.executeProposalTxBatch( - 0, - [tx1.to, tx2.to], - [tx1.value, tx2.value], - [tx1.data, tx2.data], - [tx1.operation, tx1.operation] - ); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTED); - - await expect( - executeContractCallWithSigners(safe, zodiacModule, 'cancelProposals', [[0]], [wallet_0]) - ).to.be.reverted; - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTED); - }); - - it('Should not be able to execute any more transactions if proposal is cancelled', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - await zodiacModule.executeProposalTx(0, tx1.to, tx1.value, tx1.data, tx1.operation); - await executeContractCallWithSigners( - safe, - zodiacModule, - 'cancelProposals', - [[0]], - [wallet_0] - ); - expect(await zodiacModule.getProposalState(0)).to.equal(CANCELLED); - await expect( - zodiacModule.executeProposalTx(0, tx2.to, tx2.value, tx2.data, tx2.operation) - ).to.be.revertedWith('Proposal is not in executing state'); - }); - }); - - describe('Proposal Execution', async () => { - it('The module can execute one transaction in a proposal', async () => { - const { tx_hash1 } = await receiveProposalTest(zodiacModule, tx1, tx2); - - await expect(zodiacModule.executeProposalTx(0, tx1.to, tx1.value, tx1.data, tx1.operation)) - .to.emit(zodiacModule, 'TransactionExecuted') - .withArgs(0, tx_hash1); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - - it('The module can execute all transactions in a proposal individually', async () => { - const { tx_hash1, tx_hash2 } = await receiveProposalTest(zodiacModule, tx1, tx2); - - await expect(zodiacModule.executeProposalTx(0, tx1.to, tx1.value, tx1.data, tx1.operation)) - .to.emit(zodiacModule, 'TransactionExecuted') - .withArgs(0, tx_hash1); - - await expect(zodiacModule.executeProposalTx(0, tx2.to, tx2.value, tx2.data, tx2.operation)) - .to.emit(zodiacModule, 'TransactionExecuted') - .withArgs(0, tx_hash2) - .to.emit(zodiacModule, 'ProposalExecuted') - .withArgs(0); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTED); - }); - - it('The module can execute all transactions in a proposal via batch function', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - await expect( - zodiacModule.executeProposalTxBatch( - 0, - [tx1.to, tx2.to], - [tx1.value, tx2.value], - [tx1.data, tx2.data], - [tx1.operation, tx1.operation] - ) - ) - .to.emit(zodiacModule, 'ProposalExecuted') - .withArgs(0); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTED); - }); - - it('The module should revert if an incorrect transaction order was used', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - //attempting to execute tx2 before tx1 - await expect( - zodiacModule.executeProposalTx(0, tx2.to, tx2.value, tx2.data, tx2.operation) - ).to.be.revertedWith('Invalid transaction or invalid transaction order'); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - - it('The module should revert if a transaction was invalid', async () => { - await receiveProposalTest(zodiacModule, tx1, tx2); - - //attempting to execute tx3 (not in proposal) in place of tx1 - await expect( - zodiacModule.executeProposalTx(0, tx3.to, tx3.value, tx3.data, tx3.operation) - ).to.be.revertedWith('Invalid transaction or invalid transaction order'); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTING); - }); - - it('The module should not allow replaying transactions', async () => { - const { tx_hash1, tx_hash2 } = await receiveProposalTest(zodiacModule, tx1, tx2); - - await expect(zodiacModule.executeProposalTx(0, tx1.to, tx1.value, tx1.data, tx1.operation)) - .to.emit(zodiacModule, 'TransactionExecuted') - .withArgs(0, tx_hash1); - - await expect(zodiacModule.executeProposalTx(0, tx2.to, tx2.value, tx2.data, tx2.operation)) - .to.emit(zodiacModule, 'TransactionExecuted') - .withArgs(0, tx_hash2) - .to.emit(zodiacModule, 'ProposalExecuted') - .withArgs(0); - - await expect( - zodiacModule.executeProposalTx(0, tx2.to, tx2.value, tx2.data, tx2.operation) - ).to.be.revertedWith('Proposal is not in executing state'); - - expect(await zodiacModule.getProposalState(0)).to.equal(EXECUTED); - }); - }); - - describe('Whitelist Editing', async () => { - it('can and and remove strategies from the whitelist', async () => { - expect(await zodiacModule.whitelistedSpaces(0)).to.equal(true); - // await zodiacModule.editWhitelist([1234], [0]); - await executeContractCallWithSigners( - safe, - zodiacModule, - 'editWhitelist', - [[1234], [0]], - [safeSigner] - ); - expect(await zodiacModule.whitelistedSpaces(1234)).to.equal(true); - expect(await zodiacModule.whitelistedSpaces(0)).to.equal(false); - }); - }); -}); - -async function receiveProposalTest(zodiacModule: Contract, tx1: any, tx2: any) { - const domain = { - chainId: ethers.BigNumber.from(network.config.chainId), - verifyingContract: zodiacModule.address, - }; - - //2 transactions in proposal - const txHash1 = _TypedDataEncoder.hash(domain, EIP712_TYPES, tx1); - const txHash2 = _TypedDataEncoder.hash(domain, EIP712_TYPES, tx2); - - const abiCoder = new ethers.utils.AbiCoder(); - const executionHash = ethers.utils.keccak256( - abiCoder.encode(['bytes32[]'], [[txHash1, txHash2]]) - ); - - // vitalik.eth - const callerAddress = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'; - - const proposal_outcome = 1; - await zodiacModule.receiveProposalTest(callerAddress, executionHash, proposal_outcome, [ - txHash1, - txHash2, - ]); - - return { - tx_hash1: txHash1 as any, - tx_hash2: txHash2 as any, - }; -} diff --git a/test/shared/constants.ts b/test/shared/constants.ts deleted file mode 100644 index 02cff4e3..00000000 --- a/test/shared/constants.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { hash } from 'starknet'; -const { getSelectorFromName } = hash; - -export const PROPOSE_SELECTOR = getSelectorFromName('propose'); -export const VOTE_SELECTOR = getSelectorFromName('vote'); -export const AUTHENTICATE_SELECTOR = getSelectorFromName('authenticate'); diff --git a/test/shared/ethSigUtils.ts b/test/shared/ethSigUtils.ts deleted file mode 100644 index c647978b..00000000 --- a/test/shared/ethSigUtils.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ethers } from 'hardhat'; -import { TypedDataDomain, TypedDataField } from '@ethersproject/abstract-signer'; -import { _TypedDataEncoder } from '@ethersproject/hash'; - -function getHash( - domain: TypedDataDomain, - types: Record, - message: Record -) { - const msgHash = _TypedDataEncoder.hash(domain, types, message); - - // Stub code to generate and print the type hash - // const str = "Propose(bytes32 space,bytes32 executionHash,string metadataURI,uint256 salt)"; - const str = 'Vote(bytes32 space,uint256 proposal,uint256 choice,uint256 salt)'; - const s = Buffer.from(str); - const typeHash: string = ethers.utils.keccak256(s); - console.log('typeHash: ', typeHash); - - return msgHash; -} diff --git a/test/shared/merkle.ts b/test/shared/merkle.ts deleted file mode 100644 index bfc70480..00000000 --- a/test/shared/merkle.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { pedersen } from 'starknet/dist/utils/hash'; - -export class MerkleTree { - root: string; - constructor(values: string[]) { - this.root = MerkleTree.generateMerkleRoot(values); - } - - getProof(values: string[], index: number): string[] { - return MerkleTree.getProofHelper(values, index, []); - } - - static generateMerkleRoot(values: string[]): string { - if (values.length == 1) { - return values[0]; - } - if (values.length % 2 != 0) { - values.push('0x0'); - } - const nextLevel = MerkleTree.getNextLevel(values); - return MerkleTree.generateMerkleRoot(nextLevel); - } - - static getNextLevel(level: string[]): string[] { - const nextLevel = []; - for (let i = 0; i < level.length; i += 2) { - let node = '0x0'; - if (BigInt(level[i]) < BigInt(level[i + 1])) { - node = pedersen([level[i], level[i + 1]]); - } else { - node = pedersen([level[i + 1], level[i]]); - } - nextLevel.push(node); - } - return nextLevel; - } - - static getProofHelper(level: string[], index: number, proof: string[]): string[] { - if (level.length == 1) { - return proof; - } - if (level.length % 2 != 0) { - level.push('0x0'); - } - const nextLevel = MerkleTree.getNextLevel(level); - let indexParent = 0; - - for (let i = 0; i < level.length; i++) { - if (i == index) { - indexParent = Math.floor(i / 2); - if (i % 2 == 0) { - proof.push(level[index + 1]); - } else { - proof.push(level[index - 1]); - } - } - } - return MerkleTree.getProofHelper(nextLevel, indexParent, proof); - } -} diff --git a/test/shared/safeUtils.ts b/test/shared/safeUtils.ts deleted file mode 100644 index 3ae73ba8..00000000 --- a/test/shared/safeUtils.ts +++ /dev/null @@ -1,372 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - -import { Contract, utils, BigNumber, BigNumberish, Signer, PopulatedTransaction } from 'ethers'; -import { TypedDataSigner } from '@ethersproject/abstract-signer'; -import { AddressZero } from '@ethersproject/constants'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; - -export const EIP712_TYPES = { - Transaction: [ - { - name: 'to', - type: 'address', - }, - { - name: 'value', - type: 'uint256', - }, - { - name: 'data', - type: 'bytes', - }, - { - name: 'operation', - type: 'uint8', - }, - { - name: 'nonce', - type: 'uint256', - }, - ], -}; - -export const EIP_DOMAIN = { - EIP712Domain: [ - { type: 'uint256', name: 'chainId' }, - { type: 'address', name: 'verifyingContract' }, - ], -}; - -export const EIP712_SAFE_TX_TYPE = { - // "SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)" - SafeTx: [ - { type: 'address', name: 'to' }, - { type: 'uint256', name: 'value' }, - { type: 'bytes', name: 'data' }, - { type: 'uint8', name: 'operation' }, - { type: 'uint256', name: 'safeTxGas' }, - { type: 'uint256', name: 'baseGas' }, - { type: 'uint256', name: 'gasPrice' }, - { type: 'address', name: 'gasToken' }, - { type: 'address', name: 'refundReceiver' }, - { type: 'uint256', name: 'nonce' }, - ], -}; - -export const EIP712_SAFE_MESSAGE_TYPE = { - // "SafeMessage(bytes message)" - SafeMessage: [{ type: 'bytes', name: 'message' }], -}; - -export interface MetaTransaction { - to: string; - value: string | number | BigNumber; - data: string; - operation: number; -} - -export interface SafeTransaction extends MetaTransaction { - safeTxGas: string | number; - baseGas: string | number; - gasPrice: string | number; - gasToken: string; - refundReceiver: string; - nonce: string | number; -} - -export interface SafeSignature { - signer: string; - data: string; -} - -const encodeMetaTransaction = (tx: MetaTransaction): string => { - const data = utils.arrayify(tx.data); - const encoded = utils.solidityPack( - ['uint8', 'address', 'uint256', 'uint256', 'bytes'], - [tx.operation, tx.to, tx.value, data.length, data] - ); - return encoded.slice(2); -}; - -export const encodeMultiSend = (txs: MetaTransaction[]): string => { - return '0x' + txs.map((tx) => encodeMetaTransaction(tx)).join(''); -}; - -export const buildMultiSendSafeTx = ( - multiSend: Contract, - txs: MetaTransaction[], - nonce: number, - overrides?: Partial -): SafeTransaction => { - return buildContractCall(multiSend, 'multiSend', [encodeMultiSend(txs)], nonce, true, overrides); -}; - -export const calculateSafeDomainSeparator = (safe: Contract, chainId: BigNumberish): string => { - return utils._TypedDataEncoder.hashDomain({ verifyingContract: safe.address, chainId }); -}; - -export const preimageSafeTransactionHash = ( - safe: Contract, - safeTx: SafeTransaction, - chainId: BigNumberish -): string => { - return utils._TypedDataEncoder.encode( - { verifyingContract: safe.address, chainId }, - EIP712_SAFE_TX_TYPE, - safeTx - ); -}; - -export const calculateSafeTransactionHash = ( - safe: Contract, - safeTx: SafeTransaction, - chainId: BigNumberish -): string => { - return utils._TypedDataEncoder.hash( - { verifyingContract: safe.address, chainId }, - EIP712_SAFE_TX_TYPE, - safeTx - ); -}; - -export const calculateSafeMessageHash = ( - safe: Contract, - message: string, - chainId: BigNumberish -): string => { - return utils._TypedDataEncoder.hash( - { verifyingContract: safe.address, chainId }, - EIP712_SAFE_MESSAGE_TYPE, - { - message, - } - ); -}; - -export const safeApproveHash = async ( - signer: Signer, - safe: Contract, - safeTx: SafeTransaction, - skipOnChainApproval?: boolean -): Promise => { - if (!skipOnChainApproval) { - if (!signer.provider) throw Error('Provider required for on-chain approval'); - const chainId = (await signer.provider.getNetwork()).chainId; - const typedDataHash = utils.arrayify(calculateSafeTransactionHash(safe, safeTx, chainId)); - const signerSafe = safe.connect(signer); - await signerSafe.approveHash(typedDataHash); - } - const signerAddress = await signer.getAddress(); - return { - signer: signerAddress, - data: - '0x000000000000000000000000' + - signerAddress.slice(2) + - '0000000000000000000000000000000000000000000000000000000000000000' + - '01', - }; -}; - -export const safeSignTypedData = async ( - signer: Signer & TypedDataSigner, - safe: Contract, - safeTx: SafeTransaction, - chainId?: BigNumberish -): Promise => { - if (!chainId && !signer.provider) throw Error('Provider required to retrieve chainId'); - //const cid = chainId || (await signer.provider!!.getNetwork()).chainId - const cid = (await signer.provider!.getNetwork()).chainId; - const signerAddress = await signer.getAddress(); - return { - signer: signerAddress, - data: await signer._signTypedData( - { verifyingContract: safe.address, chainId: cid }, - EIP712_SAFE_TX_TYPE, - safeTx - ), - }; -}; - -export const signHash = async (signer: Signer, hash: string): Promise => { - const typedDataHash = utils.arrayify(hash); - const signerAddress = await signer.getAddress(); - return { - signer: signerAddress, - data: (await signer.signMessage(typedDataHash)).replace(/1b$/, '1f').replace(/1c$/, '20'), - }; -}; - -export const safeSignMessage = async ( - signer: Signer, - safe: Contract, - safeTx: SafeTransaction, - chainId?: BigNumberish -): Promise => { - const cid = chainId || (await signer.provider!.getNetwork()).chainId; - return signHash(signer, calculateSafeTransactionHash(safe, safeTx, cid)); -}; - -export const buildSignatureBytes = (signatures: SafeSignature[]): string => { - signatures.sort((left, right) => - left.signer.toLowerCase().localeCompare(right.signer.toLowerCase()) - ); - let signatureBytes = '0x'; - for (const sig of signatures) { - signatureBytes += sig.data.slice(2); - } - return signatureBytes; -}; - -export const logGas = async (message: string, tx: Promise, skip?: boolean): Promise => { - return tx.then(async (result) => { - const receipt = await result.wait(); - if (!skip) console.log(' Used', receipt.gasUsed.toNumber(), `gas for >${message}<`); - return result; - }); -}; - -export const executeTx = async ( - safe: Contract, - safeTx: SafeTransaction, - signatures: SafeSignature[], - overrides?: any -): Promise => { - const signatureBytes = buildSignatureBytes(signatures); - return safe.execTransaction( - safeTx.to, - safeTx.value, - safeTx.data, - safeTx.operation, - safeTx.safeTxGas, - safeTx.baseGas, - safeTx.gasPrice, - safeTx.gasToken, - safeTx.refundReceiver, - signatureBytes, - overrides || {} - ); -}; - -export const populateExecuteTx = async ( - safe: Contract, - safeTx: SafeTransaction, - signatures: SafeSignature[], - overrides?: any -): Promise => { - const signatureBytes = buildSignatureBytes(signatures); - return safe.populateTransaction.execTransaction( - safeTx.to, - safeTx.value, - safeTx.data, - safeTx.operation, - safeTx.safeTxGas, - safeTx.baseGas, - safeTx.gasPrice, - safeTx.gasToken, - safeTx.refundReceiver, - signatureBytes, - overrides || {} - ); -}; - -export const buildContractCall = ( - contract: Contract, - method: string, - params: any[], - nonce: number, - delegateCall?: boolean, - overrides?: Partial -): SafeTransaction => { - const data = contract.interface.encodeFunctionData(method, params); - return buildSafeTransaction( - Object.assign( - { - to: contract.address, - data, - operation: delegateCall ? 1 : 0, - nonce, - }, - overrides - ) - ); -}; - -export const buildContractCallVariable = ( - contract: Contract, - address: string, - method: string, - params: any[], - nonce: number, - delegateCall?: boolean, - overrides?: Partial -): SafeTransaction => { - const data = contract.interface.encodeFunctionData(method, params); - return buildSafeTransaction( - Object.assign( - { - to: address, - data, - operation: delegateCall ? 1 : 0, - nonce, - }, - overrides - ) - ); -}; - -export const executeTxWithSigners = async ( - safe: Contract, - tx: SafeTransaction, - signers: SignerWithAddress[], - overrides?: any -) => { - const sigs = await Promise.all(signers.map((signer) => safeSignTypedData(signer, safe, tx))); - return executeTx(safe, tx, sigs, overrides); -}; - -export const executeContractCallWithSigners = async ( - safe: Contract, - contract: Contract, - method: string, - params: any[], - signers: SignerWithAddress[], - delegateCall?: boolean, - overrides?: Partial -) => { - const tx = buildContractCall( - contract, - method, - params, - await safe.nonce(), - delegateCall, - overrides - ); - return executeTxWithSigners(safe, tx, signers); -}; - -export const buildSafeTransaction = (template: { - to: string; - value?: BigNumber | number | string; - data?: string; - operation?: number; - safeTxGas?: number | string; - baseGas?: number | string; - gasPrice?: number | string; - gasToken?: string; - refundReceiver?: string; - nonce: number; -}): SafeTransaction => { - return { - to: template.to, - value: template.value || 0, - data: template.data || '0x', - operation: template.operation || 0, - safeTxGas: template.safeTxGas || 0, - baseGas: template.baseGas || 0, - gasPrice: template.gasPrice || 0, - gasToken: template.gasToken || AddressZero, - refundReceiver: template.refundReceiver || AddressZero, - nonce: template.nonce, - }; -}; diff --git a/test/shared/setup.ts b/test/shared/setup.ts deleted file mode 100644 index 2e77d133..00000000 --- a/test/shared/setup.ts +++ /dev/null @@ -1,966 +0,0 @@ -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { StarknetContract, Account } from 'hardhat/types'; -import { Contract, ContractFactory } from 'ethers'; -import { AddressZero } from '@ethersproject/constants'; -import { executeContractCallWithSigners } from './safeUtils'; -import { utils } from '@snapshot-labs/sx'; - -export interface Fossil { - factsRegistry: StarknetContract; - l1HeadersStore: StarknetContract; - l1RelayerAccount: Account; -} - -export async function vanillaSetup() { - // We make the space controller public key the same as the public key of the space account itself - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const vanillaAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/Vanilla.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - const deployments = [ - vanillaAuthenticatorFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const vanillaAuthenticator = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [vanillaAuthenticator.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - console.log('Deploying space contract...'); - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - console.log('deployed!'); - - return { - space, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} - -export async function zodiacRelayerSetup() { - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const vanillaAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/Vanilla.cairo' - ); - const zodiacRelayerFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/EthRelayer.cairo' - ); - - const deployments = [ - vanillaAuthenticatorFactory.deploy(), - vanillaVotingStategyFactory.deploy(), - zodiacRelayerFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const vanillaAuthenticator = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const zodiacRelayer = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [vanillaAuthenticator.address]; - const execution_strategies: string[] = [zodiacRelayer.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - // Deploying StarkNet core instance required for L2 -> L1 message passing - const mockStarknetMessagingFactory = (await ethers.getContractFactory( - 'MockStarknetMessaging' - )) as ContractFactory; - const mockStarknetMessaging = await mockStarknetMessagingFactory.deploy(); - await mockStarknetMessaging.deployed(); - - // Deploying zodiac module - const { zodiacModule, safe, safeSigner } = await safeWithZodiacSetup( - mockStarknetMessaging.address, - BigInt(space.address), - BigInt(zodiacRelayer.address) - ); - - return { - space, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - zodiacRelayer, - zodiacModule, - mockStarknetMessaging, - }; -} - -export async function safeWithZodiacSetup( - starknetCoreAddress = '0x0000000000000000000000000000000000000001', - spaceAddress = BigInt(0), - zodiacRelayerAddress = BigInt(0) -) { - const wallets = await ethers.getSigners(); - const safeSigner = wallets[0]; // One 1 signer on the safe - - const GnosisSafeL2 = await ethers.getContractFactory( - '@gnosis.pm/safe-contracts/contracts/GnosisSafeL2.sol:GnosisSafeL2' - ); - const FactoryContract = await ethers.getContractFactory( - '@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol:GnosisSafeProxyFactory' - ); - const singleton = await GnosisSafeL2.deploy(); - const factory = await FactoryContract.deploy(); - - const template = await factory.callStatic.createProxy(singleton.address, '0x'); - await factory.createProxy(singleton.address, '0x'); - - const safe = GnosisSafeL2.attach(template); - safe.setup([safeSigner.address], 1, AddressZero, '0x', AddressZero, AddressZero, 0, AddressZero); - - const moduleFactoryContract = await ethers.getContractFactory('ModuleProxyFactory'); - const moduleFactory = await moduleFactoryContract.deploy(); - - const SnapshotXContract = await ethers.getContractFactory('SnapshotXL1Executor'); - - //deploying singleton master contract - const masterzodiacModule = await SnapshotXContract.deploy( - '0x0000000000000000000000000000000000000001', - '0x0000000000000000000000000000000000000001', - '0x0000000000000000000000000000000000000001', - '0x0000000000000000000000000000000000000001', - 1, - [] - ); - - const encodedInitParams = ethers.utils.defaultAbiCoder.encode( - ['address', 'address', 'address', 'address', 'uint256', 'uint256[]'], - [ - safe.address, - safe.address, - safe.address, - starknetCoreAddress, - zodiacRelayerAddress, - [spaceAddress], - ] - ); - - const initData = masterzodiacModule.interface.encodeFunctionData('setUp', [encodedInitParams]); - - const masterCopyAddress = masterzodiacModule.address.toLowerCase().replace(/^0x/, ''); - - //This is the bytecode of the module proxy contract - const byteCode = - '0x602d8060093d393df3363d3d373d3d3d363d73' + - masterCopyAddress + - '5af43d82803e903d91602b57fd5bf3'; - - const salt = ethers.utils.solidityKeccak256( - ['bytes32', 'uint256'], - [ethers.utils.solidityKeccak256(['bytes'], [initData]), '0x01'] - ); - - const expectedAddress = ethers.utils.getCreate2Address( - moduleFactory.address, - salt, - ethers.utils.keccak256(byteCode) - ); - - expect(await moduleFactory.deployModule(masterzodiacModule.address, initData, '0x01')) - .to.emit(moduleFactory, 'ModuleProxyCreation') - .withArgs(expectedAddress, masterzodiacModule.address); - const zodiacModule = SnapshotXContract.attach(expectedAddress); - - await executeContractCallWithSigners( - safe, - safe, - 'enableModule', - [zodiacModule.address], - [safeSigner] - ); - - return { - zodiacModule: zodiacModule as Contract, - safe: safe as Contract, - safeSigner: safeSigner as SignerWithAddress, - }; -} - -export async function ethTxAuthSetup() { - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const ethTxAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/EthTx.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - // Deploying StarkNet core instance required for L1 -> L2 message passing - const mockStarknetMessagingFactory = (await ethers.getContractFactory( - 'MockStarknetMessaging' - )) as ContractFactory; - const mockStarknetMessaging = (await mockStarknetMessagingFactory.deploy()) as Contract; - await mockStarknetMessaging.deployed(); - const starknetCore = mockStarknetMessaging.address; - - // Deploy StarkNet Commit L1 contract - const starknetCommitFactory = (await ethers.getContractFactory( - 'StarkNetCommit' - )) as ContractFactory; - const starknetCommit = (await starknetCommitFactory.deploy(starknetCore)) as Contract; - - const deployments = [ - ethTxAuthFactory.deploy({ starknet_commit_address: BigInt(starknetCommit.address) }), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const ethTxAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [ethTxAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - console.log('Deploying space contract...'); - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - ethTxAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - mockStarknetMessaging, - starknetCommit, - }; -} - -export async function ethTxSessionKeyAuthSetup() { - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const ethTxSessionKeyAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/EthTxSessionKey.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - // Deploying StarkNet core instance required for L1 -> L2 message passing - const mockStarknetMessagingFactory = (await ethers.getContractFactory( - 'MockStarknetMessaging' - )) as ContractFactory; - const mockStarknetMessaging = (await mockStarknetMessagingFactory.deploy()) as Contract; - await mockStarknetMessaging.deployed(); - const starknetCore = mockStarknetMessaging.address; - - // Deploy StarkNet Commit L1 contract - const starknetCommitFactory = (await ethers.getContractFactory( - 'StarkNetCommit' - )) as ContractFactory; - const starknetCommit = (await starknetCommitFactory.deploy(starknetCore)) as Contract; - - const deployments = [ - ethTxSessionKeyAuthFactory.deploy({ - starknet_commit_address: BigInt(starknetCommit.address), - }), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const ethTxSessionKeyAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [ethTxSessionKeyAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - console.log('Deploying space contract...'); - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - ethTxSessionKeyAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - mockStarknetMessaging, - starknetCommit, - }; -} - -export async function ethBalanceOfSetup(block: any, proofs: any) { - // We pass the encode params function for the single slot proof strategy to generate the encoded data for the single slot proof strategy - const proofInputs: utils.storageProofs.ProofInputs = utils.storageProofs.getProofInputs( - block.number, - proofs - ); - - const controller = await starknet.deployAccount('OpenZeppelin'); - - const fossil = await fossilSetup(controller); - - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const ethBalanceOfVotingStrategyFactory = await starknet.getContractFactory( - 'contracts/starknet/VotingStrategies/EthBalanceOf.cairo' - ); - const vanillaAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/Vanilla.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - const deployments = [ - vanillaAuthenticatorFactory.deploy(), - ethBalanceOfVotingStrategyFactory.deploy({ - fact_registry_address: BigInt(fossil.factsRegistry.address), - l1_headers_store_address: BigInt(fossil.l1HeadersStore.address), - }), - vanillaExecutionStrategyFactory.deploy(), - ]; - - const contracts = await Promise.all(deployments); - const vanillaAuthenticator = contracts[0] as StarknetContract; - const ethBalanceOfVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - // Submit blockhash to L1 Headers Store (via dummy function rather than L1 -> L2 bridge) - await fossil.l1RelayerAccount.invoke(fossil.l1HeadersStore, 'receive_from_l1', { - parent_hash: utils.intsSequence.IntsSequence.fromBytes(utils.bytes.hexToBytes(block.hash)) - .values, - block_number: block.number + 1, - }); - - // Encode block header and then submit to L1 Headers Store - const processBlockInputs: utils.storageProofs.ProcessBlockInputs = - utils.storageProofs.getProcessBlockInputs(block); - await fossil.l1RelayerAccount.invoke(fossil.l1HeadersStore, 'process_block', { - options_set: processBlockInputs.blockOptions, - block_number: processBlockInputs.blockNumber, - block_header_rlp_bytes_len: processBlockInputs.headerInts.bytesLength, - block_header_rlp: processBlockInputs.headerInts.values, - }); - - const controllerAddress = BigInt(controller.starknetContract.address); - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [ethBalanceOfVotingStrategy.address]; - const votingStrategyParams: string[][] = [[proofInputs.ethAddressFelt, '0x0']]; // For the aave erc20 contract, the balances mapping has a storage index of 0 - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [vanillaAuthenticator.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - // Deploy space with specified parameters - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controllerAddress, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - vanillaAuthenticator, - ethBalanceOfVotingStrategy, - vanillaExecutionStrategy, - fossil, - proofInputs, - }; -} - -// Setup function to test the single slot proof strategy in isolation, ie not within context of space contract -export async function singleSlotProofSetupIsolated(block: any) { - const account = await starknet.deployAccount('OpenZeppelin'); - const fossil = await fossilSetup(account); - const singleSlotProofStrategyFactory = await starknet.getContractFactory( - 'contracts/starknet/VotingStrategies/SingleSlotProof.cairo' - ); - const singleSlotProofStrategy = await singleSlotProofStrategyFactory.deploy({ - fact_registry_address: BigInt(fossil.factsRegistry.address), - l1_headers_store_address: BigInt(fossil.l1HeadersStore.address), - }); - // Submit blockhash to L1 Headers Store (via dummy function rather than L1 -> L2 bridge) - await fossil.l1RelayerAccount.invoke(fossil.l1HeadersStore, 'receive_from_l1', { - parent_hash: utils.intsSequence.IntsSequence.fromBytes(utils.bytes.hexToBytes(block.hash)) - .values, - block_number: block.number + 1, - }); - // Encode block header and then submit to L1 Headers Store - const processBlockInputs: utils.storageProofs.ProcessBlockInputs = - utils.storageProofs.getProcessBlockInputs(block); - await fossil.l1RelayerAccount.invoke(fossil.l1HeadersStore, 'process_block', { - options_set: processBlockInputs.blockOptions, - block_number: processBlockInputs.blockNumber, - block_header_rlp_bytes_len: processBlockInputs.headerInts.bytesLength, - block_header_rlp: processBlockInputs.headerInts.values, - }); - return { - fossil: fossil as Fossil, - singleSlotProofStrategy: singleSlotProofStrategy as StarknetContract, - account: account as Account, - }; -} - -async function fossilSetup(deployer: Account): Promise { - const factsRegistryFactory = await starknet.getContractFactory( - 'fossil/contracts/starknet/FactsRegistry.cairo' - ); - const l1HeadersStoreFactory = await starknet.getContractFactory( - 'fossil/contracts/starknet/L1HeadersStore.cairo' - ); - const factsRegistry = await factsRegistryFactory.deploy(); - const l1HeadersStore = await l1HeadersStoreFactory.deploy(); - const l1RelayerAccount = await starknet.deployAccount('OpenZeppelin'); - await deployer.invoke(factsRegistry, 'initialize', { - l1_headers_store_addr: BigInt(l1HeadersStore.address), - }); - await deployer.invoke(l1HeadersStore, 'initialize', { - l1_messages_origin: BigInt(l1RelayerAccount.starknetContract.address), - }); - return { - factsRegistry: factsRegistry as StarknetContract, - l1HeadersStore: l1HeadersStore as StarknetContract, - l1RelayerAccount: l1RelayerAccount as Account, - }; -} - -export async function starkSigAuthSetup() { - const controller = await starknet.deployAccount('OpenZeppelin'); - - const vanillaSpaceFactory = await starknet.getContractFactory( - './contracts/starknet/SpaceAccount.cairo' - ); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const starkSigAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/StarkSig.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - starkSigAuthFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - ]; - - const contracts = await Promise.all(deployments); - const starkSigAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [starkSigAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - const vanillaSpace = (await vanillaSpaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - vanillaSpace, - starkSigAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - controller, - }; -} - -export async function starkTxAuthSetup() { - const controller = await starknet.deployAccount('OpenZeppelin'); - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const starknetTxAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/StarkTx.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - starknetTxAuthenticatorFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const starknetTxAuthenticator = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [starknetTxAuthenticator.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - console.log('Deploying space contract...'); - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - console.log('deployed!'); - - return { - space, - controller, - starknetTxAuthenticator, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} - -export async function ethSigAuthSetup() { - const controller = await starknet.deployAccount('OpenZeppelin'); - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const ethSigAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/EthSig.cairo' - ); - const vanillaExecutionFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - ethSigAuthFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const ethSigAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [ethSigAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - ethSigAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} - -export async function starknetSigAuthSetup() { - const controller = await starknet.deployAccount('OpenZeppelin'); - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const starkSigAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/StarkSig.cairo' - ); - const vanillaExecutionFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - starkSigAuthFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const starkSigAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [starkSigAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - starkSigAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} - -export async function spaceFactorySetup() { - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceDeployerFactory = await starknet.getContractFactory( - './contracts/starknet/SpaceFactory.cairo' - ); - - const spaceFactoryClass = await starknet.getContractFactory( - './contracts/starknet/SpaceAccount.cairo' - ); - const spaceHash = await controller.declare(spaceFactoryClass); - - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const vanillaAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/Vanilla.cairo' - ); - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - vanillaAuthenticatorFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionStrategyFactory.deploy(), - spaceDeployerFactory.deploy({ space_class_hash: spaceHash }), - ]; - const contracts = await Promise.all(deployments); - const vanillaAuthenticator = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - const spaceDeployer = contracts[3] as StarknetContract; - - return { - spaceDeployer, - spaceFactoryClass, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} - -export async function starknetExecutionSetup() { - const controller = (await starknet.deployAccount('OpenZeppelin')) as Account; - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const vanillaAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/Vanilla.cairo' - ); - // const starknetExecutionStrategyFactory = await starknet.getContractFactory( - // './contracts/starknet/ExecutionStrategies/Starknet.cairo' - // ); - - const deployments = [vanillaAuthenticatorFactory.deploy(), vanillaVotingStrategyFactory.deploy()]; - const contracts = await Promise.all(deployments); - const vanillaAuthenticator = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const starknetExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [vanillaAuthenticator.address]; - const execution_strategies: string[] = ['0x1', '0x1234', '0x4567', '0x456789']; // We add dummy execution_strategies that get used in the test transactions - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - console.log('Deploying space contract...'); - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - console.log('deployed!'); - - return { - space, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - starknetExecutionStrategy, - }; -} - -export async function ethSigSessionKeyAuthSetup() { - const controller = await starknet.deployAccount('OpenZeppelin'); - const spaceFactory = await starknet.getContractFactory('./contracts/starknet/SpaceAccount.cairo'); - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const ethSigSessionKeyAuthFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/EthSigSessionKey.cairo' - ); - const vanillaExecutionFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - - const deployments = [ - ethSigSessionKeyAuthFactory.deploy(), - vanillaVotingStrategyFactory.deploy(), - vanillaExecutionFactory.deploy(), - ]; - const contracts = await Promise.all(deployments); - const ethSigSessionKeyAuth = contracts[0] as StarknetContract; - const vanillaVotingStrategy = contracts[1] as StarknetContract; - const vanillaExecutionStrategy = contracts[2] as StarknetContract; - - const votingDelay = BigInt(0); - const minVotingDuration = BigInt(0); - const maxVotingDuration = BigInt(2000); - const votingStrategies: string[] = [vanillaVotingStrategy.address]; - const votingStrategyParams: string[][] = [[]]; // No params for the vanilla voting strategy - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - const authenticators: string[] = [ethSigSessionKeyAuth.address]; - const execution_strategies: string[] = [vanillaExecutionStrategy.address]; - const quorum: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromUint( - BigInt(1) - ); // Quorum of one for the vanilla test - const proposalThreshold: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - const metadataUri = utils.strings.strToShortStringArr('Snapshot X Test Space'); - - const space = (await spaceFactory.deploy({ - public_key: controller.publicKey, - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: controller.starknetContract.address, - quorum: quorum, - voting_strategy_params_flat: votingStrategyParamsFlat, - voting_strategies: votingStrategies, - authenticators: authenticators, - execution_strategies: execution_strategies, - })) as StarknetContract; - - return { - space, - controller, - ethSigSessionKeyAuth, - vanillaVotingStrategy, - vanillaExecutionStrategy, - }; -} diff --git a/test/shared/starkTypes.ts b/test/shared/starkTypes.ts deleted file mode 100644 index 7f03ca20..00000000 --- a/test/shared/starkTypes.ts +++ /dev/null @@ -1,79 +0,0 @@ -export const domain = { - name: 'snapshot-x', - version: '1', - chainId: '0x534e5f474f45524c49', // SN_GOERLI -}; - -export const domainTypes = { - StarkNetDomain: [ - { - name: 'name', - type: 'string', - }, - { - name: 'version', - type: 'felt', - }, - { - name: 'chainId', - type: 'felt', - }, - ], -}; - -export const proposeTypes = { - StarkNetDomain: domainTypes.StarkNetDomain, - Propose: [ - { name: 'space', type: 'felt' }, - { name: 'author', type: 'felt' }, - { name: 'metadata_uri', type: 'felt*' }, - { name: 'executor', type: 'felt' }, - { name: 'execution_hash', type: 'felt' }, - { name: 'strategies_hash', type: 'felt' }, - { name: 'strategies_params_hash', type: 'felt' }, - { name: 'salt', type: 'felt' }, - ], -}; - -export const voteTypes = { - StarkNetDomain: domainTypes.StarkNetDomain, - Vote: [ - { name: 'space', type: 'felt' }, - { name: 'voter', type: 'felt' }, - { name: 'proposal', type: 'felt' }, - { name: 'choice', type: 'felt' }, - { name: 'strategies_hash', type: 'felt' }, - { name: 'strategies_params_hash', type: 'felt' }, - { name: 'salt', type: 'felt' }, - ], -}; - -export const revokeSessionKeyTypes = { - StarkNetDomain: domainTypes.StarkNetDomain, - RevokeSessionKey: [{ name: 'salt', type: 'felt' }], -}; - -export interface Propose { - space: string; - author: string; - metadata_uri: string[]; - executor: string; - execution_hash: string; - strategies_hash: string; - strategies_params_hash: string; - salt: string; -} - -export interface Vote { - space: string; - voter: string; - proposal: string; - choice: number; - strategies_hash: string; - strategies_params_hash: string; - salt: string; -} - -export interface RevokeSessionKey { - salt: string; -} diff --git a/test/shared/types.ts b/test/shared/types.ts deleted file mode 100644 index 07bb1cae..00000000 --- a/test/shared/types.ts +++ /dev/null @@ -1,83 +0,0 @@ -export const domain = { - name: 'snapshot-x', - version: '1', - chainId: '5', // GOERLI -}; - -export const proposeTypes = { - Propose: [ - { name: 'authenticator', type: 'bytes32' }, - { name: 'space', type: 'bytes32' }, - { name: 'author', type: 'address' }, - { name: 'metadata_uri', type: 'string' }, - { name: 'executor', type: 'bytes32' }, - { name: 'execution_hash', type: 'bytes32' }, - { name: 'strategies_hash', type: 'bytes32' }, - { name: 'strategies_params_hash', type: 'bytes32' }, - { name: 'salt', type: 'uint256' }, - ], -}; - -export const voteTypes = { - Vote: [ - { name: 'authenticator', type: 'bytes32' }, - { name: 'space', type: 'bytes32' }, - { name: 'voter', type: 'address' }, - { name: 'proposal', type: 'uint256' }, - { name: 'choice', type: 'uint256' }, - { name: 'strategies_hash', type: 'bytes32' }, - { name: 'strategies_params_hash', type: 'bytes32' }, - { name: 'salt', type: 'uint256' }, - ], -}; - -export const sessionKeyTypes = { - SessionKey: [ - { name: 'address', type: 'address' }, - { name: 'sessionPublicKey', type: 'bytes32' }, - { name: 'sessionDuration', type: 'uint256' }, - { name: 'salt', type: 'uint256' }, - ], -}; - -export const revokeSessionKeyTypes = { - RevokeSessionKey: [ - { name: 'sessionPublicKey', type: 'bytes32' }, - { name: 'salt', type: 'uint256' }, - ], -}; - -export interface Propose { - authenticator: string; - space: string; - author: string; - metadata_uri: string; - executor: string; - execution_hash: string; - strategies_hash: string; - strategies_params_hash: string; - salt: string; -} - -export interface Vote { - authenticator: string; - space: string; - voter: string; - proposal: string; - choice: number; - strategies_hash: string; - strategies_params_hash: string; - salt: string; -} - -export interface SessionKey { - address: string; - sessionPublicKey: string; - sessionDuration: string; - salt: string; -} - -export interface RevokeSessionKey { - sessionPublicKey: string; - salt: string; -} diff --git a/test/starknet/ActiveProposal.test.ts b/test/starknet/ActiveProposal.test.ts deleted file mode 100644 index be2b0e27..00000000 --- a/test/starknet/ActiveProposal.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { vanillaSetup } from '../shared/setup'; -import { StarknetContract, Account } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { PROPOSE_SELECTOR } from '../shared/constants'; - -describe('Active Proposal', () => { - let space: StarknetContract; - let relayer: Account; - let controller: Account; - let vanillaVotingStrategy: StarknetContract; - let vanillaAuthenticator: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - let proposalId: bigint; - - before(async function () { - this.timeout(800000); - ({ space, controller, vanillaAuthenticator, vanillaVotingStrategy, vanillaExecutionStrategy } = - await vanillaSetup()); - relayer = await starknet.deployAccount('OpenZeppelin'); - proposalId = BigInt(1); - const proposalCalldata = utils.encoding.getProposeCalldata( - ethers.Wallet.createRandom().address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x0'], - [[]], - [] - ); - - // Create a proposal - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposalCalldata, - }); - }); - - it('Fails to add a voting strategy if a proposal is active', async () => { - try { - await controller.invoke(space, 'addVotingStrategies', { - addresses: [vanillaVotingStrategy.address], - params_flat: [], - }); - throw { message: 'should not add a voting strategy' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Some proposals are still active'); - } - }); - - it('Fails to remove a voting strategy if a proposal is active', async () => { - try { - await controller.invoke(space, 'removeVotingStrategies', { - indexes: ['0x0'], - }); - throw { message: 'should not remove a voting strategy' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Some proposals are still active'); - } - }); - - it('Fails to add an authenticator if a proposal is active', async () => { - try { - await controller.invoke(space, 'addAuthenticators', { - addresses: [vanillaAuthenticator.address], - }); - throw { message: 'should not add an authenticator' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Some proposals are still active'); - } - }); - - it('Fails to remove an authenticator if a proposal is active', async () => { - try { - await controller.invoke(space, 'removeAuthenticators', { - addresses: [vanillaAuthenticator.address], - }); - throw { message: 'should not remove an authenticator' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Some proposals are still active'); - } - }); -}); diff --git a/test/starknet/ArrayUtils.test.ts b/test/starknet/ArrayUtils.test.ts deleted file mode 100644 index b125b5c9..00000000 --- a/test/starknet/ArrayUtils.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { StarknetContract } from 'hardhat/types/runtime'; -import { expect } from 'chai'; -import { starknet } from 'hardhat'; -import { utils } from '@snapshot-labs/sx'; -import { computeHashOnElements } from 'starknet/dist/utils/hash'; - -describe('Array Utilities', () => { - let testArrayUtils: StarknetContract; - - before(async function () { - this.timeout(800000); - const testArrayUtilsFactory = await starknet.getContractFactory( - './contracts/starknet/TestContracts/Test_ArrayUtils.cairo' - ); - testArrayUtils = await testArrayUtilsFactory.deploy(); - }); - it('The library should be able to construct the 2D array type from a flat array and then retrieve the sub arrays individually.', async () => { - // Sub Arrays: [[5],[],[1,2,3],[7,9]] - // Offsets: [0,1,1,4] - const arr1: string[] = ['0x5']; - const arr2: string[] = []; - const arr3: string[] = ['0x1', '0x2', '0x3']; - const arr4: string[] = ['0x7', '0x9']; - const arr2d: string[][] = [arr1, arr2, arr3, arr4]; - const flatArray: string[] = utils.encoding.flatten2DArray(arr2d); - - const { array: array1 } = await testArrayUtils.call('testArray2D', { - flat_array: flatArray, - index: 0, - }); - expect(array1.map((x: any) => '0x' + x.toString(16))).to.deep.equal(arr1); - - const { array: array2 } = await testArrayUtils.call('testArray2D', { - flat_array: flatArray, - index: 1, - }); - expect(array2.map((x: any) => '0x' + x.toString(16))).to.deep.equal(arr2); - - const { array: array3 } = await testArrayUtils.call('testArray2D', { - flat_array: flatArray, - index: 2, - }); - expect(array3.map((x: any) => '0x' + x.toString(16))).to.deep.equal(arr3); - - const { array: array4 } = await testArrayUtils.call('testArray2D', { - flat_array: flatArray, - index: 3, - }); - expect(array4.map((x: any) => '0x' + x.toString(16))).to.deep.equal(arr4); - - // Sub Arrays: [[]] - // Offsets: [0] - const arr2d2 = [arr2]; - const flatArray2 = utils.encoding.flatten2DArray(arr2d2); - const { array: array5 } = await testArrayUtils.call('testArray2D', { - flat_array: flatArray2, - index: 0, - }); - expect(array5.map((x: any) => '0x' + x.toString(16))).to.deep.equal(arr2); - }).timeout(600000); - - it('The library should be able to hash an array correctly', async () => { - const { hash: hash } = await testArrayUtils.call('testHashArray', { - array: [1, 2, 3, 4], - }); - expect('0x' + hash.toString(16)).to.deep.equal(computeHashOnElements([1, 2, 3, 4])); - // empty array - const { hash: hash2 } = await testArrayUtils.call('testHashArray', { - array: [], - }); - expect('0x' + hash2.toString(16)).to.deep.equal(computeHashOnElements([])); - }).timeout(600000); - - it('The library should be able to assert whether duplicates exist in an array', async () => { - await testArrayUtils.call('test_assert_no_duplicates', { - array: [1, 2, 3, 4], - }); - - await testArrayUtils.call('test_assert_no_duplicates', { - array: [], - }); - - try { - await testArrayUtils.call('test_assert_no_duplicates', { - array: [1, 0, 3, 4, 2, 0], - }); - throw { message: 'duplicate was allowed' }; - } catch (error: any) { - expect(error.message).to.contain('Duplicate entry found'); - } - }).timeout(600000); -}); diff --git a/test/starknet/ControllerActions.test.ts b/test/starknet/ControllerActions.test.ts deleted file mode 100644 index 819adfd4..00000000 --- a/test/starknet/ControllerActions.test.ts +++ /dev/null @@ -1,637 +0,0 @@ -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { vanillaSetup } from '../shared/setup'; -import { StarknetContract, Account } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { getProposeCalldata, getVoteCalldata } from '@snapshot-labs/sx/dist/utils/encoding'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; - -describe('Controller Actions', () => { - let space: StarknetContract; - let controller: Account; - let user: Account; - let vanillaVotingStrategy: StarknetContract; - let vanillaAuthenticator: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - let proposalId: bigint; - - before(async function () { - this.timeout(800000); - ({ space, controller, vanillaAuthenticator, vanillaVotingStrategy, vanillaExecutionStrategy } = - await vanillaSetup()); - user = await starknet.deployAccount('OpenZeppelin'); - proposalId = BigInt(1); - }); - - it('The controller can update the controller', async () => { - await controller.invoke(space, 'setController', { - new_controller: user.starknetContract.address, - }); - - // Try to update the controler with the previous account - try { - await controller.invoke(space, 'setController', { - new_controller: user.starknetContract.address, - }); - throw { message: 'updated controller`' }; - } catch (error: any) { - expect(error.message).to.contain('Ownable: caller is not the owner'); - } - - // Now updating again with the previous controller - await user.invoke(space, 'setController', { - new_controller: controller.starknetContract.address, - }); - }).timeout(600000); - - it('The controller can add and remove voting strategies', async () => { - const address = ethers.Wallet.createRandom().address; - - const power = utils.splitUint256.SplitUint256.fromUint(BigInt('1000')); - - const whitelistFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Whitelist.cairo' - ); - const whitelistStrategy = await whitelistFactory.deploy({ - whitelist: [address, power.low, power.high], - }); - const votingStrategyParams: string[][] = [[]]; - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - - // Add the whitelist strategy, which will be placed at index 1 - await controller.invoke(space, 'addVotingStrategies', { - addresses: [whitelistStrategy.address], - params_flat: votingStrategyParamsFlat, - }); - - // Remove the vanilla voting strategy, which is at index 0 - await controller.invoke(space, 'removeVotingStrategies', { - indexes: ['0x0'], - }); - - // Ensure that `controller` can't propose (we removed the vanillaVotingStrategy) - try { - const wrongProposeCalldata = getProposeCalldata( - controller.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x0'], - [[]], - [] - ); - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: wrongProposeCalldata, - }); - throw { message: "voting strategy wasn't removed" }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Invalid voting strategy'); - } - - // Ensure that `address` can propose (we added the whitelist strategy) - const correctProposeCalldata = getProposeCalldata( - address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x1'], - [[]], - [] - ); - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: correctProposeCalldata, - }); - - // Ensure proposal exists (will throw if proposal id does not exist) - await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - // Cancel the proposal - await controller.invoke(space, 'cancelProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Re-add vanilla voting strategy, which will now be at index 2 - await controller.invoke(space, 'addVotingStrategies', { - addresses: [vanillaVotingStrategy.address], - params_flat: votingStrategyParamsFlat, - }); - - // Remove the whitelist voting strategy - await controller.invoke(space, 'removeVotingStrategies', { - indexes: ['0x1'], - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can add and remove authenticators', async () => { - const starknetTxAuthenticatorFactory = await starknet.getContractFactory( - './contracts/starknet/Authenticators/StarkTx.cairo' - ); - const starknetTxAuth = (await starknetTxAuthenticatorFactory.deploy()) as StarknetContract; - - // Add the StarknetTx auth - await controller.invoke(space, 'addAuthenticators', { - addresses: [starknetTxAuth.address], - }); - - // Remove the Vanilla Auth - await controller.invoke(space, 'removeAuthenticators', { - addresses: [vanillaAuthenticator.address], - }); - - const proposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Ensure that `controller` can't propose (we removed the vanillaAuth) - try { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: "authenticator wasn't removed" }; - } catch (error: any) { - expect(error.message).to.contain('Invalid authenticator'); - } - - // Ensure that `address` can propose (we added the StarknetTxAuth) - await user.invoke(starknetTxAuth, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - // Cancel the proposal - await controller.invoke(space, 'cancelProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Reset to initial auths - await controller.invoke(space, 'addAuthenticators', { - addresses: [vanillaAuthenticator.address], - }); - await controller.invoke(space, 'removeAuthenticators', { - addresses: [starknetTxAuth.address], - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can add and remove execution strategies', async () => { - const randomExecutionContractFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - const randomExecutionContract = - (await randomExecutionContractFactory.deploy()) as StarknetContract; - - // Add a random execution strategy - await controller.invoke(space, 'addExecutionStrategies', { - addresses: [randomExecutionContract.address], - }); - // Remove the vanilla execution strategy - await controller.invoke(space, 'removeExecutionStrategies', { - addresses: [vanillaExecutionStrategy.address], - }); - - const incorrectProposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Ensure that `vanillaExecutionStrategy` is not valid anymore - try { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: incorrectProposeCalldata, - }); - throw { message: "execution strategy wasn't removed" }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Invalid execution strategy'); - } - - const correctProposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - randomExecutionContract.address, - ['0x2'], - [[]], - [] - ); - // Ensure that `randomExecutionContract` is a valid execution strategy - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: correctProposeCalldata, - }); - - // Cancel the proposal - await controller.invoke(space, 'cancelProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Revert back to initial execution strategy - await controller.invoke(space, 'addExecutionStrategies', { - addresses: [vanillaExecutionStrategy.address], - }); - await controller.invoke(space, 'removeExecutionStrategies', { - addresses: [randomExecutionContract.address], - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can update the quorum', async () => { - // Update the quorum to `2` - await controller.invoke(space, 'setQuorum', { - new_quorum: utils.splitUint256.SplitUint256.fromUint(BigInt(2)), - }); - - const proposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Create a new proposal - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - const userVoteCalldata = getVoteCalldata( - user.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - // Vote once - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: userVoteCalldata, - }); - - // Should not work because quorum is set to `2` and only 1 vote has been cast - try { - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - throw { message: 'quorum has not been updated' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Quorum has not been reached'); - } - - const user2VoteCalldata = getVoteCalldata( - space.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - // Vote a second time - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: user2VoteCalldata, - }); - - // Quorum has now been reached so proposal should get finalized - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Set back quorum to initial value - await controller.invoke(space, 'setQuorum', { - new_quorum: utils.splitUint256.SplitUint256.fromUint(BigInt(1)), - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can update the voting delay', async () => { - // Set the voting delay to 1000 - await controller.invoke(space, 'setVotingDelay', { - new_delay: BigInt(1000), - }); - - const proposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Create a proposal - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - // Should not work because voting delay has not elapsed - const userVoteCalldata = getVoteCalldata( - user.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - try { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: userVoteCalldata, - }); - throw { message: 'voting delay has not been updated' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Voting has not started yet'); - } - - // Fast forward to end of voting delay - await starknet.devnet.increaseTime(1000); - - // Dummy invoke to get to the next block and effectively increase time. - // We will be able to remove this once hardhat-plugin has a `create_block` method. - await controller.invoke(vanillaExecutionStrategy, 'execute', { - proposal_outcome: BigInt(1), - execution_params: [], - }); - - // Vote should work now - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: userVoteCalldata, - }); - - // Finalize proposal - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Reset back the voting delay - await controller.invoke(space, 'setVotingDelay', { - new_delay: BigInt(0), - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can update the min voting duration', async () => { - // Update the min voting duration - await controller.invoke(space, 'setMinVotingDuration', { - new_min_voting_duration: BigInt(1000), - }); - - const proposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Create a proposal - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - const userVoteCalldata = getVoteCalldata( - user.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - // Cast a vote - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: userVoteCalldata, - }); - - // Finalize now should not work because it's too early to finalize - // with a minimum_voting_duration of 1000 seconds - try { - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - throw { message: 'min voting duration has not been updated' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Min voting period has not elapsed'); - } - - // Fast forward in time - await starknet.devnet.increaseTime(1000); - - // Dummy invoke to get to the next block and effectively increase time. - // We will be able to remove this once hardhat-plugin has a `create_block` method. - await controller.invoke(vanillaExecutionStrategy, 'execute', { - proposal_outcome: BigInt(1), - execution_params: [], - }); - - // Finalize proposal should work now that we've fast forwarded in time - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Reset back min voting setting - await controller.invoke(space, 'setMinVotingDuration', { - new_min_voting_duration: BigInt(0), - }); - - proposalId += BigInt(1); - }).timeout(600000); - - it('The controller can update the max voting duration', async () => { - // Set new max voting duration - await controller.invoke(space, 'setMaxVotingDuration', { - new_max_voting_duration: BigInt(100), - }); - - const proposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x2'], - [[]], - [] - ); - // Create a new proposal - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - const userVoteCalldata = getVoteCalldata( - user.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - // Cast a vote before the end of the vote - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: userVoteCalldata, - }); - - // Fast forward to end of voting delay - await starknet.devnet.increaseTime(100); - - // Dummy invoke to get to the next block and effectively increase time. - // We will be able to remove this once hardhat-plugin has a `create_block` method. - await controller.invoke(vanillaExecutionStrategy, 'execute', { - proposal_outcome: BigInt(1), - execution_params: [], - }); - - // Should fail because casting a vote once the max_voting_duration has elapsed - try { - const spaceVoteCalldata = getVoteCalldata( - space.address, - proposalId.toString(16), - utils.choice.Choice.FOR, - ['0x2'], - [[]] - ); - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: VOTE_SELECTOR, - calldata: spaceVoteCalldata, - }); - throw { message: 'max voting duration has not been updated' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Voting period has ended'); - } - - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: [], - }); - - // Reset to the inital max voting delay - await controller.invoke(space, 'setMaxVotingDuration', { - new_max_voting_duration: BigInt(2000), - }); - }).timeout(600000); - - it('The controller can update the proposal threshold', async () => { - await controller.invoke(space, 'setProposalThreshold', { - new_proposal_threshold: utils.splitUint256.SplitUint256.fromUint(BigInt('0x100')), - }); - - // Change the voting strategy to a whitelist strategy - // Used to have specific amounts of voting power for specific addresses - const whitelistFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Whitelist.cairo' - ); - // space should not have enough VP to reach threshold - const spaceVotingPower = utils.splitUint256.SplitUint256.fromHex('0x1'); - // user should have enough VP to reach threshold - const userVotingPower = utils.splitUint256.SplitUint256.fromHex('0x100'); - const whitelistStrategy = await whitelistFactory.deploy({ - whitelist: [ - space.address, - spaceVotingPower.low, - spaceVotingPower.high, - user.address, - userVotingPower.low, - userVotingPower.high, - ], - }); - - const votingStrategyParams: string[][] = [[]]; - const votingStrategyParamsFlat: string[] = utils.encoding.flatten2DArray(votingStrategyParams); - // The whitelist strategy will be at index 3 - await controller.invoke(space, 'addVotingStrategies', { - addresses: [whitelistStrategy.address], - params_flat: votingStrategyParamsFlat, - }); - - // Should fail because `space` does not have enough VP to reach threshold - try { - const spaceProposeCalldata = getProposeCalldata( - space.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x3'], - [[]], - [] - ); - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: spaceProposeCalldata, - }); - throw { message: 'proposal threshold not checked properly' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Not enough voting power'); - } - - const userProposeCalldata = getProposeCalldata( - user.address, - utils.intsSequence.IntsSequence.LEFromString(''), - vanillaExecutionStrategy.address, - ['0x3'], - [[]], - [] - ); - // Should work because `user` has enough VP to reach threshold - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: space.address, - function_selector: PROPOSE_SELECTOR, - calldata: userProposeCalldata, - }); - - // Ensure proposal exists - await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - }).timeout(600000); - - it('The controller can update the metadata uri', async () => { - const newMetadataUri = - 'Snapshot X Test Space 2 blah blah blah blah blah blah blah blah blah blah blah blah'; - const txHash = await controller.invoke(space, 'setMetadataUri', { - new_metadata_uri: utils.strings.strToShortStringArr(newMetadataUri), - }); - const receipt = await starknet.getTransactionReceipt(txHash); - const decodedEvents = await space.decodeEvents(receipt.events); - expect(newMetadataUri).to.deep.equal( - utils.strings.shortStringArrToStr(decodedEvents[0].data.new_metadata_uri) - ); - }).timeout(600000); -}); diff --git a/test/starknet/EthSigAuth.test.ts b/test/starknet/EthSigAuth.test.ts deleted file mode 100644 index d6eff44a..00000000 --- a/test/starknet/EthSigAuth.test.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { expect } from 'chai'; -import { StarknetContract, Account } from 'hardhat/types'; -import { ethers } from 'hardhat'; -import { domain, Propose, proposeTypes, Vote, voteTypes } from '../shared/types'; -import { computeHashOnElements } from 'starknet/dist/utils/hash'; -import { utils } from '@snapshot-labs/sx'; -import { ethSigAuthSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; -import { keccak256, _TypedDataEncoder } from 'ethers/lib/utils'; - -export const VITALIK_ADDRESS = BigInt('0xd8da6bf26964af9d7eed9e03e53415d37aa96045'); -export const AUTHENTICATE_METHOD = 'authenticate'; -export const PROPOSAL_METHOD = 'propose'; -export const VOTE_METHOD = 'vote'; -export const METADATA_URI = 'Hello and welcome to Snapshot X. This is the future of governance.'; - -describe('Ethereum Signature Auth testing', () => { - // Contracts - let space: StarknetContract; - let controller: Account; - let ethSigAuth: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let executionHash: string; - let metadataUri: string; - let metadataUriInts: utils.intsSequence.IntsSequence; - let usedVotingStrategies1: string[]; - let usedVotingStrategiesHash1: string; - let userVotingParamsAll1: string[][]; - let userVotingStrategyParamsFlatHash1: string; - let executionStrategy: string; - let executionParams: string[]; - let proposerEthAddress: string; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterEthAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let usedVotingStrategiesHash2: string; - let userVotingParamsAll2: string[][]; - let userVotingStrategyParamsFlatHash2: string; - let voteCalldata: string[]; - - before(async function () { - this.timeout(800000); - const accounts = await ethers.getSigners(); - ({ space, controller, ethSigAuth, vanillaVotingStrategy, vanillaExecutionStrategy } = - await ethSigAuthSetup()); - - metadataUri = 'Hello and welcome to Snapshot X. This is the future of governance.'; - metadataUriInts = utils.intsSequence.IntsSequence.LEFromString(metadataUri); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - spaceAddress = space.address; - - executionParams = ['0x01']; // Random params - executionHash = computeHashOnElements(executionParams); - usedVotingStrategiesHash1 = computeHashOnElements(usedVotingStrategies1); - const userVotingStrategyParamsFlat1 = utils.encoding.flatten2DArray(userVotingParamsAll1); - userVotingStrategyParamsFlatHash1 = computeHashOnElements(userVotingStrategyParamsFlat1); - - proposerEthAddress = accounts[0].address; - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUriInts, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterEthAddress = accounts[0].address; - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - usedVotingStrategiesHash2 = computeHashOnElements(usedVotingStrategies2); - const userVotingStrategyParamsFlat2 = utils.encoding.flatten2DArray(userVotingParamsAll2); - userVotingStrategyParamsFlatHash2 = computeHashOnElements(userVotingStrategyParamsFlat2); - voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Should not authenticate an invalid signature', async () => { - try { - const accounts = await ethers.getSigners(); - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex('0x1'); - const spaceStr = utils.encoding.hexPadRight(space.address); - const executionHashPadded = utils.encoding.hexPadRight(executionHash); - const usedVotingStrategiesHashPadded1 = utils.encoding.hexPadRight(usedVotingStrategiesHash1); - const userVotingStrategyParamsFlatHashPadded1 = utils.encoding.hexPadRight( - userVotingStrategyParamsFlatHash1 - ); - const paddedExecutor = utils.encoding.hexPadRight(vanillaExecutionStrategy.address); - const message: Propose = { - authenticator: ethSigAuth.address, - space: spaceStr, - author: proposerEthAddress, - metadata_uri: METADATA_URI, - executor: paddedExecutor, - execution_hash: executionHashPadded, - strategies_hash: usedVotingStrategiesHashPadded1, - strategies_params_hash: userVotingStrategyParamsFlatHashPadded1, - salt: salt.toHex(), - }; - - const fakeData = [...proposeCalldata]; - - const sig = await accounts[0]._signTypedData(domain, proposeTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - - // Data is signed with accounts[0] but the proposer is accounts[1] so it should fail - fakeData[0] = accounts[1].address; - - await controller.invoke(ethSigAuth, 'authenticate', { - r: r, - s: s, - v: v, - salt: salt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: fakeData, - }); - expect(1).to.deep.equal(2); - } catch (err: any) { - expect(err.message).to.contain('Invalid signature.'); - } - }); - - it('Should create a proposal and cast a vote', async () => { - // -- Creates the proposal -- - { - const accounts = await ethers.getSigners(); - const proposalSalt: utils.splitUint256.SplitUint256 = - utils.splitUint256.SplitUint256.fromHex('0x01'); - - const executionHashPadded = utils.encoding.hexPadRight(executionHash); - const usedVotingStrategiesHashPadded1 = utils.encoding.hexPadRight(usedVotingStrategiesHash1); - const userVotingStrategyParamsFlatHashPadded1 = utils.encoding.hexPadRight( - userVotingStrategyParamsFlatHash1 - ); - const paddedExecutor = utils.encoding.hexPadRight(executionStrategy); - - const message: Propose = { - authenticator: ethSigAuth.address, - space: spaceAddress, - author: proposerEthAddress, - metadata_uri: METADATA_URI, - executor: paddedExecutor, - execution_hash: executionHashPadded, - strategies_hash: usedVotingStrategiesHashPadded1, - strategies_params_hash: userVotingStrategyParamsFlatHashPadded1, - salt: proposalSalt.toHex(), - }; - - const sig = await accounts[0]._signTypedData(domain, proposeTypes, message); - - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - - console.log('Creating proposal...'); - await controller.invoke(ethSigAuth, 'authenticate', { - r: r, - s: s, - v: v, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - // -- Attempts a replay attack on `propose` method -- - // Expected to fail - try { - console.log('Replaying transaction...'); - await controller.invoke(ethSigAuth, 'authenticate', { - r: r, - s: s, - v: v, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'replay attack worked on `propose`' }; - } catch (err: any) { - expect(err.message).to.contain('EIP712: Salt already used'); - } - - // We can't directly compare the `info` object because we don't know for sure the value of `start_block` (and hence `end_block`), - // so we compare it element by element. - const _executionHash = proposal_info.proposal.execution_hash; - expect(_executionHash).to.deep.equal(BigInt(executionHash)); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(0)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - - // -- Casts a vote FOR -- - { - console.log('Casting a vote FOR...'); - const accounts = await ethers.getSigners(); - const spaceStr = utils.encoding.hexPadRight(space.address); - const voteSalt = utils.splitUint256.SplitUint256.fromHex('0x02'); - const usedVotingStrategiesHashPadded2 = utils.encoding.hexPadRight(usedVotingStrategiesHash2); - const userVotingStrategyParamsFlatHashPadded2 = utils.encoding.hexPadRight( - userVotingStrategyParamsFlatHash2 - ); - const voterEthAddressPadded = voterEthAddress; - - const message: Vote = { - authenticator: ethSigAuth.address, - space: spaceStr, - voter: voterEthAddressPadded, - proposal: BigInt(proposalId).toString(16), - choice: utils.choice.Choice.FOR, - strategies_hash: usedVotingStrategiesHashPadded2, - strategies_params_hash: userVotingStrategyParamsFlatHashPadded2, - salt: voteSalt.toHex(), - }; - const sig = await accounts[0]._signTypedData(domain, voteTypes, message); - - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - const voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - proposalId, - utils.choice.Choice.FOR, - usedVotingStrategies1, - userVotingParamsAll1 - ); - await controller.invoke(ethSigAuth, 'authenticate', { - r: r, - s: s, - v: v, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(1)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - - // -- Attempts a replay attack on `vote` method -- - try { - console.log('Replaying vote...'); - await controller.invoke(ethSigAuth, 'authenticate', { - r: r, - s: s, - v: v, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - throw { message: 'replay attack worked on `vote`' }; - } catch (err: any) { - expect(err.message).to.contain('EIP712: Salt already used'); - } - } - }).timeout(6000000); -}); diff --git a/test/starknet/EthSigSessionKeyAuth.test.ts b/test/starknet/EthSigSessionKeyAuth.test.ts deleted file mode 100644 index 62e4e3c8..00000000 --- a/test/starknet/EthSigSessionKeyAuth.test.ts +++ /dev/null @@ -1,584 +0,0 @@ -import { expect } from 'chai'; -import { StarknetContract, Account } from 'hardhat/types'; -import { ec, typedData, hash, Signer } from 'starknet'; -import { ethers, starknet } from 'hardhat'; -import { - domain, - SessionKey, - sessionKeyTypes, - RevokeSessionKey, - revokeSessionKeyTypes, -} from '../shared/types'; -import * as starkTypes from '../shared/starkTypes'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; -import { utils } from '@snapshot-labs/sx'; -import { ethSigSessionKeyAuthSetup } from '../shared/setup'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; - -function sleep(milliseconds: number) { - const date = Date.now(); - let currentDate = null; - do { - currentDate = Date.now(); - } while (currentDate - date < milliseconds); -} - -describe('Ethereum Signature Session Key Auth testing', () => { - let account: SignerWithAddress; - let account2: SignerWithAddress; - - // Contracts - let space: StarknetContract; - let controller: Account; - let ethSigSessionKeyAuth: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let executionHash: string; - let metadataUri: string; - let metadataUriInts: utils.intsSequence.IntsSequence; - let usedVotingStrategies1: string[]; - let usedVotingStrategiesHash1: string; - let userVotingParamsAll1: string[][]; - let userVotingStrategyParamsFlatHash1: string; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Additional parameters for voting - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let usedVotingStrategiesHash2: string; - let userVotingParamsAll2: string[][]; - let userVotingStrategyParamsFlatHash2: string; - let voteCalldata: string[]; - - // Session Keys - let sessionSigner: Signer; - let sessionPublicKey: string; - let sessionDuration: string; - let sessionSigner2: Signer; - let sessionPublicKey2: string; - - before(async function () { - this.timeout(800000); - - const accounts = await ethers.getSigners(); - account = accounts[0]; - account2 = accounts[1]; - - sessionSigner = new Signer(ec.genKeyPair()); - sessionPublicKey = await sessionSigner.getPubKey(); - sessionSigner2 = new Signer(ec.genKeyPair()); - sessionPublicKey2 = await sessionSigner2.getPubKey(); - - ({ space, controller, ethSigSessionKeyAuth, vanillaVotingStrategy, vanillaExecutionStrategy } = - await ethSigSessionKeyAuthSetup()); - - metadataUri = 'Hello and welcome to Snapshot X. This is the future of governance.'; - metadataUriInts = utils.intsSequence.IntsSequence.LEFromString(metadataUri); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - spaceAddress = space.address; - - executionParams = ['0x01']; // Random params - executionHash = hash.computeHashOnElements(executionParams); - usedVotingStrategiesHash1 = hash.computeHashOnElements(usedVotingStrategies1); - const userVotingStrategyParamsFlat1 = utils.encoding.flatten2DArray(userVotingParamsAll1); - userVotingStrategyParamsFlatHash1 = hash.computeHashOnElements(userVotingStrategyParamsFlat1); - - proposeCalldata = utils.encoding.getProposeCalldata( - account.address, - metadataUriInts, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - usedVotingStrategiesHash2 = hash.computeHashOnElements(usedVotingStrategies2); - const userVotingStrategyParamsFlat2 = utils.encoding.flatten2DArray(userVotingParamsAll2); - userVotingStrategyParamsFlatHash2 = hash.computeHashOnElements(userVotingStrategyParamsFlat2); - voteCalldata = utils.encoding.getVoteCalldata( - account.address, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Should not generate a session key if an invalid signature is provided', async () => { - try { - const accounts = await ethers.getSigners(); - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - sessionDuration = '0x30'; - const message: SessionKey = { - address: accounts[0].address, - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey), - sessionDuration: sessionDuration, - salt: salt.toHex(), - }; - const sig = await account._signTypedData(domain, sessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - // Different session duration to signed data - await controller.invoke(ethSigSessionKeyAuth, 'authorizeSessionKeyWithSig', { - r: r, - s: s, - v: v, - salt: salt, - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: '0x1111', - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('Invalid signature.'); - } - }).timeout(6000000); - - it('Should generate a session key and allow authentication via it if a valid signature is provided', async () => { - // -- Authenticates the session key -- - { - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - sessionDuration = '0xffff'; - const message: SessionKey = { - address: account.address, - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey), - sessionDuration: sessionDuration, - salt: salt.toHex(), - }; - const sig = await account._signTypedData(domain, sessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - await controller.invoke(ethSigSessionKeyAuth, 'authorizeSessionKeyWithSig', { - r: r, - s: s, - v: v, - salt: salt, - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - const { eth_address } = await ethSigSessionKeyAuth.call('getSessionKeyOwner', { - session_public_key: sessionPublicKey, - }); - expect(eth_address).to.deep.equal(BigInt(account.address)); - } - - // -- Creates the proposal -- - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - console.log('Creating proposal...'); - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - - // -- Attempts a replay attack on `propose` method -- - // Expected to fail - try { - console.log('Replaying transaction...'); - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: 'replay attack worked on `propose`' }; - } catch (err: any) { - expect(err.message).to.contain('StarkEIP191: Salt already used'); - } - } - - // -- Casts Vote -- - { - console.log('Casting a vote FOR...'); - const voteSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - voter: account.address, - proposal: proposalId, - choice: utils.choice.Choice.FOR, - strategies_hash: usedVotingStrategiesHash2, - strategies_params_hash: userVotingStrategyParamsFlatHash2, - salt: voteSalt, - }; - const msg = { - types: starkTypes.voteTypes, - primaryType: 'Vote', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - session_public_key: sessionPublicKey, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(1)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - - // -- Attempts a replay attack on `vote` method -- - try { - console.log('Replaying vote...'); - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: 'replay attack worked on `vote`' }; - } catch (err: any) { - expect(err.message).to.contain('StarkEIP191: Salt already used'); - } - } - }).timeout(6000000); - - it('Should reject an invalid session key', async () => { - try { - // Invalid session key - const sessionSigner2 = new Signer(ec.genKeyPair()); - const sessionPublicKey2 = await sessionSigner2.getPubKey(); - const voteSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - const message = { - authenticator: ethSigSessionKeyAuth.address, - space: spaceAddress, - voter: account.address, - proposal: proposalId, - choice: utils.choice.Choice.FOR, - strategies_hash: usedVotingStrategiesHash2, - strategies_params_hash: userVotingStrategyParamsFlatHash2, - salt: voteSalt, - }; - const msg = { types: starkTypes.voteTypes, primaryType: 'Vote', domain, message }; - const sig = await sessionSigner2.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - session_public_key: sessionPublicKey2, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session does not exist'); - } - }).timeout(6000000); - - it('Should reject an expired session key', async () => { - // -- Authenticates the session key -- - { - const accounts = await ethers.getSigners(); - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - sessionDuration = '0x1'; // 1 second duration session - const message: SessionKey = { - address: accounts[1].address, - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey2), - sessionDuration: sessionDuration, - salt: salt.toHex(), - }; - const sig = await account2._signTypedData(domain, sessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - await controller.invoke(ethSigSessionKeyAuth, 'authorizeSessionKeyWithSig', { - r: r, - s: s, - v: v, - salt: salt, - eth_address: account2.address, - session_public_key: sessionPublicKey2, - session_duration: sessionDuration, - }); - } - - // -- Creates the proposal -- - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - authenticator: ethSigSessionKeyAuth.address, - space: spaceAddress, - author: account2.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner2.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - try { - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey2, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session has ended'); - } - } - }).timeout(6000000); - - it('Should allow revoking of a session key via a signature from the session key', async () => { - // -- Revokes Session Key -- - { - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - salt: salt, - }; - const msg: typedData.TypedData = { - types: starkTypes.revokeSessionKeyTypes, - primaryType: 'RevokeSessionKey', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - await controller.invoke(ethSigSessionKeyAuth, 'revokeSessionKeyWithSessionKeySig', { - r: r, - s: s, - salt: salt, - session_public_key: sessionPublicKey, - }); - } - - // -- Checks that the session key can no longer be used - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - try { - console.log('Creating proposal...'); - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session does not exist'); - } - } - }).timeout(6000000); - - it('Should allow revoking of a session key via a signature from the owners ethereum key', async () => { - // -- Authenticates the session key -- - { - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - sessionDuration = '0xffff'; - const message: SessionKey = { - address: account.address, - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey), - sessionDuration: sessionDuration, - salt: salt.toHex(), - }; - const sig = await account._signTypedData(domain, sessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - await controller.invoke(ethSigSessionKeyAuth, 'authorizeSessionKeyWithSig', { - r: r, - s: s, - v: v, - salt: salt, - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - } - - // -- Revokes Session Key -- - { - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - - const message: RevokeSessionKey = { - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey), - salt: salt.toHex(), - }; - const sig = await account._signTypedData(domain, revokeSessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - - await controller.invoke(ethSigSessionKeyAuth, 'revokeSessionKeyWithOwnerSig', { - r: r, - s: s, - v: v, - salt: salt, - session_public_key: sessionPublicKey, - }); - } - - // -- Checks that the session key can no longer be used - { - const proposalSalt = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - - const message = { - space: spaceAddress, - author: account.address, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const msg: typedData.TypedData = { - types: starkTypes.proposeTypes, - primaryType: 'Propose', - domain: starkTypes.domain, - message, - }; - const sig = await sessionSigner.signMessage(msg, ethSigSessionKeyAuth.address); - const [r, s] = sig; - - try { - console.log('Creating proposal...'); - await controller.invoke(ethSigSessionKeyAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - session_public_key: sessionPublicKey, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Session does not exist'); - } - } - }).timeout(6000000); - - it('Should fail if overflow occurs when calculating the session end timestamp session duration', async () => { - const salt: utils.splitUint256.SplitUint256 = utils.splitUint256.SplitUint256.fromHex( - ethers.utils.hexlify(ethers.utils.randomBytes(4)) - ); - sessionDuration = '0xfffffffffffffffffffffffffffffffffffffffffffffff'; // Greater than RANGE_CHECK_BOUND - const message: SessionKey = { - address: account.address, - sessionPublicKey: utils.encoding.hexPadRight(sessionPublicKey), - sessionDuration: sessionDuration, - salt: salt.toHex(), - }; - const sig = await account._signTypedData(domain, sessionKeyTypes, message); - const { r, s, v } = utils.encoding.getRSVFromSig(sig); - - try { - await controller.invoke(ethSigSessionKeyAuth, 'authorizeSessionKeyWithSig', { - r: r, - s: s, - v: v, - salt: salt, - eth_address: account.address, - session_public_key: sessionPublicKey, - session_duration: sessionDuration, - }); - throw { message: '' }; - } catch (err: any) { - expect(err.message).to.contain('SessionKey: Invalid session duration'); - } - }).timeout(6000000); -}); diff --git a/test/starknet/ExecutionStrategyWhitelist.test.ts b/test/starknet/ExecutionStrategyWhitelist.test.ts deleted file mode 100644 index f3c15831..00000000 --- a/test/starknet/ExecutionStrategyWhitelist.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { expect } from 'chai'; -import { Contract } from 'ethers'; -import { starknet, ethers } from 'hardhat'; -import { utils } from '@snapshot-labs/sx'; -import { zodiacRelayerSetup } from '../shared/setup'; -import { StarknetContract, Account } from 'hardhat/types'; -import { PROPOSE_SELECTOR } from '../shared/constants'; - -describe('Execution Strategy Whitelist testing', () => { - // Contracts - let space: StarknetContract; - let controller: Account; - let vanillaAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let zodiacRelayer: StarknetContract; - let zodiacModule: Contract; - let vanillaExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let executionHash: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy1: string; - let executionParams1: string[]; - let proposeCalldata1: string[]; - - // Alternative execution strategy parameters - let executionStrategy2: string; - let executionParams2: string[]; - let proposeCalldata2: string[]; - - before(async function () { - this.timeout(800000); - - ({ - space, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - zodiacRelayer, - zodiacModule, - } = await zodiacRelayerSetup()); - - const vanillaExecutionStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/ExecutionStrategies/Vanilla.cairo' - ); - vanillaExecutionStrategy = await vanillaExecutionStrategyFactory.deploy(); - - spaceAddress = space.address; - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerEthAddress = ethers.Wallet.createRandom().address; - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy1 = zodiacRelayer.address; - executionHash = utils.bytes.bytesToHex(ethers.utils.randomBytes(32)); // Random 32 byte hash - executionParams1 = [ - zodiacModule.address, - utils.splitUint256.SplitUint256.fromHex(executionHash).low, - utils.splitUint256.SplitUint256.fromHex(executionHash).high, - ]; - proposeCalldata1 = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy1, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams1 - ); - - executionStrategy2 = vanillaExecutionStrategy.address; - executionParams2 = []; - proposeCalldata2 = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy2, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams2 - ); - }); - - it('Should create a proposal for a whitelisted execution strategy', async () => { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata1, - }); - - // Cancel the proposal to be able to add / remove execution_strategies later on - await controller.invoke(space, 'cancelProposal', { - proposal_id: 1, - execution_params: executionParams1, - }); - }).timeout(1000000); - - it('Should not be able to create a proposal with a non whitelisted execution strategy', async () => { - try { - // proposeCalldata2 contains the vanilla execution strategy which is not whitelisted initially - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata2, - }); - throw { message: 'proposal created with non whitelisted execution strategy' }; - } catch (err: any) { - expect(err.message).to.contain('Voting: Invalid execution strategy'); - } - }).timeout(1000000); - - it('The controller can whitelist an execution strategy', async () => { - await controller.invoke(space, 'addExecutionStrategies', { - addresses: [BigInt(vanillaExecutionStrategy.address)], - }); - - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata2, - }); - - // Cancel the proposal to be able to add / remove execution_strategies later on - await controller.invoke(space, 'cancelProposal', { - proposal_id: 2, - execution_params: executionParams2, - }); - }).timeout(1000000); - - it('The controller can remove two execution strategies', async () => { - await controller.invoke(space, 'removeExecutionStrategies', { - addresses: [BigInt(zodiacRelayer.address), BigInt(vanillaExecutionStrategy.address)], - }); - - try { - // Try to create a proposal, should fail because it just got removed from the whitelist - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata1, - }); - throw { message: 'proposal not removed from whitelist' }; - } catch (err: any) { - expect(err.message).to.contain('Voting: Invalid execution strategy'); - } - }).timeout(1000000); - - it('The controller can add two execution strategies', async () => { - await controller.invoke(space, 'addExecutionStrategies', { - addresses: [BigInt(zodiacRelayer.address), BigInt(vanillaExecutionStrategy.address)], - }); - - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata2, - }); - }).timeout(1000000); -}); diff --git a/test/starknet/MathUtils.test.ts b/test/starknet/MathUtils.test.ts deleted file mode 100644 index 5b1359cb..00000000 --- a/test/starknet/MathUtils.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { StarknetContract } from 'hardhat/types/runtime'; -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { utils } from '@snapshot-labs/sx'; - -describe('Felt Utils:', () => { - let testMathUtils: StarknetContract; - - before(async function () { - this.timeout(800000); - const testMathUtilsFactory = await starknet.getContractFactory( - './contracts/starknet/TestContracts/Test_MathUtils.cairo' - ); - testMathUtils = await testMathUtilsFactory.deploy(); - }); - - it('The library should covert 4 64 bit words to a Uint256', async () => { - const word1 = BigInt(utils.bytes.bytesToHex(ethers.utils.randomBytes(2))); - const word2 = BigInt(utils.bytes.bytesToHex(ethers.utils.randomBytes(2))); - const word3 = BigInt(utils.bytes.bytesToHex(ethers.utils.randomBytes(2))); - const word4 = BigInt(utils.bytes.bytesToHex(ethers.utils.randomBytes(2))); - const { uint256: uint256 } = await testMathUtils.call('testWordsToUint256', { - word1: word1, - word2: word2, - word3: word3, - word4: word4, - }); - const uint = utils.words64.wordsToUint(word1, word2, word3, word4); - expect( - new utils.splitUint256.SplitUint256( - `0x${uint256.low.toString(16)}`, - `0x${uint256.high.toString(16)}` - ) - ).to.deep.equal(utils.splitUint256.SplitUint256.fromUint(uint)); - }).timeout(600000); - - it('The library should pack 4 32 bit numbers into a felt', async () => { - const num1 = utils.bytes.bytesToHex(ethers.utils.randomBytes(1)); - const num2 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - const num3 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - const num4 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - const { packed: packed } = await testMathUtils.call('testPackFelt', { - num1: num1, - num2: num2, - num3: num3, - num4: num4, - }); - const { - num1: _num1, - num2: _num2, - num3: _num3, - num4: _num4, - } = await testMathUtils.call('testUnpackFelt', { packed: packed }); - expect(BigInt(num1)).to.deep.equal(_num1); - expect(BigInt(num2)).to.deep.equal(_num2); - expect(BigInt(num3)).to.deep.equal(_num3); - expect(BigInt(num4)).to.deep.equal(_num4); - }).timeout(600000); - - it('Packing should fail if a number greater than 32 bits is used', async () => { - const num1 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - const num2 = '0xfffffffff'; // 36 bits - const num3 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - const num4 = utils.bytes.bytesToHex(ethers.utils.randomBytes(4)); - try { - const { packed: packed } = await testMathUtils.call('testPackFelt', { - num1: num1, - num2: num2, - num3: num3, - num4: num4, - }); - throw { message: 'packing succeeded with a number greater than 32 bits' }; - } catch (error: any) { - expect(error.message).to.contain('MathUtils: number too big to be packed'); - } - }).timeout(600000); -}); diff --git a/test/starknet/MerkleProof.test.ts b/test/starknet/MerkleProof.test.ts deleted file mode 100644 index 14ce21b5..00000000 --- a/test/starknet/MerkleProof.test.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { StarknetContract } from 'hardhat/types/runtime'; -import { expect } from 'chai'; -import { ethers, starknet } from 'hardhat'; -import { computeHashOnElements } from 'starknet/dist/utils/hash'; -import { MerkleTree } from '../shared/merkle'; - -describe('Merkle:', () => { - let testMerkle: StarknetContract; - - before(async function () { - this.timeout(800000); - const testMerkleFactory = await starknet.getContractFactory( - './contracts/starknet/TestContracts/Test_Merkle.cairo' - ); - testMerkle = await testMerkleFactory.deploy(); - }); - - it('The library should handle a tree with one leaf', async () => { - const values = []; - // Generating random data for the merkle tree - for (let i = 0; i < 1; i++) { - values.push([ - ethers.Wallet.createRandom().address, - ethers.utils.hexlify(ethers.utils.randomBytes(1)), - ]); - } - - // computing the hash of each address value pair, and sorting - const merkleData = values - .map((v, i) => [computeHashOnElements(v), v[0], v[1]]) - .sort(function (a, b) { - if (a > b) return 1; - if (a < b) return -1; - return 0; - }) - .map((x, i) => [x[0], x[1], x[2], i]); - const leaves = merkleData.map((x) => x[0].toString()); - const tree = new MerkleTree(leaves); - // Picking random leaf to prove - const address = values[Math.floor(Math.random() * 1)][0]; - const leafData = merkleData.find((leaf) => leaf[1] == address)!; - - await testMerkle.call('testAssertValidLeaf', { - root: tree.root, - leaf: [leafData[1], leafData[2]], - proof: tree.getProof(leaves, Number(leafData[3])), - }); - - it('The library should handle a tree with two leaves', async () => { - const values = []; - // Generating random data for the merkle tree - for (let i = 0; i < 2; i++) { - values.push([ - ethers.Wallet.createRandom().address, - ethers.utils.hexlify(ethers.utils.randomBytes(1)), - ]); - } - - // computing the hash of each address value pair, and sorting - const merkleData = values - .map((v, i) => [computeHashOnElements(v), v[0], v[1]]) - .sort(function (a, b) { - if (a > b) return 1; - if (a < b) return -1; - return 0; - }) - .map((x, i) => [x[0], x[1], x[2], i]); - const leaves = merkleData.map((x) => x[0].toString()); - const tree = new MerkleTree(leaves); - // Picking random leaf to prove - const address = values[Math.floor(Math.random() * 2)][0]; - const leafData = merkleData.find((leaf) => leaf[1] == address)!; - - await testMerkle.call('testAssertValidLeaf', { - root: tree.root, - leaf: [leafData[1], leafData[2]], - proof: tree.getProof(leaves, Number(leafData[3])), - }); - }); - - it('The library should verify a merkle proof for a leaf in a large tree', async () => { - const values = []; - // Generating random data for the merkle tree - for (let i = 0; i < 1000; i++) { - values.push([ - ethers.Wallet.createRandom().address, - ethers.utils.hexlify(ethers.utils.randomBytes(1)), - ]); - } - - // computing the hash of each address value pair, and sorting - const merkleData = values - .map((v, i) => [computeHashOnElements(v), v[0], v[1]]) - .sort(function (a, b) { - if (a > b) return 1; - if (a < b) return -1; - return 0; - }) - .map((x, i) => [x[0], x[1], x[2], i]); - const leaves = merkleData.map((x) => x[0].toString()); - const tree = new MerkleTree(leaves); - - // Picking random leaf to prove - const address = values[Math.floor(Math.random() * 99)][0]; - const leafData = merkleData.find((leaf) => leaf[1] == address)!; - - await testMerkle.call('testAssertValidLeaf', { - root: tree.root, - leaf: [leafData[1], leafData[2]], - proof: tree.getProof(leaves, Number(leafData[3])), - }); - }).timeout(600000); - - it('The library should fail to verify if an invalid proof is supplied', async () => { - const values = []; - // Generating random data for the merkle tree - for (let i = 0; i < 100; i++) { - values.push([ - ethers.Wallet.createRandom().address, - ethers.utils.hexlify(ethers.utils.randomBytes(1)), - ]); - } - - // computing the hash of each address value pair, and sorting - const merkleData = values - .map((v, i) => [computeHashOnElements(v), v[0], v[1]]) - .sort(function (a, b) { - if (a > b) return 1; - if (a < b) return -1; - return 0; - }) - .map((x, i) => [x[0], x[1], x[2], i]); - const leaves = merkleData.map((x) => x[0].toString()); - const tree = new MerkleTree(leaves); - - // Picking random leaf to prove - const address = values[Math.floor(Math.random() * 99)][0]; - const leafData = merkleData.find((leaf) => leaf[1] == address)!; - - const corruptedProof = tree.getProof(leaves, Number(leafData[3])); - corruptedProof[0] = ethers.utils.hexlify(ethers.utils.randomBytes(4)); - try { - await testMerkle.call('testAssertValidLeaf', { - root: tree.root, - leaf: [leafData[1], leafData[2]], - proof: corruptedProof, - }); - throw { message: 'invalid leaf asserted to be valid' }; - } catch (error: any) { - expect(error.message).to.contain('Merkle: Invalid proof'); - } - }).timeout(600000); - - it('The library should handle a tree with no leaves', async () => { - try { - await testMerkle.call('testAssertValidLeaf', { - root: '0x0', - leaf: ['0x0', '0x0'], - proof: '0x0', - }); - throw { message: 'invalid leaf asserted to be valid' }; - } catch (error: any) { - expect(error.message).to.contain('Merkle: Invalid proof'); - } - }); - }).timeout(600000); -}); diff --git a/test/starknet/MerkleWhitelist.test.ts b/test/starknet/MerkleWhitelist.test.ts deleted file mode 100644 index b9e2f8c3..00000000 --- a/test/starknet/MerkleWhitelist.test.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { StarknetContract } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { computeHashOnElements } from 'starknet/dist/utils/hash'; -import { MerkleTree } from '../shared/merkle'; - -describe('Merkle Whitelist testing', () => { - let whitelist: StarknetContract; - - let address1: string; - let address2: string; - let address3: string; - let address4: string; - - let power1: utils.splitUint256.SplitUint256; - let power2: utils.splitUint256.SplitUint256; - let power3: utils.splitUint256.SplitUint256; - let power4: utils.splitUint256.SplitUint256; - - let tree: MerkleTree; - let leaves: string[]; - let merkleData: (string | number)[][]; - - before(async function () { - this.timeout(800000); - - const merkleWhitelistFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/MerkleWhitelist.cairo' - ); - whitelist = await merkleWhitelistFactory.deploy(); - - address1 = ethers.Wallet.createRandom().address; - address2 = ethers.Wallet.createRandom().address; - address3 = ethers.Wallet.createRandom().address; - address4 = ethers.Wallet.createRandom().address; - - power1 = utils.splitUint256.SplitUint256.fromUint(BigInt('1000')); - power2 = utils.splitUint256.SplitUint256.fromUint(BigInt('1')); - power3 = utils.splitUint256.SplitUint256.fromUint(BigInt('2')); - power4 = utils.splitUint256.SplitUint256.fromUint(BigInt('3')); - - const values = [ - [address1, power1.low, power1.high], - [address2, power2.low, power2.high], - [address3, power3.low, power3.high], - [address4, power4.low, power4.high], - ]; - - // computing the hash of each address value pair, and sorting - merkleData = values - .map((v, i) => [computeHashOnElements(v), v[0], v[1]]) - .sort(function (a, b) { - if (a > b) return 1; - if (a < b) return -1; - return 0; - }) - .map((x, i) => [x[0], x[1], x[2], i]); - leaves = merkleData.map((x) => x[0].toString()); - tree = new MerkleTree(leaves); - }); - - it('returns the voting power for everyone in the list', async () => { - const leaf1 = merkleData.find((leaf) => leaf[1] == address1)!; - const { voting_power: vp1 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address1 }, - params: [tree.root], - user_params: [address1, power1.low, power1.high, ...tree.getProof(leaves, Number(leaf1[3]))], - }); - const leaf2 = merkleData.find((leaf) => leaf[1] == address2)!; - const { voting_power: vp2 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address2 }, - params: [tree.root], - user_params: [address2, power2.low, power2.high, ...tree.getProof(leaves, Number(leaf2[3]))], - }); - const leaf3 = merkleData.find((leaf) => leaf[1] == address3)!; - const { voting_power: vp3 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address3 }, - params: [tree.root], - user_params: [address3, power3.low, power3.high, ...tree.getProof(leaves, Number(leaf3[3]))], - }); - const leaf4 = merkleData.find((leaf) => leaf[1] == address4)!; - const { voting_power: vp4 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address4 }, - params: [tree.root], - user_params: [address4, power4.low, power4.high, ...tree.getProof(leaves, Number(leaf4[3]))], - }); - - expect( - new utils.splitUint256.SplitUint256(`0x${vp1.low.toString(16)}`, `0x${vp1.high.toString(16)}`) - ).to.deep.equal(power1); - expect( - new utils.splitUint256.SplitUint256(`0x${vp2.low.toString(16)}`, `0x${vp2.high.toString(16)}`) - ).to.deep.equal(power2); - expect( - new utils.splitUint256.SplitUint256(`0x${vp3.low.toString(16)}`, `0x${vp3.high.toString(16)}`) - ).to.deep.equal(power3); - expect( - new utils.splitUint256.SplitUint256(`0x${vp4.low.toString(16)}`, `0x${vp4.high.toString(16)}`) - ).to.deep.equal(power4); - }).timeout(1000000); - - it('Should fail if an invalid proof is supplied', async () => { - const leaf1 = merkleData.find((leaf) => leaf[1] == address1)!; - try { - const { voting_power: vp } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address2 }, - params: [tree.root], - user_params: [ - address1, - power1.low, - power1.high, - ...tree.getProof(leaves, Number(leaf1[3])), - ], - }); - throw { message: 'voting power returned for invalid proof' }; - } catch (err: any) { - expect(err.message).to.contain('MerkleWhitelist: Invalid proof supplied'); - } - }).timeout(1000000); -}); diff --git a/test/starknet/SingleSlotProof.test.ts b/test/starknet/SingleSlotProof.test.ts deleted file mode 100644 index 40588872..00000000 --- a/test/starknet/SingleSlotProof.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -// import fs from 'fs'; -// import { expect } from 'chai'; -// import { starknet } from 'hardhat'; -// import { ethBalanceOfSetup, Fossil } from '../shared/setup'; -// import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; -// import { StarknetContract, Account } from 'hardhat/types'; -// // import { strToShortStringArr } from '@snapshot-labs/sx'; -// import { utils } from '@snapshot-labs/sx'; - -// describe('Single slot proof voting strategy:', () => { -// // Contracts -// let space: StarknetContract; -// let controller: Account; -// let relayer: Account; -// let vanillaAuthenticator: StarknetContract; -// let ethBalanceOfVotingStrategy: StarknetContract; -// let vanillaExecutionStrategy: StarknetContract; -// let fossil: Fossil; - -// // Data for account and storage proofs -// let proofInputs: utils.storageProofs.ProofInputs; - -// // Proposal creation parameters -// let spaceAddress: string; -// let metadataUri: utils.intsSequence.IntsSequence; -// let proposerEthAddress: string; -// let usedVotingStrategies1: string[]; -// let userVotingParamsAll1: string[][]; -// let executionStrategy: string; -// let executionParams: string[]; -// let proposeCalldata: string[]; - -// // Additional parameters for voting -// let voterEthAddress: string; -// let proposalId: string; -// let choice: utils.choice.Choice; -// let usedVotingStrategies2: string[]; -// let userVotingParamsAll2: string[][]; -// let voteCalldata: string[]; - -// before(async function () { -// this.timeout(800000); - -// const block = JSON.parse(fs.readFileSync('./test/data/block.json').toString()); -// const proofs = JSON.parse(fs.readFileSync('./test/data/proofs.json').toString()); - -// relayer = await starknet.deployAccount('OpenZeppelin'); - -// ({ -// space, -// controller, -// vanillaAuthenticator, -// ethBalanceOfVotingStrategy, -// vanillaExecutionStrategy, -// fossil, -// proofInputs, -// } = await ethBalanceOfSetup(block, proofs)); - -// proposalId = '0x1'; -// metadataUri = utils.intsSequence.IntsSequence.LEFromString( -// 'Hello and welcome to Snapshot X. This is the future of governance.' -// ); -// // Eth address corresponding to slot with key: 0x1f209fa834e9c9c92b83d1bd04d8d1914bd212e440f88fdda8a5879962bda665 -// proposerEthAddress = '0x4048c47b546b68ad226ea20b5f0acac49b086a21'; -// spaceAddress = space.address; -// usedVotingStrategies1 = ['0x0']; -// userVotingParamsAll1 = [proofInputs.storageProofs[0]]; -// executionStrategy = vanillaExecutionStrategy.address; -// executionParams = []; -// proposeCalldata = utils.encoding.getProposeCalldata( -// proposerEthAddress, -// metadataUri, -// executionStrategy, -// usedVotingStrategies1, -// userVotingParamsAll1, -// executionParams -// ); -// // Eth address corresponding to slot with key: 0x9dd2a912bd3f98d4e52ea66ae2fff8b73a522895d081d522fe86f592ec8467c3 -// voterEthAddress = '0x3744da57184575064838bbc87a0fc791f5e39ea2'; -// choice = utils.choice.Choice.FOR; -// usedVotingStrategies2 = ['0x0']; -// userVotingParamsAll2 = [proofInputs.storageProofs[1]]; -// voteCalldata = utils.encoding.getVoteCalldata( -// voterEthAddress, -// proposalId, -// choice, -// usedVotingStrategies2, -// userVotingParamsAll2 -// ); -// }); - -// it('A user can create a proposal and another user can vote on it', async () => { -// // Verify an account proof to obtain the storage root for the account at the specified block number trustlessly on-chain. -// // Result will be stored in the L1 Headers store in Fossil -// await relayer.invoke(fossil.factsRegistry, 'prove_account', { -// options_set: proofInputs.accountOptions, -// block_number: proofInputs.blockNumber, -// account: { -// word_1: proofInputs.ethAddress.values[0], -// word_2: proofInputs.ethAddress.values[1], -// word_3: proofInputs.ethAddress.values[2], -// }, -// proof_sizes_bytes: proofInputs.accountProofSizesBytes, -// proof_sizes_words: proofInputs.accountProofSizesWords, -// proofs_concat: proofInputs.accountProof, -// }); - -// // -- Creates the proposal -- -// { -// await relayer.invoke(vanillaAuthenticator, 'authenticate', { -// target: spaceAddress, -// function_selector: PROPOSE_SELECTOR, -// calldata: proposeCalldata, -// }); - -// const { proposal_info } = await space.call('get_proposal_info', { -// proposal_id: proposalId, -// }); - -// const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); -// expect(_for).to.deep.equal(BigInt(0)); -// const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); -// expect(against).to.deep.equal(BigInt(0)); -// const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); -// expect(abstain).to.deep.equal(BigInt(0)); -// console.log('proposal created'); -// } - -// // -- Casts a vote FOR -- -// { -// await relayer.invoke(vanillaAuthenticator, 'authenticate', { -// target: spaceAddress, -// function_selector: VOTE_SELECTOR, -// calldata: voteCalldata, -// }); - -// const { proposal_info } = await space.call('get_proposal_info', { -// proposal_id: proposalId, -// }); - -// const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); -// expect(_for).to.deep.equal(BigInt('0x26d16aea9a19cda40000')); -// const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); -// expect(against).to.deep.equal(BigInt(0)); -// const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); -// expect(abstain).to.deep.equal(BigInt(0)); -// } - -// // -- Executes the proposal -- -// { -// await relayer.invoke(space, 'finalize_proposal', { -// proposal_id: proposalId, -// execution_params: executionParams, -// }); -// } -// }).timeout(1000000); -// }); diff --git a/test/starknet/Space.test.ts b/test/starknet/Space.test.ts deleted file mode 100644 index ee9534c4..00000000 --- a/test/starknet/Space.test.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { expect } from 'chai'; -import { ethers, starknet } from 'hardhat'; -import { StarknetContract, Account } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { vanillaSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; -import { Wallet } from 'ethers'; - -describe('Space Testing', () => { - // Contracts - let space: StarknetContract; - let relayer: Account; - let controller: Account; - let vanillaAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterEthAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let userVotingParamsAll2: string[][]; - let voteCalldata: string[]; - - before(async function () { - this.timeout(800000); - relayer = await starknet.deployAccount('OpenZeppelin'); - - ({ space, controller, vanillaAuthenticator, vanillaVotingStrategy, vanillaExecutionStrategy } = - await vanillaSetup()); - - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerEthAddress = ethers.Wallet.createRandom().address; - spaceAddress = space.address; - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - executionParams = []; - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterEthAddress = ethers.Wallet.createRandom().address; - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; // The vanilla voting strategy corresponds to index 0 in the space contract - userVotingParamsAll2 = [[]]; - voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Users should be able to create a proposal, cast a vote, and execute it', async () => { - // -- Creates the proposal -- - { - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(0)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - // -- Casts a vote FOR -- - { - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(1)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - // -- Executes the proposal -- - { - await relayer.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: executionParams, - }); - } - }).timeout(6000000); - - it('Fails if an invalid voting strategy is used', async () => { - // -- Creates the proposal -- - try { - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - ['0x1'], - userVotingParamsAll1, - executionParams - ), - }); - throw { message: 'succeeded with invalid voting strategy' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Invalid voting strategy'); - } - }).timeout(6000000); - - it('Fails if the same voting strategy is used multiple times', async () => { - // -- Creates the proposal -- - { - const duplicateVotingStrategies = [ - vanillaVotingStrategy.address, - vanillaAuthenticator.address, - vanillaVotingStrategy.address, - ]; - const duplicateCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - duplicateVotingStrategies, - userVotingParamsAll1, - executionParams - ); - - try { - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: duplicateCalldata, - }); - throw { message: 'same voting strategy was used multiple times' }; - } catch (error: any) { - expect(error.message).to.contain('ArrayUtils: Duplicate entry found'); - } - } - }).timeout(6000000); - - it('Correctly aggregates voting power when using multiple voting strategies', async () => { - // -- Register 2nd and 3rd voting strategy -- - await controller.invoke(space, 'addVotingStrategies', { - addresses: [vanillaVotingStrategy.address], - params_flat: utils.encoding.flatten2DArray([[]]), - }); - await controller.invoke(space, 'addVotingStrategies', { - addresses: [vanillaVotingStrategy.address], - params_flat: utils.encoding.flatten2DArray([[]]), - }); - - // -- Creates the proposal -- - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - ['0x0', '0x1', '0x2'], - [[], [], []], - executionParams - ); - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - // -- Casts vote -- - voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - '0x2', - choice, - ['0x0', '0x1', '0x2'], - [[], [], []] - ); - - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: '0x2', - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(3)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - }).timeout(6000000); - - it('Fails if quorum has not been reached', async () => { - // Add a special execution strategy that will fail if the outcome is not `REJECTED`. - const failsIfRejected = await ( - await starknet.getContractFactory( - './contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo' - ) - ).deploy(); - await controller.invoke(space, 'addExecutionStrategies', { - addresses: [failsIfRejected.address], - }); - - const proposeCallDataWithExec = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - failsIfRejected.address, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - // Create the proposal with the new execution strategy - await relayer.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCallDataWithExec, - }); - - // Finalizing now should not work because quorum has not been reached - try { - await relayer.invoke(space, 'finalizeProposal', { - proposal_id: 0x3, - execution_params: executionParams, - }); - throw { message: 'proposal finalized with insufficient quorum' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Quorum has not been reached'); - } - }); - - it('Finalizes if quorum has not been reached but max voting duration has elapsed', async () => { - // Fast forward to the end of the max voting period - await starknet.devnet.increaseTime(4242); - // Need to create an empty block if we want the time increase to be effective - const emptyBlock = await starknet.devnet.createBlock(); - - // Finalizing should now work since max voting period has elapsed - try { - await relayer.invoke(space, 'finalizeProposal', { - proposal_id: 0x3, - execution_params: executionParams, - }); - throw { message: 'proposal passed with insufficient quorum' }; - } catch (error: any) { - expect(error.message).to.contain('TestExecutionStrategy: Proposal was rejected'); - } - }); - - it('Reverts when querying an invalid proposal id', async () => { - try { - await space.call('getProposalInfo', { - proposal_id: 42, - }); - throw { message: 'invalid proposal id query did not revert' }; - } catch (error: any) { - expect(error.message).to.contain('Voting: Proposal does not exist'); - } - }).timeout(6000000); -}); diff --git a/test/starknet/SpaceFactory.test.ts b/test/starknet/SpaceFactory.test.ts deleted file mode 100644 index c3fa9cb1..00000000 --- a/test/starknet/SpaceFactory.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { expect } from 'chai'; -import { ethers, starknet } from 'hardhat'; -import { StarknetContract, Account, StarknetContractFactory } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { spaceFactorySetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; - -describe('Space Deployment Testing', () => { - // Contracts - let space: StarknetContract; - let spaceFactoryClass: StarknetContractFactory; - let spaceDeployer: StarknetContract; - let controller: Account; - let vanillaAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - - // Space deployment parameters - let votingDelay: bigint; - let minVotingDuration: bigint; - let maxVotingDuration: bigint; - let votingStrategies: string[]; - let votingStrategyParamsFlat: string[]; - let authenticators: string[]; - let execution_strategies: string[]; - let quorum: utils.splitUint256.SplitUint256; - let proposalThreshold: utils.splitUint256.SplitUint256; - let spaceMetadataUri: string; - - // Proposal creation parameters - let spaceAddress: bigint; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - before(async function () { - this.timeout(800000); - - ({ - spaceDeployer, - spaceFactoryClass, - controller, - vanillaAuthenticator, - vanillaVotingStrategy, - vanillaExecutionStrategy, - } = await spaceFactorySetup()); - - votingDelay = BigInt(0); - minVotingDuration = BigInt(0); - maxVotingDuration = BigInt(2000); - votingStrategies = [vanillaVotingStrategy.address]; - votingStrategyParamsFlat = utils.encoding.flatten2DArray([[]]); - authenticators = [vanillaAuthenticator.address]; - execution_strategies = [vanillaExecutionStrategy.address]; - quorum = utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Quorum of one for the vanilla test - proposalThreshold = utils.splitUint256.SplitUint256.fromUint(BigInt(1)); // Proposal threshold of 1 for the vanilla test - spaceMetadataUri = 'SnapshotXTestSpace'; - }); - - it('A user should be able to deploy a space contract', async () => { - const txHash = await controller.invoke(spaceDeployer, 'deploySpace', { - public_key: BigInt(controller.publicKey), - voting_delay: votingDelay, - min_voting_duration: minVotingDuration, - max_voting_duration: maxVotingDuration, - proposal_threshold: proposalThreshold, - controller: BigInt(controller.address), - quorum: quorum, - voting_strategies: votingStrategies, - voting_strategy_params_flat: votingStrategyParamsFlat, - authenticators: authenticators, - execution_strategies: execution_strategies, - metadata_uri: utils.strings.strToShortStringArr(spaceMetadataUri), - }); - const receipt = await starknet.getTransactionReceipt(txHash); - // Removing first event as that's from the account contract deployment - const decodedEvents = await spaceDeployer.decodeEvents(receipt.events.slice(1)); - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerEthAddress = ethers.Wallet.createRandom().address; - spaceAddress = decodedEvents[0].data.space_address; - space = spaceFactoryClass.getContractAt(`0x${spaceAddress.toString(16)}`); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - executionParams = []; - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - // -- Creates the proposal -- - { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: '0x1', - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(0)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - }).timeout(6000000); -}); diff --git a/test/starknet/StarkTxAuth.test.ts b/test/starknet/StarkTxAuth.test.ts deleted file mode 100644 index a40a22eb..00000000 --- a/test/starknet/StarkTxAuth.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { expect } from 'chai'; -import { starknet } from 'hardhat'; -import { StarknetContract, Account } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { starkTxAuthSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; - -const VITALIK_ADDRESS = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'; - -describe('StarkNet Tx Auth testing', () => { - // Contracts - let space: StarknetContract; - let controller: Account; - let starknetTxAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerAccount: Account; - let proposerAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterAccount: Account; - let voterAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let userVotingParamsAll2: string[][]; - let voteCalldata: string[]; - - before(async function () { - this.timeout(800000); - proposerAccount = (await starknet.deployAccount('OpenZeppelin')) as Account; - voterAccount = (await starknet.deployAccount('OpenZeppelin')) as Account; - ({ - space, - controller, - starknetTxAuthenticator, - vanillaVotingStrategy, - vanillaExecutionStrategy, - } = await starkTxAuthSetup()); - - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerAddress = proposerAccount.starknetContract.address; - spaceAddress = space.address; - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - executionParams = []; - proposeCalldata = utils.encoding.getProposeCalldata( - proposerAddress, - metadataUri, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterAddress = voterAccount.starknetContract.address; - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - voteCalldata = utils.encoding.getVoteCalldata( - voterAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Should not authenticate an invalid user', async () => { - const fakeData = [...proposeCalldata]; - fakeData[0] = VITALIK_ADDRESS; - try { - await proposerAccount.invoke(starknetTxAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: fakeData, - }); - throw { message: 'error' }; - } catch (err: any) { - expect(err.message).to.contain('Incorrect caller'); - } - }); - - it('Should create a proposal and cast a vote', async () => { - // -- Creates the proposal -- - { - console.log('Creating proposal...'); - await proposerAccount.invoke(starknetTxAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(0)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - - // -- Casts a vote FOR -- - { - console.log('Casting a vote FOR...'); - await voterAccount.invoke(starknetTxAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(1)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - } - }).timeout(6000000); -}); diff --git a/test/starknet/StarknetExecution.test.ts b/test/starknet/StarknetExecution.test.ts deleted file mode 100644 index 713f8dbd..00000000 --- a/test/starknet/StarknetExecution.test.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { expect } from 'chai'; -import { ethers } from 'hardhat'; -import { StarknetContract, Account } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; -import { starknetExecutionSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR, AUTHENTICATE_SELECTOR } from '../shared/constants'; - -describe('Starknet execution via account contract', () => { - // Contracts - let space: StarknetContract; - let controller: Account; - let vanillaAuthenticator: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let starknetExecutionStrategy: StarknetContract; - - // Proposal creation parameters - let spaceAddress: string; - let metadataUri: utils.intsSequence.IntsSequence; - let proposerEthAddress: string; - let usedVotingStrategies1: string[]; - let userVotingParamsAll1: string[][]; - let executionStrategy: string; - let executionParams: string[]; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterEthAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let userVotingParamsAll2: string[][]; - let voteCalldata: string[]; - - // Calls - let tx1: utils.encoding.Call; - let tx2: utils.encoding.Call; - let tx3: utils.encoding.Call; - - before(async function () { - this.timeout(800000); - - ({ space, controller, vanillaAuthenticator, vanillaVotingStrategy, starknetExecutionStrategy } = - await starknetExecutionSetup()); - - metadataUri = utils.intsSequence.IntsSequence.LEFromString( - 'Hello and welcome to Snapshot X. This is the future of governance.' - ); - proposerEthAddress = ethers.Wallet.createRandom().address; - spaceAddress = space.address; - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = '0x1'; // Starknet execution does not use a separate strategy contract, instead its indicated via passing the value 1. - - // For the execution of the proposal, we create 3 new dummy proposals - const txCalldata1 = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - '0x1234', - usedVotingStrategies1, - userVotingParamsAll1, - [] - ); - const txCalldata2 = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - '0x4567', - usedVotingStrategies1, - userVotingParamsAll1, - [] - ); - const txCalldata3 = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - '0x456789', - usedVotingStrategies1, - userVotingParamsAll1, - [] - ); - tx1 = { - to: vanillaAuthenticator.address, - functionSelector: AUTHENTICATE_SELECTOR, - calldata: [ - spaceAddress, - PROPOSE_SELECTOR, - `0x${txCalldata1.length.toString(16)}`, - ...txCalldata1, - ], - }; - tx2 = { - to: vanillaAuthenticator.address, - functionSelector: AUTHENTICATE_SELECTOR, - calldata: [ - spaceAddress, - PROPOSE_SELECTOR, - `0x${txCalldata2.length.toString(16)}`, - ...txCalldata2, - ], - }; - tx3 = { - to: vanillaAuthenticator.address, - functionSelector: AUTHENTICATE_SELECTOR, - calldata: [ - spaceAddress, - PROPOSE_SELECTOR, - `0x${txCalldata3.length.toString(16)}`, - ...txCalldata3, - ], - }; - executionParams = utils.encoding.createStarknetExecutionParams([tx1, tx2, tx3]); - - proposeCalldata = utils.encoding.getProposeCalldata( - proposerEthAddress, - metadataUri, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterEthAddress = ethers.Wallet.createRandom().address; - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - voteCalldata = utils.encoding.getVoteCalldata( - voterEthAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Users should be able to create a proposal, cast a vote, and execute it', async () => { - // -- Creates the proposal -- - { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - } - // -- Casts a vote FOR -- - { - await controller.invoke(vanillaAuthenticator, 'authenticate', { - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - } - - // -- Executes the proposal, which should create 3 new dummy proposal in the same space - { - await controller.invoke(space, 'finalizeProposal', { - proposal_id: proposalId, - execution_params: executionParams, - }); - - let { proposal_info } = await space.call('getProposalInfo', { - proposal_id: 2, - }); - // We can check that the proposal was successfully created by checking the execution strategy - // as it will be zero if the new proposal was not created - expect(proposal_info.proposal.execution_strategy).to.deep.equal(BigInt('0x1234')); - - // Same for second dummy proposal - ({ proposal_info } = await space.call('getProposalInfo', { - proposal_id: 3, - })); - expect(proposal_info.proposal.execution_strategy).to.deep.equal(BigInt('0x4567')); - - ({ proposal_info } = await space.call('getProposalInfo', { - proposal_id: 4, - })); - expect(proposal_info.proposal.execution_strategy).to.deep.equal(BigInt('0x456789')); - } - }).timeout(6000000); -}); diff --git a/test/starknet/StarknetSigAuth.test.ts b/test/starknet/StarknetSigAuth.test.ts deleted file mode 100644 index eb1b40fa..00000000 --- a/test/starknet/StarknetSigAuth.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { expect } from 'chai'; -import { StarknetContract, Account } from 'hardhat/types'; -import { Account as StarknetAccount, ec, defaultProvider, typedData, Signer } from 'starknet'; -import { domain, proposeTypes, voteTypes } from '../shared/starkTypes'; -import { computeHashOnElements, getSelectorFromName } from 'starknet/dist/utils/hash'; -import { utils } from '@snapshot-labs/sx'; -import { starknetSigAuthSetup } from '../shared/setup'; -import { PROPOSE_SELECTOR, VOTE_SELECTOR } from '../shared/constants'; -import { _TypedDataEncoder } from 'ethers/lib/utils'; -import { getStructHash, getTypeHash } from 'starknet/dist/utils/typedData'; - -export const AUTHENTICATE_METHOD = 'authenticate'; -export const PROPOSAL_METHOD = 'propose'; -export const VOTE_METHOD = 'vote'; - -describe('Starknet Sig Auth testing', () => { - // Contracts - let space: StarknetContract; - let controller: Account; - let starkSigAuth: StarknetContract; - let vanillaVotingStrategy: StarknetContract; - let vanillaExecutionStrategy: StarknetContract; - let user: any; - - let starkSigner: Signer; - - // Proposal creation parameters - let spaceAddress: string; - let executionHash: string; - let metadataUri: string; - let metadataUriInts: utils.intsSequence.IntsSequence; - let usedVotingStrategies1: string[]; - let usedVotingStrategiesHash1: string; - let userVotingParamsAll1: string[][]; - let userVotingStrategyParamsFlatHash1: string; - let executionStrategy: string; - let executionParams: string[]; - let proposerAddress: string; - let proposeCalldata: string[]; - - // Additional parameters for voting - let voterAddress: string; - let proposalId: string; - let choice: utils.choice.Choice; - let usedVotingStrategies2: string[]; - let usedVotingStrategiesHash2: string; - let userVotingParamsAll2: string[][]; - let userVotingStrategyParamsFlatHash2: string; - let voteCalldata: string[]; - - before(async function () { - this.timeout(800000); - ({ space, controller, starkSigAuth, vanillaVotingStrategy, vanillaExecutionStrategy } = - await starknetSigAuthSetup()); - - metadataUri = 'Hello and welcome to Snapshot X. This is the future of governance.'; - metadataUriInts = utils.intsSequence.IntsSequence.fromString(metadataUri); - usedVotingStrategies1 = ['0x0']; - userVotingParamsAll1 = [[]]; - executionStrategy = vanillaExecutionStrategy.address; - spaceAddress = space.address; - - starkSigner = new Signer(ec.genKeyPair()); - - executionParams = ['0x01']; // Random params - executionHash = computeHashOnElements(executionParams); - usedVotingStrategiesHash1 = computeHashOnElements(usedVotingStrategies1); - const userVotingStrategyParamsFlat1 = utils.encoding.flatten2DArray(userVotingParamsAll1); - userVotingStrategyParamsFlatHash1 = computeHashOnElements(userVotingStrategyParamsFlat1); - - proposerAddress = await starkSigner.getPubKey(); - proposeCalldata = utils.encoding.getProposeCalldata( - proposerAddress, - metadataUriInts, - executionStrategy, - usedVotingStrategies1, - userVotingParamsAll1, - executionParams - ); - - voterAddress = await starkSigner.getPubKey(); - proposalId = '0x1'; - choice = utils.choice.Choice.FOR; - usedVotingStrategies2 = ['0x0']; - userVotingParamsAll2 = [[]]; - usedVotingStrategiesHash2 = computeHashOnElements(usedVotingStrategies2); - const userVotingStrategyParamsFlat2 = utils.encoding.flatten2DArray(userVotingParamsAll2); - userVotingStrategyParamsFlatHash2 = computeHashOnElements(userVotingStrategyParamsFlat2); - voteCalldata = utils.encoding.getVoteCalldata( - voterAddress, - proposalId, - choice, - usedVotingStrategies2, - userVotingParamsAll2 - ); - }); - - it('Should not authenticate an invalid proposal', async () => { - const proposalSalt = '0x01'; - const incorrectSpace = '0x1337'; - - const message = { - authenticator: starkSigAuth.address, - space: spaceAddress, - author: proposerAddress, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const data: typedData.TypedData = { - types: proposeTypes, - primaryType: 'Propose', - domain, - message, - }; - const sig = await starkSigner.signMessage(data, starkSigAuth.address); - const [r, s] = sig; - - try { - console.log('Replaying transaction...'); - await controller.invoke(starkSigAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: incorrectSpace, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'invalid payload was authenticated by signature' }; - } catch (err: any) { - expect(err.message).to.contain('is invalid, with respect to the public key'); - } - }); - - it('Should create a proposal and cast a vote', async () => { - // -- Creates the proposal -- - { - const proposalSalt = '0x01'; - - const message = { - authenticator: starkSigAuth.address, - space: spaceAddress, - author: proposerAddress, - metadata_uri: metadataUriInts.values, - executor: vanillaExecutionStrategy.address, - execution_hash: executionHash, - strategies_hash: usedVotingStrategiesHash1, - strategies_params_hash: userVotingStrategyParamsFlatHash1, - salt: proposalSalt, - }; - const data: typedData.TypedData = { - types: proposeTypes, - primaryType: 'Propose', - domain, - message, - }; - const sig = await starkSigner.signMessage(data, starkSigAuth.address); - const [r, s] = sig; - - console.log('Creating proposal...'); - await controller.invoke(starkSigAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - - // -- Attempts a replay attack on `propose` method -- - // Expected to fail - try { - console.log('Replaying transaction...'); - await controller.invoke(starkSigAuth, 'authenticate', { - r: r, - s: s, - salt: proposalSalt, - target: spaceAddress, - function_selector: PROPOSE_SELECTOR, - calldata: proposeCalldata, - }); - throw { message: 'replay attack worked on `propose`' }; - } catch (err: any) { - expect(err.message).to.contain('Salt already used'); - } - } - - // -- Casts a vote FOR -- - { - console.log('Casting a vote FOR...'); - const voteSalt = '0x02'; - - const message = { - authenticator: starkSigAuth.address, - space: spaceAddress, - voter: voterAddress, - proposal: proposalId, - choice: utils.choice.Choice.FOR, - strategies_hash: usedVotingStrategiesHash2, - strategies_params_hash: userVotingStrategyParamsFlatHash2, - salt: voteSalt, - }; - const data = { types: voteTypes, primaryType: 'Vote', domain, message }; - const sig = await starkSigner.signMessage(data, starkSigAuth.address); - const [r, s] = sig; - - await controller.invoke(starkSigAuth, 'authenticate', { - r: r, - s: s, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - - console.log('Getting proposal info...'); - const { proposal_info } = await space.call('getProposalInfo', { - proposal_id: proposalId, - }); - - const _for = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_for).toUint(); - expect(_for).to.deep.equal(BigInt(1)); - const against = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_against).toUint(); - expect(against).to.deep.equal(BigInt(0)); - const abstain = utils.splitUint256.SplitUint256.fromObj(proposal_info.power_abstain).toUint(); - expect(abstain).to.deep.equal(BigInt(0)); - - // -- Attempts a replay attack on `vote` method -- - try { - console.log('Replaying vote...'); - await controller.invoke(starkSigAuth, 'authenticate', { - r: r, - s: s, - salt: voteSalt, - target: spaceAddress, - function_selector: VOTE_SELECTOR, - calldata: voteCalldata, - }); - throw { message: 'replay attack worked on `vote`' }; - } catch (err: any) { - expect(err.message).to.contain('Salt already used'); - } - } - }).timeout(6000000); -}); diff --git a/test/starknet/VanillaVotingStrategy.test.ts b/test/starknet/VanillaVotingStrategy.test.ts deleted file mode 100644 index ebf4183f..00000000 --- a/test/starknet/VanillaVotingStrategy.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { StarknetContract } from 'hardhat/types/runtime'; -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { utils } from '@snapshot-labs/sx'; - -async function setup() { - const vanillaVotingStrategyFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Vanilla.cairo' - ); - const vanillaVotingStrategy = await vanillaVotingStrategyFactory.deploy(); - return { - vanillaVotingStrategy: vanillaVotingStrategy as StarknetContract, - }; -} - -describe('Snapshot X Vanilla Voting Strategy:', () => { - it('The voting strategy should return a voting power of 1', async () => { - const { vanillaVotingStrategy } = await setup(); - const { voting_power: vp } = await vanillaVotingStrategy.call('getVotingPower', { - timestamp: 1, - voter_address: { value: BigInt(ethers.Wallet.createRandom().address) }, - params: [], - user_params: [], - }); - expect( - new utils.splitUint256.SplitUint256(`0x${vp.low.toString(16)}`, `0x${vp.high.toString(16)}`) - ).to.deep.equal(utils.splitUint256.SplitUint256.fromUint(BigInt(1))); - }).timeout(600000); -}); diff --git a/test/starknet/WhitelistVotingStrategy.test.ts b/test/starknet/WhitelistVotingStrategy.test.ts deleted file mode 100644 index ec8c29e7..00000000 --- a/test/starknet/WhitelistVotingStrategy.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { expect } from 'chai'; -import { starknet, ethers } from 'hardhat'; -import { StarknetContract } from 'hardhat/types'; -import { utils } from '@snapshot-labs/sx'; - -describe('Whitelist testing', () => { - let whitelist: StarknetContract; - let emptyWhitelist: StarknetContract; - let repeatWhitelist: StarknetContract; - - let address1: string; - let address2: string; - let address3: string; - let address4: string; - - let power1: utils.splitUint256.SplitUint256; - let power2: utils.splitUint256.SplitUint256; - let power3: utils.splitUint256.SplitUint256; - let power4: utils.splitUint256.SplitUint256; - - before(async function () { - this.timeout(800000); - address1 = ethers.Wallet.createRandom().address; - address2 = ethers.Wallet.createRandom().address; - address3 = ethers.Wallet.createRandom().address; - address4 = ethers.Wallet.createRandom().address; - - power1 = utils.splitUint256.SplitUint256.fromUint(BigInt('1000')); - power2 = utils.splitUint256.SplitUint256.fromUint(BigInt('1')); - power3 = utils.splitUint256.SplitUint256.fromUint(BigInt('2')); - power4 = utils.splitUint256.SplitUint256.fromUint(BigInt('3')); - - const whitelistFactory = await starknet.getContractFactory( - './contracts/starknet/VotingStrategies/Whitelist.cairo' - ); - whitelist = await whitelistFactory.deploy({ - whitelist: [ - address1, - power1.low, - power1.high, - address2, - power2.low, - power2.high, - address3, - power3.low, - power3.high, - address4, - power4.low, - power4.high, - ], - }); - emptyWhitelist = await whitelistFactory.deploy({ whitelist: [] }); - repeatWhitelist = await whitelistFactory.deploy({ - whitelist: [ - address1, - power1.low, - power1.high, - address1, - power1.low, - power1.high, - address2, - power2.low, - power2.high, - ], - }); - }); - - it('returns the voting power for everyone in the list', async () => { - const { voting_power: vp1 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address1 }, - params: [], - user_params: [], - }); - const { voting_power: vp2 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address2 }, - params: [], - user_params: [], - }); - const { voting_power: vp3 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address3 }, - params: [], - user_params: [], - }); - const { voting_power: vp4 } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address4 }, - params: [], - user_params: [], - }); - expect( - new utils.splitUint256.SplitUint256(`0x${vp1.low.toString(16)}`, `0x${vp1.high.toString(16)}`) - ).to.deep.equal(power1); - expect( - new utils.splitUint256.SplitUint256(`0x${vp2.low.toString(16)}`, `0x${vp2.high.toString(16)}`) - ).to.deep.equal(power2); - expect( - new utils.splitUint256.SplitUint256(`0x${vp3.low.toString(16)}`, `0x${vp3.high.toString(16)}`) - ).to.deep.equal(power3); - expect( - new utils.splitUint256.SplitUint256(`0x${vp4.low.toString(16)}`, `0x${vp4.high.toString(16)}`) - ).to.deep.equal(power4); - }).timeout(1000000); - - it('returns 0 voting power for non-whitelisted addresses', async () => { - const { voting_power: vp } = await whitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: BigInt(ethers.Wallet.createRandom().address) }, - params: [], - user_params: [], - }); - expect( - new utils.splitUint256.SplitUint256(`0x${vp.low.toString(16)}`, `0x${vp.high.toString(16)}`) - ).to.deep.equal(utils.splitUint256.SplitUint256.fromUint(BigInt(0))); - }).timeout(1000000); - - it('returns 0 for an empty whitelist', async () => { - const { voting_power: vp } = await emptyWhitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address1 }, - params: [], - user_params: [], - }); - expect( - new utils.splitUint256.SplitUint256(`0x${vp.low.toString(16)}`, `0x${vp.high.toString(16)}`) - ).to.deep.equal(utils.splitUint256.SplitUint256.fromUint(BigInt(0))); - }).timeout(1000000); - - it('returns the correct voting power even if address is repeated', async () => { - const { voting_power: vp } = await repeatWhitelist.call('getVotingPower', { - timestamp: BigInt(0), - voter_address: { value: address1 }, - params: [], - user_params: [], - }); - expect( - new utils.splitUint256.SplitUint256(`0x${vp.low.toString(16)}`, `0x${vp.high.toString(16)}`) - ).to.deep.equal(power1); - }).timeout(1000000); -}); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 10c33d9e..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "esModuleInterop": true, - "module": "commonjs", - "outDir": "dist", - "resolveJsonModule": true, - "strict": true, - "target": "es5" - }, - "files": [ - "./hardhat.config.ts" - ], - "include": [ - "./scripts", - "./test" - ] -} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b2ce3740..fb57ccd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10976 +2,3 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - 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" - -"@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@ethereum-waffle/chai@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" - integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== - dependencies: - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.5.2" - -"@ethereum-waffle/compiler@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" - integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== - dependencies: - "@resolver-engine/imports" "^0.3.3" - "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" - "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.5.5" - ethers "^5.0.1" - mkdirp "^0.5.1" - node-fetch "^2.6.1" - solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" - -"@ethereum-waffle/ens@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" - integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== - dependencies: - "@ensdomains/ens" "^0.4.4" - "@ensdomains/resolver" "^0.2.4" - ethers "^5.5.2" - -"@ethereum-waffle/mock-contract@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz#fc6ffa18813546f4950a69f5892d4dd54b2c685a" - integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== - dependencies: - "@ethersproject/abi" "^5.5.0" - ethers "^5.5.2" - -"@ethereum-waffle/provider@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" - integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== - dependencies: - "@ethereum-waffle/ens" "^3.4.4" - ethers "^5.5.2" - ganache-core "^2.13.2" - patch-package "^6.2.2" - postinstall-postinstall "^2.1.0" - -"@ethereumjs/block@^3.6.3": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/tx@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.6.1", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.1", "@ethersproject/providers@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@gnosis.pm/mock-contract@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/mock-contract/-/mock-contract-4.0.0.tgz#eaf500fddcab81b5f6c22280a7b22ff891dd6f87" - integrity sha512-SkRq2KwPx6vo0LAjSc8JhgQstrQFXRyn2yqquIfub7r2WHi5nUbF8beeSSXsd36hvBcQxQfmOIYNYRpj9JOhrQ== - -"@gnosis.pm/safe-contracts@1.3.0", "@gnosis.pm/safe-contracts@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz#316741a7690d8751a1f701538cfc9ec80866eedc" - integrity sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw== - -"@gnosis.pm/zodiac@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-1.1.5.tgz#708c21909ef1e3ed003988253c395391f1745ef8" - integrity sha512-F2jjGJdAp/U9rScLnJzP8+b4KBz4+b3wSBkuZRn8posxnUzMaiiS165x154olH2OLxSOcZ77ZjPxMmHB2QmHGw== - dependencies: - "@gnosis.pm/mock-contract" "^4.0.0" - "@gnosis.pm/safe-contracts" "1.3.0" - "@openzeppelin/contracts" "^4.3.2" - "@openzeppelin/contracts-upgradeable" "^4.2.0" - argv "^0.0.2" - dotenv "^8.0.0" - ethers "^5.4.6" - solc "^0.8.6" - yargs "^16.1.1" - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - -"@noble/hashes@1.1.2", "@noble/hashes@~1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" - integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nomicfoundation/ethereumjs-block@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" - integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-blockchain@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" - integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-ethash" "^2.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" - integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== - dependencies: - "@nomicfoundation/ethereumjs-util" "^8.0.0" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" - integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" - integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" - integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== - -"@nomicfoundation/ethereumjs-statemanager@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" - integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - -"@nomicfoundation/ethereumjs-trie@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" - integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" - integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" - integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" - integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz#1d49e4ac028831a3011a9f3dca60bd1963185342" - integrity sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz#c0fccecc5506ff5466225e41e65691abafef3dbe" - integrity sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz#8261d033f7172b347490cd005931ef8168ab4d73" - integrity sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz#1ba64b1d76425f8953dedc6367bd7dd46f31dfc5" - integrity sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz#8d864c49b55e683f7e3b5cce9d10b628797280ac" - integrity sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz#16e769500cf1a8bb42ab9498cee3b93c30f78295" - integrity sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz#75f4e1a25526d54c506e4eba63b3d698b6255b8f" - integrity sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz#ef6e20cfad5eedfdb145cc34a44501644cd7d015" - integrity sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz#98c4e3af9cee68896220fa7e270aefdf7fc89c7b" - integrity sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz#12da288e7ef17ec14848f19c1e8561fed20d231d" - integrity sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ== - -"@nomicfoundation/solidity-analyzer@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz#d1029f872e66cb1082503b02cc8b0be12f8dd95e" - integrity sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.0.3" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.0.3" - -"@nomiclabs/hardhat-docker@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-docker/-/hardhat-docker-2.0.2.tgz#ae964be17951275a55859ff7358e9e7c77448846" - integrity sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng== - dependencies: - dockerode "^2.5.8" - fs-extra "^7.0.1" - node-fetch "^2.6.0" - -"@nomiclabs/hardhat-ethers@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" - integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== - -"@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz#7137554862b3b1c914f1b1bf110f0529fd2dec53" - integrity sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" - chalk "^2.4.2" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.11" - semver "^6.3.0" - table "^6.8.0" - undici "^5.4.0" - -"@nomiclabs/hardhat-solhint@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-solhint/-/hardhat-solhint-2.0.1.tgz#62896569d10c95a17cefab0229701cfffd19246f" - integrity sha512-SrTLufY21t78KLpJL5fS6gHIsCwVv0yWsHp1aQOPL1qwRWpe0Mnh5wb2YzBHd3Dbr/KzUYys+j2ui0PsSVU9pg== - dependencies: - solhint "^2.0.0" - -"@nomiclabs/hardhat-waffle@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" - integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== - dependencies: - "@types/sinon-chai" "^3.2.3" - "@types/web3" "1.0.19" - -"@openzeppelin/contracts-upgradeable@^4.2.0": - version "4.7.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.2.tgz#414096e21f048200cbb7ad4fe4c6de2e822513bf" - integrity sha512-3dgc6qVmFch/uOmlmKnw5/v3JxwXcZD4T10/9CI1OUbX8AqjoZrBGKfxN1z3QxnIXRU/X31/BItJezJSDDTe7Q== - -"@openzeppelin/contracts@^4.3.2", "@openzeppelin/contracts@^4.7.3": - version "4.7.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" - integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== - -"@resolver-engine/core@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" - integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== - dependencies: - debug "^3.1.0" - is-url "^1.2.4" - request "^2.85.0" - -"@resolver-engine/fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" - integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" - integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== - dependencies: - "@resolver-engine/fs" "^0.3.3" - "@resolver-engine/imports" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" - integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - hosted-git-info "^2.6.0" - path-browserify "^1.0.0" - url "^0.11.0" - -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== - -"@scure/bip32@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" - integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== - dependencies: - "@noble/hashes" "~1.1.1" - "@noble/secp256k1" "~1.6.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" - integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== - dependencies: - "@noble/hashes" "~1.1.1" - "@scure/base" "~1.1.0" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - 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" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - 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" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - 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" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@shardlabs/starknet-hardhat-plugin@0.6.8": - version "0.6.8" - resolved "https://registry.yarnpkg.com/@shardlabs/starknet-hardhat-plugin/-/starknet-hardhat-plugin-0.6.8.tgz#a2749119f7210785f771863b25066b3364a1b8cb" - integrity sha512-WXr0fie6Qh8why3ItMUkqXgsuENynX70LnxvPj6tuFEEkn+YakUA03g37fhKQiX6KxgG7vDg0xRQXqihNb9tcw== - dependencies: - "@nomiclabs/hardhat-docker" "^2.0.2" - axios "^0.24.0" - exit-hook "2.2.1" - form-data "^4.0.0" - glob "^7.2.0" - starknet "^3.15.0" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@snapshot-labs/sx@0.1.0-beta.12": - version "0.1.0-beta.12" - resolved "https://registry.yarnpkg.com/@snapshot-labs/sx/-/sx-0.1.0-beta.12.tgz#021e4dc8618f321778a44d291f713c7821fefa53" - integrity sha512-8ityZEpdjmApj8mFxPfGRcgU0uYDxx2Vs1LgnFsfQ5tQ0echvCuaUIDGsfaosG3gV7GsumtwgzjVNDlGzIUt+Q== - dependencies: - "@ethereumjs/block" "^3.6.3" - "@ethereumjs/common" "^2.6.5" - "@ethersproject/abi" "^5.7.0" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/providers" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" - cross-fetch "^3.1.5" - randombytes "^2.1.0" - starknet "^3.18.2" - -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@typechain/ethers-v5@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.0.tgz#068d7dc7014502354696dab59590a7841091e951" - integrity sha512-3LIb+eUpV3mNCrjUKT5oqp8PBsZYSnVrkfk6pY/ZM0boRs2mKxjFZ7bktx42vfDye8PPz3NxtW4DL5NsNsFqlg== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@typechain/ethers-v5@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz#cd3ca1590240d587ca301f4c029b67bfccd08810" - integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== - dependencies: - ethers "^5.0.2" - -"@typechain/hardhat@^6.1.3": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.3.tgz#e6121502eb64903ab562d89e094a5506e7b86822" - integrity sha512-e1H9MVl286ma0HuD9CBL248+pbdA7lWF6+I7FYwzykIrjilKhvLUv0Q7LtcyZztzgbP2g4Tyg1UPE+xy+qR7cA== - dependencies: - fs-extra "^9.1.0" - -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== - -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - -"@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/chai@*", "@types/chai@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== - -"@types/concat-stream@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" - integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== - dependencies: - "@types/node" "*" - -"@types/form-data@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/mocha@^9.1.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== - -"@types/node-fetch@^2.5.5": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*", "@types/node@^18.7.21": - version "18.7.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.21.tgz#63ee6688070e456325b6748dc492a7b948593871" - integrity sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA== - -"@types/node@^10.0.3": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/node@^12.12.6": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/node@^8.0.0": - version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.1": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.4.tgz#ad899dad022bab6b5a9f0a0fe67c2f7a4a8950ed" - integrity sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw== - -"@types/qs@^6.2.31": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/sinon-chai@^3.2.3": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" - integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "10.0.13" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" - integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - -"@types/underscore@*": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" - integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== - -"@types/web3@1.0.19": - version "1.0.19" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" - integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== - dependencies: - "@types/bn.js" "*" - "@types/underscore" "*" - -"@typescript-eslint/eslint-plugin@^4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== - dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== - -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -JSONStream@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" - integrity sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - -abstract-leveldown@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" - integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" - integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== - dependencies: - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -address@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" - integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -aes-js@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -argv@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" - integrity sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - -array-back@^3.0.1, array-back@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.1, array-back@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -ast-parents@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@1.x, async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - -async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.14, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q== - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ== - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q== - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg== - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw== - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw== - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ== - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ== - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw== - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw== - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag== - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw== - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg== - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA== - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg== - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw== - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA== - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ== - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw== - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ== - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ== - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg== - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA== - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -backoff@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" - integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== - dependencies: - precond "0.2" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bigint-crypto-utils@^3.0.23: - version "3.1.4" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.4.tgz#b00aa00eb792b14f2f71ead916105c17aac98a4c" - integrity sha512-niSkvARUEe8MiAiH+zKXPkgXzlvGDbOqXL3JDevWaA1TrPhUGSCgV+iedm8qMEBQwvSlMMn8GpSuoUjvsm2QfQ== - dependencies: - bigint-mod-arith "^3.1.0" - -bigint-mod-arith@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.0.tgz#ee7186ff512248e245f8c6ed0aa5c0ccf0c116b4" - integrity sha512-vpiKCiv9B1nK8HhFOU7PMC4k9nrufQxeivgCj5yOH2ZMLD+UPwc/RfNgBCX+v8C6t0sF4q7mEZgZij6k53zpWA== - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bip39@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" - integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== - dependencies: - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - safe-buffer "^5.0.1" - unorm "^1.3.3" - -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bluebird@^3.5.0, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.8.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.0, body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - 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.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - 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" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== - dependencies: - node-gyp-build "^4.3.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cachedown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ== - dependencies: - abstract-leveldown "^2.4.1" - lru-cache "^3.2.0" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30000844: - version "1.0.30001374" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz#3dab138e3f5485ba2e74bd13eca7fe1037ce6f57" - integrity sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw== - -caseless@^0.12.0, caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - -cbor@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - -chai@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -checkpoint-store@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== - dependencies: - functional-red-black-tree "^1.0.1" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -chokidar@3.5.3, chokidar@^3.4.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.0.1, chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classic-level@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" - integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "~2.0.0" - node-gyp-build "^4.3.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-table3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clone@2.1.2, clone@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colors@1.4.0, colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -command-line-args@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - -command-line-args@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" - integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== - dependencies: - array-back "^3.1.0" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -command-line-usage@^6.1.0: - version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" - integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== - dependencies: - array-back "^4.0.2" - chalk "^2.4.2" - table-layout "^1.0.2" - typical "^5.2.0" - -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concurrently@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.4.0.tgz#bb0e344964bc172673577c420db21e963f2f7368" - integrity sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA== - dependencies: - chalk "^4.1.0" - date-fns "^2.29.1" - lodash "^4.17.21" - rxjs "^7.0.0" - shell-quote "^1.7.3" - spawn-command "^0.0.2-1" - supports-color "^8.1.0" - tree-kill "^1.2.2" - yargs "^17.3.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cookiejar@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -core-js-pure@^3.0.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.1.tgz#8839dde5da545521bf282feb7dc6d0b425f39fd3" - integrity sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg== - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - 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" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" - integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== - dependencies: - node-fetch "^2.6.7" - whatwg-fetch "^2.0.4" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -date-fns@^2.29.1: - version "2.29.2" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.2.tgz#0d4b3d0f3dff0f920820a070920f0d9662c51931" - integrity sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA== - -death@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-equal@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-extend@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -deferred-leveldown@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== - dependencies: - abstract-leveldown "~2.6.0" - -deferred-leveldown@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20" - integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== - dependencies: - abstract-leveldown "~5.0.0" - inherits "^2.0.3" - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== - dependencies: - repeating "^2.0.0" - -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -difflib@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== - dependencies: - heap ">= 0.2.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -docker-modem@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" - integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw== - dependencies: - JSONStream "1.3.2" - debug "^3.2.6" - readable-stream "~1.0.26-4" - split-ca "^1.0.0" - -dockerode@^2.5.8: - version "2.5.8" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" - integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== - dependencies: - concat-stream "~1.6.2" - docker-modem "^1.0.8" - tar-fs "~1.16.3" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -dotenv@^16.0.2: - version "16.0.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.2.tgz#0b0f8652c016a3858ef795024508cddc4bffc5bf" - integrity sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA== - -dotenv@^8.0.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== - -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.3.47: - version "1.4.211" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz#afaa8b58313807501312d598d99b953568d60f91" - integrity sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A== - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - 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" - -emoji-regex@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.1.0.tgz#d50e383743c0f7a5945c47087295afc112e3cf66" - integrity sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encoding-down@5.0.4, encoding-down@~5.0.0: - version "5.0.4" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" - integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== - dependencies: - abstract-leveldown "^5.0.0" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - xtend "^4.0.1" - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.0, enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-config-standard@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" - integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.25.4: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-promise@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz#a8cddf96a67c4059bdabf4d724a29572188ae423" - integrity sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw== - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-block-tracker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" - integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== - dependencies: - eth-query "^2.1.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.3" - ethjs-util "^0.1.3" - json-rpc-engine "^3.6.0" - pify "^2.3.0" - tape "^4.6.3" - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-gas-reporter@^0.2.25: - version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" - integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== - dependencies: - "@ethersproject/abi" "^5.0.0-beta.146" - "@solidity-parser/parser" "^0.14.0" - cli-table3 "^0.5.0" - colors "1.4.0" - ethereum-cryptography "^1.0.3" - ethers "^4.0.40" - fs-readdir-recursive "^1.1.0" - lodash "^4.17.14" - markdown-table "^1.1.3" - mocha "^7.1.1" - req-cwd "^2.0.0" - request "^2.88.0" - request-promise-native "^1.0.5" - sha1 "^1.1.1" - sync-request "^6.0.0" - -eth-json-rpc-infura@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.0" - -eth-json-rpc-middleware@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - 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" - -eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== - dependencies: - json-rpc-random-id "^1.0.0" - xtend "^4.0.1" - -eth-sig-util@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - -eth-sig-util@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== - dependencies: - ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" - ethereumjs-util "^5.1.1" - -eth-tx-summary@^3.1.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== - dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" - -ethashjs@~0.0.7: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" - integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== - dependencies: - async "^2.1.2" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.2" - miller-rabin "^4.0.0" - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - -ethereum-common@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" - integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== - -ethereum-common@^0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== - -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - 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" - -ethereum-cryptography@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" - integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== - dependencies: - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.3" - "@scure/bip32" "1.1.0" - "@scure/bip39" "1.1.0" - -ethereum-waffle@^3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" - integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== - dependencies: - "@ethereum-waffle/chai" "^3.4.4" - "@ethereum-waffle/compiler" "^3.4.4" - "@ethereum-waffle/mock-contract" "^3.4.4" - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.0.1" - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g== - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": - version "0.6.8" - resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" - integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== - dependencies: - ethereumjs-util "^6.0.0" - rlp "^2.2.1" - safe-buffer "^5.1.1" - -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" - integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== - dependencies: - async "^2.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== - dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-blockchain@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" - integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== - dependencies: - async "^2.6.1" - ethashjs "~0.0.7" - ethereumjs-block "~2.2.2" - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.1.0" - flow-stoplight "^1.0.0" - level-mem "^3.0.1" - lru-cache "^5.1.1" - rlp "^2.2.2" - semaphore "^1.1.0" - -ethereumjs-common@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" - integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== - -ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - 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" - -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.0" - -ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" - integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - 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" - -ethereumjs-vm@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" - integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - core-js-pure "^3.0.1" - ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.2" - ethereumjs-blockchain "^4.0.3" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - util.promisify "^1.0.0" - -ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - -ethereumjs-wallet@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== - dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" - utf8 "^3.0.0" - uuid "^3.3.2" - -ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - 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" - -ethers@^5.0.1, ethers@^5.0.2, ethers@^5.4.6, ethers@^5.5.2, ethers@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" - integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== - 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.1" - "@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" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exit-hook@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" - integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@^4.14.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.0" - 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.10.3" - 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" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fake-merkle-patricia-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== - dependencies: - checkpoint-store "^1.1.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fetch-ponyfill@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g== - dependencies: - node-fetch "~1.7.1" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - 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" - -find-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== - dependencies: - array-back "^1.0.4" - test-value "^2.1.0" - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-yarn-workspace-root@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" - integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== - dependencies: - fs-extra "^4.0.3" - micromatch "^3.1.4" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -flow-stoplight@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== - -follow-redirects@^1.12.1, follow-redirects@^1.14.4, follow-redirects@^1.14.7: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -for-each@^0.3.3, for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - 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" - -fs-extra@^4.0.2, fs-extra@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -ganache-core@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" - integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== - dependencies: - abstract-leveldown "3.0.0" - async "2.6.2" - bip39 "2.5.0" - cachedown "1.0.0" - clone "2.1.2" - debug "3.2.6" - encoding-down "5.0.4" - eth-sig-util "3.0.0" - ethereumjs-abi "0.6.8" - ethereumjs-account "3.0.0" - ethereumjs-block "2.2.2" - ethereumjs-common "1.5.0" - ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.1" - ethereumjs-vm "4.2.0" - heap "0.2.6" - keccak "3.0.1" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.20" - lru-cache "5.1.1" - merkle-patricia-tree "3.0.0" - patch-package "6.2.2" - seedrandom "3.0.1" - source-map-support "0.5.12" - tmp "0.1.0" - web3-provider-engine "14.2.1" - websocket "1.0.32" - optionalDependencies: - ethereumjs-wallet "0.6.5" - web3 "1.2.11" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-port@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -ghost-testrpc@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" - integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== - dependencies: - chalk "^2.4.2" - node-emoji "^1.10.0" - -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - 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" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - 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" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.2.0, glob@~7.2.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== - dependencies: - type-fest "^0.20.2" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hardhat-gas-reporter@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" - integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== - dependencies: - array-uniq "1.0.3" - eth-gas-reporter "^0.2.25" - sha1 "^1.1.1" - -hardhat@^2.11.2: - version "2.11.2" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.11.2.tgz#c81388630255823bb1717ec07c4ee651b1fbe97f" - integrity sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@nomicfoundation/ethereumjs-vm" "^6.0.0" - "@nomicfoundation/solidity-analyzer" "^0.0.3" - "@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.4.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3, has@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -heap@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ== - -"heap@>= 0.2.0": - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -http-basic@^8.1.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" - integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== - -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - -immutable@^4.0.0-rc.12: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.5, is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.0.0, is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" - integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== - dependencies: - node-fetch "^2.6.1" - whatwg-fetch "^3.4.1" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -joi@^17.6.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" - integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-format-cli@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-format-cli/-/json-format-cli-1.1.1.tgz#1c25ddc55e786c2886a808dd39e4fbed03aade95" - integrity sha512-IMQ+/RZkxVVSBxPB8EdwD7gipqQtuPYGumWHryyoc9Q7rhcOi+O9dlZaInlMpwjv4rdFoTEU09hkVBgrmeh6Ew== - dependencies: - json-stable-stringify "^1.0.1" - minimist "^1.2.0" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" - -json-rpc-error@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug== - dependencies: - inherits "^2.0.1" - -json-rpc-random-id@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg== - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsonschema@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -keccak@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-codec@~7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" - integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== - dependencies: - errno "~0.1.1" - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-errors@~1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" - integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== - dependencies: - errno "~0.1.1" - -level-iterator-stream@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" - integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.5" - xtend "^4.0.0" - -level-iterator-stream@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== - dependencies: - inherits "^2.0.1" - level-errors "^1.0.3" - readable-stream "^1.0.33" - xtend "^4.0.0" - -level-iterator-stream@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730" - integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.3.6" - xtend "^4.0.0" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" - integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== - dependencies: - level-packager "~4.0.0" - memdown "~3.0.0" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-packager@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" - integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== - dependencies: - encoding-down "~5.0.0" - levelup "^3.0.0" - -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" - integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== - dependencies: - bytewise "~1.1.0" - level-codec "^9.0.0" - level-errors "^2.0.0" - level-iterator-stream "^2.0.3" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" - -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level-ws@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== - dependencies: - readable-stream "~1.0.15" - xtend "~2.1.1" - -level-ws@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" - integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.8" - xtend "^4.0.1" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - -levelup@3.1.1, levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== - dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" - -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== - dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" - xtend "~4.0.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - 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" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== - dependencies: - get-func-name "^2.0.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@5.1.1, lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - integrity sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow== - dependencies: - pseudomap "^1.0.1" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -ltgt@^2.1.2, ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -markdown-table@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memdown@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== - dependencies: - abstract-leveldown "~2.7.1" - functional-red-black-tree "^1.0.1" - immediate "^3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - -memdown@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" - integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== - dependencies: - abstract-leveldown "~5.0.0" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" - -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merkle-patricia-tree@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - -merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@~1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== - -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - 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" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.11, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== - dependencies: - array.prototype.reduce "^1.0.4" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== - -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ== - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== - -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -patch-package@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" - integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -patch-package@^6.2.2: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - open "^7.4.2" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - 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" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - 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" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - -precond@0.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier-plugin-solidity@^1.0.0-dev.23: - version "1.0.0-dev.23" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-dev.23.tgz#e1edf0693d69fe1518519ab704d5e46ee4f842fc" - integrity sha512-440/jZzvtDJcqtoRCQiigo1DYTPAZ85pjNg7gvdd+Lds6QYgID8RyOdygmudzHdFmV2UfENt//A8tzx7iS58GA== - dependencies: - "@solidity-parser/parser" "^0.14.3" - emoji-regex "^10.1.0" - escape-string-regexp "^4.0.0" - semver "^7.3.7" - solidity-comments-extractor "^0.0.7" - string-width "^4.2.3" - -prettier@^1.14.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.1.2, prettier@^2.3.1, prettier@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-to-callback@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== - dependencies: - is-fn "^1.0.0" - set-immediate-shim "^1.0.1" - -promise@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== - dependencies: - asap "~2.0.6" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== - dependencies: - looper "^2.0.0" - -pump@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -qs@^6.4.0, qs@^6.7.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - 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" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -queue-microtask@^1.2.2, queue-microtask@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1, raw-body@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - 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" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.15, readable-stream@~1.0.26-4: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" - -reduce-flatten@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" - integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== - -regenerate@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ== - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g== - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw== - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - -req-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== - dependencies: - req-from "^2.0.0" - -req-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== - dependencies: - resolve-from "^3.0.0" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.79.0, request@^2.85.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - -require-from-string@^2.0.0, require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.8.1, resolve@~1.22.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== - dependencies: - through "~2.3.4" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.0.0, rxjs@^7.5.4: - version "7.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-event-emitter@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" - integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== - dependencies: - events "^3.0.0" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sc-istanbul@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" - integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw== - dependencies: - pbkdf2 "^3.0.3" - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -seedrandom@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" - integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== - -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - -semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@~5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - 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" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - 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" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -shelljs@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - 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" - -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - 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" - -solc@^0.6.3: - version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" - integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - 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" - -solc@^0.8.6: - version "0.8.15" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" - integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== - dependencies: - command-exists "^1.2.8" - commander "^8.1.0" - follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -solhint-plugin-prettier@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" - integrity sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA== - dependencies: - prettier-linter-helpers "^1.0.0" - -solhint@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-2.3.1.tgz#6fee8fc2635112bf5812f7cba8359c14e9d9a491" - integrity sha512-wP/G+Dqj8LNWlCI9Mt6XiQRWQfZwv1rkZe/V+HKtip5SAZJVvp144PdH28KE45ZvR99Hhrp/Mujt74fSmXsFiw== - dependencies: - ajv "^6.6.1" - antlr4 "4.7.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" - optionalDependencies: - prettier "^1.14.3" - -solhint@^3.3.6: - version "3.3.7" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7" - integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ== - dependencies: - "@solidity-parser/parser" "^0.14.1" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" - optionalDependencies: - prettier "^1.14.3" - -solidity-comments-extractor@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" - integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== - -solidity-coverage@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" - integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== - dependencies: - "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.14.1" - chalk "^2.4.2" - death "^1.1.0" - detect-port "^1.3.0" - difflib "^0.2.4" - fs-extra "^8.1.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.15" - mocha "7.1.2" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.6" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.13: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== - dependencies: - amdefine ">=0.0.4" - -spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-ca@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" - integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -starknet@^3.15.0, starknet@^3.18.2: - version "3.18.2" - resolved "https://registry.yarnpkg.com/starknet/-/starknet-3.18.2.tgz#ec0c83ca97763663722f8e4b6a6872bf2cb18e05" - integrity sha512-w42BOws9np3C9dy4y9MOwY+KqxNhwTseci7CLVlLkui+jzQ7gGWoPVqn9OMeKy0PWIcZadCeuHvLez2xrg3zMg== - dependencies: - "@ethersproject/bytes" "^5.6.1" - bn.js "^5.2.1" - cross-fetch "^3.1.5" - elliptic "^6.5.4" - ethereum-cryptography "^1.0.3" - hash.js "^1.1.7" - json-bigint "^1.0.0" - minimalistic-assert "^1.0.1" - pako "^2.0.4" - ts-custom-error "^3.2.0" - url-join "^4.0.1" - -starknet@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/starknet/-/starknet-4.4.2.tgz#3da5df044c4aa2607b8f282dd34ad1e167ae3a5e" - integrity sha512-tSQNwsx0+27pf2oi1fc1bgGDQO7cHFTWBIm+HLT6yAGs53Y/YRrc6jaxbcEl/826gv36ck53pqmF+85t1ILNMg== - dependencies: - "@ethersproject/bytes" "^5.6.1" - bn.js "^5.2.1" - elliptic "^6.5.4" - ethereum-cryptography "^1.0.3" - hash.js "^1.1.7" - isomorphic-fetch "^3.0.0" - json-bigint "^1.0.0" - minimalistic-assert "^1.0.1" - pako "^2.0.4" - ts-custom-error "^3.2.0" - url-join "^4.0.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - -stream-to-pull-stream@^1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -string-format@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" - integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@~1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e" - integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-json-comments@2.0.1, strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1, supports-color@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - 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" - -sync-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" - integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== - dependencies: - http-response-object "^3.0.1" - sync-rpc "^1.2.1" - then-request "^6.0.0" - -sync-rpc@^1.2.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" - integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== - dependencies: - get-port "^3.1.0" - -table-layout@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" - integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== - dependencies: - array-back "^4.0.1" - deep-extend "~0.6.0" - typical "^5.2.0" - wordwrapjs "^4.0.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.0.9, table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tape@^4.6.3: - version "4.15.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.15.1.tgz#88fb662965a11f9be1bddb04c11662d7eceb129e" - integrity sha512-k7F5pyr91n9D/yjSJwbLLYDCrTWXxMSXbbmHX2n334lSIc2rxeXyFkaBv4UuUd2gBYMrAOalPutAiCxC6q1qbw== - dependencies: - call-bind "~1.0.2" - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - glob "~7.2.0" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.1.4" - minimist "~1.2.6" - object-inspect "~1.12.0" - resolve "~1.22.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.5" - through "~2.3.8" - -tar-fs@~1.16.3: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - 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" - -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -then-request@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" - integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== - dependencies: - "@types/concat-stream" "^1.6.0" - "@types/form-data" "0.0.33" - "@types/node" "^8.0.0" - "@types/qs" "^6.2.31" - caseless "~0.12.0" - concat-stream "^1.6.0" - form-data "^2.2.0" - http-basic "^8.1.1" - http-response-object "^3.0.1" - promise "^8.0.0" - qs "^6.4.0" - -through2@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -"through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== - -ts-command-line-args@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" - integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== - dependencies: - chalk "^4.1.0" - command-line-args "^5.1.1" - command-line-usage "^6.1.0" - string-format "^2.0.0" - -ts-custom-error@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-3.2.0.tgz#ff8f80a3812bab9dc448536312da52dce1b720fb" - integrity sha512-cBvC2QjtvJ9JfWLvstVnI45Y46Y5dMxIaG1TDMGAD/R87hpvqFL+7LhvUDhnRCfOnx/xitollFWWvUKKKhbN0A== - -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -ts-essentials@^6.0.3: - version "6.0.7" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6" - integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== - -ts-essentials@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" - integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -tweetnacl@^1.0.0, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.0.tgz#aaff4ac90514e0dc1095b54af70505ef16cf00a2" - integrity sha512-NybX0NBIssNEj1efLf1mqKAtO4Q/Np5mqpa57be81ud7/tNHIXn48FDVXiyGMBF90FfXc5o7RPsuRQrPzgMOMA== - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" - -typechain@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.0.tgz#fc4902ce596519cb2ccfd012e4ddf92a9945b569" - integrity sha512-5jToLgKTjHdI1VKqs/K8BLYy42Sr3o8bV5ojh4MnR9ExHO83cyyUdw+7+vMJCpKXUiVUvARM4qmHTFuyaCMAZQ== - dependencies: - "@types/prettier" "^2.1.1" - debug "^4.3.1" - fs-extra "^7.0.0" - glob "7.1.7" - js-sha3 "^0.8.0" - lodash "^4.17.15" - mkdirp "^1.0.4" - prettier "^2.3.1" - ts-command-line-args "^2.2.0" - ts-essentials "^7.0.1" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88" - integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== - -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" - integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== - -uglify-js@^3.1.4: - version "3.16.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.3.tgz#94c7a63337ee31227a18d03b8a3041c210fd1f1d" - integrity sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw== - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -undici@^5.4.0: - version "5.8.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.8.1.tgz#511d43ff6be02f84ec2513ae7f4b07c589319272" - integrity sha512-iDRmWX4Zar/4A/t+1LrKQRm102zw2l9Wgat3LtTlTn8ykvMZmAmpq9tjyHEigx18FsY7IfATvyN3xSw9BDz0eA== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unorm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url-join@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA== - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -utf-8-validate@^5.0.2: - version "5.0.9" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" - -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-provider-engine@14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" - integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" - -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: - version "1.7.5" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.5.tgz#081a952ac6e0322e25ac97b37358a43c7372ef6a" - integrity sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -websocket@1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== - 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" - -websocket@^1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - 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" - -whatwg-fetch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - -whatwg-fetch@^3.4.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wordwrapjs@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" - integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== - dependencies: - reduce-flatten "^2.0.0" - typical "^5.2.0" - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^5.1.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - 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" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== - -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.0.0: - version "21.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.0.tgz#a11d06a3bf57f064e951aa3ef55fcf3a5705f876" - integrity sha512-xzm2t63xTV/f7+bGMSRzLhUNk1ajv/tDoaD5OeGyC3cFo2fl7My9Z4hS3q2VdQ7JaLvTxErO8Jp5pRIFGMD/zg== - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - 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" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==