diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 00000000..57e126fd --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,21 @@ +name: unit tests + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Install dependencies + run: yarn install + + - name: Run unit tests + run: yarn test diff --git a/.gitignore b/.gitignore index 13ce6b9e..411c7fd1 100644 --- a/.gitignore +++ b/.gitignore @@ -103,10 +103,11 @@ dist # TernJS port file .tern-port +.DS_Store package-lock.json .idea cache/ artifacts/ deployments/ - +.openzeppelin/ diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..ebc32225 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,35 @@ +module.exports = { + overrides: [ + { + files: "*.sol", + options: { + bracketSpacing: false, + printWidth: 145, + tabWidth: 4, + useTabs: false, + singleQuote: false, + explicitTypes: "never", + }, + }, + { + files: "*.ts", + options: { + printWidth: 145, + semi: false, + tabWidth: 4, + useTabs: false, + trailingComma: "es5", + }, + }, + { + files: "*.js", + options: { + printWidth: 145, + semi: false, + tabWidth: 4, + useTabs: false, + trailingComma: "es5", + }, + }, + ], +} diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 00000000..da0b3eef --- /dev/null +++ b/.solhint.json @@ -0,0 +1,8 @@ +{ + "extends": "solhint:default", + "rules": { + "avoid-suicide": "error", + "avoid-sha3": "warn", + "max-line-length": ["warn", 300] + } +} diff --git a/README.md b/README.md index 907bcb62..eeea3dd5 100644 --- a/README.md +++ b/README.md @@ -1,166 +1,223 @@ -# Simple LayerZero Omni Chain Contracts +
+ LayerZero +
- ### Install & Run tests -```shell -npm install -npx hardhat test -``` +--- -# OmnichainFungibleToken - Send Tokens to another chain -> WARNING: **YOU NEED TO PERFORM THE SET TRUSTED SOURCES STEP.** Don't forget, nah you won't forget. +# LayerZero V1 Solidity Examples + +>[!IMPORTANT] +> **LayerZero V2** is now available [here](https://github.com/LayerZero-Labs/LayerZero-v2), offering improvements in cross-chain transaction speed, gas efficiency, and more. > -> LayerZero Labs will publicize a new cross-chain token standard with permissive license soon - -The `OmnichainFungibleToken` and `OmnichainNonFungibleToken` standardized libraries will have two varieties of deployments. Only one may be chosen: - 1. `Main chain & Child chain(s)` - 2. `All Chain` - - In the `Main chain & Child Chain` variety, all tokens transferred out of the main chain will be locked (and minted on destination), and tokens transferred out of `child` chains will be burned (and minted on destination). This results in the `Main Chain` being like a home base. The initialy supply will only be minted entirely on the `Main Chain` on deployment. Our `OmnichainFungibleToken` example will follow the `Main chain & Child Chain` standardization. - - In the `All Chain` implementation token transfers will always be burn & mint. The deployer may mint tokens in each deployment. Our `OmnichainNonFungibleToken` example will follow the `All Chains` standardization. - -In the example deployment below, the default main chain is ```rinkeby```. -This setting is configured in ```constants/oftMainChain.json```. -The `OmnichainFungibleToken` deployed on other chains will use this configuration to set their main chain. -Using the Ethereum network ```(testnet: rinkeby)``` as a source of truth is a security decision. -In the event a chain goes rogue, Ethereum will be the final source of truth for OFT tokens. -When sending tokens to other chains this contract locks the tokens on the main chain and mints on the destination chain. -When other non-main chains send OFT's to each other they will burn and mint accordingly. -When sending back to the main chain it will burn on the source chain and unlock on the main chain. - -# Are you down with OFT? -1. Deploy two contracts: ```rinkeby``` is the main chain -```angular2html - npx hardhat --network rinkeby deploy --tags OmnichainFungibleToken - npx hardhat --network fuji deploy --tags OmnichainFungibleToken -``` -2. Set the trusted sources, so each contract can receive messages from one another, and `only` one another. -```angular2html -npx hardhat --network rinkeby omnichainFungibleTokenSetDestination --target-network fuji -npx hardhat --network fuji omnichainFungibleTokenSetDestination --target-network rinkeby -``` -3. Send tokens across chains -```angular2html -npx hardhat --network rinkeby omnichainFungibleTokenSendTokens --target-network fuji --qty 250 -``` -#### Note: Remember to add a .env file with your MNEMONIC="" - -# OmnichainNonFungibleToken - Send an ONFT to another chain -> WARNING: **YOU NEED TO PERFORM THE SET TRUSTED SOURCES STEP.** - -In the `All Chain` implementation we deploy the contracts on the chains with a starting token id and max mint number. -The key is to separate the token ids so no same token id can be minted on different chains. -For our OmnichainNonFungibleToken example we deploy to two chains, `bsc-testnet` and `fuji`. -We set the starting token id on `bsc-testnet` to `0` and max mint to `50`. On `fuji` we set the starting token id to `50` and max mint to `100`. -This way no same token id can be minted on the same chain. These setting are configured in ```constants/onftArgs.json```. -When a transfer occurs between chains the ONFT will be `burned` on the source chain and `minted` on the destination chain. - -# Go Omnichain: Be the Deployooooor -1. Deploy two contracts: -```angular2html - npx hardhat --network bsc-testnet deploy --tags OmnichainNonFungibleToken - npx hardhat --network fuji deploy --tags OmnichainNonFungibleToken -``` -2. Set the trusted sources, so each contract can receive messages from one another, and `only` one another. -```angular2html - npx hardhat --network bsc-testnet omnichainNonFungibleTokenSetTrustedSource --target-network fuji - npx hardhat --network fuji omnichainNonFungibleTokenSetTrustedSource --target-network bsc-testnet -``` -3. Mint your ONFT on each chain! -```angular2html - npx hardhat --network bsc-testnet omnichainNonFungibleTokenMint - npx hardhat --network fuji omnichainNonFungibleTokenMint -``` -4. Verify you are the owner of that token on that chain -```angular2html - npx hardhat --network bsc-testnet omnichainNonFungibleTokenOwnerOf --token-id 1 - npx hardhat --network fuji omnichainNonFungibleTokenOwnerOf --token-id 51 -``` -5. Send ONFT's across chains -```angular2html -npx hardhat --network bsc-testnet omnichainNonFungibleTokenTransfer --target-network fuji --token-id 1 -``` -6. Verify your token no longer exists on the source chain -```angular2html - npx hardhat --network bsc-testnet omnichainNonFungibleTokenOwnerOf --token-id 1 -``` -7. Lastly verify your token exist on the destination chain -```angular2html -npx hardhat --network fuji omnichainNonFungibleTokenOwnerOf --token-id 1 +> Review the [LayerZero V2 Documentation](https://docs.layerzero.network/) for a comprehensive overview of the new feature set. +> +> For these reasons, we recommend deploying to LayerZero V2 instead of LayerZero V1. +> +> All of the contracts available in this repo should be considered legacy for Endpoint V1. + +Welcome to the solidity-examples repository, showcasing various contract examples utilizing LayerZero. LayerZero is an Omnichain Interoperability Protocol, facilitating reliable, trustless communication between different blockchain networks. + +**Disclaimer**: This repository contains example contracts to demonstrate the capabilities and usage of LayerZero. For actual implementation in your projects, it's recommended to use the official LayerZero contracts (such as LZApp, OFT, OFTV1.2, etc.) directly from the[ npm package](https://www.npmjs.com/package/@layerzerolabs/solidity-examples). + +You can find instructions for inheriting, deploying, and best practices for the provided contracts in the [LayerZero V1 Documentation](https://docs.layerzero.network/v1/developers/evm/build/what-you-can-build). + +* Formal audit(s) (May 21, 2022) can be found in [audit](./audit) + +### Install & Run tests + +```shell +yarn install +yarn test ``` -#### Note: Remember to add a .env file with your MNEMONIC="" +The code in the [contracts](./contracts) folder demonstrates LayerZero contract behaviours: + +* [NonblockingLzApp](./contracts/lzApp/NonblockingLzApp.sol) provides a generic message passing interface to send and receive arbitrary pieces of data between contracts existing on different blockchain networks. Take a look at how `OmniCounter` inherits `NonblockingLzApp` to easily handle omnichain messaging. + +* The [OFTV1](./contracts/token/oft/v1/OFT.sol) Standard allows ERC20 tokens to be transferred across multiple EVM-compatible blockchains without asset wrapping or middlechains. + +* The [OFTV1.2](./contracts/token/oft/v2/OFTV2.sol) Standard allows fungible tokens to be transferred across both EVM and non-EVM compatible blockchains supported by LayerZero. + +* The [ONFT721](./contracts/token/onft721/ONFT721.sol) Standard allows ERC721 NFTs to be moved across EVM chains. + +* The [ONFT1155](./contracts/token/onft1155/ONFT1155.sol) Standard allows ERC1155 tokens to be sent to EVM chains. + +**Notice**: Each of the above standards comes with a `Proxy` variant for sending tokens that have already been deployed cross-chain. + +> **There can only be one `Proxy` per deployment**. +> Multiple Proxies break omnichain unified liquidity by effectively creating token pools. If you create Proxies on multiple chains, you have no way to guarantee finality for token transfers due to the fact that the source chain has no knowledge of the destination pool's supply (or lack of supply). This can create race conditions where if a sent amount exceeds the available supply on the destination chain, those sent tokens will be permanently lost. + +* Always audit your own code and test extensively on `testnet` before going to mainnet 🙏 -# Testing Cross Chain Messages +> The examples below use two chains, however you could substitute any LayerZero supported chain! + +# OmniCounter.sol + +OmniCounter is a simple example of `NonblockingLzApp` contract that increments a counter on multiple chains. You can only *remotely* increment the counter! 1. Deploy both OmniCounters: -``` +```shell npx hardhat --network bsc-testnet deploy --tags OmniCounter npx hardhat --network fuji deploy --tags OmniCounter ```` 2. Set the remote addresses, so each contract can receive messages -```angular2html -npx hardhat --network bsc-testnet omniCounterSetDestination --target-network fuji -npx hardhat --network fuji omniCounterSetDestination --target-network bsc-testnet + +```shell +npx hardhat --network bsc-testnet setTrustedRemote --target-network fuji --contract OmniCounter +npx hardhat --network fuji setTrustedRemote --target-network bsc-testnet --contract OmniCounter ``` + 3. Send a cross chain message from `bsc-testnet` to `fuji` ! -```angular2html -npx hardhat --network bsc-testnet omniCounterIncrementCounter --target-network fuji + +```shell +npx hardhat --network bsc-testnet incrementCounter --target-network fuji ``` Optionally use this command in a separate terminal to watch the counter increment in real-time. + +```shell +npx hardhat --network fuji ocPoll +``` + +# Check your setTrustedRemote's are wired up correctly + +Just use our [checkWireUpAll](./tasks/checkWireUpAll.js) task to check if your contracts are wired up correctly. You can use it on the example contracts deployed above. + +1) UniversalONFT + +```shell +npx hardhat checkWireUpAll --e testnet --contract ONFT721Mock ``` -npx hardhat --network fuji omniCounterPoll + +2) OmniCounter + +```shell +npx hardhat checkWireUpAll --e testnet --contract OmniCounter ``` -# Testing Multiple Cross Chain Messages +### See some examples in `/contracts` 🙌 -1. Deploy both OmniCounters: +Many of the example contracts make use of `LayerZeroEndpointMock.sol` which is a nice way to test LayerZero locally! + +### For further reading, and a list of endpoint ids and deployed LayerZero contract addresses please take a look at the Documentation here: https://docs.layerzero.network/v1/developers/evm/build/what-you-can-build + +# OmnichainFungibleToken (OFT) + +## About OFTV1.2 + +```text +NOTE: the OFTV1.2 uses uint64 to encode value transfer for compatibility of Aptos and Solana. +The deployer is expected to set a lower decimal points like 6 or 8. + +If the decimal point is 18, then uint64 can only represent approximately 18 tokens (uint64.max ~= 18 * 10^18). ``` -npx hardhat --network bsc-testnet deploy --tags OmniCounter -npx hardhat --network fuji deploy --tags OmniCounter -npx hardhat --network mumbai deploy --tags OmniCounter -npx hardhat --network fantom-testnet deploy --tags OmniCounter -```` -2. Set the remote addresses, so each contract can receive messages -```angular2html -npx hardhat --network bsc-testnet omniCounterSetDestination --target-network fuji -npx hardhat --network fuji omniCounterSetDestination --target-network bsc-testnet +## Deploy Setup + +1. Add a `.env` file (to the root project directory) with your `MNEMONIC="your mnemonic"` and fund your wallet in order to deploy! +2. Follow any of the tutorials below + +## OFTV2Mock.sol - an omnichain ERC20 -npx hardhat --network bsc-testnet omniCounterSetDestination --target-network mumbai -npx hardhat --network mumbai omniCounterSetDestination --target-network bsc-testnet +:warning: **You must perform `setTrustedRemote()` (step 2). This is a mock deployment that auto mints tokens to `msg.sender`** -npx hardhat --network bsc-testnet omniCounterSetDestination --target-network fantom-testnet -npx hardhat --network fantom-testnet omniCounterSetDestination --target-network bsc-testnet +1. Deploy two contracts: + +```shell +npx hardhat --network goerli deploy --tags ExampleOFTV2 +npx hardhat --network fuji deploy --tags ExampleOFTV2 ``` -3. Send a cross chain message from `bsc-testnet` to `fuji,mumbai,fantom-testnet` ! -```angular2html -npx hardhat --network bsc-testnet omniCounterIncrementMultiCounter --target-networks fuji,mumbai,fantom-testnet + +2. Set the "trusted remotes" (ie: your contracts) so each of them can receive messages from one another, and `only` one another. + +```shell +npx hardhat --network goerli setTrustedRemote --target-network fuji --contract OFTV2Mock +npx hardhat --network fuji setTrustedRemote --target-network goerli --contract OFTV2Mock ``` -Optionally use this command in a separate terminal to watch the counter increment in real-time. +3. Set the "minDstGas" required on the destination chain. + +```shell +npx hardhat --network goerli setMinDstGas --packet-type 0 --target-network fuji --contract OFTV2Mock --min-gas 100000 +npx hardhat --network fuji setMinDstGas --packet-type 0 --target-network goerli --contract OFTV2Mock --min-gas 100000 ``` -npx hardhat --network fuji omniCounterPoll -npx hardhat --network mumbai omniCounterPoll -npx hardhat --network fantom-testnet omniCounterPoll + +:warning: Although `100000` is used for `min-gas` in this example, you should set this value based on careful gas consumption analysis. + +4. Send tokens from goerli to fuji + +```shell +npx hardhat --network goerli oftv2Send --target-network fuji --qty 42 --contract OFTV2Mock ``` -# Getting and Setting the Oracle -### Read the currently set Oracle -```npx hardhat --network bsc-testnet omniCounterGetOracle --target-network fantom-testnet``` + **Pro-tip**: Check the ERC20 transactions tab of the destination chain block explorer and await your tokens! -### Set a custom Oracle for the deployed OmniCounter -```npx hardhat --network bsc-testnet omniCounterSetOracle --target-network fantom-testnet --oracle 0x000000000000000000000000000000000000dEaD``` -# -### See some examples in `/contracts` 🙌 +# OmnichainNonFungibleToken721 (ONFT721) + +This ONFT contract allows minting of `nftId`s on separate chains. To ensure two chains can not mint the same `nftId` each contract on each chain is only allowed to mint`nftIds` in certain ranges. +Check the `ONFT_ARGS` constant defined in ONFT721 deploy script for the specific test configuration used in this demo. + +## ONFT721Mock.sol + +:warning: **You must perform the `setTrustedRemote()` (step 2).** + +1. Deploy two contracts: + +```shell +npx hardhat --network bsc-testnet deploy --tags ONFT721 +npx hardhat --network fuji deploy --tags ONFT721 +``` + +2. Set the "trusted remotes", so each contract can send & receive messages from one another, and **only** one another. + +```shell +npx hardhat --network bsc-testnet setTrustedRemote --target-network fuji --contract ONFT721Mock +npx hardhat --network fuji setTrustedRemote --target-network bsc-testnet --contract ONFT721Mock +``` + +3. Set the min gas required on the destination + +```shell +npx hardhat --network bsc-testnet setMinDstGas --target-network fuji --contract ONFT721Mock --packet-type 1 --min-gas 100000 +npx hardhat --network fuji setMinDstGas --target-network bsc-testnet --contract ONFT721Mock --packet-type 1 --min-gas 100000 +``` + +4. Mint an NFT on each chain! + +```shell +npx hardhat --network bsc-testnet onftMint --contract ONFT721Mock --to-address
--token-id 1 +npx hardhat --network fuji onftMint --contract ONFT721Mock --to-address
--token-id 11 +``` + +5. [Optional] Show the token owner(s) + +```shell +npx hardhat --network bsc-testnet ownerOf --token-id 1 --contract ONFT721Mock +npx hardhat --network fuji ownerOf --token-id 11 --contract ONFT721Mock +``` +6. Send ONFT across chains + +```shell +npx hardhat --network bsc-testnet onftSend --target-network fuji --token-id 1 --contract ONFT721Mock +npx hardhat --network fuji onftSend --target-network bsc-testnet --token-id 11 --contract ONFT721Mock +``` + +7. Verify your token no longer exists in your wallet on the source chain & wait for it to reach the destination side. + +```shell +npx hardhat --network bsc-testnet ownerOf --token-id 1 --contract ONFT721Mock +npx hardhat --network fuji ownerOf --token-id 1 --contract ONFT721Mock +``` + +# See testnet and mainnet chainIds and addresses, and the format for connecting contracts on different chains: -Many of the example contracts make use of LayerZeroEndpointMock.sol which is a nice way to test LayerZero locally! +https://github.com/LayerZero-Labs/set-trusted-remotes -### For further reading, and a list of endpoint ids and deployed LayerZero contract addresses please take a look at the Gitbook here: https://layerzero.gitbook.io/ +https://docs.layerzero.network/v1/developers/evm/technical-reference/testnet/testnet-addresses -## Most recently tested with node version `16.13.1` +https://docs.layerzero.network/v1/developers/evm/technical-reference/mainnet/mainnet-addresses +## Most recently tested with node version `18.16.0` \ No newline at end of file diff --git a/audit/Ackee_Audit_Solidty_Examples_Aug_8.pdf b/audit/Ackee_Audit_Solidty_Examples_Aug_8.pdf new file mode 100644 index 00000000..4e84b1c9 Binary files /dev/null and b/audit/Ackee_Audit_Solidty_Examples_Aug_8.pdf differ diff --git a/audit/Ackee_Audit_Solidty_Examples_July_27.pdf b/audit/Ackee_Audit_Solidty_Examples_July_27.pdf new file mode 100644 index 00000000..2cdf28e4 Binary files /dev/null and b/audit/Ackee_Audit_Solidty_Examples_July_27.pdf differ diff --git a/audit/Ackee_Audit_Solidty_Examples_May_3.pdf b/audit/Ackee_Audit_Solidty_Examples_May_3.pdf new file mode 100644 index 00000000..d1f798e8 Binary files /dev/null and b/audit/Ackee_Audit_Solidty_Examples_May_3.pdf differ diff --git a/audit/Zellic_Audit_Solidity_Examples_May_21.pdf b/audit/Zellic_Audit_Solidity_Examples_May_21.pdf new file mode 100644 index 00000000..75db9ad7 Binary files /dev/null and b/audit/Zellic_Audit_Solidity_Examples_May_21.pdf differ diff --git a/constants/chainIds.json b/constants/chainIds.json index 5956dfa3..acbb68cb 100644 --- a/constants/chainIds.json +++ b/constants/chainIds.json @@ -1,9 +1,19 @@ { - "rinkeby": 10001, - "bsc-testnet": 10002, - "fuji": 10006, - "mumbai": 10009, - "arbitrum-rinkeby": 10010, - "optimism-kovan": 10011, - "fantom-testnet": 10012 + "ethereum": 101, + "bsc": 102, + "avalanche": 106, + "polygon": 109, + "arbitrum": 110, + "optimism": 111, + "fantom": 112, + + "goerli": 10121, + "bsc-testnet": 10102, + "fuji": 10106, + "mumbai": 10109, + "arbitrum-goerli": 10143, + "optimism-goerli": 10132, + "fantom-testnet": 10112, + "meter-testnet": 10156, + "zksync-testnet": 10165 } \ No newline at end of file diff --git a/constants/endpoint_abi.json b/constants/endpoint_abi.json new file mode 100644 index 00000000..00dab4de --- /dev/null +++ b/constants/endpoint_abi.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"DefaultReceiveVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"DefaultSendVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"NewLibraryVersionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"address","name":"dstAddress","type":"address"}],"name":"PayloadCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":false,"internalType":"address","name":"dstAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"PayloadStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"}],"name":"UaForceResumeReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ua","type":"address"},{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"UaReceiveVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ua","type":"address"},{"indexed":false,"internalType":"uint16","name":"version","type":"uint16"}],"name":"UaSendVersionSet","type":"event"},{"inputs":[],"name":"BLOCK_VERSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_VERSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultReceiveLibraryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultReceiveVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultSendLibrary","outputs":[{"internalType":"contract ILayerZeroMessagingLibrary","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultSendVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_userApplication","type":"address"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"bool","name":"_payInZRO","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_userApplication","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"getInboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_srcAddress","type":"address"}],"name":"getOutboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userApplication","type":"address"}],"name":"getReceiveLibraryAddress","outputs":[{"internalType":"address","name":"receiveLibraryAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userApplication","type":"address"}],"name":"getReceiveVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userApplication","type":"address"}],"name":"getSendLibraryAddress","outputs":[{"internalType":"address","name":"sendLibraryAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userApplication","type":"address"}],"name":"getSendVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"hasStoredPayload","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"inboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReceivingPayload","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSendingPayload","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"libraryLookup","outputs":[{"internalType":"contract ILayerZeroMessagingLibrary","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newLayerZeroLibraryAddress","type":"address"}],"name":"newVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"outboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"address","name":"_dstAddress","type":"address"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"receivePayload","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryPayload","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_destination","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newDefaultReceiveVersion","type":"uint16"}],"name":"setDefaultReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newDefaultSendVersion","type":"uint16"}],"name":"setDefaultSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newVersion","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newVersion","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"storedPayload","outputs":[{"internalType":"uint64","name":"payloadLength","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"uaConfigLookup","outputs":[{"internalType":"uint16","name":"sendVersion","type":"uint16"},{"internalType":"uint16","name":"receiveVersion","type":"uint16"},{"internalType":"address","name":"receiveLibraryAddress","type":"address"},{"internalType":"contract ILayerZeroMessagingLibrary","name":"sendLibrary","type":"address"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/constants/environments.json b/constants/environments.json new file mode 100644 index 00000000..8c655f8f --- /dev/null +++ b/constants/environments.json @@ -0,0 +1,20 @@ +{ + "mainnet": [ + "ethereum", + "bsc", + "avalanche", + "polygon", + "arbitrum", + "optimism", + "fantom" + ], + "testnet": [ + "goerli", + "bsc-testnet", + "fuji", + "mumbai", + "arbitrum-goerli", + "optimism-goerli", + "fantom-testnet" + ] +} diff --git a/constants/layerzeroEndpoints.json b/constants/layerzeroEndpoints.json index 634f48ee..1bd0a9f1 100644 --- a/constants/layerzeroEndpoints.json +++ b/constants/layerzeroEndpoints.json @@ -1,9 +1,19 @@ { - "rinkeby": "0x79a63d6d8BBD5c6dfc774dA79bCcD948EAcb53FA", + "ethereum": "0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675", + "bsc": "0x3c2269811836af69497E5F486A85D7316753cf62", + "avalanche": "0x3c2269811836af69497E5F486A85D7316753cf62", + "polygon": "0x3c2269811836af69497E5F486A85D7316753cf62", + "arbitrum": "0x3c2269811836af69497E5F486A85D7316753cf62", + "optimism": "0x3c2269811836af69497E5F486A85D7316753cf62", + "fantom": "0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7", + + "goerli": "0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23", "bsc-testnet": "0x6Fcb97553D41516Cb228ac03FdC8B9a0a9df04A1", "fuji": "0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706", "mumbai": "0xf69186dfBa60DdB133E91E9A4B5673624293d8F8", - "arbitrum-rinkeby": "0x4D747149A57923Beb89f22E6B7B97f7D8c087A00", - "optimism-kovan": "0x72aB53a133b27Fa428ca7Dc263080807AfEc91b5", - "fantom-testnet": "0x7dcAD72640F835B0FA36EFD3D6d3ec902C7E5acf" + "arbitrum-goerli": "0x6aB5Ae6822647046626e83ee6dB8187151E1d5ab", + "optimism-goerli": "0xae92d5aD7583AD66E49A0c67BAd18F6ba52dDDc1", + "fantom-testnet": "0x7dcAD72640F835B0FA36EFD3D6d3ec902C7E5acf", + "meter-testnet": "0x3De2f3D1Ac59F18159ebCB422322Cb209BA96aAD", + "zksync-testnet": "0x093D2CF57f764f09C3c2Ac58a42A2601B8C79281" } \ No newline at end of file diff --git a/constants/oftMainChain.json b/constants/oftMainChain.json deleted file mode 100644 index 650a0add..00000000 --- a/constants/oftMainChain.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "mainChain": "rinkeby" -} \ No newline at end of file diff --git a/constants/onftArgs.json b/constants/onftArgs.json deleted file mode 100644 index 2709e55b..00000000 --- a/constants/onftArgs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "bsc-testnet": { - "startId": 0, - "maxSupply": 50 - }, - "fuji": { - "startId": 50, - "maxSupply": 100 - }, - "arbitrum-rinkeby": { - "startId": 100, - "maxSupply": 150 - } -} \ No newline at end of file diff --git a/contracts/NonBlockingReceiver.sol b/contracts/NonBlockingReceiver.sol deleted file mode 100644 index 905d5025..00000000 --- a/contracts/NonBlockingReceiver.sol +++ /dev/null @@ -1,66 +0,0 @@ -pragma solidity 0.8.4; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./interfaces/ILayerZeroReceiver.sol"; -import "./interfaces/ILayerZeroEndpoint.sol"; -import "./interfaces/ILayerZeroReceiver.sol"; - -abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { - ILayerZeroEndpoint public endpoint; - - struct FailedMessages { - uint payloadLength; - bytes32 payloadHash; - } - - mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages; - mapping(uint16 => bytes) public trustedSourceLookup; - - event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); - - // abstract function - function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal; - - function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override { - require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security - require(_srcAddress.length == trustedSourceLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedSourceLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract"); - - // try-catch all errors/exceptions - // having failed messages does not block messages passing - try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { - // do nothing - } catch { - // error / exception - failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload)); - emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); - } - } - - function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public { - // only internal transaction - require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge."); - _LzReceive( _srcChainId, _srcAddress, _nonce, _payload); - } - - function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal { - endpoint.send{value: msg.value}(_dstChainId, trustedSourceLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam); - } - - function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable { - // assert there is message to retry - FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce]; - require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message"); - require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload"); - // clear the stored message - failedMsg.payloadLength = 0; - failedMsg.payloadHash = bytes32(0); - // execute the message. revert if it fails again - this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); - } - - function setTrustedSource(uint16 _chainId, bytes calldata _trustedSource) external onlyOwner { - require(trustedSourceLookup[_chainId].length == 0, "The trusted source address has already been set for the chainId!"); - trustedSourceLookup[_chainId] = _trustedSource; - } -} \ No newline at end of file diff --git a/contracts/OmniCounter.sol b/contracts/OmniCounter.sol deleted file mode 100644 index 4cee5444..00000000 --- a/contracts/OmniCounter.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity 0.8.4; -pragma abicoder v2; - -import "@openzeppelin/contracts/utils/math/SafeMath.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "./interfaces/ILayerZeroReceiver.sol"; -import "./interfaces/ILayerZeroEndpoint.sol"; -import "./interfaces/ILayerZeroUserApplicationConfig.sol"; - -contract OmniCounter is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { - using SafeMath for uint; - // keep track of how many messages have been received from other chains - uint public messageCounter; - // required: the LayerZero endpoint which is passed in the constructor - ILayerZeroEndpoint public layerZeroEndpoint; - mapping(uint16 => bytes) public trustedSourceLookup; - - constructor(address _endpoint) { - layerZeroEndpoint = ILayerZeroEndpoint(_endpoint); - } - - function getCounter() public view returns (uint) { - return messageCounter; - } - - // overrides lzReceive function in ILayerZeroReceiver. - // automatically invoked on the receiving chain after the source chain calls endpoint.send(...) - function lzReceive( - uint16 _srcChainId, - bytes memory _srcAddress, - uint64, /*_nonce*/ - bytes memory /*_payload*/ - ) external override { - // boilerplate: only allow this endpiont to be the caller of lzReceive! - require(msg.sender == address(layerZeroEndpoint)); - // owner must have setTrustedSource() to allow its source contracts to send to this contract - require( - _srcAddress.length == trustedSourceLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedSourceLookup[_srcChainId]), - "Invalid source sender address. owner should call setTrustedSource() to enable source contract" - ); - - messageCounter += 1; - } - - // custom function that wraps endpoint.send(...) which will - // cause lzReceive() to be called on the destination chain! - function incrementCounter(uint16 _dstChainId, bytes calldata _dstCounterMockAddress) public payable { - layerZeroEndpoint.send{value: msg.value}(_dstChainId, _dstCounterMockAddress, bytes(""), payable(msg.sender), address(0x0), bytes("")); - } - - // _adapterParams (v1) - // customize the gas amount to be used on the destination chain. - function incrementCounterWithAdapterParamsV1(uint16 _dstChainId, bytes calldata _dstCounterMockAddress, uint gasAmountForDst) public payable { - uint16 version = 1; - // make look like this: 0x00010000000000000000000000000000000000000000000000000000000000030d40 - bytes memory _adapterParams = abi.encodePacked( - version, - gasAmountForDst - ); - layerZeroEndpoint.send{value: msg.value}(_dstChainId, _dstCounterMockAddress, bytes(""), payable(msg.sender), address(0x0), _adapterParams); - } - - // _adapterParams (v2) - // specify a small amount of notive token you want to airdropped to your wallet on destination - function incrementCounterWithAdapterParamsV2(uint16 _dstChainId, bytes calldata _dstCounterMockAddress, uint gasAmountForDst, uint airdropEthQty, address airdropAddr) public payable { - uint16 version = 2; - bytes memory _adapterParams = abi.encodePacked( - version, - gasAmountForDst, - airdropEthQty, // how must dust to receive on destination - airdropAddr // the address to receive the dust - ); - layerZeroEndpoint.send{value: msg.value}(_dstChainId, _dstCounterMockAddress, bytes(""), payable(msg.sender), address(0x0), _adapterParams); - } - - // call send() to multiple destinations in the same transaction! - function incrementMultiCounter(uint16[] calldata _dstChainIds, bytes[] calldata _dstCounterMockAddresses, address payable _refundAddr) public payable { - require(_dstChainIds.length == _dstCounterMockAddresses.length, "_dstChainIds.length, _dstCounterMockAddresses.length not the same"); - - uint numberOfChains = _dstChainIds.length; - - // note: could result in a few wei of dust left in contract - uint valueToSend = msg.value.div(numberOfChains); - - // send() each chainId + dst address pair - for (uint i = 0; i < numberOfChains; ++i) { - // a Communicator.sol instance is the 'endpoint' - // .send() each payload to the destination chainId + UA destination address - layerZeroEndpoint.send{value: valueToSend}(_dstChainIds[i], _dstCounterMockAddresses[i], bytes(""), _refundAddr, address(0x0), bytes("")); - } - - // refund eth if too much was sent into this contract call - uint refund = msg.value.sub(valueToSend.mul(numberOfChains)); - _refundAddr.transfer(refund); - } - - function setConfig( - uint16, /*_version*/ - uint16 _chainId, - uint _configType, - bytes calldata _config - ) external override { - layerZeroEndpoint.setConfig(layerZeroEndpoint.getSendVersion(address(this)), _chainId, _configType, _config); - } - - function getConfig( - uint16, /*_dstChainId*/ - uint16 _chainId, - address, - uint _configType - ) external view returns (bytes memory) { - return layerZeroEndpoint.getConfig(layerZeroEndpoint.getSendVersion(address(this)), _chainId, address(this), _configType); - } - - function setSendVersion(uint16 version) external override { - layerZeroEndpoint.setSendVersion(version); - } - - function setReceiveVersion(uint16 version) external override { - layerZeroEndpoint.setReceiveVersion(version); - } - - function getSendVersion() external view returns (uint16) { - return layerZeroEndpoint.getSendVersion(address(this)); - } - - function getReceiveVersion() external view returns (uint16) { - return layerZeroEndpoint.getReceiveVersion(address(this)); - } - - function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override { - layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress); - } - - // set the Oracle to be used by this UA for LayerZero messages - function setOracle(uint16 dstChainId, address oracle) external { - uint TYPE_ORACLE = 6; // from UltraLightNode - // set the Oracle - layerZeroEndpoint.setConfig( - layerZeroEndpoint.getSendVersion(address(this)), - dstChainId, - TYPE_ORACLE, - abi.encode(oracle) - ); - } - - // _chainId - the chainId for the source contract - // _sourceAddress - the contract address on the source chainId - // the owner must set source contract addresses. - // in lzReceive(), a require() ensures only messages - // from known contracts can be received. - function setTrustedSource(uint16 _chainId, bytes calldata _sourceAddress) external onlyOwner { - require(trustedSourceLookup[_chainId].length == 0, "The source address has already been set for the chainId!"); - trustedSourceLookup[_chainId] = _sourceAddress; - } - - // set the inbound block confirmations - function setInboundConfirmations(uint16 sourceChainId, uint16 confirmations) external { - layerZeroEndpoint.setConfig( - layerZeroEndpoint.getSendVersion(address(this)), - sourceChainId, - 2, // CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS - abi.encode(confirmations) - ); - } - - // set outbound block confirmations - function setOutboundConfirmations(uint16 sourceChainId, uint16 confirmations) external { - layerZeroEndpoint.setConfig( - layerZeroEndpoint.getSendVersion(address(this)), - sourceChainId, - 5, // CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS - abi.encode(confirmations) - ); - } - - // allow this contract to receive ether - fallback() external payable {} - receive() external payable {} -} \ No newline at end of file diff --git a/contracts/OmnichainFungibleToken.sol b/contracts/OmnichainFungibleToken.sol deleted file mode 100644 index becff9e5..00000000 --- a/contracts/OmnichainFungibleToken.sol +++ /dev/null @@ -1,153 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity 0.8.4; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./interfaces/ILayerZeroEndpoint.sol"; -import "./interfaces/ILayerZeroReceiver.sol"; -import "./interfaces/ILayerZeroUserApplicationConfig.sol"; - - -//--------------------------------------------------------------------------- -// THIS CONTRACT IS OF BUSINESS LICENSE. CONTACT US BEFORE YOU USE IT. -// -// LayerZero is pushing now a new cross-chain token standard with permissive license soon -// -// Stay tuned for maximum cross-chain compatability of your token -//--------------------------------------------------------------------------- -contract OmnichainFungibleToken is ERC20, Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { - ILayerZeroEndpoint immutable public endpoint; - mapping(uint16 => bytes) public trustedSourceLookup;// a map of the connected contracts - bool public paused; // indicates cross chain transfers are paused - bool public isMain; // indicates this contract is on the main chain - - event Paused(bool isPaused); - event SendToChain(uint16 srcChainId, bytes toAddress, uint256 qty, uint64 nonce); - event ReceiveFromChain(uint16 srcChainId, address toAddress, uint256 qty, uint64 nonce); - - constructor( - string memory _name, - string memory _symbol, - address _endpoint, - uint16 _mainChainId, - uint256 _initialSupplyOnMainEndpoint - ) ERC20(_name, _symbol) { - // only mint the total supply on the main chain - if (ILayerZeroEndpoint(_endpoint).getChainId() == _mainChainId) { - _mint(msg.sender, _initialSupplyOnMainEndpoint); - isMain = true; - } - // set the LayerZero endpoint - endpoint = ILayerZeroEndpoint(_endpoint); - } - - function pauseSendTokens(bool _pause) external onlyOwner { - paused = _pause; - emit Paused(_pause); - } - - function setTrustedSource(uint16 _chainId, bytes calldata _destinationContractAddress) public onlyOwner { - require(trustedSourceLookup[_chainId].length == 0, "The source address has already been set for the chainId!"); - trustedSourceLookup[_chainId] = _destinationContractAddress; - } - - function chainId() external view returns (uint16){ - return endpoint.getChainId(); - } - - function sendTokens( - uint16 _dstChainId, // send tokens to this LayerZero chainId - bytes calldata _to, // address where tokens are delivered on destination chain - uint256 _qty, // quantity of tokens to send - address _zroPaymentAddress, // future parameter - bytes calldata _adapterParam // adapterParameters - ) public payable { - require(!paused, "OFT: sendTokens() is currently paused"); - - if (isMain) { - // lock by transferring to this contract if leaving the main chain, - _transfer(msg.sender, address(this), _qty); - } else { - // burn if leaving non-main chain - _burn(msg.sender, _qty); - } - - // abi.encode() the payload - bytes memory payload = abi.encode(_to, _qty); - - // send LayerZero message - endpoint.send{value: msg.value}( - _dstChainId, // destination chainId - trustedSourceLookup[_dstChainId], // destination UA address - payload, // abi.encode()'ed bytes - payable(msg.sender), // refund address - _zroPaymentAddress, // future parameter - _adapterParam // adapterParameters - ); - uint64 nonce = endpoint.getOutboundNonce(_dstChainId, address(this)); - emit SendToChain(_dstChainId, _to, _qty, nonce); - } - - function lzReceive( - uint16 _srcChainId, - bytes memory _fromAddress, - uint64 _nonce, - bytes memory _payload - ) external override { - require(msg.sender == address(endpoint)); // lzReceive must only be called by the endpoint - require( - _fromAddress.length == trustedSourceLookup[_srcChainId].length && keccak256(_fromAddress) == keccak256(trustedSourceLookup[_srcChainId]), - "OFT: invalid source sending contract" - ); - - // decode and load the toAddress - (bytes memory _to, uint256 _qty) = abi.decode(_payload, (bytes, uint256)); - address toAddress; - assembly { toAddress := mload(add(_to, 20)) } - - // if the toAddress is 0x0, burn it - if (toAddress == address(0x0)) toAddress == address(0xdEaD); - - // on the main chain unlock via transfer, otherwise _mint - if (isMain) { - _transfer(address(this), toAddress, _qty); - } else { - _mint(toAddress, _qty); - } - - emit ReceiveFromChain(_srcChainId, toAddress, _qty, _nonce); - } - - function estimateSendTokensFee(uint16 _dstChainId, bytes calldata _toAddress, bool _useZro, bytes calldata _txParameters) external view returns (uint256 nativeFee, uint256 zroFee) { - // mock the payload for sendTokens() - bytes memory payload = abi.encode(_toAddress, 1); - return endpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _txParameters); - } - - //---------------------------DAO CALL---------------------------------------- - // generic config for user Application - function setConfig( - uint16 _version, - uint16 _chainId, - uint256 _configType, - bytes calldata _config - ) external override onlyOwner { - endpoint.setConfig(_version, _chainId, _configType, _config); - } - - function setSendVersion(uint16 _version) external override onlyOwner { - endpoint.setSendVersion(_version); - } - - function setReceiveVersion(uint16 _version) external override onlyOwner { - endpoint.setReceiveVersion(_version); - } - - function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { - endpoint.forceResumeReceive(_srcChainId, _srcAddress); - } - - function renounceOwnership() public override onlyOwner {} -} \ No newline at end of file diff --git a/contracts/OmnichainNonFungibleToken.sol b/contracts/OmnichainNonFungibleToken.sol deleted file mode 100644 index 81204cbf..00000000 --- a/contracts/OmnichainNonFungibleToken.sol +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity 0.8.4; - -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q&Rdq6qKDWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QRXt<~'` ._^cag@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@k*, `!jQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@U; ,}Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@g; 'w@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@i ~Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L '*Ij}i~ :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@k 7@@@@@@@D =@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@! k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t^^^^^^^^^^^^;~'` k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QUz+:'` k@@@@@@@@ '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@K?' k@@@@@@@@ X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b; k@@@@@@@@ f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q; k@@@@@@@@ =Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q' k@@@@@@@@ `;5Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7 k@@@@@@@@ ,~|ZQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `',;><<<<<<<<<<' `;}Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Rj7^,` `';iZWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q#RdqAAKDWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "./NonBlockingReceiver.sol"; - -import "./interfaces/ILayerZeroEndpoint.sol"; - -/// @title A LayerZero OmnichainNonFungibleToken example -/// @author sirarthurmoney -/// @notice You can use this to mint ONFT and transfer across chain -/// @dev All function calls are currently implemented without side effects -contract OmnichainNonFungibleToken is ERC721, NonblockingReceiver, ILayerZeroUserApplicationConfig { - - string public baseTokenURI; - uint256 nextTokenId; - uint256 maxMint; - - /// @notice Constructor for the OmnichainNonFungibleToken - /// @param _baseTokenURI the Uniform Resource Identifier (URI) for tokenId token - /// @param _layerZeroEndpoint handles message transmission across chains - /// @param _startToken the starting mint number on this chain - /// @param _maxMint the max number of mints on this chain - constructor( - string memory _baseTokenURI, - address _layerZeroEndpoint, - uint256 _startToken, - uint256 _maxMint - ) - ERC721("OmnichainNonFungibleToken", "ONFT"){ - setBaseURI(_baseTokenURI); - endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); - nextTokenId = _startToken; - maxMint = _maxMint; - } - - /// @notice Mint your OmnichainNonFungibleToken - function mint() external payable { - require(nextTokenId + 1 <= maxMint, "ONFT: Max limit reached"); - _safeMint(msg.sender, ++nextTokenId); - } - - /// @notice Burn OmniChainNFT_tokenId on source chain and mint on destination chain - /// @param _chainId the destination chain id you want to transfer too - /// @param omniChainNFT_tokenId the id of the ONFT you want to transfer - function transferOmnichainNFT( - uint16 _chainId, - uint256 omniChainNFT_tokenId - ) public payable { - require(msg.sender == ownerOf(omniChainNFT_tokenId), "Message sender must own the OmnichainNFT."); - require(trustedSourceLookup[_chainId].length != 0, "This chain is not a trusted source source."); - - // burn ONFT on source chain - _burn(omniChainNFT_tokenId); - - // encode payload w/ sender address and ONFT token id - bytes memory payload = abi.encode(msg.sender, omniChainNFT_tokenId); - - // encode adapterParams w/ extra gas for destination chain - // This example uses 500,000 gas. Your implementation may need more. - uint16 version = 1; - uint gas = 225000; - bytes memory adapterParams = abi.encodePacked(version, gas); - - // use LayerZero estimateFees for cross chain delivery - (uint quotedLayerZeroFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams); - - require(msg.value >= quotedLayerZeroFee, "Not enough gas to cover cross chain transfer."); - - endpoint.send{value:msg.value}( - _chainId, // destination chainId - trustedSourceLookup[_chainId], // destination address of OmnichainNFT - payload, // abi.encode()'ed bytes - payable(msg.sender), // refund address - address(0x0), // future parameter - adapterParams // adapterParams - ); - } - - /// @notice Set the baseTokenURI - /// @param _baseTokenURI to set - function setBaseURI(string memory _baseTokenURI) public onlyOwner { - baseTokenURI = _baseTokenURI; - } - - /// @notice Get the base URI - function _baseURI() override internal view returns (string memory) { - return baseTokenURI; - } - - /// @notice Override the _LzReceive internal function of the NonblockingReceiver - // @param _srcChainId - the source endpoint identifier - // @param _srcAddress - the source sending contract address from the source chain - // @param _nonce - the ordered message nonce - // @param _payload - the signed payload is the UA bytes has encoded to be sent - /// @dev safe mints the ONFT on your destination chain - function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal override { - (address _dstOmnichainNFTAddress, uint256 omnichainNFT_tokenId) = abi.decode(_payload, (address, uint256)); - _safeMint(_dstOmnichainNFTAddress, omnichainNFT_tokenId); - } - - //---------------------------DAO CALL---------------------------------------- - // generic config for user Application - function setConfig( - uint16 _version, - uint16 _chainId, - uint256 _configType, - bytes calldata _config - ) external override onlyOwner { - endpoint.setConfig(_version, _chainId, _configType, _config); - } - - function setSendVersion(uint16 _version) external override onlyOwner { - endpoint.setSendVersion(_version); - } - - function setReceiveVersion(uint16 _version) external override onlyOwner { - endpoint.setReceiveVersion(_version); - } - - function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { - endpoint.forceResumeReceive(_srcChainId, _srcAddress); - } - - function renounceOwnership() public override onlyOwner {} -} diff --git a/contracts/PingPong.sol b/contracts/PingPong.sol deleted file mode 100644 index 5ab5bc97..00000000 --- a/contracts/PingPong.sol +++ /dev/null @@ -1,149 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -// -// Note: you will need to fund each deployed contract with gas -// -// PingPong sends a LayerZero message back and forth between chains until stopped! -// -// Demonstrates: -// 1. a recursive feature of calling send() from inside lzReceive() -// 2. how to `estimateFees` for a send()'ing a LayerZero message -// 3. the contract pays the message fee - -pragma solidity 0.8.4; -pragma abicoder v2; -import "./interfaces/ILayerZeroReceiver.sol"; -import "./interfaces/ILayerZeroEndpoint.sol"; -import "./interfaces/ILayerZeroUserApplicationConfig.sol"; -import "hardhat/console.sol"; - -contract PingPong is ILayerZeroReceiver, ILayerZeroUserApplicationConfig { - // the LayerZero endpoint calls .send() to send a cross chain message - ILayerZeroEndpoint public layerZeroEndpoint; - // whether PingPong is ping-ponging - bool public pingsEnabled; - // event emitted every ping() to keep track of consecutive pings count - event Ping(uint pings); - // the maxPings before ending the loop - uint public maxPings; - // keep track of the totalPings sent - uint public numPings; - - // constructor requires the LayerZero endpoint for this chain - constructor(address _layerZeroEndpoint) { - pingsEnabled = true; - layerZeroEndpoint = ILayerZeroEndpoint(_layerZeroEndpoint); - maxPings = 5; - } - - // disable ping-ponging - function disable() external { - pingsEnabled = false; - } - - // pings the destination chain, along with the current number of pings sent - function ping( - uint16 _dstChainId, // send a ping to this destination chainId - address _dstPingPongAddr, // destination address of PingPong contract - uint pings // the uint to start at. use 0 as a default - ) public { - require(address(this).balance > 0, "the balance of this contract is 0. pls send gas for message fees"); - require(pingsEnabled, "pingsEnabled is false. messages stopped"); - require(maxPings > pings, "maxPings has been reached, no more looping"); - - emit Ping(pings); - - // abi.encode() the payload with the number of pings sent - bytes memory payload = abi.encode(pings); - - // encode adapterParams to specify more gas for the destination - uint16 version = 1; - uint gasForDestinationLzReceive = 350000; - bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive); - - // get the fees we need to pay to LayerZero + Relayer to cover message delivery - // see Communicator.sol's .estimateNativeFees() function for more details. - (uint messageFee, ) = layerZeroEndpoint.estimateFees(_dstChainId, address(this), payload, false, adapterParams); - require(address(this).balance >= messageFee, "address(this).balance < messageFee. pls send gas for message fees"); - - // send LayerZero message - layerZeroEndpoint.send{value: messageFee}( // {value: messageFee} will be paid out of this contract! - _dstChainId, // destination chainId - abi.encodePacked(_dstPingPongAddr), // destination address of PingPong - payload, // abi.encode()'ed bytes - payable(this), // (msg.sender will be this contract) refund address (LayerZero will refund any extra gas back to caller of send() - address(0x0), // 'zroPaymentAddress' unused for this mock/example - adapterParams // 'adapterParams' unused for this mock/example - ); - } - - // receive the bytes payload from the source chain via LayerZero - // _srcChainId: the chainId that we are receiving the message from. - // _fromAddress: the source PingPong address - function lzReceive( - uint16 _srcChainId, - bytes memory _fromAddress, - uint64, /*_nonce*/ - bytes memory _payload - ) external override { - require(msg.sender == address(layerZeroEndpoint)); // boilerplate! lzReceive must be called by the endpoint for security - - // use assembly to extract the address from the bytes memory parameter - address fromAddress; - assembly { - fromAddress := mload(add(_fromAddress, 20)) - } - - // decode the number of pings sent thus far - uint pings = abi.decode(_payload, (uint)); - - // "recursively" call ping in order to *pong* (and increment pings) - ++pings; - numPings = pings; - - ping(_srcChainId, fromAddress, pings); - } - - function setConfig( - uint16, /*_version*/ - uint16 _dstChainId, - uint _configType, - bytes memory _config - ) external override { - layerZeroEndpoint.setConfig(_dstChainId, layerZeroEndpoint.getSendVersion(address(this)), _configType, _config); - } - - function getConfig( - uint16, /*_dstChainId*/ - uint16 _chainId, - address, - uint _configType - ) external view returns (bytes memory) { - return layerZeroEndpoint.getConfig(layerZeroEndpoint.getSendVersion(address(this)), _chainId, address(this), _configType); - } - - function setSendVersion(uint16 version) external override { - layerZeroEndpoint.setSendVersion(version); - } - - function setReceiveVersion(uint16 version) external override { - layerZeroEndpoint.setReceiveVersion(version); - } - - function getSendVersion() external view returns (uint16) { - return layerZeroEndpoint.getSendVersion(address(this)); - } - - function getReceiveVersion() external view returns (uint16) { - return layerZeroEndpoint.getReceiveVersion(address(this)); - } - - function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override { - layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress); - } - - // allow this contract to receive ether - fallback() external payable {} - - receive() external payable {} -} diff --git a/contracts/examples/GasDrop.sol b/contracts/examples/GasDrop.sol new file mode 100644 index 00000000..f60e3fef --- /dev/null +++ b/contracts/examples/GasDrop.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../lzApp/NonblockingLzApp.sol"; + +/// @title GasDrop +/// @notice A contract for sending and receiving gas across chains using LayerZero's NonblockingLzApp. +contract GasDrop is NonblockingLzApp { + + /// @notice The version of the adapterParams. + uint16 public constant VERSION = 2; + + /// @notice The default amount of gas to be used on the destination chain. + uint public dstGas = 25000; + + /// @dev Emitted when the destination gas is updated. + event SetDstGas(uint dstGas); + + /// @dev Emitted when a gas drop is sent. + event SendGasDrop(uint16 indexed _dstChainId, address indexed _from, bytes indexed _toAddress, uint _amount); + + /// @dev Emitted when a gas drop is received on this chain. + event ReceiveGasDrop(uint16 indexed _srcChainId, address indexed _from, bytes indexed _toAddress, uint _amount); + + /// @param _endpoint The LayerZero endpoint address. + constructor(address _endpoint) NonblockingLzApp(_endpoint) {} + + /// @dev Internal function to handle incoming LayerZero messages and emit a ReceiveGasDrop event. + /// @param _srcChainId The source chain ID from where the message originated. + /// @param _payload The payload of the incoming message. + function _nonblockingLzReceive(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual override { + (uint amount, address fromAddress, bytes memory toAddress) = abi.decode(_payload, (uint, address, bytes)); + emit ReceiveGasDrop(_srcChainId, fromAddress, toAddress, amount); + } + + /// @notice Estimate the fee for sending a gas drop to other chains. + /// @param _dstChainId Array of destination chain IDs. + /// @param _toAddress Array of destination addresses. + /// @param _amount Array of amounts to send. + /// @param _useZro Whether to use ZRO for payment or not. + /// @return nativeFee The total native fee for all destinations. + /// @return zroFee The total ZRO fee for all destinations. + function estimateSendFee(uint16[] calldata _dstChainId, bytes[] calldata _toAddress, uint[] calldata _amount, bool _useZro) external view virtual returns (uint nativeFee, uint zroFee) { + require(_dstChainId.length == _toAddress.length, "_dstChainId and _toAddress must be same size"); + require(_toAddress.length == _amount.length, "_toAddress and _amount must be same size"); + for(uint i = 0; i < _dstChainId.length; i++) { + bytes memory adapterParams = abi.encodePacked(VERSION, dstGas, _amount[i], _toAddress[i]); + bytes memory payload = abi.encode(_amount[i], msg.sender, _toAddress[i]); + (uint native, uint zro) = lzEndpoint.estimateFees(_dstChainId[i], address(this), payload, _useZro, adapterParams); + nativeFee += native; + zroFee += zro; + } + } + + /// @notice Send gas drops to other chains. + /// @param _dstChainId Array of destination chain IDs. + /// @param _toAddress Array of destination addresses. + /// @param _amount Array of amounts to send. + /// @param _refundAddress Address for refunds. + /// @param _zroPaymentAddress Address for ZRO payments. + function gasDrop(uint16[] calldata _dstChainId, bytes[] calldata _toAddress, uint[] calldata _amount, address payable _refundAddress, address _zroPaymentAddress) external payable virtual { + require(_dstChainId.length == _toAddress.length, "_dstChainId and _toAddress must be same size"); + require(_toAddress.length == _amount.length, "_toAddress and _amount must be same size"); + uint _dstGas = dstGas; + for(uint i = 0; i < _dstChainId.length; i++) { + bytes memory adapterParams = abi.encodePacked(VERSION, _dstGas, _amount[i], _toAddress[i]); + bytes memory payload = abi.encode(_amount[i], msg.sender, _toAddress[i]); + address payable refundAddress = (i == _dstChainId.length - 1) ? _refundAddress : payable(address(this)); + _lzSend(_dstChainId[i], payload, refundAddress, _zroPaymentAddress, adapterParams, address(this).balance); + emit SendGasDrop(_dstChainId[i], msg.sender, _toAddress[i], _amount[i]); + } + } + + /// @notice Update the destination gas amount. + /// @param _dstGas The new destination gas amount. + function setDstGas(uint _dstGas) external onlyOwner { + dstGas = _dstGas; + emit SetDstGas(dstGas); + } + + /// @dev Fallback function to receive Ether. + receive() external payable {} +} diff --git a/contracts/examples/OmniCounter.sol b/contracts/examples/OmniCounter.sol new file mode 100644 index 00000000..bba39c3b --- /dev/null +++ b/contracts/examples/OmniCounter.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; +pragma abicoder v2; + +import "../lzApp/NonblockingLzApp.sol"; + +/// @title A LayerZero example sending a cross chain message from a source chain to a destination chain to increment a counter +contract OmniCounter is NonblockingLzApp { + bytes public constant PAYLOAD = "\x01\x02\x03\x04"; + uint public counter; + + constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} + + function _nonblockingLzReceive( + uint16, + bytes memory, + uint64, + bytes memory + ) internal override { + counter += 1; + } + + function estimateFee( + uint16 _dstChainId, + bool _useZro, + bytes calldata _adapterParams + ) public view returns (uint nativeFee, uint zroFee) { + return lzEndpoint.estimateFees(_dstChainId, address(this), PAYLOAD, _useZro, _adapterParams); + } + + function incrementCounter(uint16 _dstChainId) public payable { + _lzSend(_dstChainId, PAYLOAD, payable(msg.sender), address(0x0), bytes(""), msg.value); + } + + function setOracle(uint16 dstChainId, address oracle) external onlyOwner { + uint TYPE_ORACLE = 6; + // set the Oracle + lzEndpoint.setConfig(lzEndpoint.getSendVersion(address(this)), dstChainId, TYPE_ORACLE, abi.encode(oracle)); + } + + function getOracle(uint16 remoteChainId) external view returns (address _oracle) { + bytes memory bytesOracle = lzEndpoint.getConfig(lzEndpoint.getSendVersion(address(this)), remoteChainId, address(this), 6); + assembly { + _oracle := mload(add(bytesOracle, 32)) + } + } +} diff --git a/contracts/examples/PingPong.sol b/contracts/examples/PingPong.sol new file mode 100644 index 00000000..a50df307 --- /dev/null +++ b/contracts/examples/PingPong.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +// +// Note: You will need to fund each deployed contract with gas. +// +// PingPong sends a LayerZero message back and forth between chains +// a predetermined number of times (or until it runs out of gas). +// +// Demonstrates: +// 1. a recursive feature of calling send() from inside lzReceive() +// 2. how to `estimateFees` for a send()'ing a LayerZero message +// 3. the contract pays the message fee + +pragma solidity ^0.8.0; +pragma abicoder v2; + +import "../lzApp/NonblockingLzApp.sol"; + +/// @title PingPong +/// @notice Sends a LayerZero message back and forth between chains a predetermined number of times. +contract PingPong is NonblockingLzApp { + + /// @dev event emitted every ping() to keep track of consecutive pings count + event Ping(uint256 pingCount); + + /// @param _endpoint The LayerZero endpoint address. + constructor(address _endpoint) NonblockingLzApp(_endpoint) {} + + /// @notice Pings the destination chain, along with the current number of pings sent. + /// @param _dstChainId The destination chain ID. + /// @param _totalPings The total number of pings to send. + function ping( + uint16 _dstChainId, + uint256 _totalPings + ) public { + _ping(_dstChainId, 0, _totalPings); + } + + /// @dev Internal function to ping the destination chain, along with the current number of pings sent. + /// @param _dstChainId The destination chain ID. + /// @param _pings The current ping count. + /// @param _totalPings The total number of pings to send. + function _ping( + uint16 _dstChainId, + uint256 _pings, + uint256 _totalPings + ) internal { + require(address(this).balance > 0, "This contract ran out of money."); + + // encode the payload with the number of pings + bytes memory payload = abi.encode(_pings, _totalPings); + + // encode the adapter parameters + uint16 version = 1; + uint256 gasForDestinationLzReceive = 350000; + bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive); + + // send LayerZero message + _lzSend( // {value: messageFee} will be paid out of this contract! + _dstChainId, // destination chainId + payload, // abi.encode()'ed bytes + payable(this), // (msg.sender will be this contract) refund address (LayerZero will refund any extra gas back to caller of send()) + address(0x0), // future param, unused for this example + adapterParams, // v1 adapterParams, specify custom destination gas qty + address(this).balance + ); + } + + /// @dev Internal function to handle incoming Ping messages. + /// @param _srcChainId The source chain ID from which the message originated. + /// @param _payload The payload of the incoming message. + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory, /*_srcAddress*/ + uint64, /*_nonce*/ + bytes memory _payload + ) internal override { + // decode the number of pings sent thus far + (uint256 pingCount, uint256 totalPings) = abi.decode(_payload, (uint256, uint256)); + ++pingCount; + emit Ping(pingCount); + + // *pong* back to the other side + if (pingCount < totalPings) { + _ping(_srcChainId, pingCount, totalPings); + } + } + + // allow this contract to receive ether + receive() external payable {} +} diff --git a/contracts/libraries/BytesLib.sol b/contracts/libraries/BytesLib.sol new file mode 100644 index 00000000..9f82009f --- /dev/null +++ b/contracts/libraries/BytesLib.sol @@ -0,0 +1,487 @@ +// SPDX-License-Identifier: Unlicense +/* + * @title Solidity Bytes Arrays Utils + * @author Gonçalo Sá + * + * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. + * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. + */ +pragma solidity >=0.8.0 <0.9.0; + +library BytesLib { + function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { + bytes memory tempBytes; + + assembly { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // Store the length of the first bytes array at the beginning of + // the memory for tempBytes. + let length := mload(_preBytes) + mstore(tempBytes, length) + + // Maintain a memory counter for the current write location in the + // temp bytes array by adding the 32 bytes for the array length to + // the starting location. + let mc := add(tempBytes, 0x20) + // Stop copying when the memory counter reaches the length of the + // first bytes array. + let end := add(mc, length) + + for { + // Initialize a copy counter to the start of the _preBytes data, + // 32 bytes into its memory. + let cc := add(_preBytes, 0x20) + } lt(mc, end) { + // Increase both counters by 32 bytes each iteration. + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + // Write the _preBytes data into the tempBytes memory 32 bytes + // at a time. + mstore(mc, mload(cc)) + } + + // Add the length of _postBytes to the current length of tempBytes + // and store it as the new length in the first 32 bytes of the + // tempBytes memory. + length := mload(_postBytes) + mstore(tempBytes, add(length, mload(tempBytes))) + + // Move the memory counter back from a multiple of 0x20 to the + // actual end of the _preBytes data. + mc := end + // Stop copying when the memory counter reaches the new combined + // length of the arrays. + end := add(mc, length) + + for { + let cc := add(_postBytes, 0x20) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + // Update the free-memory pointer by padding our last write location + // to 32 bytes: add 31 bytes to the end of tempBytes to move to the + // next 32 byte block, then round down to the nearest multiple of + // 32. If the sum of the length of the two arrays is zero then add + // one before rounding down to leave a blank 32 bytes (the length block with 0). + mstore( + 0x40, + and( + add(add(end, iszero(add(length, mload(_preBytes)))), 31), + not(31) // Round down to the nearest 32 bytes. + ) + ) + } + + return tempBytes; + } + + function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { + assembly { + // Read the first 32 bytes of _preBytes storage, which is the length + // of the array. (We don't need to use the offset into the slot + // because arrays use the entire slot.) + let fslot := sload(_preBytes.slot) + // Arrays of 31 bytes or less have an even value in their slot, + // while longer arrays have an odd value. The actual length is + // the slot divided by two for odd values, and the lowest order + // byte divided by two for even values. + // If the slot is even, bitwise and the slot with 255 and divide by + // two to get the length. If the slot is odd, bitwise and the slot + // with -1 and divide by two. + let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) + let mlength := mload(_postBytes) + let newlength := add(slength, mlength) + // slength can contain both the length and contents of the array + // if length < 32 bytes so let's prepare for that + // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage + switch add(lt(slength, 32), lt(newlength, 32)) + case 2 { + // Since the new array still fits in the slot, we just need to + // update the contents of the slot. + // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length + sstore( + _preBytes.slot, + // all the modifications to the slot are inside this + // next block + add( + // we can just add to the slot contents because the + // bytes we want to change are the LSBs + fslot, + add( + mul( + div( + // load the bytes from memory + mload(add(_postBytes, 0x20)), + // zero all bytes to the right + exp(0x100, sub(32, mlength)) + ), + // and now shift left the number of bytes to + // leave space for the length in the slot + exp(0x100, sub(32, newlength)) + ), + // increase length by the double of the memory + // bytes length + mul(mlength, 2) + ) + ) + ) + } + case 1 { + // The stored value fits in the slot, but the combined value + // will exceed it. + // get the keccak hash to get the contents of the array + mstore(0x0, _preBytes.slot) + let sc := add(keccak256(0x0, 0x20), div(slength, 32)) + + // save new length + sstore(_preBytes.slot, add(mul(newlength, 2), 1)) + + // The contents of the _postBytes array start 32 bytes into + // the structure. Our first read should obtain the `submod` + // bytes that can fit into the unused space in the last word + // of the stored array. To get this, we read 32 bytes starting + // from `submod`, so the data we read overlaps with the array + // contents by `submod` bytes. Masking the lowest-order + // `submod` bytes allows us to add that value directly to the + // stored value. + + let submod := sub(32, slength) + let mc := add(_postBytes, submod) + let end := add(_postBytes, mlength) + let mask := sub(exp(0x100, submod), 1) + + sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask))) + + for { + mc := add(mc, 0x20) + sc := add(sc, 1) + } lt(mc, end) { + sc := add(sc, 1) + mc := add(mc, 0x20) + } { + sstore(sc, mload(mc)) + } + + mask := exp(0x100, sub(mc, end)) + + sstore(sc, mul(div(mload(mc), mask), mask)) + } + default { + // get the keccak hash to get the contents of the array + mstore(0x0, _preBytes.slot) + // Start copying to the last used word of the stored array. + let sc := add(keccak256(0x0, 0x20), div(slength, 32)) + + // save new length + sstore(_preBytes.slot, add(mul(newlength, 2), 1)) + + // Copy over the first `submod` bytes of the new data as in + // case 1 above. + let slengthmod := mod(slength, 32) + let mlengthmod := mod(mlength, 32) + let submod := sub(32, slengthmod) + let mc := add(_postBytes, submod) + let end := add(_postBytes, mlength) + let mask := sub(exp(0x100, submod), 1) + + sstore(sc, add(sload(sc), and(mload(mc), mask))) + + for { + sc := add(sc, 1) + mc := add(mc, 0x20) + } lt(mc, end) { + sc := add(sc, 1) + mc := add(mc, 0x20) + } { + sstore(sc, mload(mc)) + } + + mask := exp(0x100, sub(mc, end)) + + sstore(sc, mul(div(mload(mc), mask), mask)) + } + } + } + + function slice( + bytes memory _bytes, + uint _start, + uint _length + ) internal pure returns (bytes memory) { + require(_length + 31 >= _length, "slice_overflow"); + require(_bytes.length >= _start + _length, "slice_outOfBounds"); + + bytes memory tempBytes; + + assembly { + switch iszero(_length) + case 0 { + // Get a location of some free memory and store it in tempBytes as + // Solidity does for memory variables. + tempBytes := mload(0x40) + + // The first word of the slice result is potentially a partial + // word read from the original array. To read it, we calculate + // the length of that partial word and start copying that many + // bytes into the array. The first word we copy will start with + // data we don't care about, but the last `lengthmod` bytes will + // land at the beginning of the contents of the new array. When + // we're done copying, we overwrite the full first word with + // the actual length of the slice. + let lengthmod := and(_length, 31) + + // The multiplication in the next line is necessary + // because when slicing multiples of 32 bytes (lengthmod == 0) + // the following copy loop was copying the origin's length + // and then ending prematurely not copying everything it should. + let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) + let end := add(mc, _length) + + for { + // The multiplication in the next line has the same exact purpose + // as the one above. + let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) + } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + mstore(mc, mload(cc)) + } + + mstore(tempBytes, _length) + + //update free-memory pointer + //allocating the array padded to 32 bytes like the compiler does now + mstore(0x40, and(add(mc, 31), not(31))) + } + //if we want a zero-length slice let's just return a zero-length array + default { + tempBytes := mload(0x40) + //zero out the 32 bytes slice we are about to return + //we need to do it because Solidity does not garbage collect + mstore(tempBytes, 0) + + mstore(0x40, add(tempBytes, 0x20)) + } + } + + return tempBytes; + } + + function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { + require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); + address tempAddress; + + assembly { + tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) + } + + return tempAddress; + } + + function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) { + require(_bytes.length >= _start + 1, "toUint8_outOfBounds"); + uint8 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x1), _start)) + } + + return tempUint; + } + + function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) { + require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); + uint16 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x2), _start)) + } + + return tempUint; + } + + function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) { + require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); + uint32 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x4), _start)) + } + + return tempUint; + } + + function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) { + require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); + uint64 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x8), _start)) + } + + return tempUint; + } + + function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) { + require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); + uint96 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0xc), _start)) + } + + return tempUint; + } + + function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) { + require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); + uint128 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x10), _start)) + } + + return tempUint; + } + + function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } + + return tempUint; + } + + function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) { + require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); + bytes32 tempBytes32; + + assembly { + tempBytes32 := mload(add(add(_bytes, 0x20), _start)) + } + + return tempBytes32; + } + + function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { + bool success = true; + + assembly { + let length := mload(_preBytes) + + // if lengths don't match the arrays are not equal + switch eq(length, mload(_postBytes)) + case 1 { + // cb is a circuit breaker in the for loop since there's + // no said feature for inline assembly loops + // cb = 1 - don't breaker + // cb = 0 - break + let cb := 1 + + let mc := add(_preBytes, 0x20) + let end := add(mc, length) + + for { + let cc := add(_postBytes, 0x20) + // the next line is the loop condition: + // while(uint256(mc < end) + cb == 2) + } eq(add(lt(mc, end), cb), 2) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { + // if any of these checks fails then arrays are not equal + if iszero(eq(mload(mc), mload(cc))) { + // unsuccess: + success := 0 + cb := 0 + } + } + } + default { + // unsuccess: + success := 0 + } + } + + return success; + } + + function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) { + bool success = true; + + assembly { + // we know _preBytes_offset is 0 + let fslot := sload(_preBytes.slot) + // Decode the length of the stored array like in concatStorage(). + let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) + let mlength := mload(_postBytes) + + // if lengths don't match the arrays are not equal + switch eq(slength, mlength) + case 1 { + // slength can contain both the length and contents of the array + // if length < 32 bytes so let's prepare for that + // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage + if iszero(iszero(slength)) { + switch lt(slength, 32) + case 1 { + // blank the last byte which is the length + fslot := mul(div(fslot, 0x100), 0x100) + + if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { + // unsuccess: + success := 0 + } + } + default { + // cb is a circuit breaker in the for loop since there's + // no said feature for inline assembly loops + // cb = 1 - don't breaker + // cb = 0 - break + let cb := 1 + + // get the keccak hash to get the contents of the array + mstore(0x0, _preBytes.slot) + let sc := keccak256(0x0, 0x20) + + let mc := add(_postBytes, 0x20) + let end := add(mc, mlength) + + // the next line is the loop condition: + // while(uint256(mc < end) + cb == 2) + for { + + } eq(add(lt(mc, end), cb), 2) { + sc := add(sc, 1) + mc := add(mc, 0x20) + } { + if iszero(eq(sload(sc), mload(mc))) { + // unsuccess: + success := 0 + cb := 0 + } + } + } + } + } + default { + // unsuccess: + success := 0 + } + } + + return success; + } +} diff --git a/contracts/libraries/ExcessivelySafeCall.sol b/contracts/libraries/ExcessivelySafeCall.sol new file mode 100644 index 00000000..b2c4a679 --- /dev/null +++ b/contracts/libraries/ExcessivelySafeCall.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.7.6; + +library ExcessivelySafeCall { + uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + /// @notice Use when you _really_ really _really_ don't trust the called + /// contract. This prevents the called contract from causing reversion of + /// the caller in as many ways as we can. + /// @dev The main difference between this and a solidity low-level call is + /// that we limit the number of bytes that the callee can cause to be + /// copied to caller memory. This prevents stupid things like malicious + /// contracts returning 10,000,000 bytes causing a local OOG when copying + /// to memory. + /// @param _target The address to call + /// @param _gas The amount of gas to forward to the remote contract + /// @param _maxCopy The maximum number of bytes of returndata to copy + /// to memory. + /// @param _calldata The data to send to the remote contract + /// @return success and returndata, as `.call()`. Returndata is capped to + /// `_maxCopy` bytes. + function excessivelySafeCall( + address _target, + uint _gas, + uint16 _maxCopy, + bytes memory _calldata + ) internal returns (bool, bytes memory) { + // set up for assembly call + uint _toCopy; + bool _success; + bytes memory _returnData = new bytes(_maxCopy); + // dispatch message to recipient + // by assembly calling "handle" function + // we call via assembly to avoid memcopying a very large returndata + // returned by a malicious contract + assembly { + _success := call( + _gas, // gas + _target, // recipient + 0, // ether value + add(_calldata, 0x20), // inloc + mload(_calldata), // inlen + 0, // outloc + 0 // outlen + ) + // limit our copy to 256 bytes + _toCopy := returndatasize() + if gt(_toCopy, _maxCopy) { + _toCopy := _maxCopy + } + // Store the length of the copied bytes + mstore(_returnData, _toCopy) + // copy the bytes from returndata[0:_toCopy] + returndatacopy(add(_returnData, 0x20), 0, _toCopy) + } + return (_success, _returnData); + } + + /// @notice Use when you _really_ really _really_ don't trust the called + /// contract. This prevents the called contract from causing reversion of + /// the caller in as many ways as we can. + /// @dev The main difference between this and a solidity low-level call is + /// that we limit the number of bytes that the callee can cause to be + /// copied to caller memory. This prevents stupid things like malicious + /// contracts returning 10,000,000 bytes causing a local OOG when copying + /// to memory. + /// @param _target The address to call + /// @param _gas The amount of gas to forward to the remote contract + /// @param _maxCopy The maximum number of bytes of returndata to copy + /// to memory. + /// @param _calldata The data to send to the remote contract + /// @return success and returndata, as `.call()`. Returndata is capped to + /// `_maxCopy` bytes. + function excessivelySafeStaticCall( + address _target, + uint _gas, + uint16 _maxCopy, + bytes memory _calldata + ) internal view returns (bool, bytes memory) { + // set up for assembly call + uint _toCopy; + bool _success; + bytes memory _returnData = new bytes(_maxCopy); + // dispatch message to recipient + // by assembly calling "handle" function + // we call via assembly to avoid memcopying a very large returndata + // returned by a malicious contract + assembly { + _success := staticcall( + _gas, // gas + _target, // recipient + add(_calldata, 0x20), // inloc + mload(_calldata), // inlen + 0, // outloc + 0 // outlen + ) + // limit our copy to 256 bytes + _toCopy := returndatasize() + if gt(_toCopy, _maxCopy) { + _toCopy := _maxCopy + } + // Store the length of the copied bytes + mstore(_returnData, _toCopy) + // copy the bytes from returndata[0:_toCopy] + returndatacopy(add(_returnData, 0x20), 0, _toCopy) + } + return (_success, _returnData); + } + + /** + * @notice Swaps function selectors in encoded contract calls + * @dev Allows reuse of encoded calldata for functions with identical + * argument types but different names. It simply swaps out the first 4 bytes + * for the new selector. This function modifies memory in place, and should + * only be used with caution. + * @param _newSelector The new 4-byte selector + * @param _buf The encoded contract args + */ + function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { + require(_buf.length >= 4); + uint _mask = LOW_28_MASK; + assembly { + // load the first word of + let _word := mload(add(_buf, 0x20)) + // mask out the top 4 bytes + // /x + _word := and(_word, _mask) + _word := or(_newSelector, _word) + mstore(add(_buf, 0x20), _word) + } + } +} diff --git a/contracts/lzApp/LzApp.sol b/contracts/lzApp/LzApp.sol new file mode 100644 index 00000000..a922e9d9 --- /dev/null +++ b/contracts/lzApp/LzApp.sol @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "./interfaces/ILayerZeroReceiver.sol"; +import "./interfaces/ILayerZeroUserApplicationConfig.sol"; +import "./interfaces/ILayerZeroEndpoint.sol"; +import "../libraries/BytesLib.sol"; + +/* + * a generic LzReceiver implementation + */ +abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { + using BytesLib for bytes; + + // ua can not send payload larger than this by default, but it can be changed by the ua owner + uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; + + ILayerZeroEndpoint public immutable lzEndpoint; + mapping(uint16 => bytes) public trustedRemoteLookup; + mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; + mapping(uint16 => uint) public payloadSizeLimitLookup; + address public precrime; + + event SetPrecrime(address precrime); + event SetTrustedRemote(uint16 _remoteChainId, bytes _path); + event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); + event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); + + constructor(address _endpoint) { + lzEndpoint = ILayerZeroEndpoint(_endpoint); + } + + function lzReceive( + uint16 _srcChainId, + bytes calldata _srcAddress, + uint64 _nonce, + bytes calldata _payload + ) public virtual override { + // lzReceive must be called by the endpoint for security + require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); + + bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; + // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. + require( + _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), + "LzApp: invalid source sending contract" + ); + + _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); + } + + // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging + function _blockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual; + + function _lzSend( + uint16 _dstChainId, + bytes memory _payload, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams, + uint _nativeFee + ) internal virtual { + bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; + require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); + _checkPayloadSize(_dstChainId, _payload.length); + lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function _checkGasLimit( + uint16 _dstChainId, + uint16 _type, + bytes memory _adapterParams, + uint _extraGas + ) internal view virtual { + uint providedGasLimit = _getGasLimit(_adapterParams); + uint minGasLimit = minDstGasLookup[_dstChainId][_type]; + require(minGasLimit > 0, "LzApp: minGasLimit not set"); + require(providedGasLimit >= minGasLimit + _extraGas, "LzApp: gas limit is too low"); + } + + function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { + require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); + assembly { + gasLimit := mload(add(_adapterParams, 34)) + } + } + + function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { + uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; + if (payloadSizeLimit == 0) { + // use default if not set + payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; + } + require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large"); + } + + //---------------------------UserApplication config---------------------------------------- + function getConfig( + uint16 _version, + uint16 _chainId, + address, + uint _configType + ) external view returns (bytes memory) { + return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); + } + + // generic config for LayerZero user Application + function setConfig( + uint16 _version, + uint16 _chainId, + uint _configType, + bytes calldata _config + ) external override onlyOwner { + lzEndpoint.setConfig(_version, _chainId, _configType, _config); + } + + function setSendVersion(uint16 _version) external override onlyOwner { + lzEndpoint.setSendVersion(_version); + } + + function setReceiveVersion(uint16 _version) external override onlyOwner { + lzEndpoint.setReceiveVersion(_version); + } + + function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { + lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); + } + + // _path = abi.encodePacked(remoteAddress, localAddress) + // this function set the trusted path for the cross-chain communication + function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner { + trustedRemoteLookup[_remoteChainId] = _path; + emit SetTrustedRemote(_remoteChainId, _path); + } + + function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { + trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); + emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); + } + + function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { + bytes memory path = trustedRemoteLookup[_remoteChainId]; + require(path.length != 0, "LzApp: no trusted path record"); + return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) + } + + function setPrecrime(address _precrime) external onlyOwner { + precrime = _precrime; + emit SetPrecrime(_precrime); + } + + function setMinDstGas( + uint16 _dstChainId, + uint16 _packetType, + uint _minGas + ) external onlyOwner { + minDstGasLookup[_dstChainId][_packetType] = _minGas; + emit SetMinDstGas(_dstChainId, _packetType, _minGas); + } + + // if the size is 0, it means default size limit + function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { + payloadSizeLimitLookup[_dstChainId] = _size; + } + + //--------------------------- VIEW FUNCTION ---------------------------------------- + function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { + bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; + return keccak256(trustedSource) == keccak256(_srcAddress); + } +} diff --git a/contracts/lzApp/NonblockingLzApp.sol b/contracts/lzApp/NonblockingLzApp.sol new file mode 100644 index 00000000..95f74b9e --- /dev/null +++ b/contracts/lzApp/NonblockingLzApp.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./LzApp.sol"; +import "../libraries/ExcessivelySafeCall.sol"; + +/* + * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel + * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking + * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) + */ +abstract contract NonblockingLzApp is LzApp { + using ExcessivelySafeCall for address; + + constructor(address _endpoint) LzApp(_endpoint) {} + + mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; + + event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); + event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); + + // overriding the virtual function in LzReceiver + function _blockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual override { + (bool success, bytes memory reason) = address(this).excessivelySafeCall( + gasleft(), + 150, + abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload) + ); + if (!success) { + _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); + } + } + + function _storeFailedMessage( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload, + bytes memory _reason + ) internal virtual { + failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); + emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); + } + + function nonblockingLzReceive( + uint16 _srcChainId, + bytes calldata _srcAddress, + uint64 _nonce, + bytes calldata _payload + ) public virtual { + // only internal transaction + require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); + _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); + } + + //@notice override this function + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual; + + function retryMessage( + uint16 _srcChainId, + bytes calldata _srcAddress, + uint64 _nonce, + bytes calldata _payload + ) public payable virtual { + // assert there is message to retry + bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; + require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); + require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); + // clear the stored message + failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); + // execute the message. revert if it fails again + _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); + emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); + } +} diff --git a/contracts/interfaces/ILayerZeroEndpoint.sol b/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol similarity index 80% rename from contracts/interfaces/ILayerZeroEndpoint.sol rename to contracts/lzApp/interfaces/ILayerZeroEndpoint.sol index e2c3bd1f..895ede68 100644 --- a/contracts/interfaces/ILayerZeroEndpoint.sol +++ b/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; @@ -12,7 +12,14 @@ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination - function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; + function send( + uint16 _dstChainId, + bytes calldata _destination, + bytes calldata _payload, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier @@ -21,9 +28,16 @@ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract - function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; - - // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain + function receivePayload( + uint16 _srcChainId, + bytes calldata _srcAddress, + address _dstAddress, + uint64 _nonce, + uint _gasLimit, + bytes calldata _payload + ) external; + + // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); @@ -38,7 +52,13 @@ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain - function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); + function estimateFees( + uint16 _dstChainId, + address _userApplication, + bytes calldata _payload, + bool _payInZRO, + bytes calldata _adapterParam + ) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); @@ -47,7 +67,11 @@ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried - function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; + function retryPayload( + uint16 _srcChainId, + bytes calldata _srcAddress, + bytes calldata _payload + ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier @@ -75,7 +99,12 @@ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. - function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); + function getConfig( + uint16 _version, + uint16 _chainId, + address _userApplication, + uint _configType + ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application diff --git a/contracts/interfaces/ILayerZeroReceiver.sol b/contracts/lzApp/interfaces/ILayerZeroReceiver.sol similarity index 69% rename from contracts/interfaces/ILayerZeroReceiver.sol rename to contracts/lzApp/interfaces/ILayerZeroReceiver.sol index 51481d33..d02102b8 100644 --- a/contracts/interfaces/ILayerZeroReceiver.sol +++ b/contracts/lzApp/interfaces/ILayerZeroReceiver.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; @@ -8,5 +8,10 @@ interface ILayerZeroReceiver { // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent - function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; + function lzReceive( + uint16 _srcChainId, + bytes calldata _srcAddress, + uint64 _nonce, + bytes calldata _payload + ) external; } diff --git a/contracts/interfaces/ILayerZeroUserApplicationConfig.sol b/contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol similarity index 87% rename from contracts/interfaces/ILayerZeroUserApplicationConfig.sol rename to contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol index a7a12c2f..bf54be95 100644 --- a/contracts/interfaces/ILayerZeroUserApplicationConfig.sol +++ b/contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; @@ -8,7 +8,12 @@ interface ILayerZeroUserApplicationConfig { // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. - function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; + function setConfig( + uint16 _version, + uint16 _chainId, + uint _configType, + bytes calldata _config + ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version diff --git a/contracts/lzApp/libs/LzLib.sol b/contracts/lzApp/libs/LzLib.sol new file mode 100644 index 00000000..4069961f --- /dev/null +++ b/contracts/lzApp/libs/LzLib.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.6.0; +pragma experimental ABIEncoderV2; + +library LzLib { + // LayerZero communication + struct CallParams { + address payable refundAddress; + address zroPaymentAddress; + } + + //--------------------------------------------------------------------------- + // Address type handling + + struct AirdropParams { + uint airdropAmount; + bytes32 airdropAddress; + } + + function buildAdapterParams(LzLib.AirdropParams memory _airdropParams, uint _uaGasLimit) internal pure returns (bytes memory adapterParams) { + if (_airdropParams.airdropAmount == 0 && _airdropParams.airdropAddress == bytes32(0x0)) { + adapterParams = buildDefaultAdapterParams(_uaGasLimit); + } else { + adapterParams = buildAirdropAdapterParams(_uaGasLimit, _airdropParams); + } + } + + // Build Adapter Params + function buildDefaultAdapterParams(uint _uaGas) internal pure returns (bytes memory) { + // txType 1 + // bytes [2 32 ] + // fields [txType extraGas] + return abi.encodePacked(uint16(1), _uaGas); + } + + function buildAirdropAdapterParams(uint _uaGas, AirdropParams memory _params) internal pure returns (bytes memory) { + require(_params.airdropAmount > 0, "Airdrop amount must be greater than 0"); + require(_params.airdropAddress != bytes32(0x0), "Airdrop address must be set"); + + // txType 2 + // bytes [2 32 32 bytes[] ] + // fields [txType extraGas dstNativeAmt dstNativeAddress] + return abi.encodePacked(uint16(2), _uaGas, _params.airdropAmount, _params.airdropAddress); + } + + function getGasLimit(bytes memory _adapterParams) internal pure returns (uint gasLimit) { + require(_adapterParams.length == 34 || _adapterParams.length > 66, "Invalid adapterParams"); + assembly { + gasLimit := mload(add(_adapterParams, 34)) + } + } + + // Decode Adapter Params + function decodeAdapterParams(bytes memory _adapterParams) + internal + pure + returns ( + uint16 txType, + uint uaGas, + uint airdropAmount, + address payable airdropAddress + ) + { + require(_adapterParams.length == 34 || _adapterParams.length > 66, "Invalid adapterParams"); + assembly { + txType := mload(add(_adapterParams, 2)) + uaGas := mload(add(_adapterParams, 34)) + } + require(txType == 1 || txType == 2, "Unsupported txType"); + require(uaGas > 0, "Gas too low"); + + if (txType == 2) { + assembly { + airdropAmount := mload(add(_adapterParams, 66)) + airdropAddress := mload(add(_adapterParams, 86)) + } + } + } + + //--------------------------------------------------------------------------- + // Address type handling + function bytes32ToAddress(bytes32 _bytes32Address) internal pure returns (address _address) { + return address(uint160(uint(_bytes32Address))); + } + + function addressToBytes32(address _address) internal pure returns (bytes32 _bytes32Address) { + return bytes32(uint(uint160(_address))); + } +} diff --git a/contracts/lzApp/mocks/LZEndpointMock.sol b/contracts/lzApp/mocks/LZEndpointMock.sol new file mode 100644 index 00000000..6c414ef3 --- /dev/null +++ b/contracts/lzApp/mocks/LZEndpointMock.sol @@ -0,0 +1,429 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; +pragma abicoder v2; + +import "../interfaces/ILayerZeroReceiver.sol"; +import "../interfaces/ILayerZeroEndpoint.sol"; +import "../libs/LzLib.sol"; + +/* +like a real LayerZero endpoint but can be mocked, which handle message transmission, verification, and receipt. +- blocking: LayerZero provides ordered delivery of messages from a given sender to a destination chain. +- non-reentrancy: endpoint has a non-reentrancy guard for both the send() and receive(), respectively. +- adapter parameters: allows UAs to add arbitrary transaction params in the send() function, like airdrop on destination chain. +unlike a real LayerZero endpoint, it is +- no messaging library versioning +- send() will short circuit to lzReceive() +- no user application configuration +*/ +contract LZEndpointMock is ILayerZeroEndpoint { + uint8 internal constant _NOT_ENTERED = 1; + uint8 internal constant _ENTERED = 2; + + mapping(address => address) public lzEndpointLookup; + + uint16 public mockChainId; + bool public nextMsgBlocked; + + // fee config + RelayerFeeConfig public relayerFeeConfig; + ProtocolFeeConfig public protocolFeeConfig; + uint public oracleFee; + bytes public defaultAdapterParams; + + // path = remote addrss + local address + // inboundNonce = [srcChainId][path]. + mapping(uint16 => mapping(bytes => uint64)) public inboundNonce; + //todo: this is a hack + // outboundNonce = [dstChainId][srcAddress] + mapping(uint16 => mapping(address => uint64)) public outboundNonce; + // // outboundNonce = [dstChainId][path]. + // mapping(uint16 => mapping(bytes => uint64)) public outboundNonce; + // storedPayload = [srcChainId][path] + mapping(uint16 => mapping(bytes => StoredPayload)) public storedPayload; + // msgToDeliver = [srcChainId][path] + mapping(uint16 => mapping(bytes => QueuedPayload[])) public msgsToDeliver; + + // reentrancy guard + uint8 internal _send_entered_state = 1; + uint8 internal _receive_entered_state = 1; + + struct ProtocolFeeConfig { + uint zroFee; + uint nativeBP; + } + + struct RelayerFeeConfig { + uint128 dstPriceRatio; // 10^10 + uint128 dstGasPriceInWei; + uint128 dstNativeAmtCap; + uint64 baseGas; + uint64 gasPerByte; + } + + struct StoredPayload { + uint64 payloadLength; + address dstAddress; + bytes32 payloadHash; + } + + struct QueuedPayload { + address dstAddress; + uint64 nonce; + bytes payload; + } + + modifier sendNonReentrant() { + require(_send_entered_state == _NOT_ENTERED, "LayerZeroMock: no send reentrancy"); + _send_entered_state = _ENTERED; + _; + _send_entered_state = _NOT_ENTERED; + } + + modifier receiveNonReentrant() { + require(_receive_entered_state == _NOT_ENTERED, "LayerZeroMock: no receive reentrancy"); + _receive_entered_state = _ENTERED; + _; + _receive_entered_state = _NOT_ENTERED; + } + + event UaForceResumeReceive(uint16 chainId, bytes srcAddress); + event PayloadCleared(uint16 srcChainId, bytes srcAddress, uint64 nonce, address dstAddress); + event PayloadStored(uint16 srcChainId, bytes srcAddress, address dstAddress, uint64 nonce, bytes payload, bytes reason); + event ValueTransferFailed(address indexed to, uint indexed quantity); + + constructor(uint16 _chainId) { + mockChainId = _chainId; + + // init config + relayerFeeConfig = RelayerFeeConfig({ + dstPriceRatio: 1e10, // 1:1, same chain, same native coin + dstGasPriceInWei: 1e10, + dstNativeAmtCap: 1e19, + baseGas: 100, + gasPerByte: 1 + }); + protocolFeeConfig = ProtocolFeeConfig({zroFee: 1e18, nativeBP: 1000}); // BP 0.1 + oracleFee = 1e16; + defaultAdapterParams = LzLib.buildDefaultAdapterParams(200000); + } + + // ------------------------------ ILayerZeroEndpoint Functions ------------------------------ + function send( + uint16 _chainId, + bytes memory _path, + bytes calldata _payload, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) external payable override sendNonReentrant { + require(_path.length == 40, "LayerZeroMock: incorrect remote address size"); // only support evm chains + + address dstAddr; + assembly { + dstAddr := mload(add(_path, 20)) + } + + address lzEndpoint = lzEndpointLookup[dstAddr]; + require(lzEndpoint != address(0), "LayerZeroMock: destination LayerZero Endpoint not found"); + + // not handle zro token + bytes memory adapterParams = _adapterParams.length > 0 ? _adapterParams : defaultAdapterParams; + (uint nativeFee, ) = estimateFees(_chainId, msg.sender, _payload, _zroPaymentAddress != address(0x0), adapterParams); + require(msg.value >= nativeFee, "LayerZeroMock: not enough native for fees"); + + uint64 nonce = ++outboundNonce[_chainId][msg.sender]; + + // refund if they send too much + uint amount = msg.value - nativeFee; + if (amount > 0) { + (bool success, ) = _refundAddress.call{value: amount}(""); + require(success, "LayerZeroMock: failed to refund"); + } + + // Mock the process of receiving msg on dst chain + // Mock the relayer paying the dstNativeAddr the amount of extra native token + (, uint extraGas, uint dstNativeAmt, address payable dstNativeAddr) = LzLib.decodeAdapterParams(adapterParams); + if (dstNativeAmt > 0) { + (bool success, ) = dstNativeAddr.call{value: dstNativeAmt}(""); + if (!success) { + emit ValueTransferFailed(dstNativeAddr, dstNativeAmt); + } + } + + bytes memory srcUaAddress = abi.encodePacked(msg.sender, dstAddr); // cast this address to bytes + bytes memory payload = _payload; + LZEndpointMock(lzEndpoint).receivePayload(mockChainId, srcUaAddress, dstAddr, nonce, extraGas, payload); + } + + function receivePayload( + uint16 _srcChainId, + bytes calldata _path, + address _dstAddress, + uint64 _nonce, + uint _gasLimit, + bytes calldata _payload + ) external override receiveNonReentrant { + StoredPayload storage sp = storedPayload[_srcChainId][_path]; + + // assert and increment the nonce. no message shuffling + require(_nonce == ++inboundNonce[_srcChainId][_path], "LayerZeroMock: wrong nonce"); + + // queue the following msgs inside of a stack to simulate a successful send on src, but not fully delivered on dst + if (sp.payloadHash != bytes32(0)) { + QueuedPayload[] storage msgs = msgsToDeliver[_srcChainId][_path]; + QueuedPayload memory newMsg = QueuedPayload(_dstAddress, _nonce, _payload); + + // warning, might run into gas issues trying to forward through a bunch of queued msgs + // shift all the msgs over so we can treat this like a fifo via array.pop() + if (msgs.length > 0) { + // extend the array + msgs.push(newMsg); + + // shift all the indexes up for pop() + for (uint i = 0; i < msgs.length - 1; i++) { + msgs[i + 1] = msgs[i]; + } + + // put the newMsg at the bottom of the stack + msgs[0] = newMsg; + } else { + msgs.push(newMsg); + } + } else if (nextMsgBlocked) { + storedPayload[_srcChainId][_path] = StoredPayload(uint64(_payload.length), _dstAddress, keccak256(_payload)); + emit PayloadStored(_srcChainId, _path, _dstAddress, _nonce, _payload, bytes("")); + // ensure the next msgs that go through are no longer blocked + nextMsgBlocked = false; + } else { + try ILayerZeroReceiver(_dstAddress).lzReceive{gas: _gasLimit}(_srcChainId, _path, _nonce, _payload) {} catch (bytes memory reason) { + storedPayload[_srcChainId][_path] = StoredPayload(uint64(_payload.length), _dstAddress, keccak256(_payload)); + emit PayloadStored(_srcChainId, _path, _dstAddress, _nonce, _payload, reason); + // ensure the next msgs that go through are no longer blocked + nextMsgBlocked = false; + } + } + } + + function getInboundNonce(uint16 _chainID, bytes calldata _path) external view override returns (uint64) { + return inboundNonce[_chainID][_path]; + } + + function getOutboundNonce(uint16 _chainID, address _srcAddress) external view override returns (uint64) { + return outboundNonce[_chainID][_srcAddress]; + } + + function estimateFees( + uint16 _dstChainId, + address _userApplication, + bytes memory _payload, + bool _payInZRO, + bytes memory _adapterParams + ) public view override returns (uint nativeFee, uint zroFee) { + bytes memory adapterParams = _adapterParams.length > 0 ? _adapterParams : defaultAdapterParams; + + // Relayer Fee + uint relayerFee = _getRelayerFee(_dstChainId, 1, _userApplication, _payload.length, adapterParams); + + // LayerZero Fee + uint protocolFee = _getProtocolFees(_payInZRO, relayerFee, oracleFee); + _payInZRO ? zroFee = protocolFee : nativeFee = protocolFee; + + // return the sum of fees + nativeFee = nativeFee + relayerFee + oracleFee; + } + + function getChainId() external view override returns (uint16) { + return mockChainId; + } + + function retryPayload( + uint16 _srcChainId, + bytes calldata _path, + bytes calldata _payload + ) external override { + StoredPayload storage sp = storedPayload[_srcChainId][_path]; + require(sp.payloadHash != bytes32(0), "LayerZeroMock: no stored payload"); + require(_payload.length == sp.payloadLength && keccak256(_payload) == sp.payloadHash, "LayerZeroMock: invalid payload"); + + address dstAddress = sp.dstAddress; + // empty the storedPayload + sp.payloadLength = 0; + sp.dstAddress = address(0); + sp.payloadHash = bytes32(0); + + uint64 nonce = inboundNonce[_srcChainId][_path]; + + ILayerZeroReceiver(dstAddress).lzReceive(_srcChainId, _path, nonce, _payload); + emit PayloadCleared(_srcChainId, _path, nonce, dstAddress); + } + + function hasStoredPayload(uint16 _srcChainId, bytes calldata _path) external view override returns (bool) { + StoredPayload storage sp = storedPayload[_srcChainId][_path]; + return sp.payloadHash != bytes32(0); + } + + function getSendLibraryAddress(address) external view override returns (address) { + return address(this); + } + + function getReceiveLibraryAddress(address) external view override returns (address) { + return address(this); + } + + function isSendingPayload() external view override returns (bool) { + return _send_entered_state == _ENTERED; + } + + function isReceivingPayload() external view override returns (bool) { + return _receive_entered_state == _ENTERED; + } + + function getConfig( + uint16, /*_version*/ + uint16, /*_chainId*/ + address, /*_ua*/ + uint /*_configType*/ + ) external pure override returns (bytes memory) { + return ""; + } + + function getSendVersion( + address /*_userApplication*/ + ) external pure override returns (uint16) { + return 1; + } + + function getReceiveVersion( + address /*_userApplication*/ + ) external pure override returns (uint16) { + return 1; + } + + function setConfig( + uint16, /*_version*/ + uint16, /*_chainId*/ + uint, /*_configType*/ + bytes memory /*_config*/ + ) external override {} + + function setSendVersion( + uint16 /*version*/ + ) external override {} + + function setReceiveVersion( + uint16 /*version*/ + ) external override {} + + function forceResumeReceive(uint16 _srcChainId, bytes calldata _path) external override { + StoredPayload storage sp = storedPayload[_srcChainId][_path]; + // revert if no messages are cached. safeguard malicious UA behaviour + require(sp.payloadHash != bytes32(0), "LayerZeroMock: no stored payload"); + require(sp.dstAddress == msg.sender, "LayerZeroMock: invalid caller"); + + // empty the storedPayload + sp.payloadLength = 0; + sp.dstAddress = address(0); + sp.payloadHash = bytes32(0); + + emit UaForceResumeReceive(_srcChainId, _path); + + // resume the receiving of msgs after we force clear the "stuck" msg + _clearMsgQue(_srcChainId, _path); + } + + // ------------------------------ Other Public/External Functions -------------------------------------------------- + + function getLengthOfQueue(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint) { + return msgsToDeliver[_srcChainId][_srcAddress].length; + } + + // used to simulate messages received get stored as a payload + function blockNextMsg() external { + nextMsgBlocked = true; + } + + function setDestLzEndpoint(address destAddr, address lzEndpointAddr) external { + lzEndpointLookup[destAddr] = lzEndpointAddr; + } + + function setRelayerPrice( + uint128 _dstPriceRatio, + uint128 _dstGasPriceInWei, + uint128 _dstNativeAmtCap, + uint64 _baseGas, + uint64 _gasPerByte + ) external { + relayerFeeConfig.dstPriceRatio = _dstPriceRatio; + relayerFeeConfig.dstGasPriceInWei = _dstGasPriceInWei; + relayerFeeConfig.dstNativeAmtCap = _dstNativeAmtCap; + relayerFeeConfig.baseGas = _baseGas; + relayerFeeConfig.gasPerByte = _gasPerByte; + } + + function setProtocolFee(uint _zroFee, uint _nativeBP) external { + protocolFeeConfig.zroFee = _zroFee; + protocolFeeConfig.nativeBP = _nativeBP; + } + + function setOracleFee(uint _oracleFee) external { + oracleFee = _oracleFee; + } + + function setDefaultAdapterParams(bytes memory _adapterParams) external { + defaultAdapterParams = _adapterParams; + } + + // --------------------- Internal Functions --------------------- + // simulates the relayer pushing through the rest of the msgs that got delayed due to the stored payload + function _clearMsgQue(uint16 _srcChainId, bytes calldata _path) internal { + QueuedPayload[] storage msgs = msgsToDeliver[_srcChainId][_path]; + + // warning, might run into gas issues trying to forward through a bunch of queued msgs + while (msgs.length > 0) { + QueuedPayload memory payload = msgs[msgs.length - 1]; + ILayerZeroReceiver(payload.dstAddress).lzReceive(_srcChainId, _path, payload.nonce, payload.payload); + msgs.pop(); + } + } + + function _getProtocolFees( + bool _payInZro, + uint _relayerFee, + uint _oracleFee + ) internal view returns (uint) { + if (_payInZro) { + return protocolFeeConfig.zroFee; + } else { + return ((_relayerFee + _oracleFee) * protocolFeeConfig.nativeBP) / 10000; + } + } + + function _getRelayerFee( + uint16, /* _dstChainId */ + uint16, /* _outboundProofType */ + address, /* _userApplication */ + uint _payloadSize, + bytes memory _adapterParams + ) internal view returns (uint) { + (uint16 txType, uint extraGas, uint dstNativeAmt, ) = LzLib.decodeAdapterParams(_adapterParams); + uint totalRemoteToken; // = baseGas + extraGas + requiredNativeAmount + if (txType == 2) { + require(relayerFeeConfig.dstNativeAmtCap >= dstNativeAmt, "LayerZeroMock: dstNativeAmt too large "); + totalRemoteToken += dstNativeAmt; + } + // remoteGasTotal = dstGasPriceInWei * (baseGas + extraGas) + uint remoteGasTotal = relayerFeeConfig.dstGasPriceInWei * (relayerFeeConfig.baseGas + extraGas); + totalRemoteToken += remoteGasTotal; + + // tokenConversionRate = dstPrice / localPrice + // basePrice = totalRemoteToken * tokenConversionRate + uint basePrice = (totalRemoteToken * relayerFeeConfig.dstPriceRatio) / 10**10; + + // pricePerByte = (dstGasPriceInWei * gasPerBytes) * tokenConversionRate + uint pricePerByte = (relayerFeeConfig.dstGasPriceInWei * relayerFeeConfig.gasPerByte * relayerFeeConfig.dstPriceRatio) / 10**10; + + return basePrice + _payloadSize * pricePerByte; + } +} diff --git a/contracts/mocks/ERC20Mock.sol b/contracts/mocks/ERC20Mock.sol new file mode 100644 index 00000000..75e58772 --- /dev/null +++ b/contracts/mocks/ERC20Mock.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +// this is a MOCK +contract ERC20Mock is ERC20 { + constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {} + + function mint(address _to, uint _amount) public { + _mint(_to, _amount); + } +} diff --git a/contracts/mocks/LZEndpointMock.sol b/contracts/mocks/LZEndpointMock.sol deleted file mode 100644 index e72063ec..00000000 --- a/contracts/mocks/LZEndpointMock.sol +++ /dev/null @@ -1,189 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity ^0.8.4; -pragma abicoder v2; - -import "../interfaces/ILayerZeroReceiver.sol"; -import "../interfaces/ILayerZeroEndpoint.sol"; - -/* -mocking multi endpoint connection. -- send() will short circuit to lzReceive() directly -- no reentrancy guard. the real LayerZero endpoint on main net has a send and receive guard, respectively. -if we run a ping-pong-like application, the recursive call might use all gas limit in the block. -- not using any messaging library, hence all messaging library func, e.g. estimateFees, version, will not work -*/ -contract LZEndpointMock is ILayerZeroEndpoint { - mapping(address => address) public lzEndpointLookup; - - uint16 public mockChainId; - address payable public mockOracle; - address payable public mockRelayer; - uint256 public mockBlockConfirmations; - uint16 public mockLibraryVersion; - uint256 public mockStaticNativeFee; - uint16 public mockLayerZeroVersion; - uint public nativeFee; - uint public zroFee; - - // inboundNonce = [srcChainId][srcAddress]. - mapping(uint16 => mapping(bytes => uint64)) public inboundNonce; - // outboundNonce = [dstChainId][srcAddress]. - mapping(uint16 => mapping(address => uint64)) public outboundNonce; - - constructor(uint16 _chainId) { - mockStaticNativeFee = 42; - mockLayerZeroVersion = 1; - mockChainId = _chainId; - } - - // mock helper to set the value returned by `estimateNativeFees` - function setEstimatedFees(uint _nativeFee, uint _zroFee) public { - nativeFee = _nativeFee; - zroFee = _zroFee; - } - - function getChainId() external view override returns (uint16) { - return mockChainId; - } - - function setDestLzEndpoint(address destAddr, address lzEndpointAddr) external { - lzEndpointLookup[destAddr] = lzEndpointAddr; - } - - function send( - uint16 _chainId, - bytes calldata _destination, - bytes calldata _payload, - address payable, /*_refundAddress*/ - address, /*_zroPaymentAddress*/ - bytes memory dstGas - ) external payable override { - address destAddr = packedBytesToAddr(_destination); - address lzEndpoint = lzEndpointLookup[destAddr]; - - require(lzEndpoint != address(0), "LayerZeroMock: destination LayerZero Endpoint not found"); - - uint64 nonce; - { - nonce = ++outboundNonce[_chainId][msg.sender]; - } - - // Mock the relayer paying the dstNativeAddr the amount of extra native token - { - uint256 dstNative; - address dstNativeAddr; - assembly { - dstNative := mload(add(dstGas, 66)) - dstNativeAddr := mload(add(dstGas, 86)) - } - - if (dstNativeAddr == 0x90F79bf6EB2c4f870365E785982E1f101E93b906) { - require(dstNative == 453, "Gas incorrect"); - require(1 != 1, "NativeGasParams check"); - } - } - - bytes memory bytesSourceUserApplicationAddr = addrToPackedBytes(address(msg.sender)); // cast this address to bytes - - inboundNonce[_chainId][abi.encodePacked(msg.sender)] = nonce; - LZEndpointMock(lzEndpoint).receiveAndForward(destAddr, mockChainId, bytesSourceUserApplicationAddr, nonce, _payload); - } - - function receiveAndForward( - address _destAddr, - uint16 _srcChainId, - bytes memory _srcAddress, - uint64 _nonce, - bytes memory _payload - ) external { - ILayerZeroReceiver(_destAddr).lzReceive(_srcChainId, _srcAddress, _nonce, _payload); // invoke lzReceive - } - - // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery - // @param _dstChainId - the destination chain identifier - // @param _userApplication - the user app address on this EVM chain - // @param _payload - the custom message to send over LayerZero - // @param _payInZRO - if false, user app pays the protocol fee in native token - // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain - function estimateFees( - uint16, - address, - bytes memory, - bool, - bytes memory - ) external override view returns (uint _nativeFee, uint _zroFee){ - _nativeFee = nativeFee; - _zroFee = zroFee; - } - - // give 20 bytes, return the decoded address - function packedBytesToAddr(bytes calldata _b) public pure returns (address) { - address addr; - assembly { - let ptr := mload(0x40) - calldatacopy(ptr, sub(_b.offset, 2), add(_b.length, 2)) - addr := mload(sub(ptr, 10)) - } - return addr; - } - - // given an address, return the 20 bytes - function addrToPackedBytes(address _a) public pure returns (bytes memory) { - bytes memory data = abi.encodePacked(_a); - return data; - } - - function setConfig(uint16 /*_version*/, uint16 /*_chainId*/, uint /*_configType*/, bytes memory /*_config*/) override external { - } - function getConfig(uint16 /*_version*/, uint16 /*_chainId*/, address /*_ua*/, uint /*_configType*/) override pure external returns(bytes memory) { - return ""; - } - - function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external override {} - - function setSendVersion(uint16 /*version*/) override external { - } - function setReceiveVersion(uint16 /*version*/) override external { - } - function getSendVersion(address /*_userApplication*/) override external pure returns (uint16) { - return 1; - } - function getReceiveVersion(address /*_userApplication*/) override external pure returns (uint16){ - return 1; - } - - function getInboundNonce(uint16 _chainID, bytes calldata _srcAddress) override external view returns (uint64) { - return inboundNonce[_chainID][_srcAddress]; - } - - function getOutboundNonce(uint16 _chainID, address _srcAddress) override external view returns (uint64) { - return outboundNonce[_chainID][_srcAddress]; - } - - function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) override external { - // This mock does not implement the forceResumeReceive - } - - function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) override pure external {} - - function hasStoredPayload(uint16, bytes memory) external pure override returns(bool) { - return true; - } - - function isSendingPayload() external override pure returns (bool) { - return false; - } - - function isReceivingPayload() external override pure returns (bool) { - return false; - } - - function getSendLibraryAddress(address) external override view returns (address) { - return address(this); - } - - function getReceiveLibraryAddress(address) external override view returns (address) { - return address(this); - } -} diff --git a/contracts/token/oft/v1/NativeOFT.sol b/contracts/token/oft/v1/NativeOFT.sol new file mode 100644 index 00000000..ce6be21b --- /dev/null +++ b/contracts/token/oft/v1/NativeOFT.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "./OFT.sol"; + +contract NativeOFT is OFT, ReentrancyGuard { + event Deposit(address indexed _dst, uint _amount); + event Withdrawal(address indexed _src, uint _amount); + + constructor( + string memory _name, + string memory _symbol, + address _lzEndpoint + ) OFT(_name, _symbol, _lzEndpoint) {} + + function sendFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) public payable virtual override(OFTCore, IOFTCore) { + _send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function _send( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual override(OFTCore) { + uint messageFee = _debitFromNative(_from, _dstChainId, _toAddress, _amount); + bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, _amount); + + if (useCustomAdapterParams) { + _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); + } else { + require(_adapterParams.length == 0, "NativeOFT: _adapterParams must be empty."); + } + + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, messageFee); + } + + function deposit() public payable { + _mint(msg.sender, msg.value); + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint _amount) public nonReentrant { + require(balanceOf(msg.sender) >= _amount, "NativeOFT: Insufficient balance."); + _burn(msg.sender, _amount); + (bool success, ) = msg.sender.call{value: _amount}(""); + require(success, "NativeOFT: failed to unwrap"); + emit Withdrawal(msg.sender, _amount); + } + + function _debitFromNative( + address _from, + uint16, + bytes memory, + uint _amount + ) internal returns (uint messageFee) { + messageFee = msg.sender == _from ? _debitMsgSender(_amount) : _debitMsgFrom(_from, _amount); + } + + function _debitMsgSender(uint _amount) internal returns (uint messageFee) { + uint msgSenderBalance = balanceOf(msg.sender); + + if (msgSenderBalance < _amount) { + require(msgSenderBalance + msg.value >= _amount, "NativeOFT: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgSenderBalance; + _mint(address(msg.sender), mintAmount); + + // update the messageFee to take out mintAmount + messageFee = msg.value - mintAmount; + } else { + messageFee = msg.value; + } + + _transfer(msg.sender, address(this), _amount); + return messageFee; + } + + function _debitMsgFrom(address _from, uint _amount) internal returns (uint messageFee) { + uint msgFromBalance = balanceOf(_from); + + if (msgFromBalance < _amount) { + require(msgFromBalance + msg.value >= _amount, "NativeOFT: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgFromBalance; + _mint(address(msg.sender), mintAmount); + + // transfer the differential amount to the contract + _transfer(msg.sender, address(this), mintAmount); + + // overwrite the _amount to take the rest of the balance from the _from address + _amount = msgFromBalance; + + // update the messageFee to take out mintAmount + messageFee = msg.value - mintAmount; + } else { + messageFee = msg.value; + } + + _spendAllowance(_from, msg.sender, _amount); + _transfer(_from, address(this), _amount); + return messageFee; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal override(OFT) returns (uint) { + _burn(address(this), _amount); + (bool success, ) = _toAddress.call{value: _amount}(""); + require(success, "NativeOFT: failed to _creditTo"); + return _amount; + } + + receive() external payable { + deposit(); + } +} diff --git a/contracts/token/oft/v1/OFT.sol b/contracts/token/oft/v1/OFT.sol new file mode 100644 index 00000000..633065be --- /dev/null +++ b/contracts/token/oft/v1/OFT.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import "./interfaces/IOFT.sol"; +import "./OFTCore.sol"; + +// override decimal() function is needed +contract OFT is OFTCore, ERC20, IOFT { + constructor( + string memory _name, + string memory _symbol, + address _lzEndpoint + ) ERC20(_name, _symbol) OFTCore(_lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(OFTCore, IERC165) returns (bool) { + return interfaceId == type(IOFT).interfaceId || interfaceId == type(IERC20).interfaceId || super.supportsInterface(interfaceId); + } + + function token() public view virtual override returns (address) { + return address(this); + } + + function circulatingSupply() public view virtual override returns (uint) { + return totalSupply(); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint _amount + ) internal virtual override returns (uint) { + address spender = _msgSender(); + if (_from != spender) _spendAllowance(_from, spender, _amount); + _burn(_from, _amount); + return _amount; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal virtual override returns (uint) { + _mint(_toAddress, _amount); + return _amount; + } +} diff --git a/contracts/token/oft/v1/OFTCore.sol b/contracts/token/oft/v1/OFTCore.sol new file mode 100644 index 00000000..d637e203 --- /dev/null +++ b/contracts/token/oft/v1/OFTCore.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../../lzApp/NonblockingLzApp.sol"; +import "./interfaces/IOFTCore.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; + +abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore { + using BytesLib for bytes; + + uint public constant NO_EXTRA_GAS = 0; + + // packet type + uint16 public constant PT_SEND = 0; + + bool public useCustomAdapterParams; + + constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId); + } + + function estimateSendFee( + uint16 _dstChainId, + bytes calldata _toAddress, + uint _amount, + bool _useZro, + bytes calldata _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + // mock the payload for sendFrom() + bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount); + return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); + } + + function sendFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) public payable virtual override { + _send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { + useCustomAdapterParams = _useCustomAdapterParams; + emit SetUseCustomAdapterParams(_useCustomAdapterParams); + } + + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual override { + uint16 packetType; + assembly { + packetType := mload(add(_payload, 32)) + } + + if (packetType == PT_SEND) { + _sendAck(_srcChainId, _srcAddress, _nonce, _payload); + } else { + revert("OFTCore: unknown packet type"); + } + } + + function _send( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual { + _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); + + uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount); + + bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _sendAck( + uint16 _srcChainId, + bytes memory, + uint64, + bytes memory _payload + ) internal virtual { + (, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint)); + + address to = toAddressBytes.toAddress(0); + + amount = _creditTo(_srcChainId, to, amount); + emit ReceiveFromChain(_srcChainId, to, amount); + } + + function _checkAdapterParams( + uint16 _dstChainId, + uint16 _pkType, + bytes memory _adapterParams, + uint _extraGas + ) internal virtual { + if (useCustomAdapterParams) { + _checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas); + } else { + require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty."); + } + } + + function _debitFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _amount + ) internal virtual returns (uint); + + function _creditTo( + uint16 _srcChainId, + address _toAddress, + uint _amount + ) internal virtual returns (uint); +} diff --git a/contracts/token/oft/v1/ProxyOFT.sol b/contracts/token/oft/v1/ProxyOFT.sol new file mode 100644 index 00000000..d524c63d --- /dev/null +++ b/contracts/token/oft/v1/ProxyOFT.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./OFTCore.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract ProxyOFT is OFTCore { + using SafeERC20 for IERC20; + + IERC20 internal immutable innerToken; + + constructor(address _lzEndpoint, address _token) OFTCore(_lzEndpoint) { + innerToken = IERC20(_token); + } + + function circulatingSupply() public view virtual override returns (uint) { + unchecked { + return innerToken.totalSupply() - innerToken.balanceOf(address(this)); + } + } + + function token() public view virtual override returns (address) { + return address(innerToken); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint _amount + ) internal virtual override returns (uint) { + require(_from == _msgSender(), "ProxyOFT: owner is not send caller"); + uint before = innerToken.balanceOf(address(this)); + innerToken.safeTransferFrom(_from, address(this), _amount); + return innerToken.balanceOf(address(this)) - before; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal virtual override returns (uint) { + uint before = innerToken.balanceOf(_toAddress); + innerToken.safeTransfer(_toAddress, _amount); + return innerToken.balanceOf(_toAddress) - before; + } +} diff --git a/contracts/token/oft/v1/interfaces/IOFT.sol b/contracts/token/oft/v1/interfaces/IOFT.sol new file mode 100644 index 00000000..a07188fd --- /dev/null +++ b/contracts/token/oft/v1/interfaces/IOFT.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "./IOFTCore.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @dev Interface of the OFT standard + */ +interface IOFT is IOFTCore, IERC20 { + +} diff --git a/contracts/token/oft/v1/interfaces/IOFTCore.sol b/contracts/token/oft/v1/interfaces/IOFTCore.sol new file mode 100644 index 00000000..93f50b4b --- /dev/null +++ b/contracts/token/oft/v1/interfaces/IOFTCore.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +/** + * @dev Interface of the IOFT core standard + */ +interface IOFTCore is IERC165 { + /** + * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) + * _dstChainId - L0 defined chain id to send tokens too + * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + * _amount - amount of the tokens to transfer + * _useZro - indicates to use zro to pay L0 fees + * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 + */ + function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); + + /** + * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` + * `_from` the owner of token + * `_dstChainId` the destination chain identifier + * `_toAddress` can be any size depending on the `dstChainId`. + * `_amount` the quantity of tokens in wei + * `_refundAddress` the address LayerZero refunds if too much message fee is sent + * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) + * `_adapterParams` is a flexible bytes array to indicate messaging adapter services + */ + function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; + + /** + * @dev returns the circulating amount of tokens on current chain + */ + function circulatingSupply() external view returns (uint); + + /** + * @dev returns the address of the ERC20 token + */ + function token() external view returns (address); + + /** + * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) + * `_nonce` is the outbound nonce + */ + event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount); + + /** + * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. + * `_nonce` is the inbound nonce. + */ + event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); + + event SetUseCustomAdapterParams(bool _useCustomAdapterParams); +} diff --git a/contracts/token/oft/v1/mocks/OFTMock.sol b/contracts/token/oft/v1/mocks/OFTMock.sol new file mode 100644 index 00000000..97f91bee --- /dev/null +++ b/contracts/token/oft/v1/mocks/OFTMock.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../OFT.sol"; + +// @dev example implementation inheriting a OFT +contract OFTMock is OFT { + constructor(address _layerZeroEndpoint) OFT("MockOFT", "OFT", _layerZeroEndpoint) {} + + // @dev WARNING public mint function, do not use this in production + function mintTokens(address _to, uint256 _amount) external { + _mint(_to, _amount); + } +} diff --git a/contracts/token/oft/v2/BaseOFTV2.sol b/contracts/token/oft/v2/BaseOFTV2.sol new file mode 100644 index 00000000..b4386b3e --- /dev/null +++ b/contracts/token/oft/v2/BaseOFTV2.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./OFTCoreV2.sol"; +import "./interfaces/IOFTV2.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; + +abstract contract BaseOFTV2 is OFTCoreV2, ERC165, IOFTV2 { + constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) {} + + /************************************************************************ + * public functions + ************************************************************************/ + function sendFrom( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + LzCallParams calldata _callParams + ) public payable virtual override { + _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + } + + function sendAndCall( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes calldata _payload, + uint64 _dstGasForCall, + LzCallParams calldata _callParams + ) public payable virtual override { + _sendAndCall( + _from, + _dstChainId, + _toAddress, + _amount, + _payload, + _dstGasForCall, + _callParams.refundAddress, + _callParams.zroPaymentAddress, + _callParams.adapterParams + ); + } + + /************************************************************************ + * public view functions + ************************************************************************/ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IOFTV2).interfaceId || super.supportsInterface(interfaceId); + } + + function estimateSendFee( + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bool _useZro, + bytes calldata _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams); + } + + function estimateSendAndCallFee( + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes calldata _payload, + uint64 _dstGasForCall, + bool _useZro, + bytes calldata _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams); + } + + function circulatingSupply() public view virtual override returns (uint); + + function token() public view virtual override returns (address); +} diff --git a/contracts/token/oft/v2/NativeOFTV2.sol b/contracts/token/oft/v2/NativeOFTV2.sol new file mode 100644 index 00000000..9e84fab3 --- /dev/null +++ b/contracts/token/oft/v2/NativeOFTV2.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "./OFTV2.sol"; + +contract NativeOFTV2 is OFTV2, ReentrancyGuard { + uint public outboundAmount; + + event Deposit(address indexed _dst, uint _amount); + event Withdrawal(address indexed _src, uint _amount); + + constructor( + string memory _name, + string memory _symbol, + uint8 _sharedDecimals, + address _lzEndpoint + ) OFTV2(_name, _symbol, _sharedDecimals, _lzEndpoint) {} + + /************************************************************************ + * public functions + ************************************************************************/ + function sendFrom( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + LzCallParams calldata _callParams + ) public payable virtual override { + _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + } + + function sendAndCall( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes calldata _payload, + uint64 _dstGasForCall, + LzCallParams calldata _callParams + ) public payable virtual override { + _sendAndCall( + _from, + _dstChainId, + _toAddress, + _amount, + _payload, + _dstGasForCall, + _callParams.refundAddress, + _callParams.zroPaymentAddress, + _callParams.adapterParams + ); + } + + function deposit() public payable { + _mint(msg.sender, msg.value); + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint _amount) external nonReentrant { + require(balanceOf(msg.sender) >= _amount, "NativeOFTV2: Insufficient balance."); + _burn(msg.sender, _amount); + (bool success, ) = msg.sender.call{value: _amount}(""); + require(success, "NativeOFTV2: failed to unwrap"); + emit Withdrawal(msg.sender, _amount); + } + + function _send( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual override returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); + + (amount, ) = _removeDust(_amount); + require(amount > 0, "NativeOFTV2: amount too small"); + uint messageFee = _debitFromNative(_from, amount); + + bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, messageFee); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _sendAndCall( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes memory _payload, + uint64 _dstGasForCall, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual override returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); + + (amount, ) = _removeDust(_amount); + require(amount > 0, "NativeOFTV2: amount too small"); + uint messageFee = _debitFromNative(_from, amount); + + // encode the msg.sender into the payload instead of _from + bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, messageFee); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _debitFromNative(address _from, uint _amount) internal returns (uint messageFee) { + outboundAmount += _amount; + messageFee = msg.sender == _from ? _debitMsgSender(_amount) : _debitMsgFrom(_from, _amount); + } + + function _debitMsgSender(uint _amount) internal returns (uint messageFee) { + uint msgSenderBalance = balanceOf(msg.sender); + + if (msgSenderBalance < _amount) { + require(msgSenderBalance + msg.value >= _amount, "NativeOFTV2: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgSenderBalance; + _mint(address(msg.sender), mintAmount); + + // update the messageFee to take out mintAmount + messageFee = msg.value - mintAmount; + } else { + messageFee = msg.value; + } + + _transfer(msg.sender, address(this), _amount); + return messageFee; + } + + function _debitMsgFrom(address _from, uint _amount) internal returns (uint messageFee) { + uint msgFromBalance = balanceOf(_from); + + if (msgFromBalance < _amount) { + require(msgFromBalance + msg.value >= _amount, "NativeOFTV2: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgFromBalance; + _mint(address(msg.sender), mintAmount); + + // transfer the differential amount to the contract + _transfer(msg.sender, address(this), mintAmount); + + // overwrite the _amount to take the rest of the balance from the _from address + _amount = msgFromBalance; + + // update the messageFee to take out mintAmount + messageFee = msg.value - mintAmount; + } else { + messageFee = msg.value; + } + + _spendAllowance(_from, msg.sender, _amount); + _transfer(_from, address(this), _amount); + return messageFee; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal override returns (uint) { + outboundAmount -= _amount; + _burn(address(this), _amount); + (bool success, ) = _toAddress.call{value: _amount}(""); + require(success, "NativeOFTV2: failed to _creditTo"); + return _amount; + } + + receive() external payable { + deposit(); + } +} diff --git a/contracts/token/oft/v2/OFTCoreV2.sol b/contracts/token/oft/v2/OFTCoreV2.sol new file mode 100644 index 00000000..d919e5d8 --- /dev/null +++ b/contracts/token/oft/v2/OFTCoreV2.sol @@ -0,0 +1,310 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../../lzApp/NonblockingLzApp.sol"; +import "../../../libraries/ExcessivelySafeCall.sol"; +import "./interfaces/ICommonOFT.sol"; +import "./interfaces/IOFTReceiverV2.sol"; + +abstract contract OFTCoreV2 is NonblockingLzApp { + using BytesLib for bytes; + using ExcessivelySafeCall for address; + + uint public constant NO_EXTRA_GAS = 0; + + // packet type + uint8 public constant PT_SEND = 0; + uint8 public constant PT_SEND_AND_CALL = 1; + + uint8 public immutable sharedDecimals; + + mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets; + + /** + * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) + * `_nonce` is the outbound nonce + */ + event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount); + + /** + * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. + * `_nonce` is the inbound nonce. + */ + event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); + + event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash); + + event NonContractAddress(address _address); + + // _sharedDecimals should be the minimum decimals on all chains + constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) { + sharedDecimals = _sharedDecimals; + } + + /************************************************************************ + * public functions + ************************************************************************/ + function callOnOFTReceived( + uint16 _srcChainId, + bytes calldata _srcAddress, + uint64 _nonce, + bytes32 _from, + address _to, + uint _amount, + bytes calldata _payload, + uint _gasForCall + ) public virtual { + require(_msgSender() == address(this), "OFTCore: caller must be OFTCore"); + + // send + _amount = _transferFrom(address(this), _to, _amount); + emit ReceiveFromChain(_srcChainId, _to, _amount); + + // call + IOFTReceiverV2(_to).onOFTReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload); + } + + /************************************************************************ + * internal functions + ************************************************************************/ + function _estimateSendFee( + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bool _useZro, + bytes memory _adapterParams + ) internal view virtual returns (uint nativeFee, uint zroFee) { + // mock the payload for sendFrom() + bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount)); + return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); + } + + function _estimateSendAndCallFee( + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes memory _payload, + uint64 _dstGasForCall, + bool _useZro, + bytes memory _adapterParams + ) internal view virtual returns (uint nativeFee, uint zroFee) { + // mock the payload for sendAndCall() + bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall); + return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); + } + + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual override { + uint8 packetType = _payload.toUint8(0); + + if (packetType == PT_SEND) { + _sendAck(_srcChainId, _srcAddress, _nonce, _payload); + } else if (packetType == PT_SEND_AND_CALL) { + _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload); + } else { + revert("OFTCore: unknown packet type"); + } + } + + function _send( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); + + (amount, ) = _removeDust(_amount); + amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust + require(amount > 0, "OFTCore: amount too small"); + + bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _sendAck( + uint16 _srcChainId, + bytes memory, + uint64, + bytes memory _payload + ) internal virtual { + (address to, uint64 amountSD) = _decodeSendPayload(_payload); + if (to == address(0)) { + to = address(0xdead); + } + + uint amount = _sd2ld(amountSD); + amount = _creditTo(_srcChainId, to, amount); + + emit ReceiveFromChain(_srcChainId, to, amount); + } + + function _sendAndCall( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount, + bytes memory _payload, + uint64 _dstGasForCall, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); + + (amount, ) = _removeDust(_amount); + amount = _debitFrom(_from, _dstChainId, _toAddress, amount); + require(amount > 0, "OFTCore: amount too small"); + + // encode the msg.sender into the payload instead of _from + bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _sendAndCallAck( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64 _nonce, + bytes memory _payload + ) internal virtual { + (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload); + + bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce]; + uint amount = _sd2ld(amountSD); + + // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds + if (!credited) { + amount = _creditTo(_srcChainId, address(this), amount); + creditedPackets[_srcChainId][_srcAddress][_nonce] = true; + } + + if (!_isContract(to)) { + emit NonContractAddress(to); + return; + } + + // workaround for stack too deep + uint16 srcChainId = _srcChainId; + bytes memory srcAddress = _srcAddress; + uint64 nonce = _nonce; + bytes memory payload = _payload; + bytes32 from_ = from; + address to_ = to; + uint amount_ = amount; + bytes memory payloadForCall_ = payloadForCall; + + // no gas limit for the call if retry + uint gas = credited ? gasleft() : gasForCall; + (bool success, bytes memory reason) = address(this).excessivelySafeCall( + gasleft(), + 150, + abi.encodeWithSelector(this.callOnOFTReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas) + ); + + if (success) { + bytes32 hash = keccak256(payload); + emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash); + } else { + // store the failed message into the nonblockingLzApp + _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason); + } + } + + function _isContract(address _account) internal view returns (bool) { + return _account.code.length > 0; + } + + function _ld2sd(uint _amount) internal view virtual returns (uint64) { + uint amountSD = _amount / _ld2sdRate(); + require(amountSD <= type(uint64).max, "OFTCore: amountSD overflow"); + return uint64(amountSD); + } + + function _sd2ld(uint64 _amountSD) internal view virtual returns (uint) { + return _amountSD * _ld2sdRate(); + } + + function _removeDust(uint _amount) internal view virtual returns (uint amountAfter, uint dust) { + dust = _amount % _ld2sdRate(); + amountAfter = _amount - dust; + } + + function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal view virtual returns (bytes memory) { + return abi.encodePacked(PT_SEND, _toAddress, _amountSD); + } + + function _decodeSendPayload(bytes memory _payload) internal view virtual returns (address to, uint64 amountSD) { + require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "OFTCore: invalid payload"); + + to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 + amountSD = _payload.toUint64(33); + } + + function _encodeSendAndCallPayload( + address _from, + bytes32 _toAddress, + uint64 _amountSD, + bytes memory _payload, + uint64 _dstGasForCall + ) internal view virtual returns (bytes memory) { + return abi.encodePacked(PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload); + } + + function _decodeSendAndCallPayload(bytes memory _payload) + internal + view + virtual + returns ( + bytes32 from, + address to, + uint64 amountSD, + bytes memory payload, + uint64 dstGasForCall + ) + { + require(_payload.toUint8(0) == PT_SEND_AND_CALL, "OFTCore: invalid payload"); + + to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 + amountSD = _payload.toUint64(33); + from = _payload.toBytes32(41); + dstGasForCall = _payload.toUint64(73); + payload = _payload.slice(81, _payload.length - 81); + } + + function _addressToBytes32(address _address) internal pure virtual returns (bytes32) { + return bytes32(uint(uint160(_address))); + } + + function _debitFrom( + address _from, + uint16 _dstChainId, + bytes32 _toAddress, + uint _amount + ) internal virtual returns (uint); + + function _creditTo( + uint16 _srcChainId, + address _toAddress, + uint _amount + ) internal virtual returns (uint); + + function _transferFrom( + address _from, + address _to, + uint _amount + ) internal virtual returns (uint); + + function _ld2sdRate() internal view virtual returns (uint); +} diff --git a/contracts/token/oft/v2/OFTV2.sol b/contracts/token/oft/v2/OFTV2.sol new file mode 100644 index 00000000..a129245d --- /dev/null +++ b/contracts/token/oft/v2/OFTV2.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "./BaseOFTV2.sol"; + +/// @title OFT V1.2 Contract +/// @notice This contract is version 1.2 of the OFT Standard, enabling cross-chain token transfers between EVM and non-EVM contracts. +/// @dev This contract is only compatible with Endpoint V1. +contract OFTV2 is BaseOFTV2, ERC20 { + uint internal immutable ld2sdRate; + + constructor( + string memory _name, + string memory _symbol, + uint8 _sharedDecimals, + address _lzEndpoint + ) ERC20(_name, _symbol) BaseOFTV2(_sharedDecimals, _lzEndpoint) { + uint8 decimals = decimals(); + require(_sharedDecimals <= decimals, "OFT: sharedDecimals must be <= decimals"); + ld2sdRate = 10**(decimals - _sharedDecimals); + } + + /************************************************************************ + * public functions + ************************************************************************/ + function circulatingSupply() public view virtual override returns (uint) { + return totalSupply(); + } + + function token() public view virtual override returns (address) { + return address(this); + } + + /************************************************************************ + * internal functions + ************************************************************************/ + function _debitFrom( + address _from, + uint16, + bytes32, + uint _amount + ) internal virtual override returns (uint) { + address spender = _msgSender(); + if (_from != spender) _spendAllowance(_from, spender, _amount); + _burn(_from, _amount); + return _amount; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal virtual override returns (uint) { + _mint(_toAddress, _amount); + return _amount; + } + + function _transferFrom( + address _from, + address _to, + uint _amount + ) internal virtual override returns (uint) { + address spender = _msgSender(); + // if transfer from this contract, no need to check allowance + if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount); + _transfer(_from, _to, _amount); + return _amount; + } + + function _ld2sdRate() internal view virtual override returns (uint) { + return ld2sdRate; + } +} diff --git a/contracts/token/oft/v2/ProxyOFTV2.sol b/contracts/token/oft/v2/ProxyOFTV2.sol new file mode 100644 index 00000000..90037b05 --- /dev/null +++ b/contracts/token/oft/v2/ProxyOFTV2.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./BaseOFTV2.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract ProxyOFTV2 is BaseOFTV2 { + using SafeERC20 for IERC20; + + IERC20 internal immutable innerToken; + uint internal immutable ld2sdRate; + + // total amount is transferred from this chain to other chains, ensuring the total is less than uint64.max in sd + uint public outboundAmount; + + constructor( + address _token, + uint8 _sharedDecimals, + address _lzEndpoint + ) BaseOFTV2(_sharedDecimals, _lzEndpoint) { + innerToken = IERC20(_token); + + (bool success, bytes memory data) = _token.staticcall(abi.encodeWithSignature("decimals()")); + require(success, "ProxyOFT: failed to get token decimals"); + uint8 decimals = abi.decode(data, (uint8)); + + require(_sharedDecimals <= decimals, "ProxyOFT: sharedDecimals must be <= decimals"); + ld2sdRate = 10**(decimals - _sharedDecimals); + } + + /************************************************************************ + * public functions + ************************************************************************/ + function circulatingSupply() public view virtual override returns (uint) { + return innerToken.totalSupply() - outboundAmount; + } + + function token() public view virtual override returns (address) { + return address(innerToken); + } + + /************************************************************************ + * internal functions + ************************************************************************/ + function _debitFrom( + address _from, + uint16, + bytes32, + uint _amount + ) internal virtual override returns (uint) { + require(_from == _msgSender(), "ProxyOFT: owner is not send caller"); + + _amount = _transferFrom(_from, address(this), _amount); + + // _amount still may have dust if the token has transfer fee, then give the dust back to the sender + (uint amount, uint dust) = _removeDust(_amount); + if (dust > 0) innerToken.safeTransfer(_from, dust); + + // check total outbound amount + outboundAmount += amount; + uint cap = _sd2ld(type(uint64).max); + require(cap >= outboundAmount, "ProxyOFT: outboundAmount overflow"); + + return amount; + } + + function _creditTo( + uint16, + address _toAddress, + uint _amount + ) internal virtual override returns (uint) { + outboundAmount -= _amount; + + // tokens are already in this contract, so no need to transfer + if (_toAddress == address(this)) { + return _amount; + } + + return _transferFrom(address(this), _toAddress, _amount); + } + + function _transferFrom( + address _from, + address _to, + uint _amount + ) internal virtual override returns (uint) { + uint before = innerToken.balanceOf(_to); + if (_from == address(this)) { + innerToken.safeTransfer(_to, _amount); + } else { + innerToken.safeTransferFrom(_from, _to, _amount); + } + return innerToken.balanceOf(_to) - before; + } + + function _ld2sdRate() internal view virtual override returns (uint) { + return ld2sdRate; + } +} diff --git a/contracts/token/oft/v2/README.md b/contracts/token/oft/v2/README.md new file mode 100644 index 00000000..6d2d8f44 --- /dev/null +++ b/contracts/token/oft/v2/README.md @@ -0,0 +1,18 @@ +## Clarification on OFT Versions + +### OFTV1.2 + +> [!IMPORTANT] +> Please note that this repo contains OFTV1.2, and is NOT the LayerZero V2 OFT Standard, but rather a second version of OFT built on Endpoint V1. + +We recommend new developers use the [LayerZero V2 OFT Standard](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oft/OFT.sol) (found in the LayerZero V2 repo) over both the Endpoint V1 OFT V1 and Endpoint V1 OFT V1.2 implementations, as the protocol update comes with improved interfaces, gas optimizations, and greater composability. + +#### When to use LayerZero V2 OFT + +With the release of LayerZero V2, you should consider only using this V2 OFT Standard for your deployments. LayerZero V2 offers developers a smoother developer experience and optimizations to core protocol contracts. + +Read the full [LayerZero V2 Overview](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) to learn more. + +#### When to use LayerZero V1 OFT V1.2 + +What if you want to build an Omnichain Fungible Token that supports EVMs and non-EVMs (e.g., Aptos)? In this case, you should use our Endpoint V1 OFT V1.2 which supports both. This version has fees, shared decimals, and composability built in. This Endpoint V1 version of OFT is currently being used in projects such as BTCb. diff --git a/contracts/token/oft/v2/fee/BaseOFTWithFee.sol b/contracts/token/oft/v2/fee/BaseOFTWithFee.sol new file mode 100644 index 00000000..c039c818 --- /dev/null +++ b/contracts/token/oft/v2/fee/BaseOFTWithFee.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../OFTCoreV2.sol"; +import "./IOFTWithFee.sol"; +import "./Fee.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; + +abstract contract BaseOFTWithFee is OFTCoreV2, Fee, ERC165, IOFTWithFee { + + constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) { + } + + /************************************************************************ + * public functions + ************************************************************************/ + function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) public payable virtual override { + (_amount,) = _payOFTFee(_from, _dstChainId, _amount); + _amount = _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); + } + + function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) public payable virtual override { + (_amount,) = _payOFTFee(_from, _dstChainId, _amount); + _amount = _sendAndCall(_from, _dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); + } + + /************************************************************************ + * public view functions + ************************************************************************/ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IOFTWithFee).interfaceId || super.supportsInterface(interfaceId); + } + + function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { + return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams); + } + + function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { + return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams); + } + + function circulatingSupply() public view virtual override returns (uint); + + function token() public view virtual override returns (address); + + function _transferFrom(address _from, address _to, uint _amount) internal virtual override (Fee, OFTCoreV2) returns (uint); +} diff --git a/contracts/token/oft/v2/fee/Fee.sol b/contracts/token/oft/v2/fee/Fee.sol new file mode 100644 index 00000000..c44e819f --- /dev/null +++ b/contracts/token/oft/v2/fee/Fee.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +abstract contract Fee is Ownable { + uint public constant BP_DENOMINATOR = 10000; + + mapping(uint16 => FeeConfig) public chainIdToFeeBps; + uint16 public defaultFeeBp; + address public feeOwner; // defaults to owner + + struct FeeConfig { + uint16 feeBP; + bool enabled; + } + + event SetFeeBp(uint16 dstchainId, bool enabled, uint16 feeBp); + event SetDefaultFeeBp(uint16 feeBp); + event SetFeeOwner(address feeOwner); + + constructor(){ + feeOwner = owner(); + } + + function setDefaultFeeBp(uint16 _feeBp) public virtual onlyOwner { + require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); + defaultFeeBp = _feeBp; + emit SetDefaultFeeBp(defaultFeeBp); + } + + function setFeeBp(uint16 _dstChainId, bool _enabled, uint16 _feeBp) public virtual onlyOwner { + require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); + chainIdToFeeBps[_dstChainId] = FeeConfig(_feeBp, _enabled); + emit SetFeeBp(_dstChainId, _enabled, _feeBp); + } + + function setFeeOwner(address _feeOwner) public virtual onlyOwner { + require(_feeOwner != address(0x0), "Fee: feeOwner cannot be 0x"); + feeOwner = _feeOwner; + emit SetFeeOwner(_feeOwner); + } + + function quoteOFTFee(uint16 _dstChainId, uint _amount) public virtual view returns (uint fee) { + FeeConfig memory config = chainIdToFeeBps[_dstChainId]; + if (config.enabled) { + fee = _amount * config.feeBP / BP_DENOMINATOR; + } else if (defaultFeeBp > 0) { + fee = _amount * defaultFeeBp / BP_DENOMINATOR; + } else { + fee = 0; + } + } + + function _payOFTFee(address _from, uint16 _dstChainId, uint _amount) internal virtual returns (uint amount, uint fee) { + fee = quoteOFTFee(_dstChainId, _amount); + amount = _amount - fee; + if (fee > 0) { + _transferFrom(_from, feeOwner, fee); + } + } + + function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint); +} diff --git a/contracts/token/oft/v2/fee/IOFTWithFee.sol b/contracts/token/oft/v2/fee/IOFTWithFee.sol new file mode 100644 index 00000000..07dcd62d --- /dev/null +++ b/contracts/token/oft/v2/fee/IOFTWithFee.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "../interfaces/ICommonOFT.sol"; + +/** + * @dev Interface of the IOFT core standard + */ +interface IOFTWithFee is ICommonOFT { + + /** + * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` + * `_from` the owner of token + * `_dstChainId` the destination chain identifier + * `_toAddress` can be any size depending on the `dstChainId`. + * `_amount` the quantity of tokens in wei + * `_minAmount` the minimum amount of tokens to receive on dstChain + * `_refundAddress` the address LayerZero refunds if too much message fee is sent + * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) + * `_adapterParams` is a flexible bytes array to indicate messaging adapter services + */ + function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) external payable; + + function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable; +} diff --git a/contracts/token/oft/v2/fee/NativeOFTWithFee.sol b/contracts/token/oft/v2/fee/NativeOFTWithFee.sol new file mode 100644 index 00000000..a0970075 --- /dev/null +++ b/contracts/token/oft/v2/fee/NativeOFTWithFee.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "./OFTWithFee.sol"; + +contract NativeOFTWithFee is OFTWithFee, ReentrancyGuard { + uint public outboundAmount; + + event Deposit(address indexed _dst, uint _amount); + event Withdrawal(address indexed _src, uint _amount); + + constructor(string memory _name, string memory _symbol, uint8 _sharedDecimals, address _lzEndpoint) OFTWithFee(_name, _symbol, _sharedDecimals, _lzEndpoint) {} + + function deposit() public payable { + _mint(msg.sender, msg.value); + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint _amount) external nonReentrant { + require(balanceOf(msg.sender) >= _amount, "NativeOFTWithFee: Insufficient balance."); + _burn(msg.sender, _amount); + (bool success, ) = msg.sender.call{value: _amount}(""); + require(success, "NativeOFTWithFee: failed to unwrap"); + emit Withdrawal(msg.sender, _amount); + } + + /************************************************************************ + * public functions + ************************************************************************/ + function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) public payable virtual override { + _amount = _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + require(_amount >= _minAmount, "NativeOFTWithFee: amount is less than minAmount"); + } + + function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) public payable virtual override { + _amount = _sendAndCall(_from, _dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); + require(_amount >= _minAmount, "NativeOFTWithFee: amount is less than minAmount"); + } + + function _send(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual override returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); + + uint messageFee; + (messageFee, amount) = _debitFromNative(_from, _amount, _dstChainId); + + bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, messageFee); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual override returns (uint amount) { + _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); + + uint messageFee; + (messageFee, amount) = _debitFromNative(_from, _amount, _dstChainId); + + // encode the msg.sender into the payload instead of _from + bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); + _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, messageFee); + + emit SendToChain(_dstChainId, _from, _toAddress, amount); + } + + function _debitFromNative(address _from, uint _amount, uint16 _dstChainId) internal returns (uint messageFee, uint amount) { + uint fee = quoteOFTFee(_dstChainId, _amount); + uint newMsgValue = msg.value; + + if(fee > 0) { + // subtract fee from _amount + _amount -= fee; + + // pay fee and update newMsgValue + if(balanceOf(_from) >= fee) { + _transferFrom(_from, feeOwner, fee); + } else { + _mint(feeOwner, fee); + newMsgValue -= fee; + } + } + + (amount,) = _removeDust(_amount); + require(amount > 0, "NativeOFTWithFee: amount too small"); + outboundAmount += amount; + messageFee = msg.sender == _from ? _debitMsgSender(amount, newMsgValue) : _debitMsgFrom(_from, amount, newMsgValue); + } + + function _debitMsgSender(uint _amount, uint currentMsgValue) internal returns (uint messageFee) { + uint msgSenderBalance = balanceOf(msg.sender); + + if (msgSenderBalance < _amount) { + require(msgSenderBalance + currentMsgValue >= _amount, "NativeOFTWithFee: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgSenderBalance; + + _mint(address(msg.sender), mintAmount); + + // update the messageFee to take out mintAmount + messageFee = currentMsgValue - mintAmount; + } else { + messageFee = currentMsgValue; + } + + _transfer(msg.sender, address(this), _amount); + return messageFee; + } + + function _debitMsgFrom(address _from, uint _amount, uint currentMsgValue) internal returns (uint messageFee) { + uint msgFromBalance = balanceOf(_from); + + if (msgFromBalance < _amount) { + require(msgFromBalance + currentMsgValue >= _amount, "NativeOFTWithFee: Insufficient msg.value"); + + // user can cover difference with additional msg.value ie. wrapping + uint mintAmount = _amount - msgFromBalance; + _mint(address(msg.sender), mintAmount); + + // transfer the differential amount to the contract + _transfer(msg.sender, address(this), mintAmount); + + // overwrite the _amount to take the rest of the balance from the _from address + _amount = msgFromBalance; + + // update the messageFee to take out mintAmount + messageFee = currentMsgValue - mintAmount; + } else { + messageFee = currentMsgValue; + } + + _spendAllowance(_from, msg.sender, _amount); + _transfer(_from, address(this), _amount); + return messageFee; + } + + function _creditTo(uint16, address _toAddress, uint _amount) internal override returns(uint) { + outboundAmount -= _amount; + _burn(address(this), _amount); + (bool success, ) = _toAddress.call{value: _amount}(""); + require(success, "NativeOFTWithFee: failed to _creditTo"); + return _amount; + } + + receive() external payable { + deposit(); + } +} \ No newline at end of file diff --git a/contracts/token/oft/v2/fee/OFTWithFee.sol b/contracts/token/oft/v2/fee/OFTWithFee.sol new file mode 100644 index 00000000..370ce659 --- /dev/null +++ b/contracts/token/oft/v2/fee/OFTWithFee.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "./BaseOFTWithFee.sol"; + +contract OFTWithFee is BaseOFTWithFee, ERC20 { + + uint internal immutable ld2sdRate; + + constructor(string memory _name, string memory _symbol, uint8 _sharedDecimals, address _lzEndpoint) ERC20(_name, _symbol) BaseOFTWithFee(_sharedDecimals, _lzEndpoint) { + uint8 decimals = decimals(); + require(_sharedDecimals <= decimals, "OFTWithFee: sharedDecimals must be <= decimals"); + ld2sdRate = 10 ** (decimals - _sharedDecimals); + } + + /************************************************************************ + * public functions + ************************************************************************/ + function circulatingSupply() public view virtual override returns (uint) { + return totalSupply(); + } + + function token() public view virtual override returns (address) { + return address(this); + } + + /************************************************************************ + * internal functions + ************************************************************************/ + function _debitFrom(address _from, uint16, bytes32, uint _amount) internal virtual override returns (uint) { + address spender = _msgSender(); + if (_from != spender) _spendAllowance(_from, spender, _amount); + _burn(_from, _amount); + return _amount; + } + + function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns (uint) { + _mint(_toAddress, _amount); + return _amount; + } + + function _transferFrom(address _from, address _to, uint _amount) internal virtual override returns (uint) { + address spender = _msgSender(); + // if transfer from this contract, no need to check allowance + if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount); + _transfer(_from, _to, _amount); + return _amount; + } + + function _ld2sdRate() internal view virtual override returns (uint) { + return ld2sdRate; + } +} diff --git a/contracts/token/oft/v2/fee/ProxyOFTWithFee.sol b/contracts/token/oft/v2/fee/ProxyOFTWithFee.sol new file mode 100644 index 00000000..d3bad4a1 --- /dev/null +++ b/contracts/token/oft/v2/fee/ProxyOFTWithFee.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./BaseOFTWithFee.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract ProxyOFTWithFee is BaseOFTWithFee { + using SafeERC20 for IERC20; + + IERC20 internal immutable innerToken; + uint internal immutable ld2sdRate; + + // total amount is transferred from this chain to other chains, ensuring the total is less than uint64.max in sd + uint public outboundAmount; + + constructor(address _token, uint8 _sharedDecimals, address _lzEndpoint) BaseOFTWithFee(_sharedDecimals, _lzEndpoint) { + innerToken = IERC20(_token); + + (bool success, bytes memory data) = _token.staticcall( + abi.encodeWithSignature("decimals()") + ); + require(success, "ProxyOFTWithFee: failed to get token decimals"); + uint8 decimals = abi.decode(data, (uint8)); + + require(_sharedDecimals <= decimals, "ProxyOFTWithFee: sharedDecimals must be <= decimals"); + ld2sdRate = 10 ** (decimals - _sharedDecimals); + } + + /************************************************************************ + * public functions + ************************************************************************/ + function circulatingSupply() public view virtual override returns (uint) { + return innerToken.totalSupply() - outboundAmount; + } + + function token() public view virtual override returns (address) { + return address(innerToken); + } + + /************************************************************************ + * internal functions + ************************************************************************/ + function _debitFrom(address _from, uint16, bytes32, uint _amount) internal virtual override returns (uint) { + require(_from == _msgSender(), "ProxyOFTWithFee: owner is not send caller"); + + _amount = _transferFrom(_from, address(this), _amount); + + // _amount still may have dust if the token has transfer fee, then give the dust back to the sender + (uint amount, uint dust) = _removeDust(_amount); + if (dust > 0) innerToken.safeTransfer(_from, dust); + + // check total outbound amount + outboundAmount += amount; + uint cap = _sd2ld(type(uint64).max); + require(cap >= outboundAmount, "ProxyOFTWithFee: outboundAmount overflow"); + + return amount; + } + + function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns (uint) { + outboundAmount -= _amount; + + // tokens are already in this contract, so no need to transfer + if (_toAddress == address(this)) { + return _amount; + } + + return _transferFrom(address(this), _toAddress, _amount); + } + + function _transferFrom(address _from, address _to, uint _amount) internal virtual override returns (uint) { + uint before = innerToken.balanceOf(_to); + if (_from == address(this)) { + innerToken.safeTransfer(_to, _amount); + } else { + innerToken.safeTransferFrom(_from, _to, _amount); + } + return innerToken.balanceOf(_to) - before; + } + + function _ld2sdRate() internal view virtual override returns (uint) { + return ld2sdRate; + } +} diff --git a/contracts/token/oft/v2/interfaces/ICommonOFT.sol b/contracts/token/oft/v2/interfaces/ICommonOFT.sol new file mode 100644 index 00000000..f528bc56 --- /dev/null +++ b/contracts/token/oft/v2/interfaces/ICommonOFT.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +/** + * @dev Interface of the IOFT core standard + */ +interface ICommonOFT is IERC165 { + + struct LzCallParams { + address payable refundAddress; + address zroPaymentAddress; + bytes adapterParams; + } + + /** + * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) + * _dstChainId - L0 defined chain id to send tokens too + * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + * _amount - amount of the tokens to transfer + * _useZro - indicates to use zro to pay L0 fees + * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 + */ + function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); + + function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); + + /** + * @dev returns the circulating amount of tokens on current chain + */ + function circulatingSupply() external view returns (uint); + + /** + * @dev returns the address of the ERC20 token + */ + function token() external view returns (address); +} diff --git a/contracts/token/oft/v2/interfaces/IOFTReceiverV2.sol b/contracts/token/oft/v2/interfaces/IOFTReceiverV2.sol new file mode 100644 index 00000000..8f36e407 --- /dev/null +++ b/contracts/token/oft/v2/interfaces/IOFTReceiverV2.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.5.0; + +interface IOFTReceiverV2 { + /** + * @dev Called by the OFT contract when tokens are received from source chain. + * @param _srcChainId The chain id of the source chain. + * @param _srcAddress The address of the OFT token contract on the source chain. + * @param _nonce The nonce of the transaction on the source chain. + * @param _from The address of the account who calls the sendAndCall() on the source chain. + * @param _amount The amount of tokens to transfer. + * @param _payload Additional data with no specified format. + */ + function onOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external; +} diff --git a/contracts/token/oft/v2/interfaces/IOFTV2.sol b/contracts/token/oft/v2/interfaces/IOFTV2.sol new file mode 100644 index 00000000..927621c4 --- /dev/null +++ b/contracts/token/oft/v2/interfaces/IOFTV2.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "./ICommonOFT.sol"; + +/** + * @dev Interface of the IOFT core standard + */ +interface IOFTV2 is ICommonOFT { + + /** + * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` + * `_from` the owner of token + * `_dstChainId` the destination chain identifier + * `_toAddress` can be any size depending on the `dstChainId`. + * `_amount` the quantity of tokens in wei + * `_refundAddress` the address LayerZero refunds if too much message fee is sent + * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) + * `_adapterParams` is a flexible bytes array to indicate messaging adapter services + */ + function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams) external payable; + + function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable; +} diff --git a/contracts/token/oft/v2/mocks/OFTStakingMockV2.sol b/contracts/token/oft/v2/mocks/OFTStakingMockV2.sol new file mode 100644 index 00000000..1a44eb45 --- /dev/null +++ b/contracts/token/oft/v2/mocks/OFTStakingMockV2.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "../interfaces/IOFTV2.sol"; +import "../interfaces/IOFTReceiverV2.sol"; +import "../../../../libraries/BytesLib.sol"; + +// OFTStakingMock is an example to integrate with OFT. It shows how to send OFT cross chain with a custom payload and +// call a receiver contract on the destination chain when oft is received. +contract OFTStakingMockV2 is IOFTReceiverV2 { + using SafeERC20 for IERC20; + using BytesLib for bytes; + + uint64 public constant DST_GAS_FOR_CALL = 300000; // estimate gas usage of onOFTReceived() + + // packet type + uint8 public constant PT_DEPOSIT_TO_REMOTE_CHAIN = 1; + // ... other types + + // variables + IOFTV2 public oft; + mapping(uint16 => bytes32) public remoteStakingContracts; + mapping(address => uint) public balances; + bool public paused; // for testing try/catch + + event Deposit(address from, uint amount); + event Withdrawal(address to, uint amount); + event DepositToDstChain(address from, uint16 dstChainId, bytes to, uint amountOut); + + // _oft can be any composable OFT contract, e.g. ComposableOFT, ComposableBasedOFT and ComposableProxyOFT. + constructor(address _oft) { + oft = IOFTV2(_oft); + IERC20(oft.token()).safeApprove(_oft, type(uint).max); + } + + function setRemoteStakingContract(uint16 _chainId, bytes32 _stakingContract) external { + remoteStakingContracts[_chainId] = _stakingContract; + } + + function deposit(uint _amount) external payable { + IERC20(oft.token()).safeTransferFrom(msg.sender, address(this), _amount); + balances[msg.sender] += _amount; + emit Deposit(msg.sender, _amount); + } + + function withdraw(uint _amount) external { + withdrawTo(_amount, msg.sender); + } + + function withdrawTo(uint _amount, address _to) public { + require(balances[msg.sender] >= _amount); + balances[msg.sender] -= _amount; + IERC20(oft.token()).safeTransfer(_to, _amount); + emit Withdrawal(msg.sender, _amount); + } + + function depositToDstChain( + uint16 _dstChainId, + bytes calldata _to, // address of the owner of token on the destination chain + uint _amount, // amount of token to deposit + bytes calldata _adapterParams + ) external payable { + bytes32 dstStakingContract = remoteStakingContracts[_dstChainId]; + require(dstStakingContract != bytes32(0), "invalid _dstChainId"); + + // transfer token from sender to this contract + // if the oft is not the proxy oft, dont need to transfer token to this contract + // and call sendAndCall() with the msg.sender (_from) instead of address(this) + // here we use a common pattern to be compatible with all kinds of composable OFT + IERC20(oft.token()).safeTransferFrom(msg.sender, address(this), _amount); + + bytes memory payload = abi.encode(PT_DEPOSIT_TO_REMOTE_CHAIN, _to); + ICommonOFT.LzCallParams memory callParams = ICommonOFT.LzCallParams(payable(msg.sender), address(0), _adapterParams); + oft.sendAndCall{value: msg.value}(address(this), _dstChainId, dstStakingContract, _amount, payload, DST_GAS_FOR_CALL, callParams); + + emit DepositToDstChain(msg.sender, _dstChainId, _to, _amount); + } + + function quoteForDeposit( + uint16 _dstChainId, + bytes calldata _to, // address of the owner of token on the destination chain + uint _amount, // amount of token to deposit + bytes calldata _adapterParams + ) public view returns (uint nativeFee, uint zroFee) { + bytes32 dstStakingContract = remoteStakingContracts[_dstChainId]; + require(dstStakingContract != bytes32(0), "invalid _dstChainId"); + + bytes memory payload = abi.encode(PT_DEPOSIT_TO_REMOTE_CHAIN, _to); + return oft.estimateSendAndCallFee(_dstChainId, dstStakingContract, _amount, payload, DST_GAS_FOR_CALL, false, _adapterParams); + } + + //----------------------------------------------------------------------------------------------------------------------- + function onOFTReceived(uint16 _srcChainId, bytes calldata, uint64, bytes32 _from, uint _amount, bytes memory _payload) external override { + require(!paused, "paused"); // for testing safe call + require(msg.sender == address(oft), "only oft can call onOFTReceived()"); + require(_from == remoteStakingContracts[_srcChainId], "invalid from"); + + uint8 pkType; + assembly { + pkType := mload(add(_payload, 32)) + } + + if (pkType == PT_DEPOSIT_TO_REMOTE_CHAIN) { + (, bytes memory toAddrBytes) = abi.decode(_payload, (uint8, bytes)); + + address to = toAddrBytes.toAddress(0); + balances[to] += _amount; + } else { + revert("invalid deposit type"); + } + } + + function setPaused(bool _paused) external { + paused = _paused; + } +} diff --git a/contracts/token/oft/v2/mocks/OFTV2Mock.sol b/contracts/token/oft/v2/mocks/OFTV2Mock.sol new file mode 100644 index 00000000..37cb3a58 --- /dev/null +++ b/contracts/token/oft/v2/mocks/OFTV2Mock.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../OFTV2.sol"; + +// @dev mock OFTV2 demonstrating how to inherit OFTV2 +contract OFTV2Mock is OFTV2 { + constructor(address _layerZeroEndpoint, uint _initialSupply, uint8 _sharedDecimals) OFTV2("ExampleOFT", "OFT", _sharedDecimals, _layerZeroEndpoint) { + _mint(_msgSender(), _initialSupply); + } +} diff --git a/contracts/token/onft1155/ONFT1155.sol b/contracts/token/onft1155/ONFT1155.sol new file mode 100644 index 00000000..89c6ae39 --- /dev/null +++ b/contracts/token/onft1155/ONFT1155.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./interfaces/IONFT1155.sol"; +import "./ONFT1155Core.sol"; +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; + +// NOTE: this ONFT contract has no public minting logic. +// must implement your own minting logic in child classes +contract ONFT1155 is ONFT1155Core, ERC1155, IONFT1155 { + constructor(string memory _uri, address _lzEndpoint) ERC1155(_uri) ONFT1155Core(_lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT1155Core, ERC1155, IERC165) returns (bool) { + return interfaceId == type(IONFT1155).interfaceId || super.supportsInterface(interfaceId); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual override { + address spender = _msgSender(); + require(spender == _from || isApprovedForAll(_from, spender), "ONFT1155: send caller is not owner nor approved"); + _burnBatch(_from, _tokenIds, _amounts); + } + + function _creditTo( + uint16, + address _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual override { + _mintBatch(_toAddress, _tokenIds, _amounts, ""); + } +} diff --git a/contracts/token/onft1155/ONFT1155Core.sol b/contracts/token/onft1155/ONFT1155Core.sol new file mode 100644 index 00000000..e59d0961 --- /dev/null +++ b/contracts/token/onft1155/ONFT1155Core.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./interfaces/IONFT1155Core.sol"; +import "../../lzApp/NonblockingLzApp.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; + +abstract contract ONFT1155Core is NonblockingLzApp, ERC165, IONFT1155Core { + uint public constant NO_EXTRA_GAS = 0; + uint16 public constant FUNCTION_TYPE_SEND = 1; + uint16 public constant FUNCTION_TYPE_SEND_BATCH = 2; + bool public useCustomAdapterParams; + + event SetUseCustomAdapterParams(bool _useCustomAdapterParams); + + constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IONFT1155Core).interfaceId || super.supportsInterface(interfaceId); + } + + function estimateSendFee( + uint16 _dstChainId, + bytes memory _toAddress, + uint _tokenId, + uint _amount, + bool _useZro, + bytes memory _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + return estimateSendBatchFee(_dstChainId, _toAddress, _toSingletonArray(_tokenId), _toSingletonArray(_amount), _useZro, _adapterParams); + } + + function estimateSendBatchFee( + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts, + bool _useZro, + bytes memory _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + bytes memory payload = abi.encode(_toAddress, _tokenIds, _amounts); + return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); + } + + function sendFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _tokenId, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) public payable virtual override { + _sendBatch( + _from, + _dstChainId, + _toAddress, + _toSingletonArray(_tokenId), + _toSingletonArray(_amount), + _refundAddress, + _zroPaymentAddress, + _adapterParams + ); + } + + function sendBatchFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) public payable virtual override { + _sendBatch(_from, _dstChainId, _toAddress, _tokenIds, _amounts, _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function _sendBatch( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual { + _debitFrom(_from, _dstChainId, _toAddress, _tokenIds, _amounts); + bytes memory payload = abi.encode(_toAddress, _tokenIds, _amounts); + if (_tokenIds.length == 1) { + if (useCustomAdapterParams) { + _checkGasLimit(_dstChainId, FUNCTION_TYPE_SEND, _adapterParams, NO_EXTRA_GAS); + } else { + require(_adapterParams.length == 0, "LzApp: _adapterParams must be empty."); + } + _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + emit SendToChain(_dstChainId, _from, _toAddress, _tokenIds[0], _amounts[0]); + } else if (_tokenIds.length > 1) { + if (useCustomAdapterParams) { + _checkGasLimit(_dstChainId, FUNCTION_TYPE_SEND_BATCH, _adapterParams, NO_EXTRA_GAS); + } else { + require(_adapterParams.length == 0, "LzApp: _adapterParams must be empty."); + } + _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + emit SendBatchToChain(_dstChainId, _from, _toAddress, _tokenIds, _amounts); + } + } + + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64, /*_nonce*/ + bytes memory _payload + ) internal virtual override { + // decode and load the toAddress + (bytes memory toAddressBytes, uint[] memory tokenIds, uint[] memory amounts) = abi.decode(_payload, (bytes, uint[], uint[])); + address toAddress; + assembly { + toAddress := mload(add(toAddressBytes, 20)) + } + + _creditTo(_srcChainId, toAddress, tokenIds, amounts); + + if (tokenIds.length == 1) { + emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenIds[0], amounts[0]); + } else if (tokenIds.length > 1) { + emit ReceiveBatchFromChain(_srcChainId, _srcAddress, toAddress, tokenIds, amounts); + } + } + + function setUseCustomAdapterParams(bool _useCustomAdapterParams) external onlyOwner { + useCustomAdapterParams = _useCustomAdapterParams; + emit SetUseCustomAdapterParams(_useCustomAdapterParams); + } + + function _debitFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual; + + function _creditTo( + uint16 _srcChainId, + address _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual; + + function _toSingletonArray(uint element) internal pure returns (uint[] memory) { + uint[] memory array = new uint[](1); + array[0] = element; + return array; + } +} diff --git a/contracts/token/onft1155/ProxyONFT1155.sol b/contracts/token/onft1155/ProxyONFT1155.sol new file mode 100644 index 00000000..1116471f --- /dev/null +++ b/contracts/token/onft1155/ProxyONFT1155.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./ONFT1155Core.sol"; +import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; +import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; + +contract ProxyONFT1155 is ONFT1155Core, IERC1155Receiver { + using ERC165Checker for address; + + IERC1155 public immutable token; + + constructor(address _lzEndpoint, address _proxyToken) ONFT1155Core(_lzEndpoint) { + require(_proxyToken.supportsInterface(type(IERC1155).interfaceId), "ProxyONFT1155: invalid ERC1155 token"); + token = IERC1155(_proxyToken); + } + + function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT1155Core, IERC165) returns (bool) { + return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual override { + require(_from == _msgSender(), "ProxyONFT1155: owner is not send caller"); + token.safeBatchTransferFrom(_from, address(this), _tokenIds, _amounts, ""); + } + + function _creditTo( + uint16, + address _toAddress, + uint[] memory _tokenIds, + uint[] memory _amounts + ) internal virtual override { + token.safeBatchTransferFrom(address(this), _toAddress, _tokenIds, _amounts, ""); + } + + function onERC1155Received( + address _operator, + address, + uint, + uint, + bytes memory + ) public virtual override returns (bytes4) { + // only allow `this` to tranfser token from others + if (_operator != address(this)) return bytes4(0); + return this.onERC1155Received.selector; + } + + function onERC1155BatchReceived( + address _operator, + address, + uint[] memory, + uint[] memory, + bytes memory + ) public virtual override returns (bytes4) { + // only allow `this` to tranfser token from others + if (_operator != address(this)) return bytes4(0); + return this.onERC1155BatchReceived.selector; + } +} diff --git a/contracts/token/onft1155/interfaces/IONFT1155.sol b/contracts/token/onft1155/interfaces/IONFT1155.sol new file mode 100644 index 00000000..515b03c6 --- /dev/null +++ b/contracts/token/onft1155/interfaces/IONFT1155.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "./IONFT1155Core.sol"; +import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; + +/** + * @dev Interface of the ONFT standard + */ +interface IONFT1155 is IONFT1155Core, IERC1155 { + +} diff --git a/contracts/token/onft1155/interfaces/IONFT1155Core.sol b/contracts/token/onft1155/interfaces/IONFT1155Core.sol new file mode 100644 index 00000000..33649238 --- /dev/null +++ b/contracts/token/onft1155/interfaces/IONFT1155Core.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +/** + * @dev Interface of the ONFT Core standard + */ +interface IONFT1155Core is IERC165 { + event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes indexed _toAddress, uint _tokenId, uint _amount); + event SendBatchToChain(uint16 indexed _dstChainId, address indexed _from, bytes indexed _toAddress, uint[] _tokenIds, uint[] _amounts); + event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint _tokenId, uint _amount); + event ReceiveBatchFromChain( + uint16 indexed _srcChainId, + bytes indexed _srcAddress, + address indexed _toAddress, + uint[] _tokenIds, + uint[] _amounts + ); + + // _from - address where tokens should be deducted from on behalf of + // _dstChainId - L0 defined chain id to send tokens too + // _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + // _tokenId - token Id to transfer + // _amount - amount of the tokens to transfer + // _refundAddress - address on src that will receive refund for any overpayment of L0 fees + // _zroPaymentAddress - if paying in zro, pass the address to use. using 0x0 indicates not paying fees in zro + // _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + function sendFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint _tokenId, + uint _amount, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) external payable; + + // _from - address where tokens should be deducted from on behalf of + // _dstChainId - L0 defined chain id to send tokens too + // _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + // _tokenIds - token Ids to transfer + // _amounts - amounts of the tokens to transfer + // _refundAddress - address on src that will receive refund for any overpayment of L0 fees + // _zroPaymentAddress - if paying in zro, pass the address to use. using 0x0 indicates not paying fees in zro + // _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + function sendBatchFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint[] calldata _tokenIds, + uint[] calldata _amounts, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) external payable; + + // _dstChainId - L0 defined chain id to send tokens too + // _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + // _tokenId - token Id to transfer + // _amount - amount of the tokens to transfer + // _useZro - indicates to use zro to pay L0 fees + // _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + function estimateSendFee( + uint16 _dstChainId, + bytes calldata _toAddress, + uint _tokenId, + uint _amount, + bool _useZro, + bytes calldata _adapterParams + ) external view returns (uint nativeFee, uint zroFee); + + // _dstChainId - L0 defined chain id to send tokens too + // _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + // _tokenIds - tokens Id to transfer + // _amounts - amounts of the tokens to transfer + // _useZro - indicates to use zro to pay L0 fees + // _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + function estimateSendBatchFee( + uint16 _dstChainId, + bytes calldata _toAddress, + uint[] calldata _tokenIds, + uint[] calldata _amounts, + bool _useZro, + bytes calldata _adapterParams + ) external view returns (uint nativeFee, uint zroFee); +} diff --git a/contracts/token/onft1155/mocks/ERC1155Mock.sol b/contracts/token/onft1155/mocks/ERC1155Mock.sol new file mode 100644 index 00000000..5a2f6a89 --- /dev/null +++ b/contracts/token/onft1155/mocks/ERC1155Mock.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; + +// for mock purposes only, no limit on minting functionality +contract ERC1155Mock is ERC1155 { + constructor(string memory uri_) ERC1155(uri_) {} + + function mint( + address _to, + uint _tokenId, + uint _amount + ) public { + _mint(_to, _tokenId, _amount, ""); + } + + function mintBatch( + address _to, + uint[] memory _tokenIds, + uint[] memory _amounts + ) public { + _mintBatch(_to, _tokenIds, _amounts, ""); + } + + function transfer( + address _to, + uint _tokenId, + uint _amount + ) public { + _safeTransferFrom(msg.sender, _to, _tokenId, _amount, ""); + } +} diff --git a/contracts/token/onft721/ONFT721.sol b/contracts/token/onft721/ONFT721.sol new file mode 100644 index 00000000..d4900cd2 --- /dev/null +++ b/contracts/token/onft721/ONFT721.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./interfaces/IONFT721.sol"; +import "./ONFT721Core.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +// NOTE: this ONFT contract has no public minting logic. +// must implement your own minting logic in child classes +contract ONFT721 is ONFT721Core, ERC721, IONFT721 { + constructor( + string memory _name, + string memory _symbol, + uint _minGasToTransfer, + address _lzEndpoint + ) ERC721(_name, _symbol) ONFT721Core(_minGasToTransfer, _lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT721Core, ERC721, IERC165) returns (bool) { + return interfaceId == type(IONFT721).interfaceId || super.supportsInterface(interfaceId); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint _tokenId + ) internal virtual override { + require(_isApprovedOrOwner(_msgSender(), _tokenId), "ONFT721: send caller is not owner nor approved"); + require(ERC721.ownerOf(_tokenId) == _from, "ONFT721: send from incorrect owner"); + _transfer(_from, address(this), _tokenId); + } + + function _creditTo( + uint16, + address _toAddress, + uint _tokenId + ) internal virtual override { + require(!_exists(_tokenId) || (_exists(_tokenId) && ERC721.ownerOf(_tokenId) == address(this))); + if (!_exists(_tokenId)) { + _safeMint(_toAddress, _tokenId); + } else { + _transfer(address(this), _toAddress, _tokenId); + } + } +} diff --git a/contracts/token/onft721/ONFT721A.sol b/contracts/token/onft721/ONFT721A.sol new file mode 100644 index 00000000..3f80b383 --- /dev/null +++ b/contracts/token/onft721/ONFT721A.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; +import "erc721a/contracts/ERC721A.sol"; +import "erc721a/contracts/IERC721A.sol"; +import "./interfaces/IONFT721.sol"; +import "./ONFT721Core.sol"; + +// DISCLAIMER: +// This contract can only be deployed on one chain and must be the first minter of each token id! +// This is because ERC721A does not have the ability to mint a specific token id. +// Other chains must have ONFT721 deployed. + +// NOTE: this ONFT contract has no public minting logic. +// must implement your own minting logic in child contract +contract ONFT721A is ONFT721Core, ERC721A, ERC721A__IERC721Receiver { + constructor( + string memory _name, + string memory _symbol, + uint _minGasToTransferAndStore, + address _lzEndpoint + ) ERC721A(_name, _symbol) ONFT721Core(_minGasToTransferAndStore, _lzEndpoint) {} + + function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT721Core, ERC721A) returns (bool) { + return interfaceId == type(IONFT721Core).interfaceId || super.supportsInterface(interfaceId); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint _tokenId + ) internal virtual override(ONFT721Core) { + safeTransferFrom(_from, address(this), _tokenId); + } + + function _creditTo( + uint16, + address _toAddress, + uint _tokenId + ) internal virtual override(ONFT721Core) { + require(_exists(_tokenId) && ERC721A.ownerOf(_tokenId) == address(this)); + safeTransferFrom(address(this), _toAddress, _tokenId); + } + + function onERC721Received( + address, + address, + uint, + bytes memory + ) public virtual override returns (bytes4) { + return ERC721A__IERC721Receiver.onERC721Received.selector; + } +} diff --git a/contracts/token/onft721/ONFT721Core.sol b/contracts/token/onft721/ONFT721Core.sol new file mode 100644 index 00000000..8698dfb8 --- /dev/null +++ b/contracts/token/onft721/ONFT721Core.sol @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./interfaces/IONFT721Core.sol"; +import "../../lzApp/NonblockingLzApp.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; + +abstract contract ONFT721Core is NonblockingLzApp, ERC165, ReentrancyGuard, IONFT721Core { + uint16 public constant FUNCTION_TYPE_SEND = 1; + + struct StoredCredit { + uint16 srcChainId; + address toAddress; + uint index; // which index of the tokenIds remain + bool creditsRemain; + } + + uint public minGasToTransferAndStore; // min amount of gas required to transfer, and also store the payload + mapping(uint16 => uint) public dstChainIdToBatchLimit; + mapping(uint16 => uint) public dstChainIdToTransferGas; // per transfer amount of gas required to mint/transfer on the dst + mapping(bytes32 => StoredCredit) public storedCredits; + + constructor(uint _minGasToTransferAndStore, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) { + require(_minGasToTransferAndStore > 0, "minGasToTransferAndStore must be > 0"); + minGasToTransferAndStore = _minGasToTransferAndStore; + } + + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return interfaceId == type(IONFT721Core).interfaceId || super.supportsInterface(interfaceId); + } + + function estimateSendFee( + uint16 _dstChainId, + bytes memory _toAddress, + uint _tokenId, + bool _useZro, + bytes memory _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + return estimateSendBatchFee(_dstChainId, _toAddress, _toSingletonArray(_tokenId), _useZro, _adapterParams); + } + + function estimateSendBatchFee( + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + bool _useZro, + bytes memory _adapterParams + ) public view virtual override returns (uint nativeFee, uint zroFee) { + bytes memory payload = abi.encode(_toAddress, _tokenIds); + return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); + } + + function sendFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _tokenId, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) public payable virtual override { + _send(_from, _dstChainId, _toAddress, _toSingletonArray(_tokenId), _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function sendBatchFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) public payable virtual override { + _send(_from, _dstChainId, _toAddress, _tokenIds, _refundAddress, _zroPaymentAddress, _adapterParams); + } + + function _send( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint[] memory _tokenIds, + address payable _refundAddress, + address _zroPaymentAddress, + bytes memory _adapterParams + ) internal virtual { + // allow 1 by default + require(_tokenIds.length > 0, "tokenIds[] is empty"); + require(_tokenIds.length == 1 || _tokenIds.length <= dstChainIdToBatchLimit[_dstChainId], "batch size exceeds dst batch limit"); + + for (uint i = 0; i < _tokenIds.length; i++) { + _debitFrom(_from, _dstChainId, _toAddress, _tokenIds[i]); + } + + bytes memory payload = abi.encode(_toAddress, _tokenIds); + + _checkGasLimit(_dstChainId, FUNCTION_TYPE_SEND, _adapterParams, dstChainIdToTransferGas[_dstChainId] * _tokenIds.length); + _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); + emit SendToChain(_dstChainId, _from, _toAddress, _tokenIds); + } + + function _nonblockingLzReceive( + uint16 _srcChainId, + bytes memory _srcAddress, + uint64, /*_nonce*/ + bytes memory _payload + ) internal virtual override { + // decode and load the toAddress + (bytes memory toAddressBytes, uint[] memory tokenIds) = abi.decode(_payload, (bytes, uint[])); + + address toAddress; + assembly { + toAddress := mload(add(toAddressBytes, 20)) + } + + uint nextIndex = _creditTill(_srcChainId, toAddress, 0, tokenIds); + if (nextIndex < tokenIds.length) { + // not enough gas to complete transfers, store to be cleared in another tx + bytes32 hashedPayload = keccak256(_payload); + storedCredits[hashedPayload] = StoredCredit(_srcChainId, toAddress, nextIndex, true); + emit CreditStored(hashedPayload, _payload); + } + + emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenIds); + } + + // Public function for anyone to clear and deliver the remaining batch sent tokenIds + function clearCredits(bytes memory _payload) external virtual nonReentrant { + bytes32 hashedPayload = keccak256(_payload); + require(storedCredits[hashedPayload].creditsRemain, "no credits stored"); + + (, uint[] memory tokenIds) = abi.decode(_payload, (bytes, uint[])); + + uint nextIndex = _creditTill( + storedCredits[hashedPayload].srcChainId, + storedCredits[hashedPayload].toAddress, + storedCredits[hashedPayload].index, + tokenIds + ); + require(nextIndex > storedCredits[hashedPayload].index, "not enough gas to process credit transfer"); + + if (nextIndex == tokenIds.length) { + // cleared the credits, delete the element + delete storedCredits[hashedPayload]; + emit CreditCleared(hashedPayload); + } else { + // store the next index to mint + storedCredits[hashedPayload] = StoredCredit( + storedCredits[hashedPayload].srcChainId, + storedCredits[hashedPayload].toAddress, + nextIndex, + true + ); + } + } + + // When a srcChain has the ability to transfer more chainIds in a single tx than the dst can do. + // Needs the ability to iterate and stop if the minGasToTransferAndStore is not met + function _creditTill( + uint16 _srcChainId, + address _toAddress, + uint _startIndex, + uint[] memory _tokenIds + ) internal returns (uint) { + uint i = _startIndex; + while (i < _tokenIds.length) { + // if not enough gas to process, store this index for next loop + if (gasleft() < minGasToTransferAndStore) break; + + _creditTo(_srcChainId, _toAddress, _tokenIds[i]); + i++; + } + + // indicates the next index to send of tokenIds, + // if i == tokenIds.length, we are finished + return i; + } + + function setMinGasToTransferAndStore(uint _minGasToTransferAndStore) external onlyOwner { + require(_minGasToTransferAndStore > 0, "minGasToTransferAndStore must be > 0"); + minGasToTransferAndStore = _minGasToTransferAndStore; + emit SetMinGasToTransferAndStore(_minGasToTransferAndStore); + } + + // ensures enough gas in adapter params to handle batch transfer gas amounts on the dst + function setDstChainIdToTransferGas(uint16 _dstChainId, uint _dstChainIdToTransferGas) external onlyOwner { + require(_dstChainIdToTransferGas > 0, "dstChainIdToTransferGas must be > 0"); + dstChainIdToTransferGas[_dstChainId] = _dstChainIdToTransferGas; + emit SetDstChainIdToTransferGas(_dstChainId, _dstChainIdToTransferGas); + } + + // limit on src the amount of tokens to batch send + function setDstChainIdToBatchLimit(uint16 _dstChainId, uint _dstChainIdToBatchLimit) external onlyOwner { + require(_dstChainIdToBatchLimit > 0, "dstChainIdToBatchLimit must be > 0"); + dstChainIdToBatchLimit[_dstChainId] = _dstChainIdToBatchLimit; + emit SetDstChainIdToBatchLimit(_dstChainId, _dstChainIdToBatchLimit); + } + + function _debitFrom( + address _from, + uint16 _dstChainId, + bytes memory _toAddress, + uint _tokenId + ) internal virtual; + + function _creditTo( + uint16 _srcChainId, + address _toAddress, + uint _tokenId + ) internal virtual; + + function _toSingletonArray(uint element) internal pure returns (uint[] memory) { + uint[] memory array = new uint[](1); + array[0] = element; + return array; + } +} diff --git a/contracts/token/onft721/ProxyONFT721.sol b/contracts/token/onft721/ProxyONFT721.sol new file mode 100644 index 00000000..f63dc6ca --- /dev/null +++ b/contracts/token/onft721/ProxyONFT721.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import "./ONFT721Core.sol"; + +contract ProxyONFT721 is ONFT721Core, IERC721Receiver { + using ERC165Checker for address; + + IERC721 public immutable token; + + constructor( + uint _minGasToTransfer, + address _lzEndpoint, + address _proxyToken + ) ONFT721Core(_minGasToTransfer, _lzEndpoint) { + require(_proxyToken.supportsInterface(type(IERC721).interfaceId), "ProxyONFT721: invalid ERC721 token"); + token = IERC721(_proxyToken); + } + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IERC721Receiver).interfaceId || super.supportsInterface(interfaceId); + } + + function _debitFrom( + address _from, + uint16, + bytes memory, + uint _tokenId + ) internal virtual override { + require(_from == _msgSender(), "ProxyONFT721: owner is not send caller"); + token.safeTransferFrom(_from, address(this), _tokenId); + } + + // TODO apply same changes from regular ONFT721 + function _creditTo( + uint16, + address _toAddress, + uint _tokenId + ) internal virtual override { + token.safeTransferFrom(address(this), _toAddress, _tokenId); + } + + function onERC721Received( + address _operator, + address, + uint, + bytes memory + ) public virtual override returns (bytes4) { + // only allow `this` to transfer token from others + if (_operator != address(this)) return bytes4(0); + return IERC721Receiver.onERC721Received.selector; + } +} diff --git a/contracts/token/onft721/interfaces/IONFT721.sol b/contracts/token/onft721/interfaces/IONFT721.sol new file mode 100644 index 00000000..d1b9c192 --- /dev/null +++ b/contracts/token/onft721/interfaces/IONFT721.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "./IONFT721Core.sol"; +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; + +/** + * @dev Interface of the ONFT standard + */ +interface IONFT721 is IONFT721Core, IERC721 { + +} diff --git a/contracts/token/onft721/interfaces/IONFT721Core.sol b/contracts/token/onft721/interfaces/IONFT721Core.sol new file mode 100644 index 00000000..758809d9 --- /dev/null +++ b/contracts/token/onft721/interfaces/IONFT721Core.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +/** + * @dev Interface of the ONFT Core standard + */ +interface IONFT721Core is IERC165 { + /** + * @dev Emitted when `_tokenIds[]` are moved from the `_sender` to (`_dstChainId`, `_toAddress`) + * `_nonce` is the outbound nonce from + */ + event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes indexed _toAddress, uint[] _tokenIds); + event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint[] _tokenIds); + event SetMinGasToTransferAndStore(uint _minGasToTransferAndStore); + event SetDstChainIdToTransferGas(uint16 _dstChainId, uint _dstChainIdToTransferGas); + event SetDstChainIdToBatchLimit(uint16 _dstChainId, uint _dstChainIdToBatchLimit); + + /** + * @dev Emitted when `_payload` was received from lz, but not enough gas to deliver all tokenIds + */ + event CreditStored(bytes32 _hashedPayload, bytes _payload); + /** + * @dev Emitted when `_hashedPayload` has been completely delivered + */ + event CreditCleared(bytes32 _hashedPayload); + + /** + * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from` + * `_toAddress` can be any size depending on the `dstChainId`. + * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) + * `_adapterParams` is a flexible bytes array to indicate messaging adapter services + */ + function sendFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint _tokenId, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) external payable; + + /** + * @dev send tokens `_tokenIds[]` to (`_dstChainId`, `_toAddress`) from `_from` + * `_toAddress` can be any size depending on the `dstChainId`. + * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) + * `_adapterParams` is a flexible bytes array to indicate messaging adapter services + */ + function sendBatchFrom( + address _from, + uint16 _dstChainId, + bytes calldata _toAddress, + uint[] calldata _tokenIds, + address payable _refundAddress, + address _zroPaymentAddress, + bytes calldata _adapterParams + ) external payable; + + /** + * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) + * _dstChainId - L0 defined chain id to send tokens too + * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + * _tokenId - token Id to transfer + * _useZro - indicates to use zro to pay L0 fees + * _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + */ + function estimateSendFee( + uint16 _dstChainId, + bytes calldata _toAddress, + uint _tokenId, + bool _useZro, + bytes calldata _adapterParams + ) external view returns (uint nativeFee, uint zroFee); + + /** + * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) + * _dstChainId - L0 defined chain id to send tokens too + * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain + * _tokenIds[] - token Ids to transfer + * _useZro - indicates to use zro to pay L0 fees + * _adapterParams - flexible bytes array to indicate messaging adapter services in L0 + */ + function estimateSendBatchFee( + uint16 _dstChainId, + bytes calldata _toAddress, + uint[] calldata _tokenIds, + bool _useZro, + bytes calldata _adapterParams + ) external view returns (uint nativeFee, uint zroFee); +} diff --git a/contracts/token/onft721/mocks/ERC721Mock.sol b/contracts/token/onft721/mocks/ERC721Mock.sol new file mode 100644 index 00000000..08cee665 --- /dev/null +++ b/contracts/token/onft721/mocks/ERC721Mock.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +// for mock purposes only, no limit on minting functionality +contract ERC721Mock is ERC721 { + constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {} + + string public baseTokenURI; + + function mint(address to, uint tokenId) public { + _safeMint(to, tokenId, ""); + } + + function transfer(address to, uint tokenId) public { + _safeTransfer(msg.sender, to, tokenId, ""); + } + + function isApprovedOrOwner(address spender, uint tokenId) public view virtual returns (bool) { + return _isApprovedOrOwner(spender, tokenId); + } +} diff --git a/contracts/token/onft721/mocks/ONFT721AMock.sol b/contracts/token/onft721/mocks/ONFT721AMock.sol new file mode 100644 index 00000000..9e10339c --- /dev/null +++ b/contracts/token/onft721/mocks/ONFT721AMock.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "../ONFT721A.sol"; + +// DISCLAIMER: This contract can only be deployed on one chain when deployed and calling +// setTrustedRemotes with remote contracts. This is due to the sequential way 721A mints tokenIds. +// This contract must be the first minter of each token id +contract ONFT721AMock is ONFT721A { + constructor( + string memory _name, + string memory _symbol, + uint _minGasToTransferAndStore, + address _layerZeroEndpoint + ) ONFT721A(_name, _symbol, _minGasToTransferAndStore, _layerZeroEndpoint) {} + + function mint(uint _amount) external payable { + _safeMint(msg.sender, _amount, ""); + } +} diff --git a/contracts/token/onft721/mocks/ONFT721Mock.sol b/contracts/token/onft721/mocks/ONFT721Mock.sol new file mode 100644 index 00000000..3e02675a --- /dev/null +++ b/contracts/token/onft721/mocks/ONFT721Mock.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../ONFT721.sol"; + +contract ONFT721Mock is ONFT721 { + constructor( + string memory _name, + string memory _symbol, + uint _minGasToStore, + address _layerZeroEndpoint + ) ONFT721(_name, _symbol, _minGasToStore, _layerZeroEndpoint) {} + + function mint(address _tokenOwner, uint _newId) external payable { + _safeMint(_tokenOwner, _newId); + } + + function rawOwnerOf(uint tokenId) public view returns (address) { + if (_exists(tokenId)) { + return ownerOf(tokenId); + } + return address(0); + } +} diff --git a/deploy/ERC1155.js b/deploy/ERC1155.js new file mode 100644 index 00000000..5d8f792b --- /dev/null +++ b/deploy/ERC1155.js @@ -0,0 +1,19 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + await deploy("ERC1155Mock", { + from: deployer, + args: ["test,com"], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ERC1155Mock"] diff --git a/deploy/OmniChainToken.js b/deploy/ExampleOFT.js similarity index 50% rename from deploy/OmniChainToken.js rename to deploy/ExampleOFT.js index 684c21a1..455e67d0 100644 --- a/deploy/OmniChainToken.js +++ b/deploy/ExampleOFT.js @@ -1,20 +1,21 @@ -const LZ_ENDPOINTS = require('../constants/layerzeroEndpoints.json') +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") module.exports = async function ({ deployments, getNamedAccounts }) { const { deploy } = deployments const { deployer } = await getNamedAccounts() - console.log(`>>> your address: ${deployer}` ) + + console.log(`>>> your address: ${deployer}`) // get the Endpoint address const endpointAddr = LZ_ENDPOINTS[hre.network.name] - console.log(`[${hre.network.name}] Endpoint address: ${endpointAddr}`) + console.log(`[${hre.network.name}] LayerZero Endpoint address: ${endpointAddr}`) - await deploy("OmniChainToken", { + await deploy("OFTMock", { from: deployer, - args: ["OmniChainToken", "OCT", endpointAddr], + args: [endpointAddr], log: true, waitConfirmations: 1, }) } -module.exports.tags = ["OmniChainToken"] +module.exports.tags = ["ExampleOFT"] diff --git a/deploy/ExampleOFTV2.js b/deploy/ExampleOFTV2.js new file mode 100644 index 00000000..c6ab4574 --- /dev/null +++ b/deploy/ExampleOFTV2.js @@ -0,0 +1,22 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") +const { ethers } = require("hardhat") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + const globalSupply = ethers.utils.parseUnits("1000000", 18) + const sharedDecimals = 6 + + await deploy("OFTV2Mock", { + from: deployer, + args: [lzEndpointAddress, globalSupply, sharedDecimals], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ExampleOFTV2"] diff --git a/deploy/OFT.js b/deploy/OFT.js new file mode 100644 index 00000000..0711a00c --- /dev/null +++ b/deploy/OFT.js @@ -0,0 +1,19 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + await deploy("OFT", { + from: deployer, + args: ["Name", "Symbol", lzEndpointAddress, 0], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["OFT"] diff --git a/deploy/ONFT1155.js b/deploy/ONFT1155.js new file mode 100644 index 00000000..cdf10f2e --- /dev/null +++ b/deploy/ONFT1155.js @@ -0,0 +1,19 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + await deploy("ONFT1155", { + from: deployer, + args: ["ipfs:/", lzEndpointAddress], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ONFT1155"] diff --git a/deploy/ONFT721.js b/deploy/ONFT721.js new file mode 100644 index 00000000..ec20f51b --- /dev/null +++ b/deploy/ONFT721.js @@ -0,0 +1,23 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + const name = "ONFT721Mock" + const symbol = "SYM" + const minGasToStore = 100000 + + await deploy("ONFT721Mock", { + from: deployer, + args: [name, symbol, minGasToStore, lzEndpointAddress], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ONFT721"] diff --git a/deploy/OmniCounter.js b/deploy/OmniCounter.js index d9c16050..b80813b6 100644 --- a/deploy/OmniCounter.js +++ b/deploy/OmniCounter.js @@ -1,9 +1,9 @@ -const LZ_ENDPOINTS = require('../constants/layerzeroEndpoints.json') +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") module.exports = async function ({ deployments, getNamedAccounts }) { const { deploy } = deployments const { deployer } = await getNamedAccounts() - console.log(`>>> your address: ${deployer}` ) + console.log(`>>> your address: ${deployer}`) // get the Endpoint address const endpointAddr = LZ_ENDPOINTS[hre.network.name] diff --git a/deploy/OmnichainFungibleToken.js b/deploy/OmnichainFungibleToken.js deleted file mode 100644 index b8350d60..00000000 --- a/deploy/OmnichainFungibleToken.js +++ /dev/null @@ -1,33 +0,0 @@ -const LZ_ENDPOINTS = require('../constants/layerzeroEndpoints.json') -const CHAIN_ID = require("../constants/chainIds.json"); -const MAIN_CHAIN = require("../constants/oftMainChain.json"); -const {ethers} = require("hardhat"); - -module.exports = async function ({ deployments, getNamedAccounts }) { - const { deploy } = deployments - const { deployer } = await getNamedAccounts() - console.log(`>>> your address: ${deployer}` ) - - // get the Endpoint address - const endpointAddr = LZ_ENDPOINTS[hre.network.name] - const mainChainId = CHAIN_ID[MAIN_CHAIN["mainChain"]] - const currentChainId = CHAIN_ID[hre.network.name] - console.log(`[${hre.network.name}] Endpoint address: ${endpointAddr}`) - - await deploy("OmnichainFungibleToken", { - from: deployer, - args: [ - "OmnichainFungibleToken", - "OFT", - endpointAddr, - mainChainId, - mainChainId === currentChainId - ? ethers.utils.parseUnits("1000000", 18) - : ethers.utils.parseUnits("0", 18) - ], - log: true, - waitConfirmations: 1, - }) -} - -module.exports.tags = ["OmnichainFungibleToken"] diff --git a/deploy/OmnichainNonFungibleToken.js b/deploy/OmnichainNonFungibleToken.js deleted file mode 100644 index c90c9b46..00000000 --- a/deploy/OmnichainNonFungibleToken.js +++ /dev/null @@ -1,22 +0,0 @@ -const LZ_ENDPOINTS = require('../constants/layerzeroEndpoints.json') -const ONFT_ARGS = require("../constants/onftArgs.json"); - -module.exports = async function({deployments, getNamedAccounts}) { - const {deploy} = deployments; - const {deployer} = await getNamedAccounts(); - console.log(`>>> your address: ${deployer}`) - - const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name]; - const onftArgs = ONFT_ARGS[hre.network.name]; - console.log({onftArgs}) - console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) - - await deploy("OmnichainNonFungibleToken", { - from: deployer, - args: ["https://layerzero.network", lzEndpointAddress, onftArgs.startId, onftArgs.maxSupply], - log: true, - waitConfirmations: 1 - }) -} - -module.exports.tags = ["OmnichainNonFungibleToken"] \ No newline at end of file diff --git a/deploy/PingPong.js b/deploy/PingPong.js index f55d0bd7..a8e80434 100644 --- a/deploy/PingPong.js +++ b/deploy/PingPong.js @@ -1,10 +1,10 @@ -const LZ_ENDPOINTS = require('../constants/layerzeroEndpoints.json') +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") module.exports = async function ({ deployments, getNamedAccounts }) { const owner = (await ethers.getSigners())[0] const { deploy } = deployments const { deployer } = await getNamedAccounts() - console.log(`>>> your address: ${deployer}` ) + console.log(`>>> your address: ${deployer}`) // get the Endpoint address const endpointAddr = LZ_ENDPOINTS[hre.network.name] @@ -17,10 +17,13 @@ module.exports = async function ({ deployments, getNamedAccounts }) { waitConfirmations: 1, }) - let eth = '0.66' - let tx = await(await owner.sendTransaction({ - to: pingPong.address, - value: ethers.utils.parseEther(eth)})).wait() + let eth = "0.05" + let tx = await ( + await owner.sendTransaction({ + to: pingPong.address, + value: ethers.utils.parseEther(eth), + }) + ).wait() console.log(`send it [${eth}] ether | tx: ${tx.transactionHash}`) } diff --git a/deploy/ProxyOFT.js b/deploy/ProxyOFT.js new file mode 100644 index 00000000..f60de648 --- /dev/null +++ b/deploy/ProxyOFT.js @@ -0,0 +1,19 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + await deploy("ProxyOFT", { + from: deployer, + args: [lzEndpointAddress, "0x000000000000000000"], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ProxyOFT"] diff --git a/deploy/ProxyONFT1155.js b/deploy/ProxyONFT1155.js new file mode 100644 index 00000000..70591424 --- /dev/null +++ b/deploy/ProxyONFT1155.js @@ -0,0 +1,19 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function ({ deployments, getNamedAccounts }) { + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + console.log(`>>> your address: ${deployer}`) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + console.log(`[${hre.network.name}] Endpoint Address: ${lzEndpointAddress}`) + + await deploy("ProxyONFT1155", { + from: deployer, + args: [lzEndpointAddress, "0x76BE3b62873462d2142405439777e971754E8E77"], + log: true, + waitConfirmations: 1, + }) +} + +module.exports.tags = ["ProxyONFT1155"] diff --git a/hardhat.config.js b/hardhat.config.js index 569b94d1..a05348e5 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,40 +1,45 @@ -require("dotenv").config(); +require("dotenv").config() -require('hardhat-contract-sizer'); -require("@nomiclabs/hardhat-waffle"); -require("solidity-coverage"); -require('hardhat-gas-reporter'); -require('hardhat-deploy'); -require('hardhat-deploy-ethers'); -require('./tasks'); +// uncomment to include contract sizing in test output +// require("hardhat-contract-sizer") +require("@nomiclabs/hardhat-waffle") +require(`@nomiclabs/hardhat-etherscan`) +require("solidity-coverage") +// uncomment to include gas reporting in test output +//require('hardhat-gas-reporter') +require("hardhat-deploy") +require("hardhat-deploy-ethers") +require("@openzeppelin/hardhat-upgrades") +require("./tasks") // This is a sample Hardhat task. To learn how to create your own go to // https://hardhat.org/guides/create-task.html task("accounts", "Prints the list of accounts", async (taskArgs, hre) => { - const accounts = await hre.ethers.getSigners(); + const accounts = await hre.ethers.getSigners() - for (const account of accounts) { - console.log(account.address); - } -}); + for (const account of accounts) { + console.log(account.address) + } +}) function getMnemonic(networkName) { - if (networkName) { - const mnemonic = process.env['MNEMONIC_' + networkName.toUpperCase()] - if (mnemonic && mnemonic !== '') { - return mnemonic + if (networkName) { + const mnemonic = process.env["MNEMONIC_" + networkName.toUpperCase()] + if (mnemonic && mnemonic !== "") { + return mnemonic + } + } + + const mnemonic = process.env.MNEMONIC + if (!mnemonic || mnemonic === "") { + return "test test test test test test test test test test test junk" } - } - const mnemonic = process.env.MNEMONIC - if (!mnemonic || mnemonic === '') { - return 'test test test test test test test test test test test junk' - } - return mnemonic + return mnemonic } function accounts(chainKey) { - return { mnemonic: getMnemonic(chainKey) } + return { mnemonic: getMnemonic(chainKey) } } // You need to export an object to set up your config @@ -44,56 +49,134 @@ function accounts(chainKey) { * @type import('hardhat/config').HardhatUserConfig */ module.exports = { - - solidity: "0.8.4", - contractSizer: { - alphaSort: false, - runOnCompile: true, - disambiguatePaths: false, - }, - - namedAccounts: { - deployer: { - default: 0, // wallet address 0, of the mnemonic in .env - } - }, - - networks: { - rinkeby: { - url: "https://rinkeby.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - chainId: 4, - accounts: accounts(), - }, - 'bsc-testnet': { - url: 'https://data-seed-prebsc-1-s1.binance.org:8545/', - chainId: 97, - accounts: accounts(), + solidity: { + compilers: [ + { + version: "0.8.4", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + { + version: "0.7.6", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + { + version: "0.8.12", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + ], }, - fuji: { - url: `https://api.avax-test.network/ext/bc/C/rpc`, - chainId: 43113, - accounts: accounts(), - }, - mumbai: { - url: "https://rpc-mumbai.maticvigil.com/", - chainId: 80001, - accounts: accounts(), + + // solidity: "0.8.4", + contractSizer: { + alphaSort: false, + runOnCompile: true, + disambiguatePaths: false, }, - 'arbitrum-rinkeby': { - url: `https://rinkeby.arbitrum.io/rpc`, - chainId: 421611, - accounts: accounts(), + + namedAccounts: { + deployer: { + default: 0, // wallet address 0, of the mnemonic in .env + }, + proxyOwner: { + default: 1, + }, }, - 'optimism-kovan': { - url: `https://kovan.optimism.io/`, - chainId: 69, - accounts: accounts(), + + mocha: { + timeout: 100000000, }, - 'fantom-testnet': { - url: `https://rpc.testnet.fantom.network/`, - chainId: 4002, - accounts: accounts(), - } - } -}; + networks: { + ethereum: { + url: "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", // public infura endpoint + chainId: 1, + accounts: accounts(), + }, + bsc: { + url: "https://bsc-dataseed1.binance.org", + chainId: 56, + accounts: accounts(), + }, + avalanche: { + url: "https://api.avax.network/ext/bc/C/rpc", + chainId: 43114, + accounts: accounts(), + }, + polygon: { + url: "https://rpc-mainnet.maticvigil.com", + chainId: 137, + accounts: accounts(), + }, + arbitrum: { + url: `https://arb1.arbitrum.io/rpc`, + chainId: 42161, + accounts: accounts(), + }, + optimism: { + url: `https://mainnet.optimism.io`, + chainId: 10, + accounts: accounts(), + }, + fantom: { + url: `https://rpcapi.fantom.network`, + chainId: 250, + accounts: accounts(), + }, + metis: { + url: `https://andromeda.metis.io/?owner=1088`, + chainId: 1088, + accounts: accounts(), + }, + + goerli: { + url: "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", // public infura endpoint + chainId: 5, + accounts: accounts(), + }, + "bsc-testnet": { + url: "https://data-seed-prebsc-1-s1.binance.org:8545/", + chainId: 97, + accounts: accounts(), + }, + fuji: { + url: `https://api.avax-test.network/ext/bc/C/rpc`, + chainId: 43113, + accounts: accounts(), + }, + mumbai: { + url: "https://rpc-mumbai.maticvigil.com/", + chainId: 80001, + accounts: accounts(), + }, + "arbitrum-goerli": { + url: `https://goerli-rollup.arbitrum.io/rpc/`, + chainId: 421613, + accounts: accounts(), + }, + "optimism-goerli": { + url: `https://goerli.optimism.io/`, + chainId: 420, + accounts: accounts(), + }, + "fantom-testnet": { + url: `https://rpc.ankr.com/fantom_testnet`, + chainId: 4002, + accounts: accounts(), + }, + }, +} diff --git a/package.json b/package.json index 2dc9dac0..7d9d93f1 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,25 @@ { - "name": "solidity-examples", - "version": "0.0.1", + "name": "@layerzerolabs/solidity-examples", + "version": "1.1.1", + "license": "MIT", + "files": [ + "artifacts/", + "contracts/" + ], "description": "example contracts", "main": "index.js", "scripts": { - "test": "npx hardhat test" + "test": "npx hardhat test --parallel", + "prettier": "prettier --write test/**/*.js && prettier --write test/*/*/*.js && prettier --write deploy/*.js && prettier --write tasks/*.js && prettier --write contracts/**/*.sol && prettier --write contracts/**/**/*.sol && prettier --write contracts/**/**/**/*.sol", + "lint": "yarn prettier && solhint 'contracts/*.sol' && solhint 'contracts/**/*.sol' && solhint 'contracts/**/**/*.sol' && solhint 'contracts/**/**/**/*.sol'" }, "dependencies": { + "@layerzerolabs/lz-evm-sdk-v1-0.7": "^1.5.14", "@openzeppelin/contracts": "^4.4.1", + "@openzeppelin-3/contracts": "npm:@openzeppelin/contracts@^3.4.2-solc-0.7", + "@openzeppelin/contracts-upgradeable": "^4.6.0", + "@openzeppelin/hardhat-upgrades": "^1.18.3", + "erc721a": "^4.2.3", "dotenv": "^10.0.0", "hardhat": "^2.8.0", "hardhat-contract-sizer": "^2.1.1", @@ -16,11 +28,17 @@ "hardhat-gas-reporter": "^1.0.6" }, "devDependencies": { + "@layerzerolabs/prettier-plugin-solidity": "^1.0.0-beta.19", "@nomiclabs/hardhat-ethers": "^2.0.3", + "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.1", "chai": "^4.3.4", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^3.4.1", "ethereum-waffle": "^3.4.0", "ethers": "^5.5.2", + "prettier": "^2.4.1", + "solhint": "^3.3.6", "solidity-coverage": "^0.7.17" } } diff --git a/resources/LayerZeroLogo.png b/resources/LayerZeroLogo.png new file mode 100644 index 00000000..461cfeed Binary files /dev/null and b/resources/LayerZeroLogo.png differ diff --git a/tasks/approveERC1155.js b/tasks/approveERC1155.js new file mode 100644 index 00000000..e08a89df --- /dev/null +++ b/tasks/approveERC1155.js @@ -0,0 +1,7 @@ +module.exports = async function (taskArgs, hre) { + const ERC1155 = await ethers.getContractFactory("ERC1155") + const erc1155 = await ERC1155.attach(taskArgs.addr) + const proxyONFT1155 = await ethers.getContract("ProxyONFT1155") + let tx = await (await erc1155.setApprovalForAll(proxyONFT1155.address, true)).wait() + console.log(`setApprovalForAll tx: ${tx.transactionHash}`) +} diff --git a/tasks/batchSendONFT1155.js b/tasks/batchSendONFT1155.js new file mode 100644 index 00000000..ce15a74c --- /dev/null +++ b/tasks/batchSendONFT1155.js @@ -0,0 +1,27 @@ +const CHAIN_IDS = require("../constants/chainIds.json") +const ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + const owner = signers[0] + const onft1155 = await ethers.getContract("ONFT1155") + const dstChainId = CHAIN_IDS[taskArgs.targetNetwork] + + const tokenIds = taskArgs.tokenIds.split(",") + const quantities = taskArgs.quantities.split(",") + console.log(tokenIds) + console.log(quantities) + + const payload = + "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000014f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + const endpoint = await ethers.getContractAt("ILayerZeroEndpoint", ENDPOINTS[hre.network.name]) + let fees = await endpoint.estimateFees(dstChainId, onft1155.address, payload, false, "0x") + console.log(`fees[0] (wei): ${fees[0]}`) + + let tx = await ( + await onft1155.sendBatch(dstChainId, owner.address, tokenIds, quantities, owner.address, ethers.constants.AddressZero, "0x", { + value: fees[0], + }) + ).wait() + console.log(`send tx: ${tx.transactionHash}`) +} diff --git a/tasks/batchSendProxyONFT1155.js b/tasks/batchSendProxyONFT1155.js new file mode 100644 index 00000000..f0e9bab6 --- /dev/null +++ b/tasks/batchSendProxyONFT1155.js @@ -0,0 +1,27 @@ +const CHAIN_IDS = require("../constants/chainIds.json") +const ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + const owner = signers[0] + const proxyONFT1155 = await ethers.getContract("ProxyONFT1155") + const dstChainId = CHAIN_IDS[taskArgs.targetNetwork] + + const tokenIds = taskArgs.tokenIds.split(",") + const quantities = taskArgs.quantities.split(",") + console.log(tokenIds) + console.log(quantities) + + const payload = + "0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000014f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + const endpoint = await ethers.getContractAt("ILayerZeroEndpoint", ENDPOINTS[hre.network.name]) + let fees = await endpoint.estimateFees(dstChainId, proxyONFT1155.address, payload, false, "0x") + console.log(`fees[0] (wei): ${fees[0]}`) + + let tx = await ( + await proxyONFT1155.sendBatch(dstChainId, owner.address, tokenIds, quantities, owner.address, ethers.constants.AddressZero, "0x", { + value: fees[0], + }) + ).wait() + console.log(`send tx: ${tx.transactionHash}`) +} diff --git a/tasks/cachedSwapSavedParse.js b/tasks/cachedSwapSavedParse.js new file mode 100644 index 00000000..2541d392 --- /dev/null +++ b/tasks/cachedSwapSavedParse.js @@ -0,0 +1,143 @@ +const CHAIN_ID = { + "ethereum": 101, + "bsc": 102, + "avalanche": 106, + "polygon": 109, + "arbitrum": 110, + "optimism": 111, + "fantom": 112, + "metis": 151, + "base": 184, + "linea": 183, + "kava": 177 +} + +const STG_FACTORIES = { + "ethereum": "0x06D538690AF257Da524f25D0CD52fD85b1c2173E", + "bsc": "0xe7Ec689f432f29383f217e36e680B5C855051f25", + "avalanche": "0x808d7c71ad2ba3FA531b068a2417C63106BC0949", + "polygon": "0x808d7c71ad2ba3FA531b068a2417C63106BC0949", + "arbitrum": "0x55bDb4164D28FBaF0898e0eF14a589ac09Ac9970", + "optimism": "0xE3B53AF74a4BF62Ae5511055290838050bf764Df", + "fantom": "0x9d1B1669c73b033DFe47ae5a0164Ab96df25B944", + "metis": "0xAF54BE5B6eEc24d6BFACf1cce4eaF680A8239398", + "kava": "0xAF54BE5B6eEc24d6BFACf1cce4eaF680A8239398", + "linea": "0xAF54BE5B6eEc24d6BFACf1cce4eaF680A8239398", + "base": "0xAf5191B0De278C7286d6C7CC6ab6BB8A73bA2Cd6" +} + +const STG_BRIDGE = { + "ethereum": "0x296F55F8Fb28E498B858d0BcDA06D955B2Cb3f97", + "bsc": "0x6694340fc020c5E6B96567843da2df01b2CE1eb6", + "avalanche": "0x9d1B1669c73b033DFe47ae5a0164Ab96df25B944", + "polygon": "0x9d1B1669c73b033DFe47ae5a0164Ab96df25B944", + "arbitrum": "0x352d8275AAE3e0c2404d9f68f6cEE084B5bEB3DD", + "optimism": "0x701a95707A0290AC8B90b3719e8EE5b210360883", + "fantom": "0x45A01E4e04F14f7A4a6702c74187c5F6222033cd", + "metis": "0x45f1A95A4D3f3836523F5c83673c797f4d4d263B", + "kava": "0x45f1A95A4D3f3836523F5c83673c797f4d4d263B", + "linea": "0x45f1A95A4D3f3836523F5c83673c797f4d4d263B", + "base": "0xAF54BE5B6eEc24d6BFACf1cce4eaF680A8239398" +} + +const SWAP_REMOTE_UA_PAYLOAD_ENCODING = [ + 'uint8', // TYPE_SWAP_REMOTE + 'uint256', // _srcPoolId + 'uint256', // _dstPoolId + 'uint256', // _lzTxParams.dstGasForCall + 'creditObj(uint256,uint256)', // _c + 'swapObj(uint256,uint256,uint256,uint256,uint256,uint256)', // _s + 'bytes', // _to + 'bytes', // _payload +] + +let FACTORY_ABI = [ + "function getPool(uint256) view returns(address)" +]; + +let POOL_ABI = [ + "function token() view returns(address)", + "function convertRate() view returns(uint256)" +]; + +const STARGATE_RECEIVER_INTERFACE_ABI = [ + "function sgReceive(uint16 _chainId, bytes memory _srcAddress, uint256 _nonce, address _token, uint256 amountLD, bytes memory payload)" +]; + +const STARGATE_COMPOSER_ABI = [ + "function clearCachedSwap(uint16 _srcChainId,bytes calldata _srcAddress,uint64 _nonce,address _receiver,bytes calldata _sgReceiveCallData)", + "function payloadHashes(uint16,bytes,uint256) view returns(bytes32)" +]; + +const STARGATE_COMPOSER_ADDRESS = "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9" +const DST_POOL_ID_INDEX = 2; +const SWAP_OBJ_INDEX = 5; +const AMOUNT_INDEX = 0 +const EQ_REWARD_INDEX = 2; +const PAYLOAD_INDEX = 7; + +module.exports = async function (taskArgs, hre) { + const srcNetwork = taskArgs.srcNetwork; + const nonce = taskArgs.nonce; + const uaPayload = taskArgs.uaPayload + + const srcChainId = CHAIN_ID[srcNetwork]; + const srcAddress = hre.ethers.utils.solidityPack( + ['address','address'], + [STG_BRIDGE[srcNetwork], STG_BRIDGE[hre.network.name]] + ) + + const decodedPayload = ethers.utils.defaultAbiCoder.decode( + SWAP_REMOTE_UA_PAYLOAD_ENCODING, + uaPayload, + ) + + const factoryAddress = STG_FACTORIES[hre.network.name] + const factory = await ethers.getContractAt(FACTORY_ABI, factoryAddress); + + const dstPoolId = decodedPayload[DST_POOL_ID_INDEX]; + const poolAddress = await factory.getPool(dstPoolId.valueOf()) + const pool = await ethers.getContractAt(POOL_ABI, poolAddress); + + const token = await pool.token(); + const convertRate = (await pool.convertRate()).valueOf(); + + const amount = decodedPayload[SWAP_OBJ_INDEX][AMOUNT_INDEX].valueOf() + const eqReward = decodedPayload[SWAP_OBJ_INDEX][EQ_REWARD_INDEX].valueOf() + const amountLD = (amount + eqReward) * convertRate; + + const receiver = ethers.utils.hexDataSlice(decodedPayload[PAYLOAD_INDEX], 0, 20) + const callDataSrcAddress = ethers.utils.hexDataSlice(decodedPayload[PAYLOAD_INDEX], 20, 40) + const payload = ethers.utils.hexDataSlice(decodedPayload[PAYLOAD_INDEX], 40) + + const interfaceStargateReceiver = new ethers.utils.Interface(STARGATE_RECEIVER_INTERFACE_ABI); + const sgReceiveCallData = interfaceStargateReceiver.encodeFunctionData("sgReceive", [ srcChainId, callDataSrcAddress, nonce, token, amountLD, payload]) + + console.log({srcChainId,srcAddress,nonce,receiver,sgReceiveCallData}) + + if(taskArgs.clear) { + const stargateComposer = await ethers.getContractAt(STARGATE_COMPOSER_ABI, STARGATE_COMPOSER_ADDRESS); + const currentPayloadHash = await stargateComposer.payloadHashes(srcChainId,srcAddress,nonce); + const encodedPacked = ethers.utils.solidityPack(["address", "bytes"], [receiver, sgReceiveCallData]) + const hash = ethers.utils.keccak256(encodedPacked); + + if(currentPayloadHash === ethers.constants.HashZero) { + console.log("Nothing to clear. Cache Swap empty."); + return + } else if(currentPayloadHash !== hash) { + console.log("Cached Payload Hash doesnt match."); + return + } + + try { + const tx = await (await stargateComposer.clearCachedSwap(srcChainId,srcAddress,nonce,receiver,sgReceiveCallData)).wait(); + console.log(`tx: ${tx.transactionHash}`) + } catch (e) { + if(e?.error?.message) { + console.log(e.error.message) + } else { + console.log(e) + } + } + } +} diff --git a/tasks/checkWireUp.js b/tasks/checkWireUp.js new file mode 100644 index 00000000..8ff80bcc --- /dev/null +++ b/tasks/checkWireUp.js @@ -0,0 +1,47 @@ +const CHAIN_ID = require("../constants/chainIds.json") +const environments = require("../constants/environments.json") + +function TrustedRemoteTestnet() { + this.goerli + this.bscTestnet + this.fuji + this.mumbai + this.arbitrumGoerli + this.optimismGoerli + this.fantomTestnet +} + +function TrustedRemote() { + this.ethereum + this.bsc + this.avalanche + this.polygon + this.arbitrum + this.optimism + this.fantom +} + +module.exports = async function (taskArgs) { + const environment = hre.network.name + const environmentArray = environments[taskArgs.e] + + let trustedRemoteTable = {} + + trustedRemoteTable[environment] = taskArgs.e === "mainnet" ? new TrustedRemote() : new TrustedRemoteTestnet() + + await Promise.all( + environmentArray.map(async (env) => { + try { + const contract = await ethers.getContract(taskArgs.contract) + const dstChainId = CHAIN_ID[env] + let envToCamelCase = env.replace(/-./g, (m) => m[1].toUpperCase()) + trustedRemoteTable[environment][envToCamelCase] = await contract.trustedRemoteLookup(dstChainId) + } catch (error) { + //catch error because checkWireUpAll is reading console log as input + } + }) + ) + if (JSON.stringify(trustedRemoteTable[environment]).length > 2) { + console.log(JSON.stringify(trustedRemoteTable[environment])) + } +} diff --git a/tasks/checkWireUpAll.js b/tasks/checkWireUpAll.js new file mode 100644 index 00000000..c9a28163 --- /dev/null +++ b/tasks/checkWireUpAll.js @@ -0,0 +1,151 @@ +const shell = require("shelljs") +const environments = require("../constants/environments.json") +const { getDeploymentAddresses } = require("../utils/readStatic") + +let trustedRemoteTable = {} +let trustedRemoteChecks = {} +const MAX_TRYS = 10 + +function TrustedRemoteTestnet() { + this.goerli + this.bscTestnet + this.fuji + this.mumbai + this.arbitrumGoerli + this.optimismGoerli + this.fantomTestnet +} + +function TrustedRemote() { + this.ethereum + this.bsc + this.avalanche + this.polygon + this.arbitrum + this.optimism + this.fantom +} + +function isJsonString(str) { + try { + JSON.parse(str) + } catch (e) { + return false + } + return true +} + +module.exports = async function (taskArgs) { + const networks = environments[taskArgs.e] + if (!taskArgs.e || networks.length === 0) { + console.log(`Invalid environment argument: ${taskArgs.e}`) + } + // loop through all networks and fill up trustedRemoteTable + await Promise.all( + networks.map(async (network) => { + let result + let resultParsed + let trys = 0 + while (true) { + let checkWireUpCommand + if (network === taskArgs.proxyChain) { + checkWireUpCommand = `npx hardhat --network ${network} checkWireUp --e ${taskArgs.e} --contract ${taskArgs.proxyContract}` + } else { + checkWireUpCommand = `npx hardhat --network ${network} checkWireUp --e ${taskArgs.e} --contract ${taskArgs.contract}` + } + + console.log("checkWireUp: " + checkWireUpCommand) + // remove spaces and new lines from stdout + result = shell.exec(checkWireUpCommand).stdout.replace(/(\r\n|\n|\r|\s)/gm, "") + // remove extra words before JSON object, so it can be parsed correctly + result = result.substring(result.indexOf("{")) + // make sure it is JSON otherwise the network does not have this contract deployed + if (!isJsonString(result)) { + trustedRemoteTable[network] = new TrustedRemote() + break + } + // parse result into JSON object + resultParsed = JSON.parse(result) + // make sure all chain ids are set if so we break + if (Object.keys(resultParsed).length === networks.length) { + break + } + // we will retry a max of 10 times otherwise we throw an error to stop infinite while loop + else if (trys === MAX_TRYS) { + throw new Error(`Retired the max amount of times for ${network}`) + } + // sometimes the returned JSON is missing chains so retry until they are all set properly + else { + ++trys + console.log(`On retry:${trys} for ${network}`) + } + } + trustedRemoteTable[network] = taskArgs.e === "mainnet" ? new TrustedRemote() : new TrustedRemoteTestnet() + // assign new passed object to the trustedRemoteTable[network] + Object.assign(trustedRemoteTable[network], resultParsed) + // if trustedRemoteTable[network] is not empty then set trustedRemoteChecks[network] + if (Object.keys(trustedRemoteTable[network]).length > 0) { + trustedRemoteChecks[network] = taskArgs.e === "mainnet" ? new TrustedRemote() : new TrustedRemoteTestnet() + } + }) + ) + + // use filled trustedRemoteTable to make trustedRemoteChecks + const environmentArray = environments[taskArgs.e] + for (let i = 0; i < environmentArray.length; i++) { + if (trustedRemoteTable[environmentArray[i]] === undefined) continue + const envToCamelCase = environmentArray[i].replace(/-./g, (m) => m[1].toUpperCase()) + let actualRemoteAddress = getDeployedAddress(environmentArray[i], taskArgs.proxyChain, taskArgs.contract, taskArgs.proxyContract) + if (actualRemoteAddress === undefined) continue + for (let j = 0; j < environmentArray.length; j++) { + if (trustedRemoteTable[environmentArray[j]] === undefined) continue + let actualLocalAddress = getDeployedAddress(environmentArray[j], taskArgs.proxyChain, taskArgs.contract, taskArgs.proxyContract) + if (actualLocalAddress !== undefined) { + const currentlySetTrustedRemote = trustedRemoteTable[environmentArray[j]][envToCamelCase] + let actualSetTrustedRemote = actualRemoteAddress + actualLocalAddress.substring(2) + console.log( + `${environmentArray[j]}'s currentSetRemoteAddress for ${environmentArray[i]}: ${currentlySetTrustedRemote} ${ + JSON.stringify(actualSetTrustedRemote) === JSON.stringify(currentlySetTrustedRemote) ? "✅ " : "❌ " + }` + ) + if (JSON.stringify(actualSetTrustedRemote) === JSON.stringify(currentlySetTrustedRemote)) { + if (environmentArray[i] === environmentArray[j]) { + trustedRemoteChecks[environmentArray[j]][environmentArray[i]] = "" + } else { + trustedRemoteChecks[environmentArray[j]][environmentArray[i]] = "🟩" + } + } else if (JSON.stringify(actualSetTrustedRemote) !== JSON.stringify(currentlySetTrustedRemote)) { + trustedRemoteChecks[environmentArray[j]][environmentArray[i]] = "🟥" + } + } + } + } + console.log("Legend") + console.log("Set: 🟩") + console.log("Not Set: 🟥") + console.table(trustedRemoteChecks) + + //print addresses + let getAddressesCommand + if (taskArgs.proxyChain !== undefined) { + getAddressesCommand = `node utils/getAddresses ${taskArgs.e} ${taskArgs.proxyContract},${taskArgs.contract}` + } else { + getAddressesCommand = `node utils/getAddresses ${taskArgs.e} ${taskArgs.contract}` + } + console.log("getAddressesCommand: " + getAddressesCommand) + shell.exec(getAddressesCommand) +} + +function getDeployedAddress(chain, proxyChain, contract, proxyContract) { + let deployedAddress + try { + if (chain === proxyChain) { + deployedAddress = getDeploymentAddresses(chain)[proxyContract].toLowerCase() + } else { + deployedAddress = getDeploymentAddresses(chain)[contract].toLowerCase() + } + } catch { + deployedAddress = undefined + } + return deployedAddress +} diff --git a/tasks/deployWireCheck.js b/tasks/deployWireCheck.js new file mode 100644 index 00000000..05ed7f6c --- /dev/null +++ b/tasks/deployWireCheck.js @@ -0,0 +1,77 @@ +const shell = require("shelljs") +const environments = require("../constants/environments.json") + +module.exports = async function (taskArgs) { + const networks = environments[taskArgs.e] + if (!taskArgs.e || networks.length === 0) { + console.log(`Invalid environment argument: ${taskArgs.e}`) + } + + //deploy proxy oft + if (taskArgs.proxyContract !== undefined) { + console.log(`deploying ${taskArgs.proxyContract} to chain ${taskArgs.proxyChain}`) + const deployProxyCommand = `npx hardhat --network ${taskArgs.proxyChain} deploy --tags ${taskArgs.proxyContract}` + console.log("deployProxyCommand: " + deployProxyCommand) + shell.exec(deployProxyCommand) + } + + //deploy oft's + networks.map(async (network) => { + if (network !== taskArgs.proxyChain) { + console.log(`deploying ${taskArgs.contract} to chain ${network}`) + const deployCommand = `npx hardhat --network ${network} deploy --tags ${taskArgs.contract}` + console.log("deployCommand: " + deployCommand) + shell.exec(deployCommand) + } + }) + + //wire + console.log({ networks }) + networks.map(async (source) => { + let srcContract, dstContract + networks.map(async (destination) => { + if (taskArgs.proxyChain) { + if (source === taskArgs.proxyChain && destination === taskArgs.proxyChain) { + srcContract = taskArgs.proxyContract + dstContract = taskArgs.proxyContract + } else if (source === taskArgs.proxyChain) { + srcContract = taskArgs.proxyContract + dstContract = taskArgs.contract + } else if (destination === taskArgs.proxyChain) { + srcContract = taskArgs.contract + dstContract = taskArgs.proxyContract + } else { + srcContract = taskArgs.contract + dstContract = taskArgs.contract + } + } else { + srcContract = taskArgs.contract + dstContract = taskArgs.contract + } + + let wireUpCommand = `npx hardhat --network ${source} setTrustedRemote --target-network ${destination} --local-contract ${srcContract} --remote-contract ${dstContract}` + console.log("wireUpCommand: " + wireUpCommand) + shell.exec(wireUpCommand) + }) + }) + + //check + let checkWireUpCommand + if (taskArgs.proxyChain === undefined) { + checkWireUpCommand = `npx hardhat checkWireUpAll --e ${taskArgs.e} --contract ${taskArgs.contract}` + } else { + checkWireUpCommand = `npx hardhat checkWireUpAll --e ${taskArgs.e} --contract ${taskArgs.contract} --proxy-chain ${taskArgs.proxyChain} --proxy-contract ${taskArgs.proxyContract}` + } + console.log("checkWireUpCommand: " + checkWireUpCommand) + shell.exec(checkWireUpCommand) + + //print addresses + let getAddressesCommand + if (taskArgs.proxyChain !== undefined) { + getAddressesCommand = `node utils/getAddresses ${taskArgs.e} ${taskArgs.proxyContract},${taskArgs.contract}` + } else { + getAddressesCommand = `node utils/getAddresses ${taskArgs.e} ${taskArgs.contract}` + } + console.log("getAddressesCommand: " + getAddressesCommand) + shell.exec(getAddressesCommand) +} diff --git a/tasks/getMessageFailedEvent.js b/tasks/getMessageFailedEvent.js new file mode 100644 index 00000000..4cfdd76a --- /dev/null +++ b/tasks/getMessageFailedEvent.js @@ -0,0 +1,39 @@ +module.exports = async function (taskArgs, hre) { + let blockStart = (await ethers.provider.getTransaction(taskArgs.txStart)).blockNumber + let blockEnd = + taskArgs.txEnd !== undefined + ? (await ethers.provider.getTransaction(taskArgs.txEnd)).blockNumber + : await ethers.provider.getBlockNumber() + + if (taskArgs.blockStart) { + blockStart = taskArgs.blockStart + } + console.log(`blockStart: ${blockStart} -> blockEnd: ${blockEnd}`) + const contract = await ethers.getContractAt("NonblockingLzApp", taskArgs.dstUa) + const step = taskArgs.step + for (let from = blockStart; from <= blockEnd; from += step + 1) { + const to = Math.min(from + step, blockEnd) + const deposits = await contract.queryFilter(contract.filters.MessageFailed(), from, to) + for (const e of deposits) { + // event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); + let messageFailed = { + block: `${from}`, + srcChainId: `${e?.args[0].toString()}`, + srcAddress: `${e?.args[1].toString()}`, + nonce: `${e?.args[2].toString()}`, + payload: `${e?.args[3].toString()}`, + reason: `${e?.args[4].toString()}`, + } + console.log(messageFailed) + if (taskArgs.nonce !== undefined && messageFailed.nonce === taskArgs.nonce) { + console.log(`Attempting to clear nonce: ${e.args[3].toString()}`) + let tx = await ( + await contract.retryMessage(messageFailed.srcChainId, messageFailed.srcAddress, messageFailed.nonce, messageFailed.payload) + ).wait() + console.log("txHash:" + tx.transactionHash) + } + } + } +} + +// npx hardhat --network goerli getMessageFailedEvent --tx-start TX_HASH_SRC --tx-end TX_HASH_DST --dstUA DST_ADDRESS --nonce NONCE_TO_CLEAR diff --git a/tasks/getSigners.js b/tasks/getSigners.js new file mode 100644 index 00000000..6b1c4ac4 --- /dev/null +++ b/tasks/getSigners.js @@ -0,0 +1,6 @@ +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + for (let i = 0; i < taskArgs.n; ++i) { + console.log(`${i}) ${signers[i].address}`) + } +} diff --git a/tasks/getStoredPayloadEvent.js b/tasks/getStoredPayloadEvent.js new file mode 100644 index 00000000..3a31d455 --- /dev/null +++ b/tasks/getStoredPayloadEvent.js @@ -0,0 +1,51 @@ +const LZ_ENDPOINTS = require("../constants/layerzeroEndpoints.json") +const ABI = require("../constants/endpoint_abi.json") + +module.exports = async function (taskArgs, hre) { + let blockStart = (await ethers.provider.getTransaction(taskArgs.txStart)).blockNumber + let blockEnd = + taskArgs.txEnd !== undefined + ? (await ethers.provider.getTransaction(taskArgs.txEnd)).blockNumber + : await ethers.provider.getBlockNumber() + + console.log(`blockStart: ${blockStart} -> blockEnd: ${blockEnd}`) + console.log(hre.network.name) + console.log(LZ_ENDPOINTS[hre.network.name]) + + const lzEndpointAddress = LZ_ENDPOINTS[hre.network.name] + const endpoint = await hre.ethers.getContractAt(ABI, lzEndpointAddress) + + // concat remote and local address + let remoteAndLocal = hre.ethers.utils.solidityPack(["address", "address"], [taskArgs.srcAddress, taskArgs.desAddress]) + + const step = taskArgs.step + for (let from = blockStart; from <= blockEnd; from += step + 1) { + const to = Math.min(from + step, blockEnd) + const deposits = await endpoint.queryFilter(endpoint.filters.PayloadStored(), from, to) + for (const e of deposits) { + // event PayloadStored(uint16 srcChainId, bytes srcAddress, address dstAddress, uint64 nonce, bytes payload, bytes reason); + let storedPayload = { + block: `${from}`, + srcChainId: `${e?.args[0].toString()}`, + srcAddress: `${e?.args[1].toString()}`, + dstAddress: `${e?.args[2].toString()}`, + nonce: `${e?.args[3].toString()}`, + payload: `${e?.args[4].toString()}`, + reason: `${e?.args[5].toString()}`, + } + + if (e.args[1] === remoteAndLocal) console.log(storedPayload) + if (e.args[1] === remoteAndLocal && taskArgs.nonce !== undefined && storedPayload.nonce === taskArgs.nonce) { + console.log(`Attempting to clear nonce: ${e.args[3].toString()}`) + let tx = await (await endpoint.retryPayload(e.args[0], e.args[1], e?.args[4], { gasLimit: 200000 })).wait() + console.log("txHash:" + tx.transactionHash) + } + } + } +} + +// npx hardhat --network bsc-testnet getStoredPayloadEvent --tx-start TX_HASH_SRC --src-address TBD --des-address TBD +// npx hardhat --network bsc-testnet getStoredPayloadEvent --tx-start 0xf74b8a299ff58651d8f4e2411f5459b7f703b2582404a34a657e247a8463cb84 --src-address 0xff7e5f0faf0cba105cdb875833b801355fa58aa0 --des-address 0x2ef82e5c7afb10f70a704efebc15036d0e5864b1 + +// to clear nonce +// npx hardhat --network bsc-testnet getStoredPayloadEvent --tx-start 0xf74b8a299ff58651d8f4e2411f5459b7f703b2582404a34a657e247a8463cb84 --src-address 0xff7e5f0faf0cba105cdb875833b801355fa58aa0 --des-address 0x2ef82e5c7afb10f70a704efebc15036d0e5864b1 --nonce 8 diff --git a/tasks/incrementCounter.js b/tasks/incrementCounter.js new file mode 100644 index 00000000..2d2407a4 --- /dev/null +++ b/tasks/incrementCounter.js @@ -0,0 +1,25 @@ +const CHAIN_ID = require("../constants/chainIds.json") +const ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function (taskArgs, hre) { + const remoteChainId = CHAIN_ID[taskArgs.targetNetwork] + const omniCounter = await ethers.getContract("OmniCounter") + + // quote fee with default adapterParams + const adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) // default adapterParams example + + const payload = await omniCounter.PAYLOAD() + const endpoint = await ethers.getContractAt("ILayerZeroEndpoint", ENDPOINTS[hre.network.name]) + const fees = await endpoint.estimateFees(remoteChainId, omniCounter.address, payload, false, adapterParams) + console.log(`fees[0] (wei): ${fees[0]} / (eth): ${ethers.utils.formatEther(fees[0])}`) + + let tx = await (await omniCounter.incrementCounter(remoteChainId, { value: fees[0] })).wait() + console.log(`✅ Message Sent [${hre.network.name}] incrementCounter on destination OmniCounter @ [${remoteChainId}]`) + console.log(`tx: ${tx.transactionHash}`) + + console.log(``) + console.log(`Note: to poll/wait for the message to arrive on the destination use the command:`) + console.log(` (it may take a minute to arrive, be patient!)`) + console.log("") + console.log(` $ npx hardhat --network ${taskArgs.targetNetwork} ocPoll`) +} diff --git a/tasks/index.js b/tasks/index.js index ececbb32..70363b31 100644 --- a/tasks/index.js +++ b/tasks/index.js @@ -1,81 +1,187 @@ - // set the Oracle address for the OmniCounter -task("omniCounterSetOracle", "set the UA (an OmniCounter contract) to use the specified oracle for the destination chain", - require("./omniCounterSetOracle")) +// example: +task( + "omniCounterSetOracle", + "set the UA (an OmniCounter contract) to use the specified oracle for the destination chain", + require("./omniCounterSetOracle") +) .addParam("targetNetwork", "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)") .addParam("oracle", "the Oracle address for the specified targetNetwork") // get the Oracle for sending to the destination chain -task("omniCounterGetOracle", "get the Oracle address being used by the OmniCounter", - require("./omniCounterGetOracle")) +task("ocGetOracle", "get the Oracle address being used by the OmniCounter", require("./ocGetOracle")).addParam( + "targetNetwork", + "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)" +) + +// +task("ocPoll", "poll the counter of the OmniCounter", require("./ocPoll")) + +// +task( + "omniCounterIncrementWithParamsV1", + "increment the destination OmniCounter with gas amount param", + require("./omniCounterIncrementWithParamsV1") +) .addParam("targetNetwork", "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)") + .addParam("gasAmount", "the gas amount for the destination chain") // -task("omniCounterIncrementCounter", "increment the destination OmniCounter", - require("./omniCounterIncrementCounter")) +task( + "omniCounterIncrementWithParamsV2", + "increment the destination OmniCounter with gas amount param", + require("./omniCounterIncrementWithParamsV2") +) .addParam("targetNetwork", "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)") - .addOptionalParam("n", "number of tx", 1, types.int) + .addParam("gasAmount", "the gas amount for the destination chain") + .addParam("airDropEthQty", "the amount of eth to drop") + .addParam("airDropAddr", "the air drop address") + +task("pingPongSetTrustedRemote", "set the trusted remote", require("./pingPongSetTrustedRemote")).addParam( + "targetNetwork", + "the targetNetwork to set as trusted" +) + +task("ping", "call ping to start the pingPong with the target network", require("./ping")) + .addParam("targetNetwork", "the targetNetwork to commence pingponging with") + .addOptionalParam("n", "number of pings to send", 2, types.int) + +task("getSigners", "show the signers of the current mnemonic", require("./getSigners")).addOptionalParam("n", "how many to show", 3, types.int) + +task("approveERC1155", "approve it to transfer my nfts", require("./approveERC1155")).addParam("addr", "the address to approve") + +task("sendProxyONFT1155", "send a tokenid and quantity", require("./sendProxyONFT1155")) + .addParam("targetNetwork", "the destination chainId") + .addParam("tokenId", "the NFT tokenId") + .addParam("quantity", "the quantity of NFT tokenId to send") +// .addParam("msgValue", "the lz message value, ie: '0.02' ") + +task("sendONFT1155", "send a tokenid and quantity", require("./sendONFT1155")) + .addParam("targetNetwork", "the destination chainId") + .addParam("tokenId", "the NFT tokenId") + .addParam("quantity", "the quantity of NFT tokenId to send") + .addParam("msgValue", "the lz message value, ie: '0.02' ") + +task("batchSendProxyONFT1155", "send a tokenid and quantity", require("./batchSendProxyONFT1155")) + .addParam("targetNetwork", "the destination chainId") + .addParam("tokenIds", "the NFT tokenId") + .addParam("quantities", "the quantity of NFT tokenId to send") + +task("batchSendONFT1155", "send a tokenid and quantity", require("./batchSendONFT1155")) + .addParam("targetNetwork", "the destination chainId") + .addParam("tokenIds", "the NFT tokenId") + .addParam("quantities", "the quantity of NFT tokenId to send") // -task("omniCounterIncrementMultiCounter", "increment the destination OmniCounter", - require("./omniCounterIncrementMultiCounter")) - .addParam("targetNetworks", "target network names, separated by comma (no spaces)") +task("checkWireUp", "check wire up", require("./checkWireUp")) + .addParam("e", "environment testnet/mainet") + .addParam("contract", "the contract to delete and redeploy") // -task("omniCounterSetDestination", "setTrustedSource(chainId, sourceAddr) to allow the local contract to receive messages from known source contracts", - require("./omniCounterSetTrustedSource")) - .addParam("targetNetwork", "the target network to let this instance receive messages from") +task("checkWireUpAll", "check wire up all", require("./checkWireUpAll")) + .addParam("e", "environment testnet/mainet") + .addParam("contract", "name of contract") + .addOptionalParam("proxyContract", "name of proxy contract") + .addOptionalParam("proxyChain", "name of proxy chain") // -task("omnichainFungibleTokenSetDestination", "setTrustedSource(chainId, sourceAddr) to allow the local contract to receive messages from known source contracts", - require("./omnichainFungibleTokenSetTrustedSource")) - .addParam("targetNetwork", "the target network to let this instance receive messages from") +task( + "setTrustedRemote", + "setTrustedRemote(chainId, sourceAddr) to enable inbound/outbound messages with your other contracts", + require("./setTrustedRemote") +) + .addParam("targetNetwork", "the target network to set as a trusted remote") + .addOptionalParam("localContract", "Name of local contract if the names are different") + .addOptionalParam("remoteContract", "Name of remote contract if the names are different") + .addOptionalParam("contract", "If both contracts are the same name") // -task("omnichainFungibleTokenSendTokens", "omnichainFungibleTokenSendTokens() send tokens to another chain", - require("./omnichainFungibleTokenSendTokens")) +task("oftMint", "mint tokens", require("./oftMint")) + .addParam("toAddress", "address to mint to") + .addParam("qty", "qty of tokens to mint") + +// +task("oftSend", "send tokens to another chain", require("./oftSend")) .addParam("qty", "qty of tokens to send") .addParam("targetNetwork", "the target network to let this instance receive messages from") + .addOptionalParam("localContract", "Name of local contract if the names are different") + .addOptionalParam("remoteContract", "Name of remote contract if the names are different") + .addOptionalParam("contract", "If both contracts are the same name") // -task("omnichainNonFungibleTokenSetTrustedSource", "setTrustedSource(chainId, sourceAddr) to allow the local contract to receive messages from known source contracts", - require("./omnichainNonFungibleTokenSetTrustedSource")) +task("oftv2Send", "send tokens to another chain", require("./oftv2Send")) + .addParam("qty", "qty of tokens to send") .addParam("targetNetwork", "the target network to let this instance receive messages from") + .addOptionalParam("localContract", "Name of local contract if the names are different") + .addOptionalParam("remoteContract", "Name of remote contract if the names are different") + .addOptionalParam("contract", "If both contracts are the same name") + +// +task("onftMint", "mint() mint ONFT", require("./onftMint")) + .addParam("toAddress", "address to mint the ONFT to") + .addParam("tokenId", "the tokenId of the ONFT") + .addParam("contract", "Name of contract") // -task("omnichainNonFungibleTokenOwnerOf", "ownerOf(tokenId) to get the owner of a token", - require("./omnichainNonFungibleTokenOwnerOf")) +task("ownerOf", "ownerOf(tokenId) to get the owner of a token", require("./ownerOf")) + .addParam("contract", "Name of contract") .addParam("tokenId", "the tokenId of ONFT") // -task("omnichainNonFungibleTokenMint", "mint() mint ONFT", - require("./omnichainNonFungibleTokenMint")) +task("onftSend", "send an ONFT nftId from one chain to another", require("./onftSend")) + .addParam("tokenId", "the tokenId of ONFT") + .addParam("targetNetwork", "the chainId to transfer to") + .addParam("contract", "ONFT contract name") // -task("omnichainNonFungibleTokenTransfer", "transferOmnichainNFT(chainId, tokenId) transfer ONFT from one chain to another", - require("./omnichainNonFungibleTokenTransfer")) +task("setMinDstGas", "set min gas required on the destination gas", require("./setMinDstGas")) + .addParam("packetType", "message Packet type") .addParam("targetNetwork", "the chainId to transfer to") - .addParam("tokenId", "the tokenId of ONFT") + .addParam("contract", "contract name") + .addParam("minGas", "min gas") + +// +task("incrementCounter", "increment the destination OmniCounter", require("./incrementCounter")).addParam( + "targetNetwork", + "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)" +) + +// npx hardhat deployWireCheck --e testnet --contract ExampleOFT --proxy-contract ExampleBasedOFT --proxy-chain optimism-kovan +// npx hardhat deployWireCheck --e testnet --contract ExampleUniversalONFT721 +task("deployWireCheck", "", require("./deployWireCheck")) + .addParam("e", "environment testnet/mainet") + .addParam("contract", "") + .addOptionalParam("proxyChain", "") + .addOptionalParam("proxyContract", "") // -task("omniCounterPoll", "poll the counter of the OmniCounter", - require("./omniCounterPoll")) +task("getStoredPayloadEvent", "Detect and clear stored payload", require("./getStoredPayloadEvent")) + .addParam("txStart", "provide a transaction hash in the block you want to start in") + .addParam("srcAddress", "") + .addParam("desAddress", "") + .addOptionalParam("txEnd", "provide a tx hash in the block you want to end at") + .addOptionalParam("step", "provide a tx hash in the block you want to end at", 1000, types.int) + .addOptionalParam("nonce", "nonce to clear") // -task("omniCounterIncrementWithParamsV1", "increment the destination OmniCounter with gas amount param", - require("./omniCounterIncrementWithParamsV1")) - .addParam("targetNetwork", "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)") - .addParam("gasAmount", "the gas amount for the destination chain") +task("getMessageFailedEvent", "Detect and clear failed message", require("./getMessageFailedEvent")) + .addParam("txStart", "provide a transaction hash in the block you want to start in") + .addParam("dstUa", "address of dst UA") + .addOptionalParam("txEnd", "provide a tx hash in the block you want to end at") + .addOptionalParam("step", "provide a tx hash in the block you want to end at", 1000, types.int) + .addOptionalParam("nonce", "nonce to clear") // -task("omniCounterIncrementWithParamsV2", "increment the destination OmniCounter with gas amount param", - require("./omniCounterIncrementWithParamsV2")) - .addParam("targetNetwork", "the target network name, ie: fuji, or mumbai, etc (from hardhat.config.js)") - .addParam("gasAmount", "the gas amount for the destination chain") - .addParam("airDropEthQty", "the amount of eth to drop") - .addParam("airDropAddr", "the air drop address") +task("isFailedMessage", "check if failed message", require("./isFailedMessage")) + .addParam("srcChainId", "") + .addParam("srcAddress", "") + .addParam("desAddress", "") + .addParam("nonce", "") -// task("deleteAndRedeploy", "remove contracts from folder and redeploy", require("./deleteAndRedeploy")) -// .addParam("e", "the environment ie: mainnet, testnet") -// .addOptionalParam("contract", "the contract to delete and redeploy") -// .addOptionalParam("ignore", "csv of network names to ignore", "", types.string) \ No newline at end of file +// +task("isStoredPayload", "check if stored payload", require("./isStoredPayload")) + .addParam("srcChainId", "") + .addParam("srcAddress", "") + .addParam("desAddress", "") + .addOptionalParam("payload", "") + .addOptionalParam("clear", "", false, types.boolean) diff --git a/tasks/isFailedMessage.js b/tasks/isFailedMessage.js new file mode 100644 index 00000000..3e0b6ecc --- /dev/null +++ b/tasks/isFailedMessage.js @@ -0,0 +1,13 @@ +module.exports = async function (taskArgs, hre) { + console.log({ taskArgs }) + const nonBlockingApp = await ethers.getContractAt("NonblockingLzApp", taskArgs.desAddress) + + // concat remote and local address + let remoteAndLocal = hre.ethers.utils.solidityPack(["address", "address"], [taskArgs.srcAddress, taskArgs.desAddress]) + + let bool = await nonBlockingApp.failedMessages(taskArgs.srcChainId, remoteAndLocal, taskArgs.nonce) + console.log(`failedMessages: ${bool}`) +} + +// npx hardhat failedMessage --network fuji --src-chain-id TBD --src-address TBD --des-address TBD --nonce TBD +// npx hardhat failedMessage --network fuji --src-chain-id 101 --src-address 0x165192f89ea752f597203eeb14e8f5538bce799d --des-address 0x9add6f279394f7f3c7a61d3426a7f45e149261a4 --nonce 10 diff --git a/tasks/isStoredPayload.js b/tasks/isStoredPayload.js new file mode 100644 index 00000000..263bc5e7 --- /dev/null +++ b/tasks/isStoredPayload.js @@ -0,0 +1,26 @@ +const ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function (taskArgs, hre) { + const EndpointAbi = [ + "function storedPayload(uint16, bytes) external view returns (uint64, address, bytes32)", + "function hasStoredPayload(uint16, bytes calldata) external view returns (bool)", + "function retryPayload(uint16, bytes, bytes)", + ] + + // console.log({taskArgs}) + const endpoint = await ethers.getContractAt(EndpointAbi, ENDPOINTS[hre.network.name]) + + // concat remote and local address + let remoteAndLocal = hre.ethers.utils.solidityPack(["address", "address"], [taskArgs.srcAddress, taskArgs.desAddress]) + + let bool = await endpoint.hasStoredPayload(taskArgs.srcChainId, remoteAndLocal) + console.log(bool) + if (bool && taskArgs.clear) { + let payload = "0x" + taskArgs.payload + let tx = await (await endpoint.retryPayload(taskArgs.srcChainId, remoteAndLocal, payload)).wait() + console.log(`tx: ${tx.transactionHash}`) + } +} + +// npx hardhat storedPayload --network polygon --src-chain-id TBD --src-address TBD --des-address TBD +// npx hardhat storedPayload --network polygon --src-chain-id 101 --src-address 0x165192f89ea752f597203eeb14e8f5538bce799d --des-address 0x9add6f279394f7f3c7a61d3426a7f45e149261a4 diff --git a/tasks/omniCounterGetOracle.js b/tasks/ocGetOracle.js similarity index 81% rename from tasks/omniCounterGetOracle.js rename to tasks/ocGetOracle.js index 1e53c288..1233e799 100644 --- a/tasks/omniCounterGetOracle.js +++ b/tasks/ocGetOracle.js @@ -1,4 +1,4 @@ -const CHAIN_ID = require('../constants/chainIds.json') +const CHAIN_ID = require("../constants/chainIds.json") const TYPE_ORACLE = 6 @@ -16,5 +16,5 @@ module.exports = async function (taskArgs, hre) { TYPE_ORACLE ) - console.log(`✅ Oracle for src (${hre.network.name}) -> dst [${dstChainId}]: ${data.replace('000000000000000000000000','')}`) + console.log(`✅ Oracle for src (${hre.network.name}) -> dst [${dstChainId}]: ${data.replace("000000000000000000000000", "")}`) } diff --git a/tasks/omniCounterPoll.js b/tasks/ocPoll.js similarity index 90% rename from tasks/omniCounterPoll.js rename to tasks/ocPoll.js index a4588f86..f29210eb 100644 --- a/tasks/omniCounterPoll.js +++ b/tasks/ocPoll.js @@ -8,7 +8,7 @@ module.exports = async function (taskArgs, hre) { console.log(`omniCounter: ${omniCounter.address}`) while (true) { - let counter = await omniCounter.getCounter() + let counter = await omniCounter.counter() console.log(`[${hre.network.name}] ${new Date().toISOString().split("T")[1].split(".")[0]} counter... ${counter}`) await sleep(1000) } diff --git a/tasks/oftMint.js b/tasks/oftMint.js new file mode 100644 index 00000000..40bf36e6 --- /dev/null +++ b/tasks/oftMint.js @@ -0,0 +1,12 @@ +module.exports = async function (taskArgs, hre) { + let owner = (await ethers.getSigners())[0] + let toAddress = owner.address + let qty = ethers.utils.parseEther(taskArgs.qty) + + const oftMock = await ethers.getContract("OFTMock") + + let tx = await ( + await oftMock.mintTokens(toAddress, qty) + ).wait() + console.log(`✅ OFT minted [${hre.network.name}] to: [${toAddress}] qty: [${qty}]`) +} diff --git a/tasks/oftSend.js b/tasks/oftSend.js new file mode 100644 index 00000000..9b988266 --- /dev/null +++ b/tasks/oftSend.js @@ -0,0 +1,51 @@ +const CHAIN_ID = require("../constants/chainIds.json") + +module.exports = async function (taskArgs, hre) { + let signers = await ethers.getSigners() + let owner = signers[0] + let toAddress = owner.address + let qty = ethers.utils.parseEther(taskArgs.qty) + + let localContract, remoteContract + + if (taskArgs.contract) { + localContract = taskArgs.contract + remoteContract = taskArgs.contract + } else { + localContract = taskArgs.localContract + remoteContract = taskArgs.remoteContract + } + + if (!localContract || !remoteContract) { + console.log("Must pass in contract name OR pass in both localContract name and remoteContract name") + return + } + + // get remote chain id + const remoteChainId = CHAIN_ID[taskArgs.targetNetwork] + + // get local contract + const localContractInstance = await ethers.getContract(localContract) + + // quote fee with default adapterParams + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) // default adapterParams example + + let fees = await localContractInstance.estimateSendFee(remoteChainId, toAddress, qty, false, adapterParams) + console.log(`fees[0] (wei): ${fees[0]} / (eth): ${ethers.utils.formatEther(fees[0])}`) + + let tx = await ( + await localContractInstance.sendFrom( + owner.address, // 'from' address to send tokens + remoteChainId, // remote LayerZero chainId + toAddress, // 'to' address to send tokens + qty, // amount of tokens to send (in wei) + owner.address, // refund address (if too much message fee is sent, it gets refunded) + ethers.constants.AddressZero, // address(0x0) if not paying in ZRO (LayerZero Token) + "0x", // flexible bytes array to indicate messaging adapter services + { value: fees[0] } + ) + ).wait() + console.log(`✅ Message Sent [${hre.network.name}] sendTokens() to OFT @ LZ chainId[${remoteChainId}] token:[${toAddress}]`) + console.log(` tx: ${tx.transactionHash}`) + console.log(`* check your address [${owner.address}] on the destination chain, in the ERC20 transaction tab !"`) +} diff --git a/tasks/oftv2Send.js b/tasks/oftv2Send.js new file mode 100644 index 00000000..1eefcd05 --- /dev/null +++ b/tasks/oftv2Send.js @@ -0,0 +1,55 @@ +const CHAIN_ID = require("../constants/chainIds.json") + +module.exports = async function (taskArgs, hre) { + let signers = await ethers.getSigners() + let owner = signers[0] + let toAddress = owner.address + let qty = ethers.utils.parseEther(taskArgs.qty) + + let localContract, remoteContract + + if (taskArgs.contract) { + localContract = taskArgs.contract + remoteContract = taskArgs.contract + } else { + localContract = taskArgs.localContract + remoteContract = taskArgs.remoteContract + } + + if (!localContract || !remoteContract) { + console.log("Must pass in contract name OR pass in both localContract name and remoteContract name") + return + } + + let toAddressBytes = ethers.utils.defaultAbiCoder.encode(["address"], [toAddress]) + + // get remote chain id + const remoteChainId = CHAIN_ID[taskArgs.targetNetwork] + + // get local contract + const localContractInstance = await ethers.getContract(localContract) + + // quote fee with default adapterParams + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) // default adapterParams example + + let fees = await localContractInstance.estimateSendFee(remoteChainId, toAddressBytes, qty, false, adapterParams) + console.log(`fees[0] (wei): ${fees[0]} / (eth): ${ethers.utils.formatEther(fees[0])}`) + + let tx = await ( + await localContractInstance.sendFrom( + owner.address, // 'from' address to send tokens + remoteChainId, // remote LayerZero chainId + toAddressBytes, // 'to' address to send tokens + qty, // amount of tokens to send (in wei) + { + refundAddress: owner.address, + zroPaymentAddress: ethers.constants.AddressZero, + adapterParams, + }, + { value: fees[0] } + ) + ).wait() + console.log(`✅ Message Sent [${hre.network.name}] sendTokens() to OFT @ LZ chainId[${remoteChainId}] token:[${toAddress}]`) + console.log(` tx: ${tx.transactionHash}`) + console.log(`* check your address [${owner.address}] on the destination chain, in the ERC20 transaction tab !"`) +} diff --git a/tasks/omniCounterIncrementCounter.js b/tasks/omniCounterIncrementCounter.js deleted file mode 100644 index a8c15233..00000000 --- a/tasks/omniCounterIncrementCounter.js +++ /dev/null @@ -1,27 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmniCounter"] - // get local contract instance - const omniCounter = await ethers.getContract("OmniCounter") - console.log(`[source] omniCounter.address: ${omniCounter.address}`) - - // set the config for this UA to use the specified Oracle - for(let i = 0; i < taskArgs.n; ++i) { - let tx = await (await omniCounter.incrementCounter( - dstChainId, - dstAddr, - {value: ethers.utils.parseEther('1')} // estimate/guess - )).wait() - console.log(`✅ Message Sent [${hre.network.name}] incrementCounter on destination OmniCounter @ [${dstChainId}] [${dstAddr}]`) - console.log(`[${i}] tx: ${tx.transactionHash}`) - } - - console.log(``) - console.log(`Note: to poll/wait for the message to arrive on the destination use the command:`) - console.log(` (it may take a minute to arrive, be patient!)`) - console.log('') - console.log(` $ npx hardhat --network ${taskArgs.targetNetwork} omniCounterPoll`) -} diff --git a/tasks/omniCounterIncrementMultiCounter.js b/tasks/omniCounterIncrementMultiCounter.js deleted file mode 100644 index 6e9793b5..00000000 --- a/tasks/omniCounterIncrementMultiCounter.js +++ /dev/null @@ -1,42 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - const targetNetworks = taskArgs.targetNetworks.split(',') - const dstChainIdArray = []; - const dstAddrArray = []; - // CHAIN_ID[taskArgs.targetNetwork] - console.log("taskArgs.targetNetwork: " + taskArgs.targetNetworks) - for (const dst of targetNetworks) { - console.log("dst: " + dst) - dstChainIdArray.push(CHAIN_ID[dst]) - dstAddrArray.push(getDeploymentAddresses(dst)["OmniCounter"]) - } - // get local contract instance - const omniCounter = await ethers.getContract("OmniCounter") - console.log(`[source] omniCounter.address: ${omniCounter.address}`) - console.log({dstChainIdArray}) - console.log({dstAddrArray}) - - // set the config for this UA to use the specified Oracle - let tx = await (await omniCounter.incrementMultiCounter( - dstChainIdArray, - dstAddrArray, - (await ethers.getSigners())[0].address, - {value: ethers.utils.parseEther('1')} // estimate/guess - )).wait() - - let index = 0; - for (const dst of targetNetworks) { - console.log(`✅ Message Sent [${hre.network.name}] incrementMultiCounter on destination OmniCounter @ [${dstChainIdArray[index]}] [${dstAddrArray[index]}]`) - index++; - } - console.log(`tx: ${tx.transactionHash}`) - - console.log(``) - console.log(`Note: to poll/wait for the message to arrive on the destination use the command:`) - console.log('') - for (const dst of targetNetworks) { - console.log(` $ npx hardhat --network ${dst} omniCounterPoll`) - } -} \ No newline at end of file diff --git a/tasks/omniCounterIncrementWithParamsV1.js b/tasks/omniCounterIncrementWithParamsV1.js index 5a22c15d..2d7933f8 100644 --- a/tasks/omniCounterIncrementWithParamsV1.js +++ b/tasks/omniCounterIncrementWithParamsV1.js @@ -1,5 +1,5 @@ -const {getDeploymentAddresses} = require('../utils/readStatic') -const CHAIN_ID = require('../constants/chainIds.json') +const { getDeploymentAddresses } = require("../utils/readStatic") +const CHAIN_ID = require("../constants/chainIds.json") module.exports = async function (taskArgs, hre) { console.log(`[gasAmount]: `, taskArgs.gasAmount) @@ -7,18 +7,22 @@ module.exports = async function (taskArgs, hre) { const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmniCounter"] const omniCounter = await ethers.getContract("OmniCounter") - let tx = await (await omniCounter.incrementCounterWithAdapterParamsV1( - dstChainId, - dstAddr, - taskArgs.gasAmount, - {value: ethers.utils.parseEther('1')} // estimate/guess - )).wait() + let tx = await ( + await omniCounter.incrementCounterWithAdapterParamsV1( + dstChainId, + dstAddr, + taskArgs.gasAmount, + { value: ethers.utils.parseEther("1") } // estimate/guess + ) + ).wait() - console.log(`✅ Message Sent [${hre.network.name}] omniCounterIncrementWithParamsV1 on destination OmniCounter @ [${dstChainId}] [${dstAddr}]`) + console.log( + `✅ Message Sent [${hre.network.name}] omniCounterIncrementWithParamsV1 on destination OmniCounter @ [${dstChainId}] [${dstAddr}]` + ) console.log(`tx: ${tx.transactionHash}`) console.log(``) console.log(`Note: to poll/wait for the message to arrive on the destination use the command:`) - console.log('') + console.log("") console.log(` $ npx hardhat --network ${taskArgs.targetNetwork} omniCounterPoll`) } diff --git a/tasks/omniCounterIncrementWithParamsV2.js b/tasks/omniCounterIncrementWithParamsV2.js index db24539b..1fa89ee1 100644 --- a/tasks/omniCounterIncrementWithParamsV2.js +++ b/tasks/omniCounterIncrementWithParamsV2.js @@ -1,5 +1,5 @@ -const {getDeploymentAddresses} = require('../utils/readStatic') -const CHAIN_ID = require('../constants/chainIds.json') +const { getDeploymentAddresses } = require("../utils/readStatic") +const CHAIN_ID = require("../constants/chainIds.json") module.exports = async function (taskArgs, hre) { const dstChainId = CHAIN_ID[taskArgs.targetNetwork] @@ -12,19 +12,23 @@ module.exports = async function (taskArgs, hre) { const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmniCounter"] const omniCounter = await ethers.getContract("OmniCounter") console.log(`[source] omniCounter.address: ${omniCounter.address}`) - let tx = await (await omniCounter.incrementCounterWithAdapterParamsV2( - dstChainId, - dstAddr, - taskArgs.gasAmount, - taskArgs.airDropEthQty, - taskArgs.airDropAddr, - {value: ethers.utils.parseEther('1')} // estimate/guess - )).wait() - console.log(`✅ Message Sent [${hre.network.name}] omniCounterIncrementWithParamsV2 on destination OmniCounter @ [${dstChainId}] [${dstAddr}]`) + let tx = await ( + await omniCounter.incrementCounterWithAdapterParamsV2( + dstChainId, + dstAddr, + taskArgs.gasAmount, + taskArgs.airDropEthQty, + taskArgs.airDropAddr, + { value: ethers.utils.parseEther("1") } // estimate/guess + ) + ).wait() + console.log( + `✅ Message Sent [${hre.network.name}] omniCounterIncrementWithParamsV2 on destination OmniCounter @ [${dstChainId}] [${dstAddr}]` + ) console.log(`tx: ${tx.transactionHash}`) console.log(``) console.log(`Note: to poll/wait for the message to arrive on the destination use the command:`) - console.log('') + console.log("") console.log(` $ npx hardhat --network ${taskArgs.targetNetwork} omniCounterPoll`) } diff --git a/tasks/omniCounterSetOracle.js b/tasks/omniCounterSetOracle.js index 269515c7..32c3b913 100644 --- a/tasks/omniCounterSetOracle.js +++ b/tasks/omniCounterSetOracle.js @@ -1,6 +1,4 @@ -const CHAIN_ID = require('../constants/chainIds.json') - -const TYPE_ORACLE = 6 +const CHAIN_ID = require("../constants/chainIds.json") module.exports = async function (taskArgs, hre) { const dstChainId = CHAIN_ID[taskArgs.targetNetwork] @@ -9,10 +7,7 @@ module.exports = async function (taskArgs, hre) { console.log(`omniCounter.address: ${omniCounter.address}`) // set the config for this UA to use the specified Oracle - let tx = await (await omniCounter.setOracle( - dstChainId, - taskArgs.oracle - )).wait() + let tx = await (await omniCounter.setOracle(dstChainId, taskArgs.oracle)).wait() console.log(`... set Oracle[${taskArgs.oracle}] for [${hre.network.name}] OmniCounter -> dst [${dstChainId}]`) console.log(`tx: ${tx.transactionHash}`) } diff --git a/tasks/omniCounterSetTrustedSource.js b/tasks/omniCounterSetTrustedSource.js deleted file mode 100644 index bc20e53e..00000000 --- a/tasks/omniCounterSetTrustedSource.js +++ /dev/null @@ -1,23 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmniCounter"] - // get local contract instance - const omniCounter = await ethers.getContract("OmniCounter") - console.log(`[source] omniCounter.address: ${omniCounter.address}`) - - // setTrustedSource() on the local contract, so it can receive message from the source contract - try{ - let tx = await (await omniCounter.setTrustedSource( - dstChainId, - dstAddr - )).wait() - console.log(`✅ [${hre.network.name}] setTrustedSource(${dstChainId}, ${dstAddr})`) - console.log(` tx: ${tx.transactionHash}`) - } catch(e){ - if(e.error?.message.includes("The source address has already been set for the chainId")){ console.log('*source already set*') } - else { console.log(e)} - } -} diff --git a/tasks/omnichainFungibleTokenSendTokens.js b/tasks/omnichainFungibleTokenSendTokens.js deleted file mode 100644 index df0354dd..00000000 --- a/tasks/omnichainFungibleTokenSendTokens.js +++ /dev/null @@ -1,35 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - let signers = await ethers.getSigners(); - let owner = signers[0]; - let tx; - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const qty = ethers.utils.parseEther(taskArgs.qty); - - const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmnichainFungibleToken"] - // get local contract instance - const omnichainFungibleToken = await ethers.getContract("OmnichainFungibleToken") - console.log(`[source] omnichainFungibleToken.address: ${omnichainFungibleToken.address}`) - - tx = await(await omnichainFungibleToken.approve(omnichainFungibleToken.address, qty)).wait() - console.log(`approve tx: ${tx.transactionHash}`) - - let adapterParams = ethers.utils.solidityPack( - ['uint16','uint256'], - [1,2000000] - ); - - tx = await (await omnichainFungibleToken.sendTokens( - dstChainId, - owner.address, - qty, - "0x000000000000000000000000000000000000dEaD", - adapterParams, - {value: ethers.utils.parseEther('1')} // estimate/guess - )).wait() - console.log(`✅ Message Sent [${hre.network.name}] sendTokens() to OmnichainFungibleToken @ [${dstChainId}] token:[${dstAddr}]`) - console.log(` tx: ${tx.transactionHash}`) - console.log(`* check your address [${owner.address}] on the destination chain, in the ERC20 transaction tab !"`) -} diff --git a/tasks/omnichainFungibleTokenSetTrustedSource.js b/tasks/omnichainFungibleTokenSetTrustedSource.js deleted file mode 100644 index d457b095..00000000 --- a/tasks/omnichainFungibleTokenSetTrustedSource.js +++ /dev/null @@ -1,23 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmnichainFungibleToken"] - // get local contract instance - const omnichainFungibleToken = await ethers.getContract("OmnichainFungibleToken") - console.log(`[source] omnichainFungibleToken.address: ${omnichainFungibleToken.address}`) - - // setTrustedSource() on the local contract, so it can receive message from the source contract - try { - let tx = await (await omnichainFungibleToken.setTrustedSource( - dstChainId, - dstAddr - )).wait() - console.log(`✅ [${hre.network.name}] setTrustedSource(${dstChainId}, ${dstAddr})`) - console.log(` tx: ${tx.transactionHash}`) - } catch(e){ - if(e.error.message.includes("The source address has already been set for the chainId")){ console.log('*source already set*') } - else { console.log(e)} - } -} diff --git a/tasks/omnichainNonFungibleTokenMint.js b/tasks/omnichainNonFungibleTokenMint.js deleted file mode 100644 index 7c82c01a..00000000 --- a/tasks/omnichainNonFungibleTokenMint.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = async function (taskArgs, hre) { - const omnichainNonFungibleToken = await ethers.getContract("OmnichainNonFungibleToken") - console.log(`[source] omnichainNonFungibleToken.address: ${omnichainNonFungibleToken.address}`) - - try { - let tx = await (await omnichainNonFungibleToken.mint()).wait() - console.log(`✅ [${hre.network.name}] mint()`) - console.log(` tx: ${tx.transactionHash}`) - let onftTokenId = await ethers.provider.getTransactionReceipt(tx.transactionHash) - console.log(` Omnichain Non Fungible Token Id: ${parseInt(Number(onftTokenId.logs[0].topics[3]))}`) - } catch(e){ - if(e.error?.message.includes("ONFT: Max limit reached")){ console.log('*ONFT: Max limit reached*') } - else { console.log(e)} - } -} diff --git a/tasks/omnichainNonFungibleTokenOwnerOf.js b/tasks/omnichainNonFungibleTokenOwnerOf.js deleted file mode 100644 index 15096b16..00000000 --- a/tasks/omnichainNonFungibleTokenOwnerOf.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = async function (taskArgs, hre) { - const tokenId = taskArgs.tokenId - const omnichainNonFungibleToken = await ethers.getContract("OmnichainNonFungibleToken") - console.log(`[source] omnichainNonFungibleToken.address: ${omnichainNonFungibleToken.address}`) - - try { - let address = await omnichainNonFungibleToken.ownerOf( - tokenId - ) - console.log(`✅ [${hre.network.name}] ownerOf(${tokenId})`) - console.log(` address: ${address}`) - } catch(e){ - // console.log(e) - - if(e.error?.message.includes("ERC721: owner query for nonexistent token")){ console.log('*ERC721: owner query for nonexistent token.*') } - if(e.reason.includes("nonexistent")){console.log('*ERC721: owner query for nonexistent token.*')} - else {console.log(e)} - } -} diff --git a/tasks/omnichainNonFungibleTokenSetTrustedSource.js b/tasks/omnichainNonFungibleTokenSetTrustedSource.js deleted file mode 100644 index c05fff86..00000000 --- a/tasks/omnichainNonFungibleTokenSetTrustedSource.js +++ /dev/null @@ -1,22 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') -const {getDeploymentAddresses} = require('../utils/readStatic') - -module.exports = async function (taskArgs, hre) { - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const dstAddr = getDeploymentAddresses(taskArgs.targetNetwork)["OmnichainNonFungibleToken"] - const omnichainNonFungibleToken = await ethers.getContract("OmnichainNonFungibleToken") - console.log(`[source] omnichainNonFungibleToken.address: ${omnichainNonFungibleToken.address}`) - - // setTrustedSource() on the local contract, so it can receive message from the source contract - try { - let tx = await (await omnichainNonFungibleToken.setTrustedSource( - dstChainId, - dstAddr - )).wait() - console.log(`✅ [${hre.network.name}] setTrustedSource(${dstChainId}, ${dstAddr})`) - console.log(` tx: ${tx.transactionHash}`) - } catch(e){ - if(e.error.message.includes("The trusted source address has already been set for the chainId")){ console.log('*trusted source already set*') } - else { console.log(e)} - } -} diff --git a/tasks/omnichainNonFungibleTokenTransfer.js b/tasks/omnichainNonFungibleTokenTransfer.js deleted file mode 100644 index 20586c91..00000000 --- a/tasks/omnichainNonFungibleTokenTransfer.js +++ /dev/null @@ -1,22 +0,0 @@ -const CHAIN_ID = require('../constants/chainIds.json') - -module.exports = async function (taskArgs, hre) { - const dstChainId = CHAIN_ID[taskArgs.targetNetwork] - const tokenId = taskArgs.tokenId - const omnichainNonFungibleToken = await ethers.getContract("OmnichainNonFungibleToken") - console.log(`[source] omnichainNonFungibleToken.address: ${omnichainNonFungibleToken.address}`) - - try { - let tx = await (await omnichainNonFungibleToken.transferOmnichainNFT( - dstChainId, - tokenId, - {value: ethers.utils.parseEther('1')} - )).wait() - console.log(`✅ [${hre.network.name}] transferOmnichainNFT(${dstChainId}, ${tokenId})`) - console.log(` tx: ${tx.transactionHash}`) - } catch(e){ - if(e.error.message.includes("Message sender must own the OmnichainNFT.")){ console.log('*Message sender must own the OmnichainNFT.*') } - else if(e.error.message.includes("This chain is not a trusted source source.")){ console.log('*This chain is not a trusted source source.*') } - else { console.log(e)} - } -} diff --git a/tasks/onftMint.js b/tasks/onftMint.js new file mode 100644 index 00000000..bf91af5b --- /dev/null +++ b/tasks/onftMint.js @@ -0,0 +1,17 @@ +module.exports = async function (taskArgs, hre) { + let contract = await ethers.getContract(taskArgs.contract) + + try { + let tx = await (await contract.mint(taskArgs.toAddress, taskArgs.tokenId)).wait() + console.log(`✅ [${hre.network.name}] mint()`) + console.log(` tx: ${tx.transactionHash}`) + let onftTokenId = await ethers.provider.getTransactionReceipt(tx.transactionHash) + console.log(` ONFT nftId: ${parseInt(Number(onftTokenId.logs[0].topics[3]))}`) + } catch (e) { + if (e.error?.message.includes("ONFT: Max limit reached")) { + console.log("*ONFT: Max limit reached*") + } else { + console.log(e) + } + } +} diff --git a/tasks/onftSend.js b/tasks/onftSend.js new file mode 100644 index 00000000..191edb14 --- /dev/null +++ b/tasks/onftSend.js @@ -0,0 +1,33 @@ +const CHAIN_ID = require("../constants/chainIds.json") + +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + const owner = signers[0] + const toAddress = owner.address + const tokenId = taskArgs.tokenId + // get remote chain id + const remoteChainId = CHAIN_ID[taskArgs.targetNetwork] + + // get local contract + const onft = await ethers.getContract(taskArgs.contract) + + // quote fee with default adapterParams + const adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) // default adapterParams example + + const fees = await onft.estimateSendFee(remoteChainId, toAddress, tokenId, false, adapterParams) + const nativeFee = fees[0] + console.log(`native fees (wei): ${nativeFee}`) + + const tx = await onft.sendFrom( + owner.address, // 'from' address to send tokens + remoteChainId, // remote LayerZero chainId + toAddress, // 'to' address to send tokens + tokenId, // tokenId to send + owner.address, // refund address (if too much message fee is sent, it gets refunded) + ethers.constants.AddressZero, // address(0x0) if not paying in ZRO (LayerZero Token) + adapterParams, // flexible bytes array to indicate messaging adapter services + { value: nativeFee.mul(5).div(4) } + ) + console.log(`✅ [${hre.network.name}] sendFrom tx: ${tx.hash}`) + await tx.wait() +} diff --git a/tasks/ownerOf.js b/tasks/ownerOf.js new file mode 100644 index 00000000..4487a7a2 --- /dev/null +++ b/tasks/ownerOf.js @@ -0,0 +1,16 @@ +module.exports = async function (taskArgs, hre) { + let contract = await ethers.getContract(taskArgs.contract) + let tokenId = taskArgs.tokenId + + try { + let address = await contract.ownerOf(tokenId) + console.log(`✅ [${hre.network.name}] ownerOf(${tokenId})`) + console.log(` Owner address: ${address}`) + } catch (e) { + if (e?.reason) { + console.log(e.reason) + } else { + console.log(e) + } + } +} diff --git a/tasks/ping.js b/tasks/ping.js new file mode 100644 index 00000000..af08c80c --- /dev/null +++ b/tasks/ping.js @@ -0,0 +1,19 @@ +const CHAIN_ID = require("../constants/chainIds.json") +const { getDeploymentAddresses } = require("../utils/readStatic") + +module.exports = async function (taskArgs, hre) { + const targetNetwork = taskArgs.targetNetwork + const totalPings = taskArgs.n + + const dstChainId = CHAIN_ID[targetNetwork] + const dstPingPongAddr = getDeploymentAddresses(targetNetwork)["PingPong"] + + // get local contract instance + const pingPong = await ethers.getContract("PingPong") + console.log(`[source] pingPong.address: ${pingPong.address}`) + + let tx = await (await pingPong.ping(dstChainId, totalPings)).wait() + + console.log(`✅ Pings started! [${hre.network.name}] pinging with target chain [${dstChainId}] @ [${dstPingPongAddr}]`) + console.log(`...tx: ${tx.transactionHash}`) +} diff --git a/tasks/pingPongSetTrustedRemote.js b/tasks/pingPongSetTrustedRemote.js new file mode 100644 index 00000000..a45c1243 --- /dev/null +++ b/tasks/pingPongSetTrustedRemote.js @@ -0,0 +1,14 @@ +const CHAIN_ID = require("../constants/chainIds.json") +const { getDeploymentAddresses } = require("../utils/readStatic") + +module.exports = async function (taskArgs, hre) { + const dstChainId = CHAIN_ID[taskArgs.targetNetwork] + const dstPingPongAddr = getDeploymentAddresses(taskArgs.targetNetwork)["PingPong"] + // get local contract instance + const pingPong = await ethers.getContract("PingPong") + console.log(`[source] pingPong.address: ${pingPong.address}`) + + let tx = await (await pingPong.setTrustedRemote(dstChainId, dstPingPongAddr)).wait() + console.log(`✅ [${hre.network.name}] PingPong.setTrustedRemote( ${dstChainId}, ${dstPingPongAddr} )`) + console.log(`...tx: ${tx.transactionHash}`) +} diff --git a/tasks/sendONFT1155.js b/tasks/sendONFT1155.js new file mode 100644 index 00000000..5753cc84 --- /dev/null +++ b/tasks/sendONFT1155.js @@ -0,0 +1,14 @@ +const CHAIN_IDS = require("../constants/chainIds.json") + +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + const owner = signers[0] + const onft1155 = await ethers.getContract("ONFT1155") + const dstChainId = CHAIN_IDS[taskArgs.targetNetwork] + let tx = await ( + await onft1155.send(dstChainId, owner.address, taskArgs.tokenId, taskArgs.quantity, owner.address, ethers.constants.AddressZero, "0x", { + value: ethers.utils.parseEther(taskArgs.msgValue), + }) + ).wait() + console.log(`send tx: ${tx.transactionHash}`) +} diff --git a/tasks/sendProxyONFT1155.js b/tasks/sendProxyONFT1155.js new file mode 100644 index 00000000..0c1a247a --- /dev/null +++ b/tasks/sendProxyONFT1155.js @@ -0,0 +1,27 @@ +const CHAIN_IDS = require("../constants/chainIds.json") +const ENDPOINTS = require("../constants/layerzeroEndpoints.json") + +module.exports = async function (taskArgs, hre) { + const signers = await ethers.getSigners() + const owner = signers[0] + const proxyONFT1155 = await ethers.getContract("ProxyONFT1155") + const dstChainId = CHAIN_IDS[taskArgs.targetNetwork] + + const endpoint = await ethers.getContractAt("ILayerZeroEndpoint", ENDPOINTS[hre.network.name]) + let fees = await endpoint.estimateFees(dstChainId, proxyONFT1155.address, "0x", false, "0x") + console.log(`fees[0]: ${fees[0]}`) + + let tx = await ( + await proxyONFT1155.send( + dstChainId, + owner.address, + taskArgs.tokenId, + taskArgs.quantity, + owner.address, + ethers.constants.AddressZero, + "0x", + { value: fees[0] } + ) + ).wait() + console.log(`send tx: ${tx.transactionHash}`) +} diff --git a/tasks/setMinDstGas.js b/tasks/setMinDstGas.js new file mode 100644 index 00000000..b26e8486 --- /dev/null +++ b/tasks/setMinDstGas.js @@ -0,0 +1,10 @@ +const CHAIN_ID = require("../constants/chainIds.json") + +module.exports = async function (taskArgs, hre) { + const contract = await ethers.getContract(taskArgs.contract) + const dstChainId = CHAIN_ID[taskArgs.targetNetwork] + const tx = await contract.setMinDstGas(dstChainId, taskArgs.packetType, taskArgs.minGas) + + console.log(`[${hre.network.name}] setMinDstGas tx hash ${tx.hash}`) + await tx.wait() +} diff --git a/tasks/setTrustedRemote.js b/tasks/setTrustedRemote.js new file mode 100644 index 00000000..63b71060 --- /dev/null +++ b/tasks/setTrustedRemote.js @@ -0,0 +1,50 @@ +const CHAIN_ID = require("../constants/chainIds.json") +const { getDeploymentAddresses } = require("../utils/readStatic") + +module.exports = async function (taskArgs, hre) { + let localContract, remoteContract + + if (taskArgs.contract) { + localContract = taskArgs.contract + remoteContract = taskArgs.contract + } else { + localContract = taskArgs.localContract + remoteContract = taskArgs.remoteContract + } + + if (!localContract || !remoteContract) { + console.log("Must pass in contract name OR pass in both localContract name and remoteContract name") + return + } + + // get local contract + const localContractInstance = await ethers.getContract(localContract) + + // get deployed remote contract address + const remoteAddress = getDeploymentAddresses(taskArgs.targetNetwork)[remoteContract] + + // get remote chain id + const remoteChainId = CHAIN_ID[taskArgs.targetNetwork] + + // concat remote and local address + let remoteAndLocal = hre.ethers.utils.solidityPack(["address", "address"], [remoteAddress, localContractInstance.address]) + + // check if pathway is already set + const isTrustedRemoteSet = await localContractInstance.isTrustedRemote(remoteChainId, remoteAndLocal) + + if (!isTrustedRemoteSet) { + try { + let tx = await (await localContractInstance.setTrustedRemote(remoteChainId, remoteAndLocal)).wait() + console.log(`✅ [${hre.network.name}] setTrustedRemote(${remoteChainId}, ${remoteAndLocal})`) + console.log(` tx: ${tx.transactionHash}`) + } catch (e) { + if (e.error.message.includes("The chainId + address is already trusted")) { + console.log("*source already set*") + } else { + console.log(`❌ [${hre.network.name}] setTrustedRemote(${remoteChainId}, ${remoteAndLocal})`) + } + } + } else { + console.log("*source already set*") + } +} diff --git a/test/OmniCounter.test.js b/test/OmniCounter.test.js deleted file mode 100644 index 29c5389c..00000000 --- a/test/OmniCounter.test.js +++ /dev/null @@ -1,48 +0,0 @@ -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("OmniCounter", function () { - beforeEach(async function(){ - // use this chainId - this.chainId = 123; - - // create a LayerZero Endpoint mock for testing - const LayerZeroEndpointMock = await ethers.getContractFactory("LZEndpointMock"); - this.lzEndpointMock = await LayerZeroEndpointMock.deploy(this.chainId); - - // create two OmniCounter instances - const OmniCounter = await ethers.getContractFactory("OmniCounter"); - this.omniCounterA = await OmniCounter.deploy(this.lzEndpointMock.address); - this.omniCounterB = await OmniCounter.deploy(this.lzEndpointMock.address); - - this.lzEndpointMock.setDestLzEndpoint(this.omniCounterA.address, this.lzEndpointMock.address) - this.lzEndpointMock.setDestLzEndpoint(this.omniCounterB.address, this.lzEndpointMock.address) - - // set each contracts source address so it can send to each other - this.omniCounterA.setTrustedSource(this.chainId, this.omniCounterB.address) - this.omniCounterB.setTrustedSource(this.chainId, this.omniCounterA.address) - }); - - it("increment the counter of the destination OmniCounter", async function () { - // ensure theyre both starting from 0 - expect(await this.omniCounterA.getCounter()).to.be.equal(0); // initial value - expect(await this.omniCounterB.getCounter()).to.be.equal(0); // initial value - - // instruct each OmniCounter to increment the other OmniCounter - // counter A increments counter B - await this.omniCounterA.incrementCounter( - this.chainId, - this.omniCounterB.address, - ); - expect(await this.omniCounterA.getCounter()).to.be.equal(0); // still 0 - expect(await this.omniCounterB.getCounter()).to.be.equal(1); // now its 1 - - // counter B increments counter A - await this.omniCounterB.incrementCounter( - this.chainId, - this.omniCounterA.address, - ); - expect(await this.omniCounterA.getCounter()).to.be.equal(1); // now its 1 - expect(await this.omniCounterB.getCounter()).to.be.equal(1); // still 1 - }); -}); diff --git a/test/OmnichainFungibleToken.test.js b/test/OmnichainFungibleToken.test.js deleted file mode 100644 index 9ba1b5c2..00000000 --- a/test/OmnichainFungibleToken.test.js +++ /dev/null @@ -1,73 +0,0 @@ -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("OmnichainFungibleToken", function () { - beforeEach(async function () { - this.accounts = await ethers.getSigners(); - this.owner = this.accounts[0]; - - const LZEndpointMock = await ethers.getContractFactory("LZEndpointMock"); - const OmnichainFungibleToken = await ethers.getContractFactory("OmnichainFungibleToken"); - - this.chainIdSrc = 1; - this.chainIdDst = 2; - - this.lzEndpointSrcMock = await LZEndpointMock.deploy(this.chainIdSrc); - this.lzEndpointDstMock = await LZEndpointMock.deploy(this.chainIdDst); - - this.initialSupplyOnEndpoint = ethers.utils.parseUnits("1000000", 18) - - // create two OmnichainFungibleToken instances - this.OmnichainFungibleTokenSrc = await OmnichainFungibleToken.deploy( - "NAME1", - "SYM1", - this.lzEndpointSrcMock.address, - this.chainIdSrc, - this.initialSupplyOnEndpoint - ); - this.OmnichainFungibleTokenDst = await OmnichainFungibleToken.deploy( - "NAME2", - "SYM2", - this.lzEndpointDstMock.address, - this.chainIdSrc, - 0 - ); - - this.lzEndpointSrcMock.setDestLzEndpoint(this.OmnichainFungibleTokenDst.address, this.lzEndpointDstMock.address) - this.lzEndpointDstMock.setDestLzEndpoint(this.OmnichainFungibleTokenSrc.address, this.lzEndpointSrcMock.address) - - // set each contracts source address so it can send to each other - await this.OmnichainFungibleTokenSrc.setTrustedSource(this.chainIdDst, this.OmnichainFungibleTokenDst.address) // for A, set B - await this.OmnichainFungibleTokenDst.setTrustedSource(this.chainIdSrc, this.OmnichainFungibleTokenSrc.address) // for B, set A - - // retrieve the starting tokens - this.startingTokens = await this.OmnichainFungibleTokenSrc.balanceOf(this.owner.address); - }); - - it("burn local tokens on source chain and mint on destination chain", async function () { - // ensure they're both starting from 1000000 - let a = await this.OmnichainFungibleTokenSrc.balanceOf(this.owner.address); - let b = await this.OmnichainFungibleTokenDst.balanceOf(this.owner.address); - expect(a).to.be.equal(this.startingTokens); - expect(b).to.be.equal("0x0"); - - // approve and send tokens - let sendQty = ethers.utils.parseUnits("100", 18) - await this.OmnichainFungibleTokenSrc.approve(this.OmnichainFungibleTokenSrc.address, sendQty); - await this.OmnichainFungibleTokenSrc.sendTokens( - this.chainIdDst, - this.owner.address, - sendQty, - ethers.constants.AddressZero, - 0 - ) - - // verify tokens burned on source chain and minted on destination chain - a = await this.OmnichainFungibleTokenSrc.balanceOf(this.owner.address); - b = await this.OmnichainFungibleTokenDst.balanceOf(this.owner.address); - expect(a).to.be.equal(this.startingTokens.sub(sendQty)); - expect(b).to.be.equal(sendQty); - }); -}); - - diff --git a/test/OmnichainNonFungibleToken.test.js b/test/OmnichainNonFungibleToken.test.js deleted file mode 100644 index 1e304593..00000000 --- a/test/OmnichainNonFungibleToken.test.js +++ /dev/null @@ -1,68 +0,0 @@ -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("OmnichainNonFungibleToken", function () { - beforeEach(async function () { - this.accounts = await ethers.getSigners(); - this.owner = this.accounts[0]; - - const LZEndpointMock = await ethers.getContractFactory("LZEndpointMock"); - const OmnichainNonFungibleToken = await ethers.getContractFactory("OmnichainNonFungibleToken"); - - this.chainIdSrc = 1; - this.chainIdDst = 2; - - this.lzEndpointSrcMock = await LZEndpointMock.deploy(this.chainIdSrc); - this.lzEndpointDstMock = await LZEndpointMock.deploy(this.chainIdDst); - - // create two OmnichainNonFungibleToken instances - this.OmnichainNonFungibleTokenSrc = await OmnichainNonFungibleToken.deploy( - "https://layerzero.network", - this.lzEndpointSrcMock.address, - 0, - 50 - ); - this.OmnichainNonFungibleTokenDst = await OmnichainNonFungibleToken.deploy( - "https://layerzero.network", - this.lzEndpointDstMock.address, - 50, - 100 - ); - - this.lzEndpointSrcMock.setDestLzEndpoint(this.OmnichainNonFungibleTokenDst.address, this.lzEndpointDstMock.address) - this.lzEndpointDstMock.setDestLzEndpoint(this.OmnichainNonFungibleTokenSrc.address, this.lzEndpointSrcMock.address) - - // set each contracts source address so it can send to each other - await this.OmnichainNonFungibleTokenSrc.setTrustedSource(this.chainIdDst, this.OmnichainNonFungibleTokenDst.address) // for A, set B - await this.OmnichainNonFungibleTokenDst.setTrustedSource(this.chainIdSrc, this.OmnichainNonFungibleTokenSrc.address) // for B, set A - }); - - it("mint on the source chain and send ONFT to the destination chain", async function () { - // mint OmnichainNonFungibleToken - await this.OmnichainNonFungibleTokenSrc.mint(); - // expected tokenId - let onftTokenId = 1; - - // verify the owner of the token is on the source chain - let currentOwner = await this.OmnichainNonFungibleTokenSrc.ownerOf(onftTokenId) - expect(currentOwner).to.be.equal(this.owner.address); - - // approve and send OmnichainNonFungibleToken - await this.OmnichainNonFungibleTokenSrc.approve(this.OmnichainNonFungibleTokenSrc.address, onftTokenId); - await this.OmnichainNonFungibleTokenSrc.transferOmnichainNFT( - this.chainIdDst, - onftTokenId - ) - - // verify the owner of the token is no longer on the source chain - await expect (this.OmnichainNonFungibleTokenSrc.ownerOf(onftTokenId)).to.revertedWith( - "ERC721: owner query for nonexistent token" - ); - - // verify the owner of the token is on the destination chain - currentOwner = await this.OmnichainNonFungibleTokenDst.ownerOf(onftTokenId) - expect(currentOwner).to.not.equal(this.owner); - }); -}); - - diff --git a/test/PingPong.test.js b/test/PingPong.test.js deleted file mode 100644 index 0f0ce4a5..00000000 --- a/test/PingPong.test.js +++ /dev/null @@ -1,43 +0,0 @@ -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("PingPong", function () { - - beforeEach(async function(){ - this.accounts = await ethers.getSigners(); - this.owner = this.accounts[0]; - - // use this chainId - this.chainId = 123; - - // create a LayerZero Endpoint mock for testing - const LZEndpointMock = await ethers.getContractFactory("LZEndpointMock"); - this.layerZeroEndpointMock = await LZEndpointMock.deploy(this.chainId); - this.mockEstimatedNativeFee = ethers.utils.parseEther('0.001') - this.mockEstimatedZroFee = ethers.utils.parseEther('0.00025') - await this.layerZeroEndpointMock.setEstimatedFees( - this.mockEstimatedNativeFee, - this.mockEstimatedZroFee, - ) - - // create two PingPong instances - const PingPong = await ethers.getContractFactory("PingPong"); - this.pingPongA = await PingPong.deploy(this.layerZeroEndpointMock.address); - this.pingPongB = await PingPong.deploy(this.layerZeroEndpointMock.address); - - await this.owner.sendTransaction({ - to: this.pingPongA.address, - value: ethers.utils.parseEther('0.0001') - }) - await this.owner.sendTransaction({ - to: this.pingPongB.address, - value: ethers.utils.parseEther('0.0001') - }) - }); - - it("increment the counter of the destination PingPong", async function () { - expect(await this.pingPongA.numPings()).to.equal(0) - expect(await this.pingPongB.numPings()).to.equal(0) - // await this.pingPongA.ping(this.chainId, this.pingPongB.address, 0); - }); -}); diff --git a/test/examples/OmniCounter.test.js b/test/examples/OmniCounter.test.js new file mode 100644 index 00000000..c7354d7f --- /dev/null +++ b/test/examples/OmniCounter.test.js @@ -0,0 +1,48 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("OmniCounter", function () { + beforeEach(async function () { + // use this chainId + this.chainId = 123 + + // create a LayerZero Endpoint mock for testing + const LayerZeroEndpointMock = await ethers.getContractFactory("LZEndpointMock") + this.lzEndpointMock = await LayerZeroEndpointMock.deploy(this.chainId) + + // create two OmniCounter instances + const OmniCounter = await ethers.getContractFactory("OmniCounter") + this.omniCounterA = await OmniCounter.deploy(this.lzEndpointMock.address) + this.omniCounterB = await OmniCounter.deploy(this.lzEndpointMock.address) + + this.lzEndpointMock.setDestLzEndpoint(this.omniCounterA.address, this.lzEndpointMock.address) + this.lzEndpointMock.setDestLzEndpoint(this.omniCounterB.address, this.lzEndpointMock.address) + + // set each contracts source address so it can send to each other + this.omniCounterA.setTrustedRemote( + this.chainId, + ethers.utils.solidityPack(["address", "address"], [this.omniCounterB.address, this.omniCounterA.address]) + ) + this.omniCounterB.setTrustedRemote( + this.chainId, + ethers.utils.solidityPack(["address", "address"], [this.omniCounterA.address, this.omniCounterB.address]) + ) + }) + + it("increment the counter of the destination OmniCounter", async function () { + // ensure theyre both starting from 0 + expect(await this.omniCounterA.counter()).to.be.equal(0) // initial value + expect(await this.omniCounterB.counter()).to.be.equal(0) // initial value + + // instruct each OmniCounter to increment the other OmniCounter + // counter A increments counter B + await this.omniCounterA.incrementCounter(this.chainId, { value: ethers.utils.parseEther("0.5") }) + expect(await this.omniCounterA.counter()).to.be.equal(0) // still 0 + expect(await this.omniCounterB.counter()).to.be.equal(1) // now its 1 + + // counter B increments counter A + await this.omniCounterB.incrementCounter(this.chainId, { value: ethers.utils.parseEther("0.5") }) + expect(await this.omniCounterA.counter()).to.be.equal(1) // now its 1 + expect(await this.omniCounterB.counter()).to.be.equal(1) // still 1 + }) +}) diff --git a/test/examples/PingPong.test.js b/test/examples/PingPong.test.js new file mode 100644 index 00000000..1b72a42d --- /dev/null +++ b/test/examples/PingPong.test.js @@ -0,0 +1,71 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +// fund "to" address by "value" from "signer" +const fund = async (signer, to, value) => { + ;( + await signer.sendTransaction({ + to, + value, + }) + ).wait() +} + +describe("PingPong", async function () { + const chainIdA = 1 + const chainIdB = 2 + // amount to fund each PingPong instance + const pingPongBalance = ethers.utils.parseEther(".1") + const gasForDstLzReceive = 350000 + + let LZEndpointMock, layerZeroEndpointMockA, layerZeroEndpointMockB + let PingPong, pingPongA, pingPongB + let owner + + before(async function () { + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + PingPong = await ethers.getContractFactory("PingPong") + owner = (await ethers.getSigners())[0] + }) + + beforeEach(async function () { + layerZeroEndpointMockA = await LZEndpointMock.deploy(chainIdA) + layerZeroEndpointMockB = await LZEndpointMock.deploy(chainIdB) + + // create two PingPong contract instances and provide native token balance + pingPongA = await PingPong.deploy(layerZeroEndpointMockA.address) + await fund(owner, pingPongA.address, pingPongBalance) + pingPongB = await PingPong.deploy(layerZeroEndpointMockB.address) + await fund(owner, pingPongB.address, pingPongBalance) + + await layerZeroEndpointMockA.setDestLzEndpoint(pingPongB.address, layerZeroEndpointMockB.address) + await layerZeroEndpointMockB.setDestLzEndpoint(pingPongA.address, layerZeroEndpointMockA.address) + + // enable bidirectional communication between pingPongA and pingPongB + await pingPongA.setTrustedRemote(chainIdB, ethers.utils.solidityPack(["address", "address"], [pingPongB.address, pingPongA.address])) // for A, set B + await pingPongB.setTrustedRemote(chainIdA, ethers.utils.solidityPack(["address", "address"], [pingPongA.address, pingPongB.address])) // for B, set A + }) + + it("ping back and forth once between PingPong contract instances", async function () { + const startBalanceA = await ethers.provider.getBalance(pingPongA.address) + const startBalanceB = await ethers.provider.getBalance(pingPongB.address) + + // Send one ping from A->B, then one pong back from B->A. Validate B emits a ping with count=1. + await expect(pingPongA.ping(chainIdB, 2)).to.emit(pingPongB, "Ping").withArgs(1) + + // Ensure pingPongA has emitted exactly one Ping with count=2 and no MessageFailed events. + const aPings = await pingPongA.queryFilter(pingPongA.filters.Ping(), 0, "latest") + expect(aPings.length).to.equal(1) + // waffle 3 is incapable of expect'ing multiple emits. + expect(pingPongA.interface.decodeEventLog("Ping", aPings[0].data).pingCount).to.equal(2) + expect((await pingPongA.queryFilter(pingPongA.filters.MessageFailed(), 0, "latest")).length).to.equal(0) + + // Ensure pingPongB has emitted one Ping and no MessageFailed events. + expect((await pingPongB.queryFilter(pingPongB.filters.Ping(), 0, "latest")).length).to.equal(1) + expect((await pingPongB.queryFilter(pingPongB.filters.MessageFailed(), 0, "latest")).length).to.equal(0) + + // Ensure PingPong contract balances have decreased. + expect(await ethers.provider.getBalance(pingPongA.address)).to.be.lt(startBalanceA.sub(gasForDstLzReceive)) + expect(await ethers.provider.getBalance(pingPongB.address)).to.be.lt(startBalanceB.sub(gasForDstLzReceive)) + }) +}) diff --git a/test/oft/v1/NativeOFT.test.js b/test/oft/v1/NativeOFT.test.js new file mode 100644 index 00000000..c1d2ae46 --- /dev/null +++ b/test/oft/v1/NativeOFT.test.js @@ -0,0 +1,468 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("NativeOFT: ", function () { + const baseChainId = 1 + const otherChainId = 2 + const name = "OmnichainFungibleToken" + const symbol = "OFT" + + let owner, alice, lzEndpointBase, lzEndpointOther, nativeOFT, otherOFT, LZEndpointMock, NativeOFT, OFT + + before(async function () { + owner = (await ethers.getSigners())[0] + alice = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + NativeOFT = await ethers.getContractFactory("NativeOFT") + OFT = await ethers.getContractFactory("OFT") + }) + + beforeEach(async function () { + lzEndpointBase = await LZEndpointMock.deploy(baseChainId) + lzEndpointOther = await LZEndpointMock.deploy(otherChainId) + + expect(await lzEndpointBase.getChainId()).to.equal(baseChainId) + expect(await lzEndpointOther.getChainId()).to.equal(otherChainId) + + //------ deploy: base & other chain ------------------------------------------------------- + // create two NativeOFT instances. both tokens have the same name and symbol on each chain + // 1. base chain + // 2. other chain + nativeOFT = await NativeOFT.deploy(name, symbol, lzEndpointBase.address) + otherOFT = await OFT.deploy(name, symbol, lzEndpointOther.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + await lzEndpointBase.setDestLzEndpoint(otherOFT.address, lzEndpointOther.address) + await lzEndpointOther.setDestLzEndpoint(nativeOFT.address, lzEndpointBase.address) + + //------ setTrustedRemote(s) ------------------------------------------------------- + // for each OFT, setTrustedRemote to allow it to receive from the remote OFT contract. + // Note: This is sometimes referred to as the "wire-up" process. + await nativeOFT.setTrustedRemoteAddress(otherChainId, otherOFT.address) + await otherOFT.setTrustedRemoteAddress(baseChainId, nativeOFT.address) + + await nativeOFT.setUseCustomAdapterParams(true) + // ... the deployed OFTs are ready now! + }) + + it("sendFrom() - tokens from main to other chain using default", async function () { + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(ethers.utils.parseUnits("0", 18)) + + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + + // ensure they're both allocated initial amounts + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("7", 18) + await nativeOFT.deposit({ value: depositAmount }) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let totalAmount = ethers.utils.parseUnits("8", 18) + + // estimate nativeFees + let nativeFee = (await nativeOFT.estimateSendFee(otherChainId, owner.address, totalAmount, false, "0x")).nativeFee + + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(ethers.utils.parseUnits("0", 18)) + + await nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + // expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance.sub(messageFee).sub(transFee).sub(depositAmount)) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFT.balanceOf(nativeOFT.address)).to.be.equal(totalAmount) + expect(await nativeOFT.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await otherOFT.balanceOf(owner.address)).to.be.equal(totalAmount) + + let ownerBalance2 = await ethers.provider.getBalance(owner.address) + + // estimate nativeFees + nativeFee = (await nativeOFT.estimateSendFee(baseChainId, owner.address, totalAmount, false, "0x")).nativeFee + + await otherOFT.sendFrom( + owner.address, + baseChainId, // destination chainId + alice.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: nativeFee.add(totalAmount) } // pass a msg.value to pay the LayerZero message fee + ) + + let transFee = ownerBalance2.sub(await ethers.provider.getBalance(owner.address)).sub(nativeFee) + expect(await ethers.provider.getBalance(alice.address)).to.be.equal(aliceBalance.add(totalAmount)) + expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance2.sub(nativeFee).sub(transFee)) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(leftOverAmount) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + }) + + it("sendFrom() - with enough native", async function () { + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + + // ensure they're both allocated initial amounts + let ownerBalance = await ethers.provider.getBalance(owner.address) + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("4", 18) + await nativeOFT.deposit({ value: depositAmount }) + + let transFee_1 = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(depositAmount) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let sentFee = ethers.utils.parseUnits("2", 18) + let totalAmount = ethers.utils.parseUnits("4", 18) + + let messageFee = ethers.utils.parseUnits("1", 18) // conversion to units of wei + + // estimate nativeFees + let nativeFee = (await nativeOFT.estimateSendFee(otherChainId, owner.address, totalAmount, false, "0x")).nativeFee + + await nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(lzEndpointOther.address)).to.be.equal(ethers.utils.parseUnits("0", 18)) + expect(await nativeOFT.balanceOf(nativeOFT.address)).to.be.equal(totalAmount) + expect(await nativeOFT.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await otherOFT.balanceOf(owner.address)).to.be.equal(totalAmount) + }) + + it("sendFrom() - from != sender with enough native", async function () { + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + + // ensure they're both allocated initial amounts + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("4", 18) + await nativeOFT.deposit({ value: depositAmount }) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let totalAmount = ethers.utils.parseUnits("4", 18) + + // approve the other user to send the tokens + await nativeOFT.approve(alice.address, totalAmount) + + // estimate nativeFees + let nativeFee = (await nativeOFT.estimateSendFee(otherChainId, owner.address, totalAmount, false, "0x")).nativeFee + + await nativeOFT.connect(alice).sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(lzEndpointOther.address)).to.be.equal(ethers.utils.parseUnits("0", 18)) + expect(await nativeOFT.balanceOf(nativeOFT.address)).to.be.equal(totalAmount) + expect(await nativeOFT.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await otherOFT.balanceOf(owner.address)).to.be.equal(totalAmount) + }) + + it("sendFrom() - from != sender with addition msg.value", async function () { + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + + // ensure they're both allocated initial amounts + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("3", 18) + await nativeOFT.deposit({ value: depositAmount }) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let sentFee = ethers.utils.parseUnits("2", 18) + let totalAmount = ethers.utils.parseUnits("4", 18) + + // approve the other user to send the tokens + await nativeOFT.approve(alice.address, totalAmount) + + // estimate nativeFees + let nativeFee = (await nativeOFT.estimateSendFee(otherChainId, owner.address, totalAmount, false, "0x")).nativeFee + + await nativeOFT.connect(alice).sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(lzEndpointBase.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(lzEndpointOther.address)).to.be.equal(ethers.utils.parseUnits("0", 18)) + expect(await nativeOFT.balanceOf(nativeOFT.address)).to.be.equal(totalAmount) + expect(await nativeOFT.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await otherOFT.balanceOf(owner.address)).to.be.equal(totalAmount) + }) + + it("sendFrom() - from != sender with not enough native", async function () { + // ensure they're both allocated initial amounts + let ownerBalance = await ethers.provider.getBalance(owner.address) + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("4", 18) + await nativeOFT.deposit({ value: depositAmount }) + + let transFee_1 = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(depositAmount) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let sentFee = ethers.utils.parseUnits("2", 18) + let totalAmount = ethers.utils.parseUnits("5", 18) + + // approve the other user to send the tokens + await nativeOFT.approve(alice.address, totalAmount) + + let messageFee = ethers.utils.parseUnits("0.5", 18) // conversion to units of wei + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + await expect( + nativeOFT.connect(alice).sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFT: Insufficient msg.value") + }) + + it("sendFrom() - from != sender not approved expect revert", async function () { + // ensure they're both allocated initial amounts + let ownerBalance = await ethers.provider.getBalance(owner.address) + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("4", 18) + await nativeOFT.deposit({ value: depositAmount }) + + let transFee_1 = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(depositAmount) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let sentFee = ethers.utils.parseUnits("2", 18) + let totalAmount = ethers.utils.parseUnits("4", 18) + + // approve the other user to send the tokens + // await nativeOFT.approve(alice.address, totalAmount) + + let messageFee = ethers.utils.parseUnits("1", 18) // conversion to units of wei + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + await expect( + nativeOFT.connect(alice).sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - with insufficient value and expect revert", async function () { + // ensure they're both allocated initial amounts + let ownerBalance = await ethers.provider.getBalance(owner.address) + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseUnits("4", 18) + await nativeOFT.deposit({ value: depositAmount }) + + let transFee_1 = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(depositAmount) + + expect(await nativeOFT.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseUnits("0", 18) + let sentFee = ethers.utils.parseUnits("2", 18) + let totalAmount = ethers.utils.parseUnits("8", 18) + + let messageFee = ethers.utils.parseUnits("3", 18) // conversion to units of wei + await nativeOFT.setUseCustomAdapterParams(false) + await otherOFT.setUseCustomAdapterParams(false) + await expect( + nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + "0x", // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFT: Insufficient msg.value") + }) + + it("sendFrom() - tokens from main to other chain using adapterParam", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + expect(await otherOFT.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseUnits("100", 18) + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFT.setMinDstGas(otherChainId, parseInt(await nativeOFT.PT_SEND()), 225000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + + await nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + adapterParam, // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + + // verify tokens burned on source chain and minted on destination chain + expect(await nativeOFT.balanceOf(nativeOFT.address)).to.be.equal(amount) + expect(await otherOFT.balanceOf(owner.address)).to.be.equal(amount) + }) + + it("setMinDstGas() - when type is not set on destination chain", async function () { + const amount = ethers.utils.parseUnits("100", 18) + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + adapterParam, // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: minGasLimit not set") + }) + + it("setMinDstGas() - set min dst gas higher than what we are sending and expect revert", async function () { + const amount = ethers.utils.parseUnits("100", 18) + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFT.setMinDstGas(otherChainId, parseInt(await nativeOFT.PT_SEND()), 250000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFT.sendFrom( + owner.address, + otherChainId, // destination chainId + owner.address, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + owner.address, // LayerZero refund address (if too much fee is sent gets refunded) + ethers.constants.AddressZero, // future parameter + adapterParam, // adapterParameters empty bytes specifies default settings + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: gas limit is too low") + }) + + it("wrap() and unwrap()", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.equal(0) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseUnits("100", 18) + await nativeOFT.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(amount) + + await nativeOFT.withdraw(amount) + transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.equal(0) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(transFee)) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + }) + + it("wrap() and unwrap() expect revert", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFT.address)).to.equal(0) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(0) + + let amount = ethers.utils.parseUnits("100", 18) + await nativeOFT.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFT.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFT.balanceOf(owner.address)).to.equal(amount) + + amount = ethers.utils.parseUnits("150", 18) + await expect(nativeOFT.withdraw(amount)).to.be.revertedWith("NativeOFT: Insufficient balance.") + }) +}) diff --git a/test/oft/v1/OFT.test.js b/test/oft/v1/OFT.test.js new file mode 100644 index 00000000..bc00fab3 --- /dev/null +++ b/test/oft/v1/OFT.test.js @@ -0,0 +1,226 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("OFT: ", function () { + const chainIdSrc = 1 + const chainIdDst = 2 + const name = "OmnichainFungibleToken" + const symbol = "OFT" + const globalSupply = ethers.utils.parseUnits("1000000", 18) + + let owner, lzEndpointSrcMock, lzEndpointDstMock, OFTSrc, OFTDst, LZEndpointMock, OFTMock, OFT, dstPath, srcPath + + before(async function () { + owner = (await ethers.getSigners())[0] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + OFTMock = await ethers.getContractFactory("OFTMock") + OFT = await ethers.getContractFactory("OFT") + }) + + beforeEach(async function () { + lzEndpointSrcMock = await LZEndpointMock.deploy(chainIdSrc) + lzEndpointDstMock = await LZEndpointMock.deploy(chainIdDst) + + // create two OmnichainFungibleToken instances + OFTSrc = await OFTMock.deploy(lzEndpointSrcMock.address) + OFTDst = await OFT.deploy(name, symbol, lzEndpointDstMock.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + lzEndpointSrcMock.setDestLzEndpoint(OFTDst.address, lzEndpointDstMock.address) + lzEndpointDstMock.setDestLzEndpoint(OFTSrc.address, lzEndpointSrcMock.address) + + // set each contracts source address so it can send to each other + dstPath = ethers.utils.solidityPack(["address", "address"], [OFTDst.address, OFTSrc.address]) + srcPath = ethers.utils.solidityPack(["address", "address"], [OFTSrc.address, OFTDst.address]) + await OFTSrc.setTrustedRemote(chainIdDst, dstPath) // for A, set B + await OFTDst.setTrustedRemote(chainIdSrc, srcPath) // for B, set A + + //set destination min gas + await OFTSrc.setMinDstGas(chainIdDst, parseInt(await OFTSrc.PT_SEND()), 220000) + await OFTSrc.setUseCustomAdapterParams(true) + + // mint initial tokens + await OFTSrc.mintTokens(owner.address, globalSupply) + }) + + describe("setting up stored payload", async function () { + // v1 adapterParams, encoded for version 1 style, and 200k gas quote + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + const sendQty = ethers.utils.parseUnits("1", 18) // amount to be sent across + + beforeEach(async function () { + // ensure they're both starting with correct amounts + expect(await OFTSrc.balanceOf(owner.address)).to.be.equal(globalSupply) + expect(await OFTDst.balanceOf(owner.address)).to.be.equal("0") + + // block receiving msgs on the dst lzEndpoint to simulate ua reverts which stores a payload + await lzEndpointDstMock.blockNextMsg() + + // estimate nativeFees + let nativeFee = (await OFTSrc.estimateSendFee(chainIdDst, owner.address, sendQty, false, adapterParam)).nativeFee + + // stores a payload + await expect( + OFTSrc.sendFrom( + owner.address, + chainIdDst, + ethers.utils.solidityPack(["address"], [owner.address]), + sendQty, + owner.address, + ethers.constants.AddressZero, + adapterParam, + { value: nativeFee } + ) + ).to.emit(lzEndpointDstMock, "PayloadStored") + + // verify tokens burned on source chain and minted on destination chain + expect(await OFTSrc.balanceOf(owner.address)).to.be.equal(globalSupply.sub(sendQty)) + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + }) + + it("hasStoredPayload() - stores the payload", async function () { + expect(await lzEndpointDstMock.hasStoredPayload(chainIdSrc, srcPath)).to.equal(true) + }) + + it("getLengthOfQueue() - cant send another msg if payload is blocked", async function () { + // queue is empty + expect(await lzEndpointDstMock.getLengthOfQueue(chainIdSrc, srcPath)).to.equal(0) + + // estimate nativeFees + let nativeFee = (await OFTSrc.estimateSendFee(chainIdDst, owner.address, sendQty, false, adapterParam)).nativeFee + + // now that a msg has been stored, subsequent ones will not revert, but will get added to the queue + await expect( + OFTSrc.sendFrom( + owner.address, + chainIdDst, + ethers.utils.solidityPack(["address"], [owner.address]), + sendQty, + owner.address, + ethers.constants.AddressZero, + adapterParam, + { value: nativeFee } + ) + ).to.not.reverted + + // queue has increased + expect(await lzEndpointDstMock.getLengthOfQueue(chainIdSrc, srcPath)).to.equal(1) + }) + + it("retryPayload() - delivers a stuck msg", async function () { + // balance before transfer is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + + const payload = ethers.utils.defaultAbiCoder.encode(["uint16", "bytes", "uint256"], [0, owner.address, sendQty]) + await expect(lzEndpointDstMock.retryPayload(chainIdSrc, srcPath, payload)).to.emit(lzEndpointDstMock, "PayloadCleared") + + // balance after transfer is sendQty + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(sendQty) + }) + + it("forceResumeReceive() - removes msg", async function () { + // balance before is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + + // forceResumeReceive deletes the stuck msg + await expect(OFTDst.forceResumeReceive(chainIdSrc, srcPath)).to.emit(lzEndpointDstMock, "UaForceResumeReceive") + + // stored payload gone + expect(await lzEndpointDstMock.hasStoredPayload(chainIdSrc, srcPath)).to.equal(false) + + // balance after transfer is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + }) + + it("forceResumeReceive() - removes msg, delivers all msgs in the queue", async function () { + const msgsInQueue = 3 + + // estimate nativeFees + let nativeFee = (await OFTSrc.estimateSendFee(chainIdDst, owner.address, sendQty, false, adapterParam)).nativeFee + + for (let i = 0; i < msgsInQueue; i++) { + // first iteration stores a payload, the following get added to queue + await OFTSrc.sendFrom( + owner.address, + chainIdDst, + ethers.utils.solidityPack(["address"], [owner.address]), + sendQty, + owner.address, + ethers.constants.AddressZero, + adapterParam, + { value: nativeFee } + ) + } + + // msg queue is full + expect(await lzEndpointDstMock.getLengthOfQueue(chainIdSrc, srcPath)).to.equal(msgsInQueue) + + // balance before is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + + // forceResumeReceive deletes the stuck msg + await expect(OFTDst.forceResumeReceive(chainIdSrc, srcPath)).to.emit(lzEndpointDstMock, "UaForceResumeReceive") + + // balance after transfer is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(sendQty.mul(msgsInQueue)) + + // msg queue is empty + expect(await lzEndpointDstMock.getLengthOfQueue(chainIdSrc, srcPath)).to.equal(0) + }) + + it("forceResumeReceive() - emptied queue is actually emptied and doesnt get double counted", async function () { + const msgsInQueue = 3 + + // estimate nativeFees + let nativeFee = (await OFTSrc.estimateSendFee(chainIdDst, owner.address, sendQty, false, adapterParam)).nativeFee + + for (let i = 0; i < msgsInQueue; i++) { + // first iteration stores a payload, the following gets added to queue + await OFTSrc.sendFrom( + owner.address, + chainIdDst, + ethers.utils.solidityPack(["address"], [owner.address]), + sendQty, + owner.address, + ethers.constants.AddressZero, + adapterParam, + { value: nativeFee } + ) + } + + // msg queue is full + expect(await lzEndpointDstMock.getLengthOfQueue(chainIdSrc, srcPath)).to.equal(msgsInQueue) + + // balance before is 0 + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(0) + + // forceResumeReceive deletes the stuck msg + await expect(OFTDst.forceResumeReceive(chainIdSrc, srcPath)).to.emit(lzEndpointDstMock, "UaForceResumeReceive") + + // balance after transfer + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(sendQty.mul(msgsInQueue)) + + // estimate nativeFees + nativeFee = (await OFTSrc.estimateSendFee(chainIdDst, owner.address, sendQty, false, adapterParam)).nativeFee + + // store a new payload + await lzEndpointDstMock.blockNextMsg() + await OFTSrc.sendFrom( + owner.address, + chainIdDst, + ethers.utils.solidityPack(["address"], [owner.address]), + sendQty, + owner.address, + ethers.constants.AddressZero, + adapterParam, + { value: nativeFee } + ) + + // forceResumeReceive deletes msgs but since there's nothing in the queue, balance shouldn't increase + await expect(OFTDst.forceResumeReceive(chainIdSrc, srcPath)).to.emit(lzEndpointDstMock, "UaForceResumeReceive") + + // balance after transfer remains the same + expect(await OFTDst.balanceOf(owner.address)).to.be.equal(sendQty.mul(msgsInQueue)) + }) + }) +}) diff --git a/test/oft/v1/ProxyOFT.test.js b/test/oft/v1/ProxyOFT.test.js new file mode 100644 index 00000000..61f10ab1 --- /dev/null +++ b/test/oft/v1/ProxyOFT.test.js @@ -0,0 +1,370 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("ProxyOFT: ", function () { + const chainId_A = 1 + const chainId_B = 2 + const chainId_C = 3 + const name = "OmnichainNonFungibleToken" + const symbol = "ONFT" + + let owner, warlock, lzEndpointMockA, lzEndpointMockB, lzEndpointMockC + let OFT_B, OFT_C, LZEndpointMock, OFT, ERC20, ERC20Src, ProxyOFT_A, ProxyOFT + + before(async function () { + owner = (await ethers.getSigners())[0] + warlock = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + OFT = await ethers.getContractFactory("OFT") + ProxyOFT = await ethers.getContractFactory("ProxyOFT") + ERC20 = await ethers.getContractFactory("ERC20Mock") + }) + + beforeEach(async function () { + lzEndpointMockA = await LZEndpointMock.deploy(chainId_A) + lzEndpointMockB = await LZEndpointMock.deploy(chainId_B) + lzEndpointMockC = await LZEndpointMock.deploy(chainId_C) + + // make an ERC20 to mock a previous deploy + ERC20Src = await ERC20.deploy("ERC20", "ERC20") + // generate a proxy to allow it to go OFT + ProxyOFT_A = await ProxyOFT.deploy(lzEndpointMockA.address, ERC20Src.address) + + // create OFT on dstChains + OFT_B = await OFT.deploy(name, symbol, lzEndpointMockB.address) + OFT_C = await OFT.deploy(name, symbol, lzEndpointMockC.address) + + // wire the lz endpoints to guide msgs back and forth + lzEndpointMockA.setDestLzEndpoint(OFT_B.address, lzEndpointMockB.address) + lzEndpointMockA.setDestLzEndpoint(OFT_C.address, lzEndpointMockC.address) + lzEndpointMockB.setDestLzEndpoint(ProxyOFT_A.address, lzEndpointMockA.address) + lzEndpointMockB.setDestLzEndpoint(OFT_C.address, lzEndpointMockC.address) + lzEndpointMockC.setDestLzEndpoint(ProxyOFT_A.address, lzEndpointMockA.address) + lzEndpointMockC.setDestLzEndpoint(OFT_B.address, lzEndpointMockB.address) + + // set each contracts source address so it can send to each other + await ProxyOFT_A.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [OFT_B.address, ProxyOFT_A.address])) + await ProxyOFT_A.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [OFT_C.address, ProxyOFT_A.address])) + await OFT_B.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyOFT_A.address, OFT_B.address])) + await OFT_B.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [OFT_C.address, OFT_B.address])) + await OFT_C.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyOFT_A.address, OFT_C.address])) + await OFT_C.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [OFT_B.address, OFT_C.address])) + }) + + it("sendFrom() - your own tokens", async function () { + const tokenAmount = 1234567 + await ERC20Src.mint(owner.address, tokenAmount) + + // verify owner has tokens + expect(await ERC20Src.balanceOf(owner.address)).to.be.equal(tokenAmount) + + // has no tokens on other chain + expect(await OFT_B.balanceOf(owner.address)).to.be.equal(0) + + // can transfer tokens on srcChain as regular erC20 + await ERC20Src.transfer(warlock.address, tokenAmount) + expect(await ERC20Src.balanceOf(warlock.address)).to.be.equal(tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.connect(warlock).approve(ProxyOFT_A.address, tokenAmount) + + // estimate nativeFees + let nativeFee = (await ProxyOFT_A.estimateSendFee(chainId_B, warlock.address, tokenAmount, false, "0x")).nativeFee + + // swaps token to other chain + await ProxyOFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are now owned by the proxy contract, because this is the original oft chain + expect(await ERC20Src.balanceOf(warlock.address)).to.equal(0) + + // tokens received on the dst chain + expect(await OFT_B.balanceOf(warlock.address)).to.be.equal(tokenAmount) + + // estimate nativeFees + nativeFee = (await OFT_B.estimateSendFee(chainId_C, warlock.address, tokenAmount, false, "0x")).nativeFee + + // can send to other oft contract eg. not the original oft contract chain + await OFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_C, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are burned on the sending chain + expect(await OFT_B.balanceOf(warlock.address)).to.be.equal(0) + + // tokens received on the dst chain + expect(await OFT_C.balanceOf(warlock.address)).to.be.equal(tokenAmount) + + // estimate nativeFees + nativeFee = (await OFT_C.estimateSendFee(chainId_A, warlock.address, tokenAmount, false, "0x")).nativeFee + + // send them back to the original chain + await OFT_C.connect(warlock).sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are burned on the sending chain + expect(await OFT_C.balanceOf(warlock.address)).to.be.equal(0) + + // received on the original chain + expect(await ERC20Src.balanceOf(warlock.address)).to.be.equal(tokenAmount) + }) + + it("sendFrom() - reverts if not approved on proxy", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + await expect( + ProxyOFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenAmount, owner.address, ethers.constants.AddressZero, "0x") + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - reverts if from is not msgSender", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.approve(ProxyOFT_A.address, tokenAmount) + + // swaps tokens to other chain + await expect( + ProxyOFT_A.connect(warlock).sendFrom( + owner.address, + chainId_B, + owner.address, + tokenAmount, + owner.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ProxyOFT: owner is not send caller") + }) + + it("sendFrom() - reverts if no balance to swap", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.approve(ProxyOFT_A.address, tokenAmount) + + // estimate nativeFees + let nativeFee = (await ProxyOFT_A.estimateSendFee(chainId_B, owner.address, tokenAmount, false, "0x")).nativeFee + + // swaps tokens to other chain + await ProxyOFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenAmount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // tokens received on the dst chain + expect(await OFT_B.balanceOf(owner.address)).to.be.equal(tokenAmount) + + // reverts because other address does not own tokens + await expect( + OFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_C, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: burn amount exceeds balance") + }) + + it("sendFrom() - on behalf of other user", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.approve(ProxyOFT_A.address, tokenAmount) + + // estimate nativeFees + let nativeFee = (await ProxyOFT_A.estimateSendFee(chainId_B, owner.address, tokenAmount, false, "0x")).nativeFee + + // swaps tokens to other chain + await ProxyOFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenAmount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // tokens received on the dst chain + expect(await OFT_B.balanceOf(owner.address)).to.be.equal(tokenAmount) + + // approve the other user to send the tokens + await OFT_B.approve(warlock.address, tokenAmount) + + // estimate nativeFees + nativeFee = (await OFT_B.estimateSendFee(chainId_C, warlock.address, tokenAmount, false, "0x")).nativeFee + + // sends across + await OFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens received on the dst chain + expect(await OFT_C.balanceOf(warlock.address)).to.be.equal(tokenAmount) + }) + + it("sendFrom() - reverts if contract is approved, but not the sending user", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.approve(ProxyOFT_A.address, tokenAmount) + + // estimate nativeFees + let nativeFee = (await ProxyOFT_A.estimateSendFee(chainId_B, owner.address, tokenAmount, false, "0x")).nativeFee + + // swaps tokens to other chain + await ProxyOFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenAmount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // tokens received on the dst chain + expect(await OFT_B.balanceOf(owner.address)).to.be.equal(tokenAmount) + + // approve the contract to swap your tokens + await OFT_B.approve(OFT_B.address, tokenAmount) + + // reverts because contract is approved, not the user + await expect( + OFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - reverts if not approved on non proxy chain", async function () { + const tokenAmount = 123 + await ERC20Src.mint(owner.address, tokenAmount) + + // approve the proxy to swap your tokens + await ERC20Src.approve(ProxyOFT_A.address, tokenAmount) + + // estimate nativeFees + let nativeFee = (await ProxyOFT_A.estimateSendFee(chainId_B, owner.address, tokenAmount, false, "0x")).nativeFee + + // swaps tokens to other chain + await ProxyOFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenAmount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // tokens received on the dst chain + expect(await OFT_B.balanceOf(owner.address)).to.be.equal(tokenAmount) + + // reverts because user is not approved + await expect( + OFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenAmount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - reverts if someone else is approved, but not the sender", async function () { + const tokenAmountA = 123 + const tokenAmountB = 456 + // mint to both owners + await ERC20Src.mint(owner.address, tokenAmountA) + await ERC20Src.mint(warlock.address, tokenAmountB) + + // approve owner.address to transfer, but not the other + await ERC20Src.approve(ProxyOFT_A.address, tokenAmountA) + + await expect( + ProxyOFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenAmountB, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + await expect( + ProxyOFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenAmountB, + owner.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - reverts if sender does not own token", async function () { + const tokenAmountA = 123 + const tokenAmountB = 456 + // mint to both owners + await ERC20Src.mint(owner.address, tokenAmountA) + await ERC20Src.mint(warlock.address, tokenAmountB) + + // approve owner.address to transfer, but not the other + await ERC20Src.approve(ProxyOFT_A.address, tokenAmountA) + + await expect( + ProxyOFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenAmountA, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + await expect( + ProxyOFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenAmountA, + owner.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) +}) diff --git a/test/oft/v2/ComposableProxyOFTV2.test.js b/test/oft/v2/ComposableProxyOFTV2.test.js new file mode 100644 index 00000000..5ee71051 --- /dev/null +++ b/test/oft/v2/ComposableProxyOFTV2.test.js @@ -0,0 +1,132 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("Composable ProxyOFT v2: ", function () { + const srcChainId = 1 + const dstChainId = 2 + + let srcEndpoint, dstEndpoint, proxyOFT, dstOFT, srcStaking, dstStaking, dstPath, srcPath, token + let owner, alice, bob, carol + let dstStakingAddressBytes32, srcStakingAddressBytes32 + + before(async function () { + const LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + const ProxyOFT = await ethers.getContractFactory("ProxyOFTV2") + const ERC20Mock = await ethers.getContractFactory("ERC20Mock") + const OFT = await ethers.getContractFactory("OFTV2") + const OFTStakingMock = await ethers.getContractFactory("OFTStakingMockV2") + + srcEndpoint = await LZEndpointMock.deploy(srcChainId) + dstEndpoint = await LZEndpointMock.deploy(dstChainId) + token = await ERC20Mock.deploy("Mock", "MOCK") + + proxyOFT = await ProxyOFT.deploy(token.address, 6, srcEndpoint.address) + dstOFT = await OFT.deploy("OFT", "OFT", 6, dstEndpoint.address) + + srcStaking = await OFTStakingMock.deploy(proxyOFT.address) + dstStaking = await OFTStakingMock.deploy(dstOFT.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + srcEndpoint.setDestLzEndpoint(dstOFT.address, dstEndpoint.address) + dstEndpoint.setDestLzEndpoint(proxyOFT.address, srcEndpoint.address) + + // set each contracts source address so it can send to each other + dstPath = ethers.utils.solidityPack(["address", "address"], [dstOFT.address, proxyOFT.address]) + srcPath = ethers.utils.solidityPack(["address", "address"], [proxyOFT.address, dstOFT.address]) + await proxyOFT.setTrustedRemote(dstChainId, dstPath) // for A, set B + await dstOFT.setTrustedRemote(srcChainId, srcPath) // for B, set A + + // set each contracts source address so it can send to each other + dstStakingAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [dstStaking.address]) + srcStakingAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [srcStaking.address]) + await srcStaking.setRemoteStakingContract(dstChainId, dstStakingAddressBytes32) + await dstStaking.setRemoteStakingContract(srcChainId, srcStakingAddressBytes32) + + // set destination min gas + await proxyOFT.setMinDstGas(dstChainId, parseInt(await proxyOFT.PT_SEND()), 225000) + await proxyOFT.setMinDstGas(dstChainId, parseInt(await proxyOFT.PT_SEND_AND_CALL()), 225000) + + owner = (await ethers.getSigners())[0] + alice = (await ethers.getSigners())[1] + bob = (await ethers.getSigners())[2] + carol = (await ethers.getSigners())[3] + + // mint initial tokens + await token.mint(owner.address, ethers.utils.parseEther("1000000")) + }) + + it("deposit on dst chain", async function () { + // owner transfer 100 ether token to alice + const amount = ethers.utils.parseEther("100") + await token.transfer(alice.address, amount) + expect(await token.balanceOf(alice.address)).to.equal(amount) + + // alice deposit 100 ether token to dst chain and transfer to bob + await token.connect(alice).approve(srcStaking.address, amount) + + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000 + 300000]) // min gas of OFT + gas for call + // deposit on dst chain + const fee = await srcStaking.quoteForDeposit(dstChainId, bob.address, amount, adapterParam) + + await srcStaking.connect(alice).depositToDstChain(dstChainId, bob.address, amount, adapterParam, { value: fee[0] }) + + // check balance + expect(await token.balanceOf(alice.address)).to.equal(0) + expect(await dstOFT.balanceOf(dstStaking.address)).to.equal(amount) + expect(await dstStaking.balances(bob.address)).to.equal(amount) + + // withdraw + await dstStaking.connect(bob).withdraw(amount) + expect(await dstOFT.balanceOf(dstStaking.address)).to.equal(0) + expect(await dstOFT.balanceOf(bob.address)).to.equal(amount) + }) + + it("failed to call on oft received for paused", async function () { + // owner transfer 50 ether token to alice + const amount = ethers.utils.parseEther("50") + + await token.transfer(alice.address, amount) + expect(await token.balanceOf(alice.address)).to.equal(amount) + + // carol 100 ether token to dst chain and transfer to bob + await token.connect(alice).approve(srcStaking.address, amount) + + await dstStaking.setPaused(true) // paused on dst chain + + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000 + 300000]) // min gas of OFT + gas for call + + // deposit on dst chain + const fee = await srcStaking.quoteForDeposit(dstChainId, carol.address, amount, adapterParam) + await srcStaking.connect(alice).depositToDstChain(dstChainId, carol.address, amount, adapterParam, { value: fee[0] }) + + // check balance + expect(await token.balanceOf(alice.address)).to.equal(0) + expect(await dstOFT.balanceOf(dstOFT.address)).to.equal(amount) + expect(await dstStaking.balances(carol.address)).to.equal(0) // failed to call onOFTReceived() for paused + + // should be 0 for failure to call onOFTReceived() + expect(await dstOFT.balanceOf(dstStaking.address)).to.equal(0) + }) + + it("retry to call onOFTReceived() by calling retryMessage()", async function () { + await dstStaking.setPaused(false) // unpaused on dst chain + + const amount = ethers.utils.parseEther("50") + const amountSD = amount.div(Math.pow(10, 12)) + const payloadForCall = ethers.utils.defaultAbiCoder.encode(["uint8", "bytes"], [1, carol.address]) + + // retry to call onOFTReceived() + const payload = ethers.utils.solidityPack( + ["uint8", "bytes32", "uint64", "bytes32", "uint64", "bytes"], + [1, dstStakingAddressBytes32, amountSD, srcStakingAddressBytes32, 300000, payloadForCall] + ) + + // console.log("_from", alice.address) + // console.log("_to", dstOFT.address) + // console.log("_amount", amount) + // console.log("payload", payload) + await dstOFT.retryMessage(srcChainId, srcPath, 2, payload) + expect(await dstStaking.balances(carol.address)).to.equal(amount) + expect(await dstOFT.balanceOf(dstStaking.address)).to.equal(amount) + }) +}) diff --git a/test/oft/v2/NativeOFTV2.test.js b/test/oft/v2/NativeOFTV2.test.js new file mode 100644 index 00000000..b991a313 --- /dev/null +++ b/test/oft/v2/NativeOFTV2.test.js @@ -0,0 +1,377 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("NativeOFTV2: ", function () { + const localChainId = 1 + const remoteChainId = 2 + const name = "NativeOFTV2" + const symbol = "NOFT" + const sharedDecimals = 6 + + let owner, alice, localEndpoint, remoteEndpoint, nativeOFTV2, remoteOFTV2, LZEndpointMock, NativeOFTV2, OFTV2, ownerAddressBytes32 + + let defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + before(async function () { + ;[owner, alice] = await ethers.getSigners() + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + NativeOFTV2 = await ethers.getContractFactory("NativeOFTV2") + OFTV2 = await ethers.getContractFactory("OFTV2") + }) + + beforeEach(async function () { + localEndpoint = await LZEndpointMock.deploy(localChainId) + remoteEndpoint = await LZEndpointMock.deploy(remoteChainId) + + //------ deploy: base & other chain ------------------------------------------------------- + // create two NativeOFTV2 instances. both tokens have the same name and symbol on each chain + // 1. base chain + // 2. other chain + nativeOFTV2 = await NativeOFTV2.deploy(name, symbol, sharedDecimals, localEndpoint.address) + remoteOFTV2 = await OFTV2.deploy(name, symbol, sharedDecimals, remoteEndpoint.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + await localEndpoint.setDestLzEndpoint(remoteOFTV2.address, remoteEndpoint.address) + await remoteEndpoint.setDestLzEndpoint(nativeOFTV2.address, localEndpoint.address) + + //------ setTrustedRemote(s) ------------------------------------------------------- + // for each OFTV2, setTrustedRemote to allow it to receive from the remote OFTV2 contract. + // Note: This is sometimes referred to as the "wire-up" process. + // set each contracts source address so it can send to each other + await nativeOFTV2.setTrustedRemoteAddress(remoteChainId, remoteOFTV2.address) + await remoteOFTV2.setTrustedRemoteAddress(localChainId, nativeOFTV2.address) + + await nativeOFTV2.setMinDstGas(remoteChainId, 0, 200000) + await nativeOFTV2.setMinDstGas(remoteChainId, 1, 200000) + await remoteOFTV2.setMinDstGas(localChainId, 0, 200000) + await remoteOFTV2.setMinDstGas(localChainId, 1, 200000) + + ownerAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [owner.address]) + }) + + it("sendFrom() - tokens from main to other chain using default", async function () { + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + + // ensure they're both allocated initial amounts + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(0) + + let depositAmount = ethers.utils.parseEther("7") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("8") + + // estimate nativeFees + let nativeFee = (await nativeOFTV2.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + await nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + // expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance.sub(messageFee).sub(transFee).sub(depositAmount)) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFTV2.balanceOf(nativeOFTV2.address)).to.be.equal(totalAmount) + expect(await nativeOFTV2.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTV2.balanceOf(owner.address)).to.be.equal(totalAmount) + expect(await nativeOFTV2.outboundAmount()).to.be.equal(totalAmount) + expect(await remoteOFTV2.totalSupply()).to.be.equal(totalAmount) + + + let ownerBalance2 = await ethers.provider.getBalance(owner.address) + + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + // estimate nativeFees + nativeFee = (await nativeOFTV2.estimateSendFee(localChainId, aliceAddressBytes32, totalAmount, false, defaultAdapterParams)).nativeFee + await remoteOFTV2.sendFrom( + owner.address, + localChainId, // destination chainId + aliceAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount) } // pass a msg.value to pay the LayerZero message fee + ) + + let transFee = ownerBalance2.sub(await ethers.provider.getBalance(owner.address)).sub(nativeFee) + expect(await ethers.provider.getBalance(alice.address)).to.be.equal(aliceBalance.add(totalAmount)) + expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance2.sub(nativeFee).sub(transFee)) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(leftOverAmount) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.totalSupply()).to.be.equal(leftOverAmount) + expect(await nativeOFTV2.outboundAmount()).to.be.equal(leftOverAmount) + }) + + it("sendFrom() - with enough native", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4.000000000000000001") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0.000000000000000001") + let totalAmount = ethers.utils.parseEther("4.000000000000000001") + let totalAmountMinusDust = ethers.utils.parseEther("4") + + // estimate nativeFees + let nativeFee = (await nativeOFTV2.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(remoteEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + expect(await nativeOFTV2.balanceOf(nativeOFTV2.address)).to.be.equal(totalAmountMinusDust) + expect(await nativeOFTV2.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTV2.balanceOf(owner.address)).to.be.equal(totalAmountMinusDust) + expect(await nativeOFTV2.outboundAmount()).to.be.equal(totalAmountMinusDust) + expect(await remoteOFTV2.totalSupply()).to.be.equal(totalAmountMinusDust) + }) + + it("sendFrom() - from != sender with addition msg.value", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("3") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("4") + + // approve the other user to send the tokens + await nativeOFTV2.approve(alice.address, totalAmount) + + // estimate nativeFees + let nativeFee = (await nativeOFTV2.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTV2.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(remoteEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + expect(await nativeOFTV2.balanceOf(nativeOFTV2.address)).to.be.equal(totalAmount) + expect(await nativeOFTV2.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTV2.balanceOf(owner.address)).to.be.equal(totalAmount) + expect(await nativeOFTV2.outboundAmount()).to.be.equal(totalAmount) + expect(await remoteOFTV2.totalSupply()).to.be.equal(totalAmount) + }) + + it("sendFrom() - from != sender with not enough native", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("5") + + // approve the other user to send the tokens + await nativeOFTV2.approve(alice.address, totalAmount) + + let messageFee = ethers.utils.parseEther("0.5") // conversion to units of wei + await expect( + nativeOFTV2.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFTV2: Insufficient msg.value") + }) + + it("sendFrom() - from != sender not approved expect revert", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("4") + + let messageFee = ethers.utils.parseEther("1") // conversion to units of wei + await expect( + nativeOFTV2.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - with insufficient value and expect revert", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTV2.deposit({ value: depositAmount }) + + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("8") + let messageFee = ethers.utils.parseEther("3") // conversion to units of wei + await expect( + nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFTV2: Insufficient msg.value") + }) + + it("sendFrom() - tokens from main to other chain using adapterParam", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTV2.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFTV2.setMinDstGas(remoteChainId, parseInt(await nativeOFTV2.PT_SEND()), 225000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + + // verify tokens burned on source chain and minted on destination chain + expect(await nativeOFTV2.balanceOf(nativeOFTV2.address)).to.be.equal(amount) + expect(await remoteOFTV2.balanceOf(owner.address)).to.be.equal(amount) + expect(await nativeOFTV2.outboundAmount()).to.be.equal(amount) + expect(await remoteOFTV2.totalSupply()).to.be.equal(amount) + }) + + it("setMinDstGas() - when type is not set on destination chain", async function () { + // reset the min dst to 0 + await nativeOFTV2.setMinDstGas(remoteChainId, 0, 0) + + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: minGasLimit not set") + }) + + it("setMinDstGas() - set min dst gas higher than what we are sending and expect revert", async function () { + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFTV2.setMinDstGas(remoteChainId, parseInt(await nativeOFTV2.PT_SEND()), 250000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFTV2.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: gas limit is too low") + }) + + it("wrap() and unwrap()", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(0) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseEther("100.000000000000000001") + await nativeOFTV2.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(amount) + + await nativeOFTV2.withdraw(amount) + transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)) + + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(0) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(transFee)) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + }) + + it("wrap() and unwrap() expect revert", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(0) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(0) + + let amount = ethers.utils.parseEther("100") + await nativeOFTV2.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFTV2.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFTV2.balanceOf(owner.address)).to.equal(amount) + + amount = ethers.utils.parseEther("150") + await expect(nativeOFTV2.withdraw(amount)).to.be.revertedWith("NativeOFTV2: Insufficient balance.") + }) +}) diff --git a/test/oft/v2/NativeOFTWithFee.test.js b/test/oft/v2/NativeOFTWithFee.test.js new file mode 100644 index 00000000..58b45cce --- /dev/null +++ b/test/oft/v2/NativeOFTWithFee.test.js @@ -0,0 +1,581 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("NativeOFTWithFee: ", function () { + const localChainId = 1 + const remoteChainId = 2 + const name = "NativeOFTWithFee" + const symbol = "NOFT" + const sharedDecimals = 6 + + let owner, + alice, + bob, + localEndpoint, + remoteEndpoint, + nativeOFTWithFee, + remoteOFTWithFee, + LZEndpointMock, + NativeOFTWithFee, + OFTWithFee, + ownerAddressBytes32 + + let defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + before(async function () { + ;[owner, alice, bob] = await ethers.getSigners() + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + NativeOFTWithFee = await ethers.getContractFactory("NativeOFTWithFee") + OFTWithFee = await ethers.getContractFactory("OFTWithFee") + }) + + beforeEach(async function () { + localEndpoint = await LZEndpointMock.deploy(localChainId) + remoteEndpoint = await LZEndpointMock.deploy(remoteChainId) + + //------ deploy: base & other chain ------------------------------------------------------- + // create two NativeOFTWithFee instances. both tokens have the same name and symbol on each chain + // 1. base chain + // 2. other chain + nativeOFTWithFee = await NativeOFTWithFee.deploy(name, symbol, sharedDecimals, localEndpoint.address) + remoteOFTWithFee = await OFTWithFee.deploy(name, symbol, sharedDecimals, remoteEndpoint.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + await localEndpoint.setDestLzEndpoint(remoteOFTWithFee.address, remoteEndpoint.address) + await remoteEndpoint.setDestLzEndpoint(nativeOFTWithFee.address, localEndpoint.address) + + //------ setTrustedRemote(s) ------------------------------------------------------- + // for each OFTV2, setTrustedRemote to allow it to receive from the remote OFTV2 contract. + // Note: This is sometimes referred to as the "wire-up" process. + // set each contracts source address so it can send to each other + await nativeOFTWithFee.setTrustedRemoteAddress(remoteChainId, remoteOFTWithFee.address) + await remoteOFTWithFee.setTrustedRemoteAddress(localChainId, nativeOFTWithFee.address) + + await nativeOFTWithFee.setMinDstGas(remoteChainId, 0, 200000) + await nativeOFTWithFee.setMinDstGas(remoteChainId, 1, 200000) + await remoteOFTWithFee.setMinDstGas(localChainId, 0, 200000) + await remoteOFTWithFee.setMinDstGas(localChainId, 1, 200000) + + ownerAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [owner.address]) + }) + + it("sendFrom() - tokens from main to other chain using default", async function () { + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + + // ensure they're both allocated initial amounts + let aliceBalance = await ethers.provider.getBalance(alice.address) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + + let depositAmount = ethers.utils.parseEther("7") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("8") + + // estimate nativeFees + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + // expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance.sub(messageFee).sub(transFee).sub(depositAmount)) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(totalAmount) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalAmount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalAmount) + + let ownerBalance2 = await ethers.provider.getBalance(owner.address) + + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + // estimate nativeFees + nativeFee = (await nativeOFTWithFee.estimateSendFee(localChainId, aliceAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await remoteOFTWithFee.sendFrom( + owner.address, + localChainId, // destination chainId + aliceAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount) } // pass a msg.value to pay the LayerZero message fee + ) + + let transFee = ownerBalance2.sub(await ethers.provider.getBalance(owner.address)).sub(nativeFee) + expect(await ethers.provider.getBalance(alice.address)).to.be.equal(aliceBalance.add(totalAmount)) + expect(await ethers.provider.getBalance(owner.address)).to.be.equal(ownerBalance2.sub(nativeFee).sub(transFee)) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(leftOverAmount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(leftOverAmount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(leftOverAmount) + }) + + it("sendFrom() w/ fee change - tokens from main to other chain", async function () { + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + + // set default fee to 0.01% + await nativeOFTWithFee.setDefaultFeeBp(1) + await nativeOFTWithFee.setFeeOwner(bob.address) + + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("8") + + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(0) + + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + // estimate nativeFees + let fee = await nativeOFTWithFee.quoteOFTFee(remoteChainId, totalAmount) + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, aliceAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + aliceAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount.sub(fee), // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount) } // pass a msg.value to pay the LayerZero message fee + ) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await nativeOFTWithFee.balanceOf(alice.address)).to.be.equal(leftOverAmount) + expect(await nativeOFTWithFee.balanceOf(bob.address)).to.be.equal(fee) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalAmount.sub(fee)) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalAmount.sub(fee)) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalAmount.sub(fee)) + }) + + it("sendFrom() w/ fee change - tokens from main to other chain without taking dust", async function () { + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + + // set default fee to 50% + await nativeOFTWithFee.setDefaultFeeBp(1) + await nativeOFTWithFee.setFeeOwner(bob.address) + + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("8.123456789") + + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(0) + + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + // estimate nativeFees + let fee = await nativeOFTWithFee.quoteOFTFee(remoteChainId, totalAmount) + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, aliceAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + + let ld2sdRate = 10 ** (18 - sharedDecimals) + let dust = totalAmount.sub(fee).mod(ld2sdRate) + let totalMintAmount = (totalAmount.sub(fee)).sub(dust) + + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + aliceAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalMintAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount) } // pass a msg.value to pay the LayerZero message fee + ) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await nativeOFTWithFee.balanceOf(bob.address)).to.be.equal(fee) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalMintAmount) + expect(await remoteOFTWithFee.balanceOf(alice.address)).to.be.equal(totalMintAmount) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalMintAmount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalMintAmount) + }) + + it("sendFrom() w/ fee change - deposit before send", async function () { + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + + // set default fee to 50% + await nativeOFTWithFee.setDefaultFeeBp(5000) + await nativeOFTWithFee.setFeeOwner(bob.address) + + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + + let depositAmount = ethers.utils.parseEther("7") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("8") + + // estimate nativeFees + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + await expect( + nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFTWithFee: amount is less than minAmount") + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(0) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(depositAmount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(0) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(leftOverAmount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(leftOverAmount) + + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + // estimate nativeFees + let fee = await nativeOFTWithFee.quoteOFTFee(remoteChainId, totalAmount) + nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, aliceAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + aliceAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount.sub(fee), // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) // collects + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await nativeOFTWithFee.balanceOf(alice.address)).to.be.equal(leftOverAmount) + expect(await nativeOFTWithFee.balanceOf(bob.address)).to.be.equal(fee) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalAmount.sub(fee)) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalAmount.div(2)) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalAmount.div(2)) + }) + + it("quote oft fee", async function () { + // default fee 0% + expect(await nativeOFTWithFee.quoteOFTFee(1, 10000)).to.be.equal(0) + + // change default fee to 10% + await nativeOFTWithFee.setDefaultFeeBp(1000) + expect(await nativeOFTWithFee.quoteOFTFee(1, 10000)).to.be.equal(1000) + + // change fee to 20% for chain 2 + await nativeOFTWithFee.setFeeBp(2, true, 2000) + expect(await nativeOFTWithFee.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await nativeOFTWithFee.quoteOFTFee(2, 10000)).to.be.equal(2000) + + // change fee to 0% for chain 2 + await nativeOFTWithFee.setFeeBp(2, true, 0) + expect(await nativeOFTWithFee.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await nativeOFTWithFee.quoteOFTFee(2, 10000)).to.be.equal(0) + + // disable fee for chain 2 + await nativeOFTWithFee.setFeeBp(2, false, 0) + expect(await nativeOFTWithFee.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await nativeOFTWithFee.quoteOFTFee(2, 10000)).to.be.equal(1000) + }) + + it("sendFrom() - with enough native", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4.000000000000000001") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0.000000000000000001") + let totalAmount = ethers.utils.parseEther("4.000000000000000001") + let minAmount = ethers.utils.parseEther("4.000000000000000000") + let totalAmountMinusDust = ethers.utils.parseEther("4") + + // estimate nativeFees + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + minAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(remoteEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalAmountMinusDust) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(totalAmountMinusDust) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalAmountMinusDust) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalAmountMinusDust) + }) + + it("sendFrom() - from != sender with addition msg.value", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("3") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let leftOverAmount = ethers.utils.parseEther("0") + let totalAmount = ethers.utils.parseEther("4") + + // approve the other user to send the tokens + await nativeOFTWithFee.approve(alice.address, totalAmount) + + // estimate nativeFees + let nativeFee = (await nativeOFTWithFee.estimateSendFee(remoteChainId, ownerAddressBytes32, totalAmount, false, defaultAdapterParams)) + .nativeFee + await nativeOFTWithFee.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee.add(totalAmount.sub(depositAmount)) } // pass a msg.value to pay the LayerZero message fee + ) + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await ethers.provider.getBalance(localEndpoint.address)).to.be.equal(nativeFee) + expect(await ethers.provider.getBalance(remoteEndpoint.address)).to.be.equal(ethers.utils.parseEther("0")) + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(totalAmount) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.be.equal(leftOverAmount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(totalAmount) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(totalAmount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(totalAmount) + }) + + it("sendFrom() - from != sender with not enough native", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("5") + + // approve the other user to send the tokens + await nativeOFTWithFee.approve(alice.address, totalAmount) + + let messageFee = ethers.utils.parseEther("0.5") // conversion to units of wei + await expect( + nativeOFTWithFee.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFTWithFee: Insufficient msg.value") + }) + + it("sendFrom() - from != sender not approved expect revert", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("4") + + let messageFee = ethers.utils.parseEther("1") // conversion to units of wei + await expect( + nativeOFTWithFee.connect(alice).sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("ERC20: insufficient allowance") + }) + + it("sendFrom() - with insufficient value and expect revert", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(0) + + let depositAmount = ethers.utils.parseEther("4") + await nativeOFTWithFee.deposit({ value: depositAmount }) + + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(depositAmount) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.be.equal(depositAmount) + + let totalAmount = ethers.utils.parseEther("8") + let messageFee = ethers.utils.parseEther("3") // conversion to units of wei + await expect( + nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + totalAmount, // quantity of tokens to send (in units of wei) + totalAmount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("NativeOFTWithFee: Insufficient msg.value") + }) + + it("sendFrom() - tokens from main to other chain using adapterParam", async function () { + // ensure they're both allocated initial amounts + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFTWithFee.setMinDstGas(remoteChainId, parseInt(await nativeOFTWithFee.PT_SEND()), 225000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + + // verify tokens burned on source chain and minted on destination chain + expect(await nativeOFTWithFee.balanceOf(nativeOFTWithFee.address)).to.be.equal(amount) + expect(await remoteOFTWithFee.balanceOf(owner.address)).to.be.equal(amount) + expect(await nativeOFTWithFee.outboundAmount()).to.be.equal(amount) + expect(await remoteOFTWithFee.totalSupply()).to.be.equal(amount) + }) + + it("setMinDstGas() - when type is not set on destination chain", async function () { + await nativeOFTWithFee.setMinDstGas(remoteChainId, 0, 0) + + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: minGasLimit not set") + }) + + it("setMinDstGas() - set min dst gas higher than what we are sending and expect revert", async function () { + const amount = ethers.utils.parseEther("100") + const messageFee = ethers.utils.parseEther("101") // conversion to units of wei + await nativeOFTWithFee.setMinDstGas(remoteChainId, parseInt(await nativeOFTWithFee.PT_SEND()), 250000) + const adapterParam = ethers.utils.solidityPack(["uint16", "uint256"], [1, 225000]) + await expect( + nativeOFTWithFee.sendFrom( + owner.address, + remoteChainId, // destination chainId + ownerAddressBytes32, // destination address to send tokens to + amount, // quantity of tokens to send (in units of wei) + amount, // quantity of tokens to send (in units of wei) + [owner.address, ethers.constants.AddressZero, adapterParam], + { value: messageFee } // pass a msg.value to pay the LayerZero message fee + ) + ).to.be.revertedWith("LzApp: gas limit is too low") + }) + + it("wrap() and unwrap()", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + + const amount = ethers.utils.parseEther("100.000000000000000001") + await nativeOFTWithFee.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(amount) + + await nativeOFTWithFee.withdraw(amount) + transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)) + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(transFee)) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + }) + + it("wrap() and unwrap() expect revert", async function () { + let ownerBalance = await ethers.provider.getBalance(owner.address) + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(0) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(0) + + let amount = ethers.utils.parseEther("100") + await nativeOFTWithFee.deposit({ value: amount }) + + let transFee = ownerBalance.sub(await ethers.provider.getBalance(owner.address)).sub(amount) + + expect(await ethers.provider.getBalance(nativeOFTWithFee.address)).to.equal(amount) + expect(await ethers.provider.getBalance(owner.address)).to.equal(ownerBalance.sub(amount).sub(transFee)) + expect(await nativeOFTWithFee.balanceOf(owner.address)).to.equal(amount) + + amount = ethers.utils.parseEther("150") + await expect(nativeOFTWithFee.withdraw(amount)).to.be.revertedWith("NativeOFTWithFee: Insufficient balance.") + }) +}) diff --git a/test/oft/v2/OFTV2.test.js b/test/oft/v2/OFTV2.test.js new file mode 100644 index 00000000..b3726be4 --- /dev/null +++ b/test/oft/v2/OFTV2.test.js @@ -0,0 +1,160 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") +const { BigNumber } = require("@ethersproject/bignumber") + +describe("OFT v2: ", function () { + const localChainId = 1 + const remoteChainId = 2 + const name = "OmnichainFungibleToken" + const symbol = "OFT" + const sharedDecimals = 5 + // const globalSupply = ethers.utils.parseUnits("1000000", 18) + + let LZEndpointMock, ERC20, ProxyOFTV2, OFTV2 + let localEndpoint, remoteEndpoint, localOFT, remoteOFT, erc20, remotePath, localPath + let owner, alice, bob + + let defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + before(async function () { + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ProxyOFTV2 = await ethers.getContractFactory("ProxyOFTV2") + OFTV2 = await ethers.getContractFactory("OFTV2") + ERC20 = await ethers.getContractFactory("ERC20Mock") + owner = (await ethers.getSigners())[0] + alice = (await ethers.getSigners())[1] + bob = (await ethers.getSigners())[2] + }) + + beforeEach(async function () { + localEndpoint = await LZEndpointMock.deploy(localChainId) + remoteEndpoint = await LZEndpointMock.deploy(remoteChainId) + + // create two OmnichainFungibleToken instances + erc20 = await ERC20.deploy("ERC20", "ERC20") + localOFT = await ProxyOFTV2.deploy(erc20.address, sharedDecimals, localEndpoint.address) + remoteOFT = await OFTV2.deploy(name, symbol, sharedDecimals, remoteEndpoint.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + await localEndpoint.setDestLzEndpoint(remoteOFT.address, remoteEndpoint.address) + await remoteEndpoint.setDestLzEndpoint(localOFT.address, localEndpoint.address) + + // set each contracts source address so it can send to each other + remotePath = ethers.utils.solidityPack(["address", "address"], [remoteOFT.address, localOFT.address]) + localPath = ethers.utils.solidityPack(["address", "address"], [localOFT.address, remoteOFT.address]) + + await localOFT.setMinDstGas(remoteChainId, 0, 200000) + await localOFT.setMinDstGas(remoteChainId, 1, 200000) + await remoteOFT.setMinDstGas(localChainId, 0, 200000) + await remoteOFT.setMinDstGas(localChainId, 1, 200000) + + await localOFT.setTrustedRemote(remoteChainId, remotePath) // for A, set B + await remoteOFT.setTrustedRemote(localChainId, localPath) // for B, set A + }) + + it("send tokens from proxy oft and receive them back", async function () { + const initialAmount = ethers.utils.parseEther("1.00000001") // 1 ether + const amount = ethers.utils.parseEther("1.00000000") + const dust = ethers.utils.parseEther("0.00000001") + await erc20.mint(alice.address, initialAmount) + + // verify alice has tokens and bob has no tokens on remote chain + expect(await erc20.balanceOf(alice.address)).to.be.equal(initialAmount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(0) + + // alice sends tokens to bob on remote chain + // approve the proxy to swap your tokens + await erc20.connect(alice).approve(localOFT.address, initialAmount) + + // swaps token to remote chain + const bobAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [bob.address]) + let nativeFee = (await localOFT.estimateSendFee(remoteChainId, bobAddressBytes32, initialAmount, false, defaultAdapterParams)).nativeFee + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + initialAmount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + // tokens are now owned by the proxy contract, because this is the original oft chain + expect(await erc20.balanceOf(localOFT.address)).to.equal(amount) + expect(await erc20.balanceOf(alice.address)).to.equal(dust) + + // tokens received on the remote chain + expect(await remoteOFT.totalSupply()).to.equal(amount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(amount) + + // bob send tokens back to alice from remote chain + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + const halfAmount = amount.div(2) + nativeFee = (await remoteOFT.estimateSendFee(localChainId, aliceAddressBytes32, halfAmount, false, defaultAdapterParams)).nativeFee + await remoteOFT + .connect(bob) + .sendFrom( + bob.address, + localChainId, + aliceAddressBytes32, + halfAmount, + [bob.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + // half tokens are burned on the remote chain + expect(await remoteOFT.totalSupply()).to.equal(halfAmount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(halfAmount) + + // tokens received on the local chain and unlocked from the proxy + expect(await erc20.balanceOf(localOFT.address)).to.be.equal(halfAmount) + // console.log(halfAmount, dust, typeof halfAmount, typeof dust) + // console.log(halfAmount.add(dust), typeof halfAmount.add(dust)) + expect(await erc20.balanceOf(alice.address)).to.be.equal(halfAmount.add(dust)) + }) + + it("total outbound amount overflow", async function () { + // alice try sending a huge amount of tokens to bob on remote chain + await erc20.mint(alice.address, ethers.constants.MaxUint256) + + const maxUint64 = BigNumber.from(2).pow(64).sub(1) + let amount = maxUint64.mul(BigNumber.from(10).pow(18 - sharedDecimals)) // sd to ld + + // swaps max amount of token to remote chain + await erc20.connect(alice).approve(localOFT.address, ethers.constants.MaxUint256) + const bobAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [bob.address]) + let nativeFee = (await localOFT.estimateSendFee(remoteChainId, bobAddressBytes32, amount, false, defaultAdapterParams)).nativeFee + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + amount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + amount = BigNumber.from(10).pow(18 - sharedDecimals) // min amount without dust + + // fails to send more for cap overflow + nativeFee = (await localOFT.estimateSendFee(remoteChainId, bobAddressBytes32, amount, false, defaultAdapterParams)).nativeFee + + try { + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + amount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + expect(false).to.be.true + } catch (e) { + expect(e.message).to.match(/ProxyOFT: outboundAmount overflow/) + } + }) +}) diff --git a/test/oft/v2/OFTV2WithFee.test.js b/test/oft/v2/OFTV2WithFee.test.js new file mode 100644 index 00000000..6b8a0e95 --- /dev/null +++ b/test/oft/v2/OFTV2WithFee.test.js @@ -0,0 +1,184 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") +const { BigNumber } = require("@ethersproject/bignumber") + +describe("OFT with fee: ", function () { + const localChainId = 1 + const remoteChainId = 2 + const name = "OmnichainFungibleToken" + const symbol = "OFT" + const sharedDecimals = 5 + // const globalSupply = ethers.utils.parseUnits("1000000", 18) + + let LZEndpointMock, ERC20, ProxyOFTV2, OFTV2 + let localEndpoint, remoteEndpoint, localOFT, remoteOFT, erc20, remotePath, localPath + let owner, alice, bob + + let defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + before(async function () { + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ProxyOFTV2 = await ethers.getContractFactory("ProxyOFTWithFee") + OFTV2 = await ethers.getContractFactory("OFTWithFee") + ERC20 = await ethers.getContractFactory("ERC20Mock") + owner = (await ethers.getSigners())[0] + alice = (await ethers.getSigners())[1] + bob = (await ethers.getSigners())[2] + }) + + beforeEach(async function () { + localEndpoint = await LZEndpointMock.deploy(localChainId) + remoteEndpoint = await LZEndpointMock.deploy(remoteChainId) + + // create two OmnichainFungibleToken instances + erc20 = await ERC20.deploy("ERC20", "ERC20") + localOFT = await ProxyOFTV2.deploy(erc20.address, sharedDecimals, localEndpoint.address) + remoteOFT = await OFTV2.deploy(name, symbol, sharedDecimals, remoteEndpoint.address) + + // internal bookkeeping for endpoints (not part of a real deploy, just for this test) + await localEndpoint.setDestLzEndpoint(remoteOFT.address, remoteEndpoint.address) + await remoteEndpoint.setDestLzEndpoint(localOFT.address, localEndpoint.address) + + // set each contracts source address so it can send to each other + remotePath = ethers.utils.solidityPack(["address", "address"], [remoteOFT.address, localOFT.address]) + localPath = ethers.utils.solidityPack(["address", "address"], [localOFT.address, remoteOFT.address]) + await localOFT.setTrustedRemote(remoteChainId, remotePath) // for A, set B + await remoteOFT.setTrustedRemote(localChainId, localPath) // for B, set A + + await localOFT.setMinDstGas(remoteChainId, 0, 200000) + await localOFT.setMinDstGas(remoteChainId, 1, 200000) + await remoteOFT.setMinDstGas(localChainId, 0, 200000) + await remoteOFT.setMinDstGas(localChainId, 1, 200000) + }) + + it("send tokens from proxy oft and receive them back", async function () { + const amount = ethers.utils.parseEther("1") // 1 ether + await erc20.mint(alice.address, amount) + + // verify alice has tokens and bob has no tokens on remote chain + expect(await erc20.balanceOf(alice.address)).to.be.equal(amount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(0) + + // alice sends tokens to bob on remote chain + // approve the proxy to swap your tokens + await erc20.connect(alice).approve(localOFT.address, amount) + + // swaps token to remote chain + const bobAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [bob.address]) + let nativeFee = (await localOFT.estimateSendFee(remoteChainId, bobAddressBytes32, amount, false, defaultAdapterParams)).nativeFee + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + amount, + amount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + // tokens are now owned by the proxy contract, because this is the original oft chain + expect(await erc20.balanceOf(localOFT.address)).to.equal(amount) + expect(await erc20.balanceOf(alice.address)).to.equal(0) + + // tokens received on the remote chain + expect(await remoteOFT.totalSupply()).to.equal(amount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(amount) + + // bob send tokens back to alice from remote chain + const aliceAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [alice.address]) + const halfAmount = amount.div(2) + nativeFee = (await remoteOFT.estimateSendFee(localChainId, aliceAddressBytes32, halfAmount, false, defaultAdapterParams)).nativeFee + await remoteOFT + .connect(bob) + .sendFrom( + bob.address, + localChainId, + aliceAddressBytes32, + halfAmount, + halfAmount, + [bob.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + // half tokens are burned on the remote chain + expect(await remoteOFT.totalSupply()).to.equal(halfAmount) + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(halfAmount) + + // tokens received on the local chain and unlocked from the proxy + expect(await erc20.balanceOf(localOFT.address)).to.be.equal(halfAmount) + expect(await erc20.balanceOf(alice.address)).to.be.equal(halfAmount) + }) + + it("quote oft fee", async function () { + // default fee 0% + expect(await localOFT.quoteOFTFee(1, 10000)).to.be.equal(0) + + // change default fee to 10% + await localOFT.setDefaultFeeBp(1000) + expect(await localOFT.quoteOFTFee(1, 10000)).to.be.equal(1000) + + // change fee to 20% for chain 2 + await localOFT.setFeeBp(2, true, 2000) + expect(await localOFT.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await localOFT.quoteOFTFee(2, 10000)).to.be.equal(2000) + + // change fee to 0% for chain 2 + await localOFT.setFeeBp(2, true, 0) + expect(await localOFT.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await localOFT.quoteOFTFee(2, 10000)).to.be.equal(0) + + // disable fee for chain 2 + await localOFT.setFeeBp(2, false, 0) + expect(await localOFT.quoteOFTFee(1, 10000)).to.be.equal(1000) + expect(await localOFT.quoteOFTFee(2, 10000)).to.be.equal(1000) + }) + + it("charge oft fee for sending", async function () { + const amount = ethers.utils.parseEther("1") // 1 ether + const halfAmount = amount.div(2) + + await erc20.mint(alice.address, amount) + + // set default fee to 50% + await localOFT.setDefaultFeeBp(5000) + + // swaps max amount of token to remote chain + const bobAddressBytes32 = ethers.utils.defaultAbiCoder.encode(["address"], [bob.address]) + await erc20.connect(alice).approve(localOFT.address, amount) + let nativeFee = (await localOFT.estimateSendFee(remoteChainId, bobAddressBytes32, amount, false, defaultAdapterParams)).nativeFee + try { + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + amount, + amount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + expect(false).to.be.true + } catch (e) { + expect(e.message).to.match(/BaseOFTWithFee: amount is less than minAmount/) + } + + await localOFT + .connect(alice) + .sendFrom( + alice.address, + remoteChainId, + bobAddressBytes32, + amount, + halfAmount, + [alice.address, ethers.constants.AddressZero, defaultAdapterParams], + { value: nativeFee } + ) + + expect(await remoteOFT.balanceOf(bob.address)).to.be.equal(halfAmount) + expect(await erc20.balanceOf(owner.address)).to.be.equal(halfAmount) // half tokens are fee + expect(await erc20.balanceOf(alice.address)).to.be.equal(0) + }) +}) diff --git a/test/onft1155/ProxyONFT1155.test.js b/test/onft1155/ProxyONFT1155.test.js new file mode 100644 index 00000000..4583273d --- /dev/null +++ b/test/onft1155/ProxyONFT1155.test.js @@ -0,0 +1,583 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("ProxyONFT1155: ", function () { + const chainId_A = 1 + const chainId_B = 2 + const chainId_C = 3 + const uri = "www.warlock.com" + + let owner, warlock, lzEndpointMockA, lzEndpointMockB, lzEndpointMockC + let ONFT_B, ONFT_C, LZEndpointMock, ONFT, ERC1155, ERC1155Src, ProxyONFT_A, ProxyONFT + + before(async function () { + owner = (await ethers.getSigners())[0] + warlock = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ONFT = await ethers.getContractFactory("ONFT1155") + ProxyONFT = await ethers.getContractFactory("ProxyONFT1155") + ERC1155 = await ethers.getContractFactory("ERC1155Mock") + }) + + beforeEach(async function () { + lzEndpointMockA = await LZEndpointMock.deploy(chainId_A) + lzEndpointMockB = await LZEndpointMock.deploy(chainId_B) + lzEndpointMockC = await LZEndpointMock.deploy(chainId_C) + + // make an ERC1155 to mock a previous deploy + ERC1155Src = await ERC1155.deploy(uri) + // generate a proxy to allow it to go ONFT + ProxyONFT_A = await ProxyONFT.deploy(lzEndpointMockA.address, ERC1155Src.address) + + // create ONFT on dstChains + ONFT_B = await ONFT.deploy(uri, lzEndpointMockB.address) + ONFT_C = await ONFT.deploy(uri, lzEndpointMockC.address) + + // wire the lz endpoints to guide msgs back and forth + lzEndpointMockA.setDestLzEndpoint(ONFT_B.address, lzEndpointMockB.address) + lzEndpointMockA.setDestLzEndpoint(ONFT_C.address, lzEndpointMockC.address) + lzEndpointMockB.setDestLzEndpoint(ProxyONFT_A.address, lzEndpointMockA.address) + lzEndpointMockB.setDestLzEndpoint(ONFT_C.address, lzEndpointMockC.address) + lzEndpointMockC.setDestLzEndpoint(ProxyONFT_A.address, lzEndpointMockA.address) + lzEndpointMockC.setDestLzEndpoint(ONFT_B.address, lzEndpointMockB.address) + + // set each contracts source address so it can send to each other + await ProxyONFT_A.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [ONFT_B.address, ProxyONFT_A.address])) + await ProxyONFT_A.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [ONFT_C.address, ProxyONFT_A.address])) + await ONFT_B.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyONFT_A.address, ONFT_B.address])) + await ONFT_B.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [ONFT_C.address, ONFT_B.address])) + await ONFT_C.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyONFT_A.address, ONFT_C.address])) + await ONFT_C.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [ONFT_B.address, ONFT_C.address])) + }) + + it("sendFrom()", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + // verify the owner owns tokens + expect(await ERC1155Src.balanceOf(owner.address, tokenId)).to.be.equal(amount) + + // token doesn't exist on other chain + expect(await ONFT_B.balanceOf(owner.address, tokenId)).to.be.equal(0) + + // can transfer token on srcChain as regular erC1155 + await ERC1155Src.safeTransferFrom(owner.address, warlock.address, tokenId, amount, "0x") + expect(await ERC1155Src.balanceOf(warlock.address, tokenId)).to.be.equal(amount) + expect(await ERC1155Src.balanceOf(owner.address, tokenId)).to.be.equal(0) + + // approve the proxy to swap your token + await ERC1155Src.connect(warlock).setApprovalForAll(ProxyONFT_A.address, true) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, warlock.address, tokenId, amount, false, "0x")).nativeFee + + // swaps token to other chain + await ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // token is now owned by the proxy contract, because this is the original nft chain + expect(await ERC1155Src.balanceOf(ProxyONFT_A.address, tokenId)).to.be.equal(amount) + expect(await ERC1155Src.balanceOf(warlock.address, tokenId)).to.be.equal(0) + + // token received on the dst chain + expect(await ONFT_B.balanceOf(warlock.address, tokenId)).to.be.equal(amount) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_C, warlock.address, tokenId, amount, false, "0x")).nativeFee + + // can send to other onft contract eg. not the original nft contract chain + await ONFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_C, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // token is burned on the sending chain + expect(await ONFT_B.balanceOf(warlock.address, tokenId)).to.be.equal(0) + + // token received on the dst chain + expect(await ONFT_C.balanceOf(warlock.address, tokenId)).to.be.equal(amount) + + // estimate nativeFees + nativeFee = (await ONFT_C.estimateSendFee(chainId_A, warlock.address, tokenId, amount, false, "0x")).nativeFee + + // send it back to the original chain + await ONFT_C.connect(warlock).sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // token is burned on the sending chain + expect(await ONFT_C.balanceOf(warlock.address, tokenId)).to.be.equal(0) + + // is received on the original chain + expect(await ERC1155Src.balanceOf(warlock.address, tokenId)).to.be.equal(amount) + + // proxy no longer owns + expect(await ERC1155Src.balanceOf(ProxyONFT_A.address, tokenId)).to.be.equal(0) + }) + + it("sendFrom() - reverts if not approved on proxy", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + await expect( + ProxyONFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenId, amount, owner.address, ethers.constants.AddressZero, "0x") + ).to.be.revertedWith("ERC1155: caller is not token owner or approved") + }) + + it("sendFrom() - reverts if from is not msgSender", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + // approve the proxy to swap your token + await ERC1155Src.setApprovalForAll(ProxyONFT_A.address, tokenId) + + // swaps token to other chain + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + amount, + owner.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ProxyONFT1155: owner is not send caller") + }) + + it("sendFrom() - reverts if someone else is has approved on the proxy, but not the sender", async function () { + const tokenId = 123 + const amount = 1 + // mint to both owners + await ERC1155Src.mint(owner.address, tokenId, amount) + await ERC1155Src.mint(warlock.address, tokenId, amount) + + // approve owner.address to transfer, but not the other + await ERC1155Src.setApprovalForAll(ProxyONFT_A.address, true) + + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC1155: caller is not token owner or approved") + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenId, + amount, + owner.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC1155: caller is not token owner or approved") + }) + + it("sendFrom() - on non proxy", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + // approve the proxy to swap your token + await ERC1155Src.setApprovalForAll(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, amount, false, "0x")).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenId, amount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // token received on the dst chain + expect(await ONFT_B.balanceOf(owner.address, tokenId)).to.be.equal(amount) + + // approve the other user to send the token + await ONFT_B.setApprovalForAll(warlock.address, tokenId) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_C, warlock.address, tokenId, amount, false, "0x")).nativeFee + + // sends across + await ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // token received on the dst chain + expect(await ONFT_C.balanceOf(warlock.address, tokenId)).to.be.equal(amount) + }) + + it("sendFrom() - reverts if contract is approved, but not the sending user on non proxy", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + // approve the proxy to swap your token + await ERC1155Src.setApprovalForAll(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, amount, false, "0x")).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenId, amount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // token received on the dst chain + expect(await ONFT_B.balanceOf(owner.address, tokenId)).to.be.equal(amount) + + // approve the proxy to swap your token + await ONFT_B.setApprovalForAll(ONFT_B.address, tokenId) + + // reverts because proxy is approved, not the user + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ONFT1155: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if not approved on non proxy chain", async function () { + const tokenId = 123 + const amount = 1 + await ERC1155Src.mint(owner.address, tokenId, amount) + + // approve the proxy to swap your token + await ERC1155Src.setApprovalForAll(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, amount, false, "0x")).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom(owner.address, chainId_B, owner.address, tokenId, amount, owner.address, ethers.constants.AddressZero, "0x", { + value: nativeFee, + }) + + // token received on the dst chain + expect(await ONFT_B.balanceOf(owner.address, tokenId)).to.be.equal(amount) + + // reverts because not approved + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ONFT1155: send caller is not owner nor approved") + }) + + it("sendBatchFrom()", async function () { + const tokenIds = [123, 456, 7890, 101112131415] + const amounts = [1, 33, 22, 1234566] + const emptyAmounts = [0, 0, 0, 0] + const listOfOwner = tokenIds.map((x) => owner.address) + const listOfWarlock = tokenIds.map((x) => warlock.address) + const listOfProxyA = tokenIds.map((x) => ProxyONFT_A.address) + + function checkTokenBalance(balances, expectedBalances) { + expect(balances.length).to.equal(expectedBalances.length) + for (let i = 0; i < balances.length; i++) { + expect(balances[i].toNumber()).to.equal(expectedBalances[i]) + } + } + + // mint large batch of tokens + await ERC1155Src.mintBatch(owner.address, tokenIds, amounts) + + // verify the owner owns tokens + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfOwner, tokenIds), amounts) + + // tokens don't exist on other chain + checkTokenBalance(await ONFT_B.balanceOfBatch(listOfOwner, tokenIds), emptyAmounts) + + // can transfer tokens on srcChain as regular erC1155 + await ERC1155Src.safeBatchTransferFrom(owner.address, warlock.address, tokenIds, amounts, "0x") + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfWarlock, tokenIds), amounts) + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfOwner, tokenIds), emptyAmounts) + + // approve the proxy to swap your tokens + await ERC1155Src.connect(warlock).setApprovalForAll(ProxyONFT_A.address, true) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds.slice(1), amounts.slice(1), false, "0x")) + .nativeFee + + // swaps tokens to other chain in seperate batches + await ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds.slice(1), + amounts.slice(1), + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // estimate nativeFees + nativeFee = (await ProxyONFT_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds.slice(0, 1), amounts.slice(0, 1), false, "0x")) + .nativeFee + + await ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds.slice(0, 1), + amounts.slice(0, 1), + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are now owned by the proxy contract, because this is the original nft chain + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfProxyA, tokenIds), amounts) + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfWarlock, tokenIds), emptyAmounts) + + // tokens received on the dst chain + checkTokenBalance(await ONFT_B.balanceOfBatch(listOfWarlock, tokenIds), amounts) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendBatchFee(chainId_C, owner.address, tokenIds, amounts, false, "0x")).nativeFee + + // can send to other onft contract eg. not the original nft contract chain, and a different address + // eg. warlock -> owner + await ONFT_B.connect(warlock).sendBatchFrom( + warlock.address, + chainId_C, + owner.address, + tokenIds, + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are burned on the sending chain + checkTokenBalance(await ONFT_B.balanceOfBatch(listOfWarlock, tokenIds), emptyAmounts) + + // tokens received on the dst chain + checkTokenBalance(await ONFT_C.balanceOfBatch(listOfOwner, tokenIds), amounts) + + // estimate nativeFees + nativeFee = (await ONFT_C.estimateSendBatchFee(chainId_A, warlock.address, tokenIds, amounts, false, "0x")).nativeFee + + // send it back to the original chain, and original owner + await ONFT_C.sendBatchFrom( + owner.address, + chainId_A, + warlock.address, + tokenIds, + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: nativeFee } + ) + + // tokens are burned on the sending chain + checkTokenBalance(await ONFT_C.balanceOfBatch(listOfWarlock, tokenIds), emptyAmounts) + + // is received on the original chain + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfWarlock, tokenIds), amounts) + + // proxy no longer owns + checkTokenBalance(await ERC1155Src.balanceOfBatch(listOfProxyA, tokenIds), emptyAmounts) + }) + + it("sendBatch() - reverts if not approved", async function () { + const tokenIds = [123, 456, 7890, 101112131415] + const amounts = [1, 33, 22, 1234566] + await ERC1155Src.mintBatch(owner.address, tokenIds, amounts) + + await expect( + ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC1155: caller is not token owner or approved") + }) + + it("sendBatch() - reverts if mismatched amounts and tokenIds", async function () { + const tokenIds = [123, 456, 7890, 101112131415] + const amounts = [1, 33, 22, 44] + await ERC1155Src.mintBatch(owner.address, tokenIds, amounts) + + // approve the proxy to swap your tokens + await ERC1155Src.connect(warlock).setApprovalForAll(ProxyONFT_A.address, true) + + // mismatch the length of ids and amounts + await expect( + ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds.slice(1), + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x" + ) + ).to.be.revertedWith("ERC1155: ids and amounts length mismatch'") + }) + + it("estimateSendFee()", async function () { + const tokenId = 123 + const amount = 11 + const nativeFee = 123 + const zroFee = 666 + + // mint large batch of tokens + await ERC1155Src.mint(warlock.address, tokenId, amount) + + // approve the proxy to swap your tokens + await ERC1155Src.connect(warlock).setApprovalForAll(ProxyONFT_A.address, true) + + // estimate the fees + const fees = await ProxyONFT_A.estimateSendFee(chainId_B, warlock.address, tokenId, amount, false, "0x") + + // reverts with not enough native + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { + value: fees.nativeFee.sub(1), + } + ) + ).to.be.reverted + + // does not revert with correct amount + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + amount, + warlock.address, + ethers.constants.AddressZero, + "0x", + { + value: fees.nativeFee, + } + ) + ).to.not.reverted + }) + + it("estimateSendBatchFee()", async function () { + const tokenIds = [123, 456, 7890, 101112131415] + const amounts = [1, 33, 22, 1234566] + const nativeFee = 123 + const zroFee = 666 + + // mint large batch of tokens + await ERC1155Src.mintBatch(warlock.address, tokenIds, amounts) + + // approve the proxy to swap your tokens + await ERC1155Src.connect(warlock).setApprovalForAll(ProxyONFT_A.address, true) + + // estimate the fees + const fees = await ProxyONFT_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds, amounts, false, "0x") + + // reverts with not enough native + await expect( + ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: fees.nativeFee.sub(1) } + ) + ).to.be.reverted + + // does not revert with correct amount + await expect( + ProxyONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + amounts, + warlock.address, + ethers.constants.AddressZero, + "0x", + { value: fees.nativeFee } + ) + ).to.not.reverted + }) +}) diff --git a/test/onft721/ONFT721.test.js b/test/onft721/ONFT721.test.js new file mode 100644 index 00000000..df6cfccb --- /dev/null +++ b/test/onft721/ONFT721.test.js @@ -0,0 +1,464 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") +const Web3 = require("web3") +const web3 = new Web3() + +describe("ONFT721: ", function () { + const chainId_A = 1 + const chainId_B = 2 + const name = "OmnichainNonFungibleToken" + const symbol = "ONFT" + const minGasToStore = 150000 + const batchSizeLimit = 300 + const defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + let owner, warlock, lzEndpointMockA, lzEndpointMockB, LZEndpointMock, ONFT, ONFT_A, ONFT_B + + before(async function () { + owner = (await ethers.getSigners())[0] + warlock = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ONFT = await ethers.getContractFactory("ONFT721Mock") + }) + + beforeEach(async function () { + lzEndpointMockA = await LZEndpointMock.deploy(chainId_A) + lzEndpointMockB = await LZEndpointMock.deploy(chainId_B) + + // generate a proxy to allow it to go ONFT + ONFT_A = await ONFT.deploy(name, symbol, minGasToStore, lzEndpointMockA.address) + ONFT_B = await ONFT.deploy(name, symbol, minGasToStore, lzEndpointMockB.address) + + // wire the lz endpoints to guide msgs back and forth + lzEndpointMockA.setDestLzEndpoint(ONFT_B.address, lzEndpointMockB.address) + lzEndpointMockB.setDestLzEndpoint(ONFT_A.address, lzEndpointMockA.address) + + // set each contracts source address so it can send to each other + await ONFT_A.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [ONFT_B.address, ONFT_A.address])) + await ONFT_B.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ONFT_A.address, ONFT_B.address])) + + // set batch size limit + await ONFT_A.setDstChainIdToBatchLimit(chainId_B, batchSizeLimit) + await ONFT_B.setDstChainIdToBatchLimit(chainId_A, batchSizeLimit) + + // set min dst gas for swap + await ONFT_A.setMinDstGas(chainId_B, 1, 150000) + await ONFT_B.setMinDstGas(chainId_A, 1, 150000) + }) + + it("sendFrom() - your own tokens", async function () { + const tokenId = 123 + await ONFT_A.mint(owner.address, tokenId) + + // verify the owner of the token is on the source chain + expect(await ONFT_A.ownerOf(tokenId)).to.be.equal(owner.address) + + // token doesn't exist on other chain + await expect(ONFT_B.ownerOf(tokenId)).to.be.revertedWith("ERC721: invalid token ID") + + // can transfer token on srcChain as regular erC721 + await ONFT_A.transferFrom(owner.address, warlock.address, tokenId) + expect(await ONFT_A.ownerOf(tokenId)).to.be.equal(warlock.address) + + // approve the proxy to swap your token + await ONFT_A.connect(warlock).approve(ONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendFee(chainId_B, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is burnt + expect(await ONFT_A.ownerOf(tokenId)).to.be.equal(ONFT_A.address) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(warlock.address) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_A, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // can send to other onft contract eg. not the original nft contract chain + await ONFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is burned on the sending chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(ONFT_B.address) + }) + + it("sendFrom() - reverts if not owner on non proxy chain", async function () { + const tokenId = 123 + await ONFT_A.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ONFT_A.approve(ONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because other address does not own it + await expect( + ONFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - on behalf of other user", async function () { + const tokenId = 123 + await ONFT_A.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ONFT_A.approve(ONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the other user to send the token + await ONFT_B.approve(warlock.address, tokenId) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_A, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // sends across + await ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await ONFT_A.ownerOf(tokenId)).to.be.equal(warlock.address) + }) + + it("sendFrom() - reverts if contract is approved, but not the sending user", async function () { + const tokenId = 123 + await ONFT_A.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ONFT_A.approve(ONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the contract to swap your token + await ONFT_B.approve(ONFT_B.address, tokenId) + + // reverts because contract is approved, not the user + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if not approved on non proxy chain", async function () { + const tokenId = 123 + await ONFT_A.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ONFT_A.approve(ONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because user is not approved + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if sender does not own token", async function () { + const tokenIdA = 123 + const tokenIdB = 456 + // mint to both owners + await ONFT_A.mint(owner.address, tokenIdA) + await ONFT_A.mint(warlock.address, tokenIdB) + + // approve owner.address to transfer, but not the other + await ONFT_A.setApprovalForAll(ONFT_A.address, true) + + await expect( + ONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIdA, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + await expect( + ONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenIdA, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendBatchFrom()", async function () { + await ONFT_A.setMinGasToTransferAndStore(400000) + await ONFT_B.setMinGasToTransferAndStore(400000) + + const tokenIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + + // mint to owner + for (let tokenId of tokenIds) { + await ONFT_A.mint(warlock.address, tokenId) + } + + // approve owner.address to transfer + await ONFT_A.connect(warlock).setApprovalForAll(ONFT_A.address, true) + + // expected event params + const payload = ethers.utils.defaultAbiCoder.encode(["bytes", "uint[]"], [warlock.address, tokenIds]) + const hashedPayload = web3.utils.keccak256(payload) + + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds, false, defaultAdapterParams)).nativeFee + + // initiate batch transfer + await expect( + ONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + warlock.address, + ethers.constants.AddressZero, + adapterParams, // TODO might need to change this + { value: nativeFee } + ) + ) + .to.emit(ONFT_B, "CreditStored") + .withArgs(hashedPayload, payload) + + // only partial amount of tokens has been sent, the rest have been stored as a credit + let creditedIdsA = [] + for (let tokenId of tokenIds) { + let owner = await ONFT_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsA.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // clear the rest of the credits + await expect(ONFT_B.clearCredits(payload)).to.emit(ONFT_B, "CreditCleared").withArgs(hashedPayload) + + let creditedIdsB = [] + for (let tokenId of creditedIdsA) { + let owner = await ONFT_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsB.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // all ids should have cleared + expect(creditedIdsB.length).to.be.equal(0) + + // should revert because payload is no longer valid + await expect(ONFT_B.clearCredits(payload)).to.be.revertedWith("no credits stored") + }) + + it("sendBatchFrom() - large batch", async function () { + await ONFT_A.setMinGasToTransferAndStore(400000) + await ONFT_B.setMinGasToTransferAndStore(400000) + + const tokenIds = [] + + for (let i = 1; i <= 300; i++) { + tokenIds.push(i) + } + + // mint to owner + for (let tokenId of tokenIds) { + await ONFT_A.mint(warlock.address, tokenId) + } + + // approve owner.address to transfer + await ONFT_A.connect(warlock).setApprovalForAll(ONFT_A.address, true) + + // expected event params + const payload = ethers.utils.defaultAbiCoder.encode(["bytes", "uint[]"], [warlock.address, tokenIds]) + const hashedPayload = web3.utils.keccak256(payload) + + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 400000]) + + // estimate nativeFees + let nativeFee = (await ONFT_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds, false, adapterParams)).nativeFee + + // initiate batch transfer + await expect( + ONFT_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + warlock.address, + ethers.constants.AddressZero, + adapterParams, // TODO might need to change this + { value: nativeFee } + ) + ) + .to.emit(ONFT_B, "CreditStored") + .withArgs(hashedPayload, payload) + + // only partial amount of tokens has been sent, the rest have been stored as a credit + let creditedIdsA = [] + for (let tokenId of tokenIds) { + let owner = await ONFT_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsA.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // console.log("Number of tokens credited: ", creditedIdsA.length) + + // clear the rest of the credits + let tx = await (await ONFT_B.clearCredits(payload)).wait() + + // console.log("Total gasUsed: ", tx.gasUsed.toString()) + + let creditedIdsB = [] + for (let tokenId of creditedIdsA) { + let owner = await ONFT_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsB.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // console.log("Number of tokens credited: ", creditedIdsB.length) + + // all ids should have cleared + expect(creditedIdsB.length).to.be.equal(0) + + // should revert because payload is no longer valid + await expect(ONFT_B.clearCredits(payload)).to.be.revertedWith("no credits stored") + }) +}) diff --git a/test/onft721/ONFT721A.test.js b/test/onft721/ONFT721A.test.js new file mode 100644 index 00000000..cc4b2692 --- /dev/null +++ b/test/onft721/ONFT721A.test.js @@ -0,0 +1,455 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") +const Web3 = require("web3") +const web3 = new Web3() + +describe("ONFT721A: ", function () { + const chainId_A = 1 + const chainId_B = 2 + const name = "OmnichainNonFungibleToken" + const symbol = "ONFT721A" + const defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 250000]) + const batchSizeLimit = 300 + + let owner, warlock, lzEndpointMockA, lzEndpointMockB, LZEndpointMock, ONFT721A, ONFT721, onft721a_A, onft721_B + + before(async function () { + owner = (await ethers.getSigners())[0] + warlock = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ONFT721A = await ethers.getContractFactory("ONFT721AMock") + ONFT721 = await ethers.getContractFactory("ONFT721Mock") + }) + + beforeEach(async function () { + lzEndpointMockA = await LZEndpointMock.deploy(chainId_A) + lzEndpointMockB = await LZEndpointMock.deploy(chainId_B) + + onft721a_A = await ONFT721A.deploy(name, symbol, 150000, lzEndpointMockA.address) + onft721_B = await ONFT721.deploy(name, symbol, 150000, lzEndpointMockB.address) + + // wire the lz endpoints to guide msgs back and forth + await lzEndpointMockA.setDestLzEndpoint(onft721_B.address, lzEndpointMockB.address) + await lzEndpointMockB.setDestLzEndpoint(onft721a_A.address, lzEndpointMockA.address) + + // set each contracts source address so it can send to each other + await onft721a_A.setTrustedRemoteAddress(chainId_B, onft721_B.address) + await onft721_B.setTrustedRemoteAddress(chainId_A, onft721a_A.address) + + await onft721a_A.setMinDstGas(chainId_B, 1, 150000) + await onft721_B.setMinDstGas(chainId_A, 1, 150000) + }) + + it("sendFrom() - your own tokens", async function () { + let tokenId = 1 + await onft721a_A.mint(2) + + // verify the owner of the token is on the source chain + expect(await onft721a_A.ownerOf(0)).to.be.equal(owner.address) + expect(await onft721a_A.ownerOf(1)).to.be.equal(owner.address) + + // token doesn't exist on other chain + await expect(onft721_B.ownerOf(tokenId)).to.be.revertedWith("ERC721: invalid token ID") + + // can transfer token on srcChain as regular erC721 + await onft721a_A.transferFrom(owner.address, warlock.address, tokenId) + expect(await onft721a_A.ownerOf(tokenId)).to.be.equal(warlock.address) + + // approve the contract to swap your token + await onft721a_A.connect(warlock).approve(onft721a_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await onft721a_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await onft721a_A + .connect(warlock) + .sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is burnt + expect(await onft721a_A.ownerOf(0)).to.be.equal(owner.address) + expect(await onft721a_A.ownerOf(tokenId)).to.be.equal(onft721a_A.address) + + // token received on the dst chain + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(warlock.address) + + // can send to other onft contract eg. not the original nft contract chain + await onft721_B + .connect(warlock) + .sendFrom(warlock.address, chainId_A, owner.address, tokenId, warlock.address, ethers.constants.AddressZero, defaultAdapterParams, { + value: nativeFee, + }) + + // token is burned on the sending chain + expect(await onft721a_A.ownerOf(tokenId)).to.be.equal(owner.address) + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(onft721_B.address) + }) + + it("sendFrom() - reverts if not owner", async function () { + const tokenId = 0 + await onft721a_A.mint(1) + + // approve the contract to swap your token + await onft721a_A.approve(onft721a_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await onft721_B.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await onft721a_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because other address does not own it + await expect( + onft721_B + .connect(warlock) + .sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - on behalf of other user", async function () { + const tokenId = 0 + await onft721a_A.mint(1) + + // approve the contract to swap your token + await onft721a_A.approve(onft721a_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await onft721_B.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await onft721a_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the other user to send the token + await onft721_B.approve(warlock.address, tokenId) + + // sends across + await onft721_B + .connect(warlock) + .sendFrom(owner.address, chainId_A, warlock.address, tokenId, warlock.address, ethers.constants.AddressZero, defaultAdapterParams, { + value: nativeFee, + }) + + // token received on the dst chain + expect(await onft721a_A.ownerOf(tokenId)).to.be.equal(warlock.address) + }) + + it("sendFrom() - reverts if contract is approved, but not the sending user", async function () { + const tokenId = 0 + await onft721a_A.mint(1) + + // approve the contract to swap your token + await onft721a_A.approve(onft721a_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await onft721_B.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await onft721a_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the contract to swap your token + await onft721_B.approve(onft721_B.address, tokenId) + + // reverts because contract is approved, not the user + await expect( + onft721_B + .connect(warlock) + .sendFrom( + owner.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if not approved", async function () { + const tokenId = 0 + await onft721a_A.mint(1) + + // approve the contract to swap your token + await onft721a_A.approve(onft721a_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await onft721_B.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await onft721a_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await onft721_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because user is not approved + await expect( + onft721_B + .connect(warlock) + .sendFrom( + owner.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if sender does not own token", async function () { + const tokenIdA = 0 + await onft721a_A.mint(1) + + // approve owner.address to transfer, but not the other + await onft721a_A.setApprovalForAll(onft721a_A.address, true) + + // estimate nativeFees + let nativeFee = (await onft721a_A.estimateSendFee(chainId_B, owner.address, tokenIdA, false, defaultAdapterParams)).nativeFee + + await expect( + onft721a_A + .connect(warlock) + .sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIdA, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + ).to.be.revertedWith("TransferFromIncorrectOwner()") + + await expect( + onft721a_A + .connect(warlock) + .sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenIdA, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + ).to.be.revertedWith("TransferFromIncorrectOwner()") + }) + + it("sendBatchFrom()", async function () { + await onft721a_A.setMinGasToTransferAndStore(400000) + await onft721_B.setMinGasToTransferAndStore(400000) + await onft721a_A.setDstChainIdToBatchLimit(chainId_B, batchSizeLimit) + await onft721_B.setDstChainIdToBatchLimit(chainId_A, batchSizeLimit) + const tokenIds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + // mint to owner + await onft721a_A.connect(warlock).mint(10) + + // approve owner.address to transfer + await onft721a_A.connect(warlock).setApprovalForAll(onft721a_A.address, true) + + // expected event params + const payload = ethers.utils.defaultAbiCoder.encode(["bytes", "uint[]"], [warlock.address, tokenIds]) + const hashedPayload = web3.utils.keccak256(payload) + + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + // estimate nativeFees + let nativeFee = (await onft721a_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds, false, defaultAdapterParams)).nativeFee + + // initiate batch transfer + await expect( + onft721a_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + warlock.address, + ethers.constants.AddressZero, + adapterParams, // TODO might need to change this + { value: nativeFee } + ) + ) + .to.emit(onft721_B, "CreditStored") + .withArgs(hashedPayload, payload) + + // only partial amount of tokens has been sent, the rest have been stored as a credit + let creditedIdsA = [] + for (let tokenId of tokenIds) { + let owner = await onft721_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsA.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // clear the rest of the credits + await expect(onft721_B.clearCredits(payload)).to.emit(onft721_B, "CreditCleared").withArgs(hashedPayload) + + let creditedIdsB = [] + for (let tokenId of creditedIdsA) { + let owner = await onft721_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsB.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // all ids should have cleared + expect(creditedIdsB.length).to.be.equal(0) + + // should revert because payload is no longer valid + await expect(onft721_B.clearCredits(payload)).to.be.revertedWith("no credits stored") + }) + + it("sendBatchFrom() - large batch", async function () { + await onft721a_A.setMinGasToTransferAndStore(400000) + await onft721_B.setMinGasToTransferAndStore(400000) + await onft721a_A.setDstChainIdToBatchLimit(chainId_B, batchSizeLimit) + await onft721_B.setDstChainIdToBatchLimit(chainId_A, batchSizeLimit) + + const tokenIds = [] + + for (let i = 0; i < 300; i++) { + tokenIds.push(i) + } + + // mint to owner + for (let tokenId of tokenIds) { + await onft721a_A.connect(warlock).mint(1) + } + + // approve owner.address to transfer + await onft721a_A.connect(warlock).setApprovalForAll(onft721a_A.address, true) + + // expected event params + const payload = ethers.utils.defaultAbiCoder.encode(["bytes", "uint[]"], [warlock.address, tokenIds]) + const hashedPayload = web3.utils.keccak256(payload) + + let adapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 400000]) + + // estimate nativeFees + let nativeFee = (await onft721a_A.estimateSendBatchFee(chainId_B, warlock.address, tokenIds, false, adapterParams)).nativeFee + + // initiate batch transfer + await expect( + onft721a_A.connect(warlock).sendBatchFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIds, + warlock.address, + ethers.constants.AddressZero, + adapterParams, // TODO might need to change this + { value: nativeFee } + ) + ) + .to.emit(onft721_B, "CreditStored") + .withArgs(hashedPayload, payload) + + // only partial amount of tokens has been sent, the rest have been stored as a credit + let creditedIdsA = [] + for (let tokenId of tokenIds) { + let owner = await onft721_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsA.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // console.log("Number of tokens credited: ", creditedIdsA.length) + + // clear the rest of the credits + let tx = await (await onft721_B.clearCredits(payload)).wait() + + // console.log("Total gasUsed: ", tx.gasUsed.toString()) + + let creditedIdsB = [] + for (let tokenId of creditedIdsA) { + let owner = await onft721_B.rawOwnerOf(tokenId) + if (owner == ethers.constants.AddressZero) { + creditedIdsB.push(tokenId) + } else { + expect(owner).to.be.equal(warlock.address) + } + } + + // console.log("Number of tokens credited: ", creditedIdsB.length) + + // all ids should have cleared + expect(creditedIdsB.length).to.be.equal(0) + + // should revert because payload is no longer valid + await expect(onft721_B.clearCredits(payload)).to.be.revertedWith("no credits stored") + }) +}) diff --git a/test/onft721/ProxyONFT721.test.js b/test/onft721/ProxyONFT721.test.js new file mode 100644 index 00000000..d3f30471 --- /dev/null +++ b/test/onft721/ProxyONFT721.test.js @@ -0,0 +1,433 @@ +const { expect } = require("chai") +const { ethers } = require("hardhat") + +describe("ProxyONFT721: ", function () { + const chainId_A = 1 + const chainId_B = 2 + const chainId_C = 3 + const name = "OmnichainNonFungibleToken" + const symbol = "ONFT" + const minGasToStore = 40000 + const batchSizeLimit = 1 + const defaultAdapterParams = ethers.utils.solidityPack(["uint16", "uint256"], [1, 200000]) + + let owner, warlock, lzEndpointMockA, lzEndpointMockB, lzEndpointMockC + let ONFT_B, ONFT_C, LZEndpointMock, ONFT, ERC721, ERC721Src, ProxyONFT_A, ProxyONFT + + before(async function () { + owner = (await ethers.getSigners())[0] + warlock = (await ethers.getSigners())[1] + LZEndpointMock = await ethers.getContractFactory("LZEndpointMock") + ONFT = await ethers.getContractFactory("ONFT721") + ProxyONFT = await ethers.getContractFactory("ProxyONFT721") + ERC721 = await ethers.getContractFactory("ERC721Mock") + }) + + beforeEach(async function () { + lzEndpointMockA = await LZEndpointMock.deploy(chainId_A) + lzEndpointMockB = await LZEndpointMock.deploy(chainId_B) + lzEndpointMockC = await LZEndpointMock.deploy(chainId_C) + + // make an ERC721 to mock a previous deploy + ERC721Src = await ERC721.deploy("ERC721", "ERC721") + // generate a proxy to allow it to go ONFT + ProxyONFT_A = await ProxyONFT.deploy(minGasToStore, lzEndpointMockA.address, ERC721Src.address) + + // create ONFT on dstChains + ONFT_B = await ONFT.deploy(name, symbol, minGasToStore, lzEndpointMockB.address) + ONFT_C = await ONFT.deploy(name, symbol, minGasToStore, lzEndpointMockC.address) + + // wire the lz endpoints to guide msgs back and forth + lzEndpointMockA.setDestLzEndpoint(ONFT_B.address, lzEndpointMockB.address) + lzEndpointMockA.setDestLzEndpoint(ONFT_C.address, lzEndpointMockC.address) + lzEndpointMockB.setDestLzEndpoint(ProxyONFT_A.address, lzEndpointMockA.address) + lzEndpointMockB.setDestLzEndpoint(ONFT_C.address, lzEndpointMockC.address) + lzEndpointMockC.setDestLzEndpoint(ProxyONFT_A.address, lzEndpointMockA.address) + lzEndpointMockC.setDestLzEndpoint(ONFT_B.address, lzEndpointMockB.address) + + // set each contracts source address so it can send to each other + await ProxyONFT_A.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [ONFT_B.address, ProxyONFT_A.address])) + await ProxyONFT_A.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [ONFT_C.address, ProxyONFT_A.address])) + await ONFT_B.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyONFT_A.address, ONFT_B.address])) + await ONFT_B.setTrustedRemote(chainId_C, ethers.utils.solidityPack(["address", "address"], [ONFT_C.address, ONFT_B.address])) + await ONFT_C.setTrustedRemote(chainId_A, ethers.utils.solidityPack(["address", "address"], [ProxyONFT_A.address, ONFT_C.address])) + await ONFT_C.setTrustedRemote(chainId_B, ethers.utils.solidityPack(["address", "address"], [ONFT_B.address, ONFT_C.address])) + + // set batch size limit + await ProxyONFT_A.setDstChainIdToBatchLimit(chainId_B, batchSizeLimit) + await ProxyONFT_A.setDstChainIdToBatchLimit(chainId_C, batchSizeLimit) + await ONFT_B.setDstChainIdToBatchLimit(chainId_A, batchSizeLimit) + await ONFT_B.setDstChainIdToBatchLimit(chainId_C, batchSizeLimit) + await ONFT_C.setDstChainIdToBatchLimit(chainId_A, batchSizeLimit) + await ONFT_C.setDstChainIdToBatchLimit(chainId_B, batchSizeLimit) + + // set min dst gas for swap + await ProxyONFT_A.setMinDstGas(chainId_B, 1, 150000) + await ProxyONFT_A.setMinDstGas(chainId_C, 1, 150000) + await ONFT_B.setMinDstGas(chainId_A, 1, 150000) + await ONFT_B.setMinDstGas(chainId_C, 1, 150000) + await ONFT_C.setMinDstGas(chainId_A, 1, 150000) + await ONFT_C.setMinDstGas(chainId_B, 1, 150000) + }) + + it("sendFrom() - your own tokens", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // verify the owner of the token is on the source chain + expect(await ERC721Src.ownerOf(tokenId)).to.be.equal(owner.address) + + // token doesn't exist on other chain + await expect(ONFT_B.ownerOf(tokenId)).to.be.revertedWith("ERC721: invalid token ID") + + // can transfer token on srcChain as regular erC721 + await ERC721Src.transfer(warlock.address, tokenId) + expect(await ERC721Src.ownerOf(tokenId)).to.be.equal(warlock.address) + + // approve the proxy to swap your token + await ERC721Src.connect(warlock).approve(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is now owned by the proxy contract, because this is the original nft chain + expect(await ERC721Src.ownerOf(tokenId)).to.equal(ProxyONFT_A.address) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(warlock.address) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_C, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // can send to other onft contract eg. not the original nft contract chain + await ONFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_C, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is burned on the sending chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(ONFT_B.address) + + // token received on the dst chain + expect(await ONFT_C.ownerOf(tokenId)).to.be.equal(warlock.address) + + // estimate nativeFees + nativeFee = (await ONFT_C.estimateSendFee(chainId_A, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // send it back to the original chain + await ONFT_C.connect(warlock).sendFrom( + warlock.address, + chainId_A, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token is burned on the sending chain + expect(await ONFT_C.ownerOf(tokenId)).to.be.equal(ONFT_C.address) + + // is received on the original chain + expect(await ERC721Src.ownerOf(tokenId)).to.be.equal(warlock.address) + }) + + it("sendFrom() - reverts if not approved on proxy", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + await expect( + ProxyONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ERC721: caller is not token owner or approved") + }) + + it("sendFrom() - reverts if from is not msgSender", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ERC721Src.approve(ProxyONFT_A.address, tokenId) + + // swaps token to other chain + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ProxyONFT721: owner is not send caller") + }) + + it("sendFrom() - reverts if not owner on non proxy chain", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ERC721Src.approve(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because other address does not own it + await expect( + ONFT_B.connect(warlock).sendFrom( + warlock.address, + chainId_C, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - on behalf of other user", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ERC721Src.approve(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the other user to send the token + await ONFT_B.approve(warlock.address, tokenId) + + // estimate nativeFees + nativeFee = (await ONFT_B.estimateSendFee(chainId_C, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // sends across + await ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { value: nativeFee } + ) + + // token received on the dst chain + expect(await ONFT_C.ownerOf(tokenId)).to.be.equal(warlock.address) + }) + + it("sendFrom() - reverts if contract is approved, but not the sending user", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ERC721Src.approve(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, owner.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // approve the contract to swap your token + await ONFT_B.approve(ONFT_B.address, tokenId) + + // reverts because contract is approved, not the user + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if not approved on non proxy chain", async function () { + const tokenId = 123 + await ERC721Src.mint(owner.address, tokenId) + + // approve the proxy to swap your token + await ERC721Src.approve(ProxyONFT_A.address, tokenId) + + // estimate nativeFees + let nativeFee = (await ProxyONFT_A.estimateSendFee(chainId_B, warlock.address, tokenId, false, defaultAdapterParams)).nativeFee + + // swaps token to other chain + await ProxyONFT_A.sendFrom( + owner.address, + chainId_B, + owner.address, + tokenId, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams, + { + value: nativeFee, + } + ) + + // token received on the dst chain + expect(await ONFT_B.ownerOf(tokenId)).to.be.equal(owner.address) + + // reverts because user is not approved + await expect( + ONFT_B.connect(warlock).sendFrom( + owner.address, + chainId_C, + warlock.address, + tokenId, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ONFT721: send caller is not owner nor approved") + }) + + it("sendFrom() - reverts if someone else is approved, but not the sender", async function () { + const tokenIdA = 123 + const tokenIdB = 456 + // mint to both owners + await ERC721Src.mint(owner.address, tokenIdA) + await ERC721Src.mint(warlock.address, tokenIdB) + + // approve owner.address to transfer, but not the other + await ERC721Src.setApprovalForAll(ProxyONFT_A.address, true) + + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIdB, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ERC721: caller is not token owner or approved") + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenIdB, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ERC721: caller is not token owner or approved") + }) + + it("sendFrom() - reverts if sender does not own token", async function () { + const tokenIdA = 123 + const tokenIdB = 456 + // mint to both owners + await ERC721Src.mint(owner.address, tokenIdA) + await ERC721Src.mint(warlock.address, tokenIdB) + + // approve owner.address to transfer, but not the other + await ERC721Src.setApprovalForAll(ProxyONFT_A.address, true) + + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + warlock.address, + tokenIdA, + warlock.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ERC721: transfer from incorrect owner") + await expect( + ProxyONFT_A.connect(warlock).sendFrom( + warlock.address, + chainId_B, + owner.address, + tokenIdA, + owner.address, + ethers.constants.AddressZero, + defaultAdapterParams + ) + ).to.be.revertedWith("ERC721: transfer from incorrect owner") + }) +}) diff --git a/utils/getAddresses.js b/utils/getAddresses.js new file mode 100644 index 00000000..dac7b705 --- /dev/null +++ b/utils/getAddresses.js @@ -0,0 +1,40 @@ +const environments = require("../constants/environments.json") +const fs = require("fs") + +const environmentArg = process.argv[2] +const contractCsvArg = process.argv[3] + +async function getAddresses(environment, contractCsv) { + let contracts = contractCsv.split(",") + const promises = [] + for (const contract of contracts) { + promises.push("\n" + contract) + const networks = environments[environment]; + for (const network of networks) { + let fileName = `deployments/${network}/${contract[0].toUpperCase() + contract.substring(1)}.json`; + if(fs.existsSync(fileName)) { + promises.push(getAddressForNetwork(fileName, network)) + } + } + } + const resolvedPromises = await Promise.all(promises) + resolvedPromises.forEach((networkAddressStr) => { + console.log(networkAddressStr) + }) +} + +function getAddressForNetwork(file, network) { + return new Promise((res) => { + fs.readFile(file, (error, content) => { + if (content === undefined) { + console.log(`File: ${file} does not exsist`) + return + } + res(`${network}: ${JSON.parse(content).address}`) + }) + }) +} + +// to run: node getAddresses ${ENVIRONMENT} ${CONTRACT_CSV} +// example: node getAddresses testnet Relayer,Endpoint,UltraLightNode +getAddresses(environmentArg, contractCsvArg).then((res) => console.log("\nComplete!")) diff --git a/utils/helpers.js b/utils/helpers.js new file mode 100644 index 00000000..1b90b249 --- /dev/null +++ b/utils/helpers.js @@ -0,0 +1,21 @@ +const { BigNumber } = require("ethers") +const { ethers, network } = require("hardhat") + +deployNew = async (contractName, params = []) => { + const C = await ethers.getContractFactory(contractName) + return C.deploy(...params) +} + +deployNewFromAbi = async(abi, bytecode, signer, params) => { + const C = new ethers.ContractFactory(abi, bytecode, signer) + if (params) { + return C.deploy(...params) + } else { + return C.deploy() + } +} + +module.exports = { + deployNew, + deployNewFromAbi +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index dfe88ea0..c10b7911 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,9 +2,35 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + 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.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@ensdomains/ens@^0.4.4": version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== dependencies: bluebird "^3.5.2" @@ -15,12 +41,12 @@ "@ensdomains/resolver@^0.2.4": version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== "@ethereum-waffle/chai@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" + resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz" integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== dependencies: "@ethereum-waffle/provider" "^3.4.4" @@ -28,7 +54,7 @@ "@ethereum-waffle/compiler@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" + resolved "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz" integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== dependencies: "@resolver-engine/imports" "^0.3.3" @@ -45,7 +71,7 @@ "@ethereum-waffle/ens@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" + resolved "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz" integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== dependencies: "@ensdomains/ens" "^0.4.4" @@ -54,7 +80,7 @@ "@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" + resolved "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz" integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== dependencies: "@ethersproject/abi" "^5.5.0" @@ -62,7 +88,7 @@ "@ethereum-waffle/provider@^3.4.4": version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" + resolved "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz" integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== dependencies: "@ethereum-waffle/ens" "^3.4.4" @@ -71,41 +97,41 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2", "@ethereumjs/block@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" merkle-patricia-tree "^4.2.4" -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" - integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== +"@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": + version "5.5.3" + resolved "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== dependencies: "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.3" + "@ethereumjs/common" "^2.6.4" "@ethereumjs/ethash" "^1.1.0" debug "^4.3.3" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" level-mem "^5.0.1" lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" - integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" "@ethereumjs/ethash@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + resolved "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz" integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== dependencies: "@ethereumjs/block" "^3.5.0" @@ -114,27 +140,27 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== +"@ethereumjs/tx@^3.3.2", "@ethereumjs/tx@^3.5.1", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" -"@ethereumjs/vm@^5.6.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.8.0.tgz#c9055f96afc13dd7b72893b57fa20027effea6fe" - integrity sha512-mn2G2SX79QY4ckVvZUfxlNUpzwT2AEIkvgJI8aHoQaNYEHhH8rmdVDIaVVgz6//PjK52BZsK23afz+WvSR0Qqw== +"@ethereumjs/vm@^5.9.0": + version "5.9.3" + resolved "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz" + integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" + "@ethereumjs/block" "^3.6.3" + "@ethereumjs/blockchain" "^5.5.3" + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" async-eventemitter "^0.2.4" core-js-pure "^3.0.1" debug "^4.3.3" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" merkle-patricia-tree "^4.2.4" @@ -142,7 +168,7 @@ "@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" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz" integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== dependencies: "@ethersproject/address" ">=5.0.0-beta.128" @@ -155,365 +181,533 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" - integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" +"@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3": + version "5.6.4" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.4.tgz" + integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/strings" "^5.6.1" -"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== +"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" + "@ethersproject/networks" "^5.6.3" "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - -"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + +"@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.6.2", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.6.2": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.6.1", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" -"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== +"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" -"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== +"@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.1.tgz" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" + +"@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.6.1", "@ethersproject/basex@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.6.1.tgz" + integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== + dependencies: + "@ethersproject/bytes" "^5.6.1" "@ethersproject/properties" "^5.6.0" -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== +"@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.6.2": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.2.tgz" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" + bn.js "^5.2.1" + +"@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.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.6.0": +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.6.1": version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz" integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== +"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: - "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== - dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" +"@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.1.tgz" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + +"@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.6.2", "@ethersproject/contracts@^5.4.1": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.6.2.tgz" + integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== + dependencies: + "@ethersproject/abi" "^5.6.3" + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" -"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" +"@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.1.tgz" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/hash@>=5.0.0-beta.128": + 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.6.2", "@ethersproject/hdnode@^5.6.2": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.6.2.tgz" + integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" +"@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz" + integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== +"@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.1.tgz" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.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.6.0" + "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": +"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/networks@5.6.1", "@ethersproject/networks@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" - integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== +"@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.6.4", "@ethersproject/networks@^5.6.3": + version "5.6.4" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.4.tgz" + integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== +"@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.6.1", "@ethersproject/pbkdf2@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz" + integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz" integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/providers@5.6.2", "@ethersproject/providers@^5.4.4": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" - integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.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.6.8", "@ethersproject/providers@^5.4.4": + version "5.6.8" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.6.8.tgz" + integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" + "@ethersproject/networks" "^5.6.3" "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== +"@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.6.1.tgz" + integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== +"@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.1.tgz" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== +"@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.6.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.1.tgz" + integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== + dependencies: + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== +"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.2.tgz" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" + bn.js "^5.2.1" elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== +"@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.6.1", "@ethersproject/solidity@^5.4.0": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.6.1.tgz" + integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" -"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== +"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.1.tgz" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.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.6.2", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.2": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.2.tgz" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - -"@ethersproject/units@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + +"@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.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.6.1.tgz" + integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/constants" "^5.6.0" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" -"@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" +"@ethersproject/wallet@5.6.2", "@ethersproject/wallet@^5.4.0": + version "5.6.2" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.6.2.tgz" + integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/json-wallets" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" -"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" - integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== +"@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.1.tgz" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== dependencies: - "@ethersproject/base64" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/strings" "^5.6.1" -"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.6.1.tgz" + integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@layerzerolabs/lz-evm-sdk-v1-0.7@^1.5.14": + version "1.5.14" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-sdk-v1-0.7/-/lz-evm-sdk-v1-0.7-1.5.14.tgz#2654346c74c50aab13fb1e7be26a30368f206b7f" + integrity sha512-hlhtyoZrA3DZ/0DcMEJqpzJ1cOSHc3SVUovMr693BQEBbJy9DFEwLsMBGePhhtjtMpDazFrD9UGxyWDEwhT9Jg== + dependencies: + "@openzeppelin/contracts" "3.4.2-solc-0.7" + "@openzeppelin/contracts-upgradeable" "3.4.2-solc-0.7" + +"@layerzerolabs/prettier-plugin-solidity@^1.0.0-beta.19": + version "1.0.0-beta.19" + resolved "https://registry.npmjs.org/@layerzerolabs/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.19.tgz" + integrity sha512-LhWUofwoB7iOPlFNwRImsrmgiMaXMnjXB4Ytypgr9n85uuASX+zrIStOrRbvHmgSGgOlaZQ1Gu/ZJLRFpYojBA== + dependencies: + "@solidity-parser/parser" "^0.14.0" + emoji-regex "^10.0.0" + escape-string-regexp "^4.0.0" + semver "^7.3.5" + solidity-comments-extractor "^0.0.7" + string-width "^4.2.3" "@metamask/eth-sig-util@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" - integrity sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA== + version "4.0.1" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" ethereumjs-util "^6.2.1" @@ -521,9 +715,19 @@ 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.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" + 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" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -531,38 +735,97 @@ "@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" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 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" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" "@nomiclabs/hardhat-ethers@^2.0.3": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" - integrity sha512-A2gZAGB6kUvLx+kzM92HKuUF33F1FSe90L0TmkXkT2Hh0OKRpvWZURUSU2nghD2yC4DzfEZ3DftfeHGvZ2JTUw== + version "2.1.0" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.0.tgz" + integrity sha512-vlW90etB3675QWG7tMrHaDoTa7ymMB7irM4DAQ98g8zJoe9YqEggeDnbO6v5b+BLth/ty4vN6Ko/kaqRN1krHw== + +"@nomiclabs/hardhat-etherscan@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz" + 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-waffle@^2.0.1": version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz" integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== dependencies: "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" +"@openzeppelin-3/contracts@npm:@openzeppelin/contracts@^3.4.2-solc-0.7": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== + +"@openzeppelin/contracts-upgradeable@3.4.2-solc-0.7": + version "3.4.2-solc-0.7" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-3.4.2-solc-0.7.tgz#9a5cdaf9f65bcd9a3b7e865f44a6f672afe7785e" + integrity sha512-I5iKKS8U9L1XdSxsNAIBQekN0U9hTgdleoyntIdR7Jy3U/z/NZ/1oUM0v5HnUMrmn/bXLvYL94rBvaLF++Ndnw== + +"@openzeppelin/contracts-upgradeable@^4.6.0": + version "4.7.1" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.1.tgz" + integrity sha512-5EFiZld3DYFd8aTL8eeMnhnaWh1/oXLXFNuFMrgF3b1DNPshF3LCyO7VR6lc+gac2URJ0BlVcZoCfkk/3MoEfg== + +"@openzeppelin/contracts@3.4.2-solc-0.7": + version "3.4.2-solc-0.7" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" + integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== + "@openzeppelin/contracts@^4.4.1": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc" - integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.0.tgz#683f33b6598970051bc5f0806fd8660da9e018dd" + integrity sha512-DUP74AFGKlic2sQb/CmgrN2aUPMFGxRrmCTUxLHsiU2RzwWqVuMPZBxiAyvlff6Pea77uylAX6B5x9W6evEbhA== + +"@openzeppelin/hardhat-upgrades@^1.18.3": + version "1.19.0" + resolved "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.19.0.tgz" + integrity sha512-351QqDO3nZ96g0BO/bQnaTflix4Nw4ELWC/hZ8PwicsuVxRmxN/GZhxPrs62AOdiQdZ+xweawrVXa5knliRd4A== + dependencies: + "@openzeppelin/upgrades-core" "^1.16.0" + chalk "^4.1.0" + proper-lockfile "^4.1.1" + +"@openzeppelin/upgrades-core@^1.16.0": + version "1.16.1" + resolved "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.16.1.tgz" + integrity sha512-+hejbeAfsZWIQL5Ih13gkdm2KO6kbERc1ektzcyb25/OtUwaRjIIHxW++LdC/3Hg5uzThVOzJBfiLdAbgwD+OA== + dependencies: + bn.js "^5.1.2" + cbor "^8.0.0" + chalk "^4.1.0" + compare-versions "^4.0.0" + debug "^4.1.1" + ethereumjs-util "^7.0.3" + proper-lockfile "^4.1.1" + solidity-ast "^0.4.15" "@resolver-engine/core@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + resolved "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz" integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== dependencies: debug "^3.1.0" @@ -571,7 +834,7 @@ "@resolver-engine/fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + resolved "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz" integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== dependencies: "@resolver-engine/core" "^0.3.3" @@ -579,7 +842,7 @@ "@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" + resolved "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz" integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== dependencies: "@resolver-engine/fs" "^0.3.3" @@ -588,7 +851,7 @@ "@resolver-engine/imports@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + resolved "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz" integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== dependencies: "@resolver-engine/core" "^0.3.3" @@ -597,9 +860,31 @@ path-browserify "^1.0.0" url "^0.11.0" +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz" + 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.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -610,7 +895,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -619,7 +904,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -628,7 +913,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -643,7 +928,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -654,12 +939,12 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" 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" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" @@ -667,94 +952,95 @@ "@sindresorhus/is@^0.14.0": version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46" - integrity sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw== +"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.2": + version "0.14.3" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz" + 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" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: defer-to-connect "^1.0.1" "@truffle/error@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.0.tgz#5e9fed79e6cda624c926d314b280a576f8b22a36" + resolved "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz" integrity sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg== -"@truffle/interface-adapter@^0.5.12": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.12.tgz#8cc34e9a5363970bfec1001520ae55fad6a26bfd" - integrity sha512-Qrc5VARnvSILYqZNsAM0xsUHqGqphLXVdIvDnhUA1Xj1xyNz8iboTr8bXorMd+Uspw+PXmsW44BJ/Wioo/jL2A== +"@truffle/interface-adapter@^0.5.19": + version "0.5.19" + resolved "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.19.tgz" + integrity sha512-x7IZvsyx36DAJCJVZ9gUe1Lh8AhODhJoW7I+lJXIlGxj3EmZbao4/sHo+cN4u9i94yVTyGwYd78NzbP0a/LAog== dependencies: bn.js "^5.1.3" ethers "^4.0.32" - web3 "1.5.3" + web3 "1.7.4" "@truffle/provider@^0.2.24": - version "0.2.50" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.50.tgz#5c8a8fd7724bacac15cf7396cecc51c0ee1e597d" - integrity sha512-GCoyX8SncfgizXYJfordv5kiysQS7S1311D3ewciixaoQpTkbqC3s0wxwHlPxU7m5wJOCw2K8rQtL3oIFfeHwA== + version "0.2.57" + resolved "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.57.tgz" + integrity sha512-O8VxF2uQwa+KB4HDg9lG7uhQ/+AOvchX+1STpQBSSAGfov1+EROM0iRZUNoPm71Pu0C9ji2WmXbNW/COjUMaMA== dependencies: "@truffle/error" "^0.1.0" - "@truffle/interface-adapter" "^0.5.12" - web3 "1.5.3" + "@truffle/interface-adapter" "^0.5.19" + debug "^4.3.1" + web3 "1.7.4" "@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" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz" integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== dependencies: ethers "^5.0.2" "@types/abstract-leveldown@*": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" + resolved "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz" integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== "@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" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz" 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" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/chai@*": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + version "4.3.1" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== "@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" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" 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 sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" + 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" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -762,12 +1048,12 @@ "@types/level-errors@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz" integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== dependencies: "@types/abstract-leveldown" "*" @@ -776,108 +1062,108 @@ "@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" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" 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" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz" integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== dependencies: "@types/node" "*" "@types/node-fetch@^2.5.5": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.2" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + version "18.6.1" + resolved "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz" + integrity sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg== "@types/node@^10.0.3": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^12.12.6": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== + version "12.20.55" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" + 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" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" 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" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.6.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz" + integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== "@types/qs@^6.2.31", "@types/qs@^6.9.7": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" 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" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" 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" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" 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" + resolved "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.8.tgz" integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== dependencies: "@types/chai" "*" "@types/sinon" "*" "@types/sinon@*": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== + version "10.0.13" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz" + 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" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" 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" + resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz" 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" + resolved "https://registry.npmjs.org/@types/web3/-/web3-1.0.19.tgz" integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== dependencies: "@types/bn.js" "*" @@ -885,55 +1171,50 @@ "@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" + resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" 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" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -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: +abbrev@1, abbrev@1.0.x: version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" + 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" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" abstract-leveldown@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz" 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" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz" 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" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== dependencies: buffer "^5.5.0" @@ -944,14 +1225,14 @@ abstract-leveldown@^6.2.1: abstract-leveldown@~2.6.0: version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz" 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" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz" integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== dependencies: buffer "^5.5.0" @@ -962,50 +1243,60 @@ abstract-leveldown@~6.2.1: accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" negotiator "0.6.3" +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^6.0.7: + version "6.4.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + version "1.2.0" + resolved "https://registry.npmjs.org/address/-/address-1.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" 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 sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz" 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" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" 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" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.12.3: +ajv@^6.10.2, ajv@^6.12.3, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1013,75 +1304,100 @@ ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + 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 sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-colors@4.1.1, ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" 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 sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + 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" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" 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" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" 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" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 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" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 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" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 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" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +antlr4@4.7.1: + version "4.7.1" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz" + 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" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" 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" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" @@ -1089,73 +1405,84 @@ anymatch@~3.1.1, anymatch@~3.1.2: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 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" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" 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" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 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 sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= + resolved "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz" + 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" + resolved "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz" integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== dependencies: typical "^2.6.1" array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 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 sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + 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" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.reduce@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz" + 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 sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + 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" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -1165,92 +1492,107 @@ asn1.js@^5.2.0: asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" 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 sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" 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" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-parents@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" 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" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" 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" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@2.6.2: +async@2.6.2, async@^2.0.1, async@^2.1.2, async@^2.5.0, async@^2.6.1: version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + resolved "https://registry.npmjs.org/async/-/async-2.6.2.tgz" 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.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== +async@^2.4.0: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + 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 sha1-x57Zf380y48robyXkLzDZkdLS3k= + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + 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" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.21.1: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" 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" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" @@ -1259,7 +1601,7 @@ babel-code-frame@^6.26.0: 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" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" @@ -1284,7 +1626,7 @@ babel-core@^6.0.14, babel-core@^6.26.0: babel-generator@^6.26.0: version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" @@ -1298,7 +1640,7 @@ babel-generator@^6.26.0: 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" + resolved "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz" integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" @@ -1307,7 +1649,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^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" + resolved "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz" integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" @@ -1317,7 +1659,7 @@ babel-helper-call-delegate@^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" + resolved "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz" integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" @@ -1327,7 +1669,7 @@ babel-helper-define-map@^6.24.1: 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" + resolved "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz" integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" @@ -1336,7 +1678,7 @@ babel-helper-explode-assignable-expression@^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" + resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz" integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" @@ -1347,7 +1689,7 @@ babel-helper-function-name@^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" + resolved "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz" integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" @@ -1355,7 +1697,7 @@ babel-helper-get-function-arity@^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" + resolved "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz" integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" @@ -1363,7 +1705,7 @@ babel-helper-hoist-variables@^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" + resolved "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz" integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" @@ -1371,7 +1713,7 @@ babel-helper-optimise-call-expression@^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" + resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz" integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" @@ -1380,7 +1722,7 @@ babel-helper-regex@^6.24.1: 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" + resolved "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz" integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" @@ -1391,7 +1733,7 @@ babel-helper-remap-async-to-generator@^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" + resolved "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz" integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" @@ -1403,7 +1745,7 @@ babel-helper-replace-supers@^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" + resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" @@ -1411,36 +1753,36 @@ babel-helpers@^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" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= 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" + resolved "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz" integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= 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" + resolved "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz" integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= 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" + resolved "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= 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" + resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz" integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz" integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" @@ -1449,21 +1791,21 @@ babel-plugin-transform-async-to-generator@^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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz" integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz" integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" @@ -1474,7 +1816,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz" integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" @@ -1489,7 +1831,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz" integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" @@ -1497,14 +1839,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz" integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz" integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" @@ -1512,14 +1854,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz" integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz" integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" @@ -1528,14 +1870,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz" integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz" integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" @@ -1544,7 +1886,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz" integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" @@ -1554,7 +1896,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz" integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" @@ -1563,7 +1905,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz" integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" @@ -1572,7 +1914,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz" integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" @@ -1580,7 +1922,7 @@ babel-plugin-transform-es2015-object-super@^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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz" integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" @@ -1592,7 +1934,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz" integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" @@ -1600,14 +1942,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz" integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz" integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" @@ -1616,21 +1958,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz" integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz" integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz" integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" @@ -1639,7 +1981,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.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" + resolved "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz" integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" @@ -1648,14 +1990,14 @@ babel-plugin-transform-exponentiation-operator@^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" + resolved "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz" integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= 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" + resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz" integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" @@ -1663,7 +2005,7 @@ babel-plugin-transform-strict-mode@^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" + resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz" integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" @@ -1699,7 +2041,7 @@ babel-preset-env@^1.7.0: babel-register@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" @@ -1712,7 +2054,7 @@ babel-register@^6.26.0: 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" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" @@ -1720,7 +2062,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.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" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" @@ -1731,7 +2073,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: 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" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" @@ -1746,7 +2088,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: 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" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" @@ -1756,7 +2098,7 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + resolved "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz" integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= dependencies: babel-core "^6.0.14" @@ -1764,36 +2106,36 @@ babelify@^7.3.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" 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" + resolved "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz" integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= 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" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 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" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" 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" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 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" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -1806,36 +2148,29 @@ base@^0.11.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 sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bignumber.js@^9.0.0: +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" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz" 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" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bip39@2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" + resolved "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz" integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== dependencies: create-hash "^1.1.0" @@ -1844,65 +2179,67 @@ bip39@2.5.0: safe-buffer "^5.0.1" unorm "^1.3.3" -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" 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" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" 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 sha1-UzRK2xRhehP26N0s4okF0cC6MhU= + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + 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" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.2, body-parser@^1.16.0: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0, body-parser@^1.16.0: + version "1.20.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz" + 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 "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + 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" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 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.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -1918,24 +2255,24 @@ braces@^2.3.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" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 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 sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -1947,7 +2284,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify- browserify-cipher@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -1956,7 +2293,7 @@ browserify-cipher@^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" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -1966,7 +2303,7 @@ browserify-des@^1.0.0: 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" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" @@ -1974,7 +2311,7 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.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" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" @@ -1989,7 +2326,7 @@ browserify-sign@^4.0.0: browserslist@^3.2.6: version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" @@ -1997,14 +2334,14 @@ browserslist@^3.2.6: bs58@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -2013,29 +2350,29 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" 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 sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= + resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" + 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 sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + 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" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz" 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" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -2043,26 +2380,26 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: bufferutil@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz" 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" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" 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" + resolved "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz" integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= 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" + resolved "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz" integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= dependencies: bytewise-core "^1.2.2" @@ -2070,7 +2407,7 @@ bytewise@~1.1.0: cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -2085,7 +2422,7 @@ cache-base@^1.0.1: cacheable-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== dependencies: clone-response "^1.0.2" @@ -2098,7 +2435,7 @@ cacheable-request@^6.0.0: cachedown@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" + resolved "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz" integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= dependencies: abstract-leveldown "^2.4.1" @@ -2106,40 +2443,79 @@ cachedown@1.0.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" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" 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.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + 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 sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" 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" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30000844: - version "1.0.30001324" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001324.tgz#e17c3a8b34822b02d5d15639d570057550074884" - integrity sha512-/eYp1J6zYh1alySQB4uzYFkLmxxI8tk0kxldbNHXp8+v+rdMKdUBNjRLz7T7fz6Iox+1lIdYpc7rq6ZcXfTukg== + version "1.0.30001407" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001407.tgz#92281a6ee67cb90bfd8a6a1201fcc2dc19b60a15" + integrity sha512-4ydV+t4P7X3zH83fQWNDX/mQEzYomossfpViCOx9zHBSMV+rIe3LFqglHHtVyvNl1FhTNxPxs3jei82iqOW04w== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +cbor@^5.0.2: + version "5.2.0" + resolved "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz" + integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== + dependencies: + bignumber.js "^9.0.1" + nofilter "^1.0.4" + +cbor@^8.0.0: + version "8.1.0" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" chai@^4.3.4: version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== dependencies: assertion-error "^1.1.0" @@ -2152,7 +2528,7 @@ chai@^4.3.4: chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" @@ -2161,9 +2537,9 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.4.1, chalk@^2.4.2: +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" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2172,32 +2548,37 @@ chalk@^2.4.1, chalk@^2.4.2: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" 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.npmjs.org/chardet/-/chardet-0.7.0.tgz" + 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 sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" + 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 sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz" integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= 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" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: anymatch "~3.1.1" @@ -2212,7 +2593,7 @@ chokidar@3.3.0: chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -2227,17 +2608,17 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: chownr@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" 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" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" 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" + resolved "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz" integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== dependencies: buffer "^5.5.0" @@ -2248,7 +2629,7 @@ cids@^0.7.1: 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" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -2256,12 +2637,12 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: class-is@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + resolved "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz" 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" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -2271,12 +2652,19 @@ class-utils@^0.3.5: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: object-assign "^4.1.0" @@ -2285,18 +2673,23 @@ cli-table3@^0.5.0: colors "^1.1.2" cli-table3@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" - integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + version "0.6.2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== dependencies: string-width "^4.2.0" optionalDependencies: - colors "1.4.0" + "@colors/colors" "1.5.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" + 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 sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -2304,7 +2697,7 @@ cliui@^3.2.0: cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" @@ -2313,7 +2706,7 @@ cliui@^5.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -2321,25 +2714,25 @@ cliui@^7.0.2: wrap-ansi "^7.0.0" clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@2.1.2, clone@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= 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 sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" @@ -2347,72 +2740,82 @@ collection-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" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 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" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + 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" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 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" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" 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" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 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" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" 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" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz" integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== dependencies: array-back "^2.0.0" find-replace "^1.0.3" typical "^2.6.1" +commander@2.18.0: + version "2.18.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz" + 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" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +compare-versions@^4.0.0: + version "4.1.3" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.3.tgz" + integrity sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg== + component-emitter@^1.2.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" 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 sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -2422,14 +2825,14 @@ concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-hash@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + resolved "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz" integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== dependencies: cids "^0.7.1" @@ -2438,7 +2841,7 @@ content-hash@^2.5.2: content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.5.1: @@ -2450,63 +2853,70 @@ convert-source-map@^1.5.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 sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@0.4.2, cookie@^0.4.1: +cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" 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" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz" 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" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-pure@^3.0.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== + version "3.24.0" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.0.tgz" + integrity sha512-uzMmW8cRh7uYw4JQtzqvGWRyC2T5+4zipQLQdi2FmiRqP83k3d6F3stv2iAlNhOs6cXN401FCD5TL0vvleuHgA== 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" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-util-is@1.0.2: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -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== + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== cors@^2.8.1: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" vary "^1" -crc-32@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" - integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== +cosmiconfig@^5.0.7: + version "5.2.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: - exit-on-epipe "~1.0.1" - printj "~1.3.1" + 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.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + 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" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -2514,7 +2924,7 @@ create-ecdh@^4.0.0: 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" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2525,7 +2935,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.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" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2536,16 +2946,16 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: sha.js "^2.4.8" cross-fetch@^2.1.0, cross-fetch@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.5.tgz#afaf5729f3b6c78d89c9296115c9f142541a5705" - integrity sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w== + 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.1" - whatwg-fetch "2.0.4" + node-fetch "^2.6.7" + whatwg-fetch "^2.0.4" cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -2556,12 +2966,12 @@ cross-spawn@^6.0.5: "crypt@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" @@ -2578,7 +2988,7 @@ crypto-browserify@3.12.0: d@1, d@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -2586,83 +2996,76 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 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" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" 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 sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" 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 sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 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" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" 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" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" @@ -2674,24 +3077,24 @@ deep-equal@~1.1.1: deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" 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" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" 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" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz" 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" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz" integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== dependencies: abstract-leveldown "~5.0.0" @@ -2699,36 +3102,37 @@ deferred-leveldown@~4.0.0: deferred-leveldown@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== dependencies: abstract-leveldown "~6.2.1" inherits "^2.0.3" -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + 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" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 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" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 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" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -2736,47 +3140,42 @@ define-property@^2.0.2: defined@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - des.js@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= 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" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz" integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== dependencies: address "^1.0.1" @@ -2784,17 +3183,17 @@ detect-port@^1.3.0: diff@3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" 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" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -2803,63 +3202,61 @@ diffie-hellman@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== dotenv@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== dotignore@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== dependencies: minimatch "^3.0.4" -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" + 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 sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + 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 sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.3.47: - version "1.4.103" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" - integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== + version "1.4.255" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz#dc52d1095b876ed8acf25865db10265b02b1d6e1" + integrity sha512-H+mFNKow6gi2P5Gi2d1Fvd3TUEJlB9CF7zYaIV9T83BE3wP1xZ0mRPbNTm0KUjyd1QiVy7iKXuIcjlDtBQMiAQ== 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" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2870,29 +3267,34 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-regex@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 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" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encode-utf8@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz" integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== dependencies: abstract-leveldown "^5.0.0" @@ -2903,7 +3305,7 @@ encoding-down@5.0.4, encoding-down@~5.0.0: encoding-down@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== dependencies: abstract-leveldown "^6.2.1" @@ -2913,73 +3315,86 @@ encoding-down@^6.3.0: encoding@^0.1.11: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" 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" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enquirer@^2.3.0, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" 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" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +erc721a@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/erc721a/-/erc721a-4.2.3.tgz#ca6469b0e54afb0f614272c2147dc4cb49ff223f" + integrity sha512-0deF0hOOK1XI1Vxv3NKDh2E9sgzRlENuOoexjXRJIRfYCsLlqi9ejl2RF6Wcd9HfH0ldqC03wleQ2WDjxoOUvA== + errno@~0.1.1: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0: +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" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5, es-abstract@^1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" - integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== +es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0, es-abstract@^1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz" + 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.1" + 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" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + 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.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== 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" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2987,9 +3402,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.59" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" - integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== + version "0.10.61" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz" + integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -2997,8 +3412,8 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-iterator@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" es5-ext "^0.10.35" @@ -3006,7 +3421,7 @@ es6-iterator@^2.0.3: 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" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -3014,28 +3429,28 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 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 sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + 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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@4.0.0: +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" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.8.x: version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -3044,34 +3459,141 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +eslint-config-prettier@^8.3.0: + version "8.5.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-plugin-prettier@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.4.3" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^5.6.0: + version "5.16.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz" + 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" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.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 sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + 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" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.0.1: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + 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 sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + 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" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 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 sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + 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" + resolved "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz" integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== dependencies: eth-query "^2.1.0" @@ -3084,22 +3606,22 @@ eth-block-tracker@^3.0.0: 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 sha1-IprEbsqG1S4MmR58sq74P/D2i88= + resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== dependencies: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" eth-gas-reporter@^0.2.24: - version "0.2.24" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.24.tgz#768721fec7de02b566e4ebfd123466d275d7035c" - integrity sha512-RbXLC2bnuPHzIMU/rnLXXlb6oiHEEKu7rq2UrAX/0mfo0Lzrr/kb9QTjWjfz8eNvc+uu6J8AuBwI++b+MLNI2w== + version "0.2.25" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" + 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" - ethereumjs-util "6.2.0" + ethereum-cryptography "^1.0.3" ethers "^4.0.40" fs-readdir-recursive "^1.1.0" lodash "^4.17.14" @@ -3113,7 +3635,7 @@ eth-gas-reporter@^0.2.24: 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" + resolved "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz" integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== dependencies: cross-fetch "^2.1.1" @@ -3123,7 +3645,7 @@ eth-json-rpc-infura@^3.1.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" + resolved "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz" integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== dependencies: async "^2.5.0" @@ -3142,7 +3664,7 @@ eth-json-rpc-middleware@^1.5.0: eth-lib@0.2.8: version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz" integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== dependencies: bn.js "^4.11.6" @@ -3151,7 +3673,7 @@ eth-lib@0.2.8: eth-lib@^0.1.26: version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz" integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== dependencies: bn.js "^4.11.6" @@ -3163,7 +3685,7 @@ eth-lib@^0.1.26: 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" + resolved "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz" integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= dependencies: json-rpc-random-id "^1.0.0" @@ -3171,7 +3693,7 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: 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" + resolved "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz" integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== dependencies: buffer "^5.2.1" @@ -3184,14 +3706,14 @@ eth-sig-util@3.0.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 sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + 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" + resolved "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz" integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== dependencies: async "^2.1.2" @@ -3207,7 +3729,7 @@ eth-tx-summary@^3.1.2: ethashjs@~0.0.7: version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" + resolved "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz" integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== dependencies: async "^2.1.2" @@ -3217,24 +3739,24 @@ ethashjs@~0.0.7: 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" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" 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" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz" 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" + resolved "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@^0.1.2, 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" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -3253,9 +3775,19 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^1.0.3: + version "1.1.2" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz" + 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" + resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz" integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== dependencies: "@ethereum-waffle/chai" "^3.4.4" @@ -3266,7 +3798,7 @@ ethereum-waffle@^3.4.0: ethereumjs-abi@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz" integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= dependencies: bn.js "^4.10.0" @@ -3274,7 +3806,7 @@ ethereumjs-abi@0.6.5: 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" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -3289,7 +3821,7 @@ ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: 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" + resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz" integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== dependencies: ethereumjs-util "^6.0.0" @@ -3298,7 +3830,7 @@ ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: ethereumjs-account@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + resolved "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz" integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: ethereumjs-util "^5.0.0" @@ -3307,7 +3839,7 @@ ethereumjs-account@^2.0.3: 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" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== dependencies: async "^2.0.1" @@ -3318,7 +3850,7 @@ ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethere 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" + resolved "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz" integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== dependencies: async "^2.0.1" @@ -3329,7 +3861,7 @@ ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: ethereumjs-blockchain@^4.0.3: version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" + resolved "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz" integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== dependencies: async "^2.6.1" @@ -3343,19 +3875,14 @@ ethereumjs-blockchain@^4.0.3: rlp "^2.2.2" semaphore "^1.1.0" -ethereumjs-common@1.5.0: +ethereumjs-common@1.5.0, ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" + resolved "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz" 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" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz" integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== dependencies: ethereumjs-common "^1.5.0" @@ -3363,28 +3890,15 @@ ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: 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" + resolved "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz" integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== dependencies: ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" -ethereumjs-util@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" - integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^2.0.0" - rlp "^2.2.3" - secp256k1 "^3.0.1" - ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -3397,7 +3911,7 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumj ethereumjs-util@^4.3.0: version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz" integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== dependencies: bn.js "^4.8.0" @@ -3408,7 +3922,7 @@ ethereumjs-util@^4.3.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" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== dependencies: bn.js "^4.11.0" @@ -3419,10 +3933,10 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" @@ -3432,7 +3946,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereu ethereumjs-vm@4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz" integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== dependencies: async "^2.1.2" @@ -3453,7 +3967,7 @@ ethereumjs-vm@4.2.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" + resolved "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== dependencies: async "^2.1.2" @@ -3470,7 +3984,7 @@ ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: ethereumjs-wallet@0.6.5: version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" + resolved "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz" integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== dependencies: aes-js "^3.1.1" @@ -3485,7 +3999,7 @@ ethereumjs-wallet@0.6.5: ethers@^4.0.32, ethers@^4.0.40: version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: aes-js "3.0.0" @@ -3499,52 +4013,52 @@ ethers@^4.0.32, ethers@^4.0.40: xmlhttprequest "1.8.0" ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" - integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== - dependencies: - "@ethersproject/abi" "5.6.0" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" + version "5.6.9" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.6.9.tgz" + integrity sha512-lMGC2zv9HC5EC+8r429WaWu3uWJUCgUCt8xxKCFqkrFuBDZXDYIdzDUECxzjf2BMF8IVBByY1EBoGSL3RTm8RA== + dependencies: + "@ethersproject/abi" "5.6.4" + "@ethersproject/abstract-provider" "5.6.1" + "@ethersproject/abstract-signer" "5.6.2" + "@ethersproject/address" "5.6.1" + "@ethersproject/base64" "5.6.1" + "@ethersproject/basex" "5.6.1" + "@ethersproject/bignumber" "5.6.2" "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" + "@ethersproject/constants" "5.6.1" + "@ethersproject/contracts" "5.6.2" + "@ethersproject/hash" "5.6.1" + "@ethersproject/hdnode" "5.6.2" + "@ethersproject/json-wallets" "5.6.1" + "@ethersproject/keccak256" "5.6.1" "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.1" - "@ethersproject/pbkdf2" "5.6.0" + "@ethersproject/networks" "5.6.4" + "@ethersproject/pbkdf2" "5.6.1" "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.2" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" + "@ethersproject/providers" "5.6.8" + "@ethersproject/random" "5.6.1" + "@ethersproject/rlp" "5.6.1" + "@ethersproject/sha2" "5.6.1" + "@ethersproject/signing-key" "5.6.2" + "@ethersproject/solidity" "5.6.1" + "@ethersproject/strings" "5.6.1" + "@ethersproject/transactions" "5.6.2" + "@ethersproject/units" "5.6.1" + "@ethersproject/wallet" "5.6.2" + "@ethersproject/web" "5.6.1" + "@ethersproject/wordlists" "5.6.1" ethjs-unit@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" + 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" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -3552,12 +4066,12 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: 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" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" 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" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== events@^3.0.0: @@ -3567,20 +4081,15 @@ events@^3.0.0: 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" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" @@ -3592,58 +4101,59 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" express@^4.14.0: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.1" + resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + 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.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.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" + resolved "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz" 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" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 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" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" @@ -3651,12 +4161,21 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -3668,31 +4187,31 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -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== + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== 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" + resolved "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz" integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= dependencies: checkpoint-store "^1.1.0" fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^3.0.3: version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3703,36 +4222,45 @@ fast-glob@^3.0.3: 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" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + 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" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" 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" + resolved "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz" integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= dependencies: node-fetch "~1.7.1" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" + 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.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" @@ -3742,42 +4270,42 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + 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 sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= + resolved "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz" + integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== dependencies: array-back "^1.0.4" test-value "^2.1.0" 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" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -3785,22 +4313,22 @@ find-up@5.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 sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" find-up@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== dependencies: fs-extra "^4.0.3" @@ -3808,65 +4336,74 @@ find-yarn-workspace-root@^1.2.1: 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" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz" 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.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flat@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" 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" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + flow-stoplight@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" + resolved "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz" integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= fmix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw= + resolved "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz" + integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== dependencies: imul "^1.0.0" follow-redirects@^1.12.1, follow-redirects@^1.14.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + version "1.15.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" + 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" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" 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" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + 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" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== dependencies: asynckit "^0.4.0" @@ -3875,7 +4412,7 @@ form-data@^2.2.0: form-data@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" @@ -3884,7 +4421,7 @@ form-data@^3.0.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -3893,7 +4430,7 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -3902,35 +4439,30 @@ form-data@~2.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fp-ts@1.19.3: +fp-ts@1.19.3, fp-ts@^1.0.0: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" 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" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 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 sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3939,9 +4471,9 @@ fs-extra@^0.30.0: rimraf "^2.2.8" fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -3949,7 +4481,7 @@ fs-extra@^10.0.0: fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" @@ -3958,7 +4490,7 @@ fs-extra@^4.0.2, fs-extra@^4.0.3: 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" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -3967,7 +4499,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -3976,44 +4508,59 @@ fs-extra@^8.1.0: fs-minipass@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" 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" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" 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 sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" 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" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + 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 sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + 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" + resolved "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz" integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== dependencies: abstract-leveldown "3.0.0" @@ -4050,55 +4597,55 @@ ganache-core@^2.13.2: 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" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" 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" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 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 sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + 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.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + 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 sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" + 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 sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" 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" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" 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" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -4106,19 +4653,19 @@ get-symbol-description@^1.0.0: 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" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + 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" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: chalk "^2.4.2" @@ -4126,14 +4673,14 @@ ghost-testrpc@^0.0.2: 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" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 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" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" @@ -4143,9 +4690,9 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: +glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -4157,8 +4704,8 @@ glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: glob@^5.0.15: version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" inherits "2" @@ -4166,16 +4713,28 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@~7.2.3: + 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" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" 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" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -4184,20 +4743,25 @@ global-prefix@^3.0.0: global@~4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" process "^0.11.10" +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^9.18.0: version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" 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" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: "@types/glob" "^7.1.1" @@ -4211,7 +4775,7 @@ globby@^10.0.1: got@9.6.0: version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== dependencies: "@sindresorhus/is" "^0.14.0" @@ -4228,7 +4792,7 @@ got@9.6.0: got@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + resolved "https://registry.npmjs.org/got/-/got-7.1.0.tgz" integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== dependencies: decompress-response "^3.2.0" @@ -4246,19 +4810,19 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== growl@1.10.5: version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" 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" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" @@ -4270,33 +4834,33 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" har-schema "^2.0.0" hardhat-contract-sizer@^2.1.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.5.1.tgz#cb0b8dd32593b7a28c8d96ecde04841292bbd603" - integrity sha512-28yRb73e30aBVaZOOHTlHZFIdIasA/iFunIehrUviIJTubvdQjtSiQUo2wexHFtt71mQeMPP8qjw2sdbgatDnQ== + version "2.6.1" + resolved "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.6.1.tgz" + integrity sha512-b8wS7DBvyo22kmVwpzstAQTdDCThpl/ySBqZh5ga9Yxjf61/uTL12TEg5nl7lDeWy73ntEUzxMwY6XxbQEc2wA== dependencies: chalk "^4.0.0" cli-table3 "^0.6.0" hardhat-deploy-ethers@^0.3.0-beta.13: version "0.3.0-beta.13" - resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" + resolved "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz" integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== hardhat-deploy@^0.10.5: version "0.10.6" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.10.6.tgz#007d9c51484ffcf6187425a4288de9dd7d0a5999" + resolved "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.10.6.tgz" integrity sha512-/v/HI8QRa72Xl7+/D0kIZmYjSIwaghFkizZ/hmfYS0YtsYCrh5atxKl0dNkGhCVOWsbmWZQF9O4RrweozxjfEw== dependencies: "@ethersproject/abi" "^5.4.0" @@ -4324,7 +4888,7 @@ hardhat-deploy@^0.10.5: hardhat-gas-reporter@^1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz" integrity sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g== dependencies: array-uniq "1.0.3" @@ -4332,19 +4896,19 @@ hardhat-gas-reporter@^1.0.6: sha1 "^1.1.1" hardhat@^2.8.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.2.tgz#123f3fed6810ef8637b127b73ca44bb9c9efc249" - integrity sha512-elTcUK1EdFverWinybQ+DoJzsM6sgiHUYs0ZYNNXMfESty6ESHiFSwkfJsC88/q09vmIz6YVaMh73BYnYd+feQ== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" + version "2.10.1" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.10.1.tgz" + integrity sha512-0FN9TyCtn7Lt25SB2ei2G7nA2rZjP+RN6MvFOm+zYwherxLZNo6RbD8nDz88eCbhRapevmXqOiL2nM8INKsjmA== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/blockchain" "^5.5.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/tx" "^3.5.1" + "@ethereumjs/vm" "^5.9.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" + "@solidity-parser/parser" "^0.14.2" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -4357,19 +4921,19 @@ hardhat@^2.8.0: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" + ethereumjs-util "^7.1.4" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" + merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" qs "^6.7.0" raw-body "^2.4.1" @@ -4381,64 +4945,71 @@ hardhat@^2.8.0: stacktrace-parser "^0.1.10" "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.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" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + 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 sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + 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 sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz" 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" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" 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" + resolved "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz" 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" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" 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" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" @@ -4447,7 +5018,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" @@ -4456,12 +5027,12 @@ has-value@^1.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" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" @@ -4469,14 +5040,14 @@ has-values@^1.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" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 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" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -4485,7 +5056,7 @@ hash-base@^3.0.0: hash.js@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" @@ -4493,7 +5064,7 @@ hash.js@1.1.3: 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" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -4501,18 +5072,18 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: he@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 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" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -4520,7 +5091,7 @@ hmac-drbg@^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" + resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" @@ -4528,12 +5099,12 @@ home-or-tmp@^2.0.0: 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" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" 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" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== dependencies: caseless "^0.12.0" @@ -4543,23 +5114,12 @@ http-basic@^8.1.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" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -4570,36 +5130,36 @@ http-errors@2.0.0: http-https@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= + resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" 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 sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + 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.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" -iconv-lite@0.4.24: +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" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -4613,67 +5173,112 @@ iconv-lite@^0.6.2: 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" + resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== dependencies: punycode "2.1.0" ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + ignore@^5.1.1: version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" 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" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" 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" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz" integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= immutable@^4.0.0-rc.12: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + version "4.1.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" imul@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk= + resolved "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz" + integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + 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" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" 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 sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + 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" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 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" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" + 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" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: get-intrinsic "^1.1.0" @@ -4682,50 +5287,50 @@ internal-slot@^1.0.3: interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invariant@^2.2.2: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" 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 sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" 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" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 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" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 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" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" 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" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -4733,26 +5338,26 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + 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" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" 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" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 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" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -4760,57 +5365,57 @@ is-boolean-object@^1.1.0: is-buffer@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@~2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" 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" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" 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" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +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" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 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" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" 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" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" 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" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" @@ -4819,135 +5424,140 @@ is-descriptor@^0.1.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" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" 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.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" + 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" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" 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" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" 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 sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + 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" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" 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" + resolved "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz" integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= 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 sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" 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 sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 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 sha1-fY035q135dEnFIkTxXPggtd39VQ= + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" 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" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" 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" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 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" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 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" + resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" 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" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" 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" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" 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" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -4955,120 +5565,120 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: 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" + resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-shared-array-buffer@^1.0.1: +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" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" 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 sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" 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" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" + es-abstract "^1.20.0" + for-each "^0.3.3" has-tostringtag "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" 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" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" 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 sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + 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" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" 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" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" 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" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" 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" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 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 sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + 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 sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 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" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + 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" + resolved "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz" integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== dependencies: has-to-string-tag-x "^1.2.0" @@ -5076,35 +5686,35 @@ isurl@^1.0.0-alpha5: 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 sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" + 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" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -"js-tokens@^3.0.0 || ^4.0.0": +"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" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@3.13.1: version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x: +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" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -5112,34 +5722,39 @@ js-yaml@3.x: js-yaml@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 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 sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsesc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-buffer@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz" integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== dependencies: async "^2.0.1" @@ -5151,60 +5766,70 @@ json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: 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" + resolved "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz" integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= 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" + resolved "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz" integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= 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" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= 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 sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + 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 sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5213,17 +5838,17 @@ jsonfile@^6.0.1: jsonify@~0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsonschema@^1.2.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== + version "1.4.1" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -5233,25 +5858,15 @@ jsprim@^1.2.2: keccak@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" - integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== - dependencies: - bindings "^1.5.0" - inherits "^2.0.4" - nan "^2.14.0" - safe-buffer "^5.2.0" - keccak@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" @@ -5260,97 +5875,90 @@ keccak@^3.0.0: keyv@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" 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" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 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" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 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" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" 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" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" 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" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" 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 sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + 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 sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" 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" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz" 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" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz" 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== +level-errors@^1.0.3, level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== 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" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz" 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" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz" integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== dependencies: inherits "^2.0.1" @@ -5359,7 +5967,7 @@ level-iterator-stream@^2.0.3: 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" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz" integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= dependencies: inherits "^2.0.1" @@ -5369,7 +5977,7 @@ level-iterator-stream@~1.3.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" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz" integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== dependencies: inherits "^2.0.1" @@ -5378,7 +5986,7 @@ level-iterator-stream@~3.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" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz" integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== dependencies: inherits "^2.0.4" @@ -5387,7 +5995,7 @@ level-iterator-stream@~4.0.0: level-mem@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz" integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== dependencies: level-packager "~4.0.0" @@ -5395,7 +6003,7 @@ level-mem@^3.0.1: level-mem@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz" integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== dependencies: level-packager "^5.0.3" @@ -5403,7 +6011,7 @@ level-mem@^5.0.1: level-packager@^5.0.3: version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== dependencies: encoding-down "^6.3.0" @@ -5411,7 +6019,7 @@ level-packager@^5.0.3: level-packager@~4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz" integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== dependencies: encoding-down "~5.0.0" @@ -5419,14 +6027,14 @@ level-packager@~4.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" + resolved "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz" 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" + resolved "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz" integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== dependencies: bytewise "~1.1.0" @@ -5442,14 +6050,14 @@ level-sublevel@6.6.4: level-supports@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz" integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== dependencies: xtend "^4.0.2" level-ws@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz" integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= dependencies: readable-stream "~1.0.15" @@ -5457,7 +6065,7 @@ level-ws@0.0.0: level-ws@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz" integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== dependencies: inherits "^2.0.3" @@ -5466,7 +6074,7 @@ level-ws@^1.0.0: level-ws@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz" integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== dependencies: inherits "^2.0.3" @@ -5475,7 +6083,7 @@ level-ws@^2.0.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" + resolved "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz" integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== dependencies: deferred-leveldown "~4.0.0" @@ -5485,7 +6093,7 @@ levelup@3.1.1, levelup@^3.0.0: levelup@^1.2.1: version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + resolved "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz" integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== dependencies: deferred-leveldown "~1.2.1" @@ -5498,7 +6106,7 @@ levelup@^1.2.1: levelup@^4.3.2: version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + resolved "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== dependencies: deferred-leveldown "~5.3.0" @@ -5507,18 +6115,18 @@ levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" -levn@~0.3.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 sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" 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 sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -5528,15 +6136,15 @@ load-json-file@^1.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 sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -5544,36 +6152,41 @@ locate-path@^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" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" + integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== -lodash@4.17.20: +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@4.17.20, lodash@^4.17.4: version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 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" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -5581,104 +6194,104 @@ log-symbols@4.1.0: looper@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" + resolved "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz" integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= looper@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" + resolved "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz" integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= loose-envify@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 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" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" 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" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" 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" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" 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" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 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" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz" integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= 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" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 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 sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - -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 sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== -ltgt@~2.1.1: +ltgt@^2.1.2, ltgt@~2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz" integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 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" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== match-all@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + resolved "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz" integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" 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" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -5687,12 +6300,12 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + 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" + resolved "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz" integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= dependencies: abstract-leveldown "~2.7.1" @@ -5704,7 +6317,7 @@ memdown@^1.0.0: memdown@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== dependencies: abstract-leveldown "~6.2.1" @@ -5716,7 +6329,7 @@ memdown@^5.0.0: memdown@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" + resolved "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz" integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== dependencies: abstract-leveldown "~5.0.0" @@ -5728,22 +6341,22 @@ memdown@~3.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + 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 sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 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" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz" integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== dependencies: async "^2.6.1" @@ -5756,7 +6369,7 @@ merkle-patricia-tree@3.0.0: 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" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== dependencies: async "^1.4.2" @@ -5768,9 +6381,9 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: +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" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== dependencies: "@types/levelup" "^4.3.0" @@ -5782,12 +6395,12 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + 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" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -5806,7 +6419,7 @@ micromatch@^3.1.4: micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -5814,7 +6427,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -5822,72 +6435,77 @@ miller-rabin@^4.0.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 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" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 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" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" 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 sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" + 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" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" 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 sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 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" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.5: +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" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" 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" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" @@ -5895,14 +6513,14 @@ minipass@^2.6.0, minipass@^2.9.0: minizlib@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" 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" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" @@ -5910,40 +6528,63 @@ mixin-deep@^1.2.0: mkdirp-promise@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + resolved "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz" + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== dependencies: mkdirp "*" -mkdirp@*: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@*, mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" mkdirp@0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" 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" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" +mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" @@ -5971,64 +6612,34 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - 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.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - mock-fs@^4.1.0: version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + resolved "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: +ms@2.1.2, ms@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 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" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz" integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== dependencies: base-x "^3.0.8" @@ -6036,7 +6647,7 @@ multibase@^0.7.0: multibase@~0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz" integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== dependencies: base-x "^3.0.8" @@ -6044,14 +6655,14 @@ multibase@~0.6.0: multicodec@^0.5.5: version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz" 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" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz" integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== dependencies: buffer "^5.6.0" @@ -6059,7 +6670,7 @@ multicodec@^1.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" + resolved "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz" integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== dependencies: buffer "^5.5.0" @@ -6068,31 +6679,31 @@ multihashes@^0.4.15, multihashes@~0.4.15: murmur-128@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + resolved "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz" integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== dependencies: encode-utf8 "^1.0.2" fmix "^0.1.0" imul "^1.0.0" -nan@^2.14.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" + 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 sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= + resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" + 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" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -6107,81 +6718,91 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" 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" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" 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" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" 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" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" 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" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" 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" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" 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" + resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@^2.6.1: +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" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" 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" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" 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.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + version "4.5.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + +nofilter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz" + integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + 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" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -6191,50 +6812,50 @@ normalize-package-data@^2.3.2: 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" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" 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 sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + 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 sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" + 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" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" 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 sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + 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" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 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.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.2: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-is@^1.0.1: version "1.1.5" @@ -6244,26 +6865,26 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +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" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" 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" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 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" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" @@ -6273,7 +6894,7 @@ object.assign@4.1.0: object.assign@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" @@ -6282,65 +6903,73 @@ object.assign@^4.1.2: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + version "2.1.4" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz" + integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== dependencies: + array.prototype.reduce "^1.0.4" call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + 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" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" obliterator@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.2.tgz#25f50dc92e1181371b9d8209d11890f1a3c2fc21" - integrity sha512-g0TrA7SbUggROhDPK8cEu/qpItwH2LSKcNl4tlfBNT54XY+nOsqrs0Q68h1V9b3HOSpIWv15jb1lax2hAggdIg== + version "2.0.4" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== oboe@2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz" integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= dependencies: http-https "^1.0.0" oboe@2.1.5: version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== dependencies: http-https "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" 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 sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" 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.1, optionator@^0.8.2: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -6352,105 +6981,112 @@ optionator@^0.8.1: os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + 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 sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz" 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" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" 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 sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" 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" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" 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" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 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 sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 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" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" 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 sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz" + 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 sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: asn1.js "^5.2.0" @@ -6461,34 +7097,42 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: 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 sha1-juqz5U+laSD+Fro493+iGqzC104= + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" 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 sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 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" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= patch-package@6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz" integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -6506,7 +7150,7 @@ patch-package@6.2.2: patch-package@^6.2.2: version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz" integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -6525,50 +7169,55 @@ patch-package@^6.2.2: path-browserify@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" 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 sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + 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 sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + 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 sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== 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" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 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 sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + 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 sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -6576,17 +7225,17 @@ path-type@^1.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" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" 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" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -6597,94 +7246,106 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 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" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" 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 sha1-ITXW36ejWMBprJsXh3YogihFD/o= + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + 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 sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + 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" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postinstall-postinstall@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + resolved "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== precond@0.2: version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + resolved "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + 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 sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + 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 sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== -prettier@^2.1.2: - version "2.6.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17" - integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" -printj@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" - integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== +prettier@^1.14.3: + version "1.19.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.1.2, prettier@^2.4.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + 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" + resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" 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" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" 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 sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + 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" + resolved "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz" integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= dependencies: is-fn "^1.0.0" @@ -6692,14 +7353,23 @@ promise-to-callback@^1.0.0: promise@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + resolved "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz" integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: asap "~2.0.6" +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -6707,22 +7377,22 @@ proxy-addr@~2.0.7: prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + 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" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -6734,17 +7404,17 @@ public-encrypt@^4.0.0: pull-cat@^1.1.9: version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" + resolved "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz" integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= pull-defer@^0.2.2: version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" + resolved "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz" 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" + resolved "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz" integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== dependencies: level-post "^1.0.7" @@ -6757,7 +7427,7 @@ pull-level@^2.0.3: pull-live@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" + resolved "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz" integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= dependencies: pull-cat "^1.1.9" @@ -6765,24 +7435,24 @@ pull-live@^1.0.1: pull-pushable@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" + resolved "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz" integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= 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" + resolved "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz" 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" + resolved "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz" integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= dependencies: looper "^2.0.0" pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -6790,39 +7460,41 @@ pump@^3.0.0: punycode@1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@2.1.0: +punycode@2.1.0, punycode@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@6.10.3: version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" +qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + 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== + version "6.5.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" @@ -6831,24 +7503,24 @@ query-string@^5.0.1: querystring@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 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" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" 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" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" @@ -6856,22 +7528,12 @@ randomfill@^1.0.3: range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@^2.4.1: +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" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -6881,16 +7543,16 @@ raw-body@^2.4.1: 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 sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== dependencies: find-up "^1.0.0" read-pkg "^1.0.0" read-pkg@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -6898,7 +7560,7 @@ read-pkg@^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" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" @@ -6908,7 +7570,7 @@ readable-stream@^1.0.33: 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.6, readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -6921,7 +7583,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable 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" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -6930,7 +7592,7 @@ readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable readable-stream@~1.0.15: version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" @@ -6940,45 +7602,45 @@ readable-stream@~1.0.15: readdirp@~3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" 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" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 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 sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + 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" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" regenerate@^1.2.1: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" 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" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" 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" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz" integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" @@ -6987,23 +7649,29 @@ regenerator-transform@^0.10.0: 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" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + 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.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" @@ -7012,12 +7680,12 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" @@ -7029,40 +7697,40 @@ repeat-element@^1.1.2: repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 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 sha1-1AgrTURZgDZkD7c93qAe1T20nrw= + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" + 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 sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA= + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" 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" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: request-promise-core "1.1.4" @@ -7071,7 +7739,7 @@ request-promise-native@^1.0.5: 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" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -7097,94 +7765,119 @@ request@^2.79.0, request@^2.85.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + 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 sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== -require-from-string@^2.0.0: +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 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 sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" 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 sha1-six699nWiBvItuZTM17rywoYh0g= + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.x: version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@1.17.0: +resolve@1.17.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1, resolve@~1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@~1.22.1: + 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.8.1" + 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 sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= 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" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + 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" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 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" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -7192,55 +7885,67 @@ ripemd160@^2.0.0, ripemd160@^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" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" 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.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 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" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== +rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.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" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 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" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 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" + resolved "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz" 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" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 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" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 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" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" @@ -7260,38 +7965,24 @@ sc-istanbul@^0.4.5: scrypt-js@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" 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" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== scryptsy@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" + resolved "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz" integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= dependencies: pbkdf2 "^3.0.3" -secp256k1@^3.0.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -7300,80 +7991,80 @@ secp256k1@^4.0.1: seedrandom@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== semaphore-async-await@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" + 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" + resolved "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"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" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.3.4, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + 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" + resolved "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + 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 "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + 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" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" servify@^0.1.12: version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + resolved "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz" integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== dependencies: body-parser "^1.16.0" @@ -7384,17 +8075,17 @@ servify@^0.1.12: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= 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" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -7404,22 +8095,22 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" + 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 sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + 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" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" 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" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -7427,27 +8118,27 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg= + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" + 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 sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.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 sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shelljs@^0.8.3: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -7456,16 +8147,21 @@ shelljs@^0.8.3: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" 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.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + 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" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: @@ -7479,22 +8175,40 @@ simple-get@^2.7.0: slash@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" + 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.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -7503,14 +8217,14 @@ snapdragon-node@^2.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" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" 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" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -7524,7 +8238,7 @@ snapdragon@^0.8.1: solc@0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" @@ -7539,7 +8253,7 @@ solc@0.7.3: solc@^0.4.20: version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== dependencies: fs-extra "^0.30.0" @@ -7550,7 +8264,7 @@ solc@^0.4.20: solc@^0.6.3: version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" + resolved "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz" integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== dependencies: command-exists "^1.2.8" @@ -7562,10 +8276,42 @@ solc@^0.6.3: semver "^5.5.0" tmp "0.0.33" +solhint@^3.3.6: + version "3.3.7" + resolved "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz" + 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-ast@^0.4.15: + version "0.4.35" + resolved "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.35.tgz" + integrity sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA== + +solidity-comments-extractor@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" + integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== + solidity-coverage@^0.7.17: - version "0.7.20" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" - integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== + version "0.7.21" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.21.tgz" + integrity sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg== dependencies: "@solidity-parser/parser" "^0.14.0" "@truffle/provider" "^0.2.24" @@ -7588,7 +8334,7 @@ solidity-coverage@^0.7.17: 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" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" @@ -7599,7 +8345,7 @@ source-map-resolve@^0.5.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" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz" integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" @@ -7607,14 +8353,14 @@ source-map-support@0.5.12: 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" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" 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" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -7627,24 +8373,24 @@ source-map-url@^0.4.0: 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" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 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" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 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 sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -7652,12 +8398,12 @@ spdx-correct@^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" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" 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" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -7665,24 +8411,24 @@ spdx-expression-parse@^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" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz" integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== 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" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" 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 sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -7697,14 +8443,14 @@ sshpk@^1.7.0: stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" @@ -7712,22 +8458,17 @@ static-extend@^0.1.1: statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - stealthy-require@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" + 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" + resolved "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz" integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== dependencies: looper "^3.0.0" @@ -7735,21 +8476,21 @@ stream-to-pull-stream@^1.7.1: strict-uri-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== string-width@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.1: +"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" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -7757,154 +8498,156 @@ string-width@^1.0.1: 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" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 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.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" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 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.5" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" - integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== +string.prototype.trim@~1.2.6: + 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.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + 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" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" 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" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" 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 sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + 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 sha1-qEeQIusaw2iocTibY1JixQXuNo8= + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" 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" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 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" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 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 sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" 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 sha1-DF8VX+8RUTczd96du1iNoFUA428= + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@2.0.1: +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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 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" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 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" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" supports-color@8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" 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" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + 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" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 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" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -7916,7 +8659,7 @@ supports-preserve-symlinks-flag@^1.0.0: swarm-js@^0.1.40: version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" + resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz" integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== dependencies: bluebird "^3.5.0" @@ -7933,7 +8676,7 @@ swarm-js@^0.1.40: sync-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== dependencies: http-response-object "^3.0.1" @@ -7942,35 +8685,56 @@ sync-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" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: get-port "^3.1.0" +table@^5.2.3: + version "5.4.6" + resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" + 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.8.0: + version "6.8.0" + resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" + 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.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.15.0.tgz#1b8a9563b4bc7e51302216c137732fb2ce6d1a99" - integrity sha512-SfRmG2I8QGGgJE/MCiLH8c11L5XxyUXxwK9xLRD0uiK5fehRkkSZGmR6Y1pxOt8vJ19m3sY+POTQpiaVv45/LQ== + version "4.16.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.16.1.tgz#8d511b3a0be1a30441885972047c1dac822fd9be" + integrity sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg== 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" + glob "~7.2.3" has "~1.0.3" inherits "~2.0.4" is-regex "~1.1.4" - minimist "~1.2.5" - object-inspect "~1.12.0" - resolve "~1.22.0" + minimist "~1.2.6" + object-inspect "~1.12.2" + resolve "~1.22.1" resumer "~0.0.0" - string.prototype.trim "~1.2.5" + string.prototype.trim "~1.2.6" through "~2.3.8" tar@^4.0.2: version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: chownr "^1.1.4" @@ -7983,20 +8747,25 @@ tar@^4.0.2: test-value@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= + resolved "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + 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" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: "@types/concat-stream" "^1.6.0" @@ -8013,56 +8782,56 @@ then-request@^6.0.0: through2@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" xtend "~4.0.1" -through@~2.3.4, through@~2.3.8: +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 sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + 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 sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" 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" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz" integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== dependencies: rimraf "^2.6.3" 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" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= 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" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 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" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" 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" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" @@ -8070,14 +8839,14 @@ to-regex-range@^2.1.0: 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" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 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" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -8087,12 +8856,12 @@ to-regex@^3.0.1, to-regex@^3.0.2: toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" 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" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -8100,32 +8869,32 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-right@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= "true-case-path@^2.2.1": version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== ts-essentials@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz" 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" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz" integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw== ts-generator@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" + resolved "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz" integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== dependencies: "@types/mkdirp" "^0.5.2" @@ -8138,63 +8907,63 @@ ts-generator@^0.1.1: resolve "^1.8.1" ts-essentials "^1.0.0" -tslib@^1.9.3: +tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + 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" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" 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 sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + 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" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + 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" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" 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" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" 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" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -8202,17 +8971,17 @@ type-is@~1.6.18: type@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.5.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" + resolved "https://registry.npmjs.org/type/-/type-2.6.0.tgz" integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== typechain@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" + resolved "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz" integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== dependencies: command-line-args "^4.0.7" @@ -8225,71 +8994,71 @@ typechain@^3.0.0: 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" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== 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" + resolved "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz" integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= typewise@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + resolved "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz" integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= 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" + resolved "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz" integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= 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 sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= + resolved "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz" + integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== uglify-js@^3.1.4: - version "3.15.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.3.tgz#9aa82ca22419ba4c0137642ba0df800cb06e0471" - integrity sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg== + version "3.16.3" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz" + integrity sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw== ultron@~1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + 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" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^4.14.1: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== +undici@^5.4.0: + version "5.8.0" + resolved "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz" + integrity sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q== union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -8299,27 +9068,27 @@ union-value@^1.0.0: universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" 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" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unorm@^1.3.3: version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + resolved "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz" 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 sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + 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" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" @@ -8327,73 +9096,73 @@ unset-value@^1.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" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 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" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 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 sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + 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 sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + 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 sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= + resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" + 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 sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + resolved "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz" + 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 sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" + 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" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" 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" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz" 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" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" 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 sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + 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" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz" integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: call-bind "^1.0.0" @@ -8404,7 +9173,7 @@ util.promisify@^1.0.0: util@^0.12.0: version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + resolved "https://registry.npmjs.org/util/-/util-0.12.4.tgz" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== dependencies: inherits "^2.0.3" @@ -8416,32 +9185,32 @@ util@^0.12.0: utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + 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 sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + 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" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" 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" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" 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" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 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" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -8449,18 +9218,18 @@ validate-npm-package-license@^3.0.1: varint@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" 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 sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + 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 sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -8468,7 +9237,7 @@ verror@1.10.0: web3-bzz@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz" integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== dependencies: "@types/node" "^12.12.6" @@ -8476,10 +9245,10 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== +web3-bzz@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz" + integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== dependencies: "@types/node" "^12.12.6" got "9.6.0" @@ -8487,24 +9256,24 @@ web3-bzz@1.5.3: 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" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz" integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== dependencies: underscore "1.9.1" web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== +web3-core-helpers@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz" + integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" + web3-eth-iban "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz" integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" @@ -8514,35 +9283,34 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== +web3-core-method@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz" + integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz" integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== +web3-core-promievent@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz" + integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== 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" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz" integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== dependencies: underscore "1.9.1" @@ -8551,37 +9319,37 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== +web3-core-requestmanager@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz" + integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== dependencies: util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" + web3-core-helpers "1.7.4" + web3-providers-http "1.7.4" + web3-providers-ipc "1.7.4" + web3-providers-ws "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz" integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== dependencies: eventemitter3 "4.0.4" underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== +web3-core-subscriptions@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz" + integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" web3-core@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz" integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== dependencies: "@types/bn.js" "^4.11.5" @@ -8592,39 +9360,39 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== +web3-core@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz" + integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== dependencies: - "@types/bn.js" "^4.11.5" + "@types/bn.js" "^5.1.0" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-requestmanager "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz" integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== dependencies: "@ethersproject/abi" "5.0.0-beta.153" underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== +web3-eth-abi@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz" + integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" + "@ethersproject/abi" "^5.6.3" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz" integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== dependencies: crypto-browserify "3.12.0" @@ -8639,26 +9407,26 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== +web3-eth-accounts@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz" + integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" crypto-browserify "3.12.0" eth-lib "0.2.8" ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz" integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== dependencies: "@types/bn.js" "^4.11.5" @@ -8671,23 +9439,23 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== +web3-eth-contract@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz" + integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" + "@types/bn.js" "^5.1.0" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz" integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== dependencies: content-hash "^2.5.2" @@ -8700,39 +9468,39 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== +web3-eth-ens@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz" + integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-contract "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz" integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== dependencies: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== +web3-eth-iban@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz" + integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" + bn.js "^5.2.1" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz" integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== dependencies: "@types/node" "^12.12.6" @@ -8742,21 +9510,21 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== +web3-eth-personal@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz" + integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== dependencies: "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" web3-eth@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz" integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== dependencies: underscore "1.9.1" @@ -8773,45 +9541,45 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" +web3-eth@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz" + integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== + dependencies: + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-accounts "1.7.4" + web3-eth-contract "1.7.4" + web3-eth-ens "1.7.4" + web3-eth-iban "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" web3-net@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz" integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== dependencies: web3-core "1.2.11" web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== +web3-net@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz" + integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz" integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== dependencies: async "^2.5.0" @@ -8837,40 +9605,40 @@ web3-provider-engine@14.2.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" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz" integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== dependencies: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== +web3-providers-http@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz" + integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== dependencies: - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz" integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== dependencies: oboe "2.1.4" underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== +web3-providers-ipc@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz" + integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== dependencies: oboe "2.1.5" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" 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" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz" integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== dependencies: eventemitter3 "4.0.4" @@ -8878,18 +9646,18 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== +web3-providers-ws@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz" + integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" + web3-core-helpers "1.7.4" websocket "^1.0.32" web3-shh@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz" integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== dependencies: web3-core "1.2.11" @@ -8897,19 +9665,19 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== +web3-shh@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz" + integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-net "1.7.4" web3-utils@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz" integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: bn.js "^4.11.9" @@ -8921,25 +9689,12 @@ web3-utils@1.2.11: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== - 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" - utf8 "3.0.0" - -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" - integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== +web3-utils@1.7.4, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.7.4" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz" + integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== dependencies: - bn.js "^4.11.9" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" @@ -8949,7 +9704,7 @@ web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: web3@1.2.11: version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" + resolved "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz" integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== dependencies: web3-bzz "1.2.11" @@ -8960,27 +9715,27 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== +web3@1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz" + integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" + web3-bzz "1.7.4" + web3-core "1.7.4" + web3-eth "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-shh "1.7.4" + web3-utils "1.7.4" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -websocket@1.0.32: +websocket@1.0.32, websocket@^1.0.31: version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz" integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== dependencies: bufferutil "^4.0.1" @@ -8990,9 +9745,9 @@ websocket@1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -websocket@^1.0.31, websocket@^1.0.32: +websocket@^1.0.32: version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== dependencies: bufferutil "^4.0.1" @@ -9002,22 +9757,22 @@ websocket@^1.0.31, websocket@^1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -whatwg-fetch@2.0.4: +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-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" 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" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -9028,78 +9783,71 @@ which-boxed-primitive@^1.0.2: which-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" + 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 sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + version "1.1.8" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" + es-abstract "^1.20.0" + for-each "^0.3.3" has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" + is-typed-array "^1.1.9" 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" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@2.0.2: - 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" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" 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 sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" + integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" 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 sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" + 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 sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" @@ -9108,7 +9856,7 @@ wrap-ansi@^5.1.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -9117,17 +9865,24 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" -ws@7.4.6: +ws@7.4.6, ws@^7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" 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" + resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz" integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" @@ -9141,21 +9896,16 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" -ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== - 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" + resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== dependencies: xhr-request "^1.1.0" 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" + resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== dependencies: buffer-to-arraybuffer "^0.0.5" @@ -9168,14 +9918,14 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: xhr2-cookies@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz" + 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" + resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: global "~4.4.0" @@ -9185,80 +9935,75 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: xmlhttprequest@1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" + 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" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 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" + resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz" integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= 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" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" 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" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 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 sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz" + 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" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.2.4: +yargs-parser@20.2.4, yargs-parser@^20.2.2: version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" 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 sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" + integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== dependencies: camelcase "^3.0.0" lodash.assign "^4.0.6" -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-unparser@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" @@ -9267,7 +10012,7 @@ yargs-unparser@1.6.0: yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -9277,7 +10022,7 @@ yargs-unparser@2.0.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" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" @@ -9293,7 +10038,7 @@ yargs@13.3.2, yargs@^13.3.0: yargs@16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -9306,8 +10051,8 @@ yargs@16.2.0: yargs@^4.7.1: version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= + resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" + integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== dependencies: cliui "^3.2.0" decamelize "^1.1.1" @@ -9326,5 +10071,5 @@ yargs@^4.7.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==