diff --git a/.circleci/config.yml b/.circleci/config.yml index 63b4a6b7f..20e638e45 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: environment: BASH_ENV: ~/.nvm/nvm.sh docker: - - image: circleci/golang:1.12.13-browsers + - image: circleci/golang:1.13.4-browsers - image: 0xorg/ganache-cli:istanbul environment: VERSION: 5.1.0 diff --git a/.drone.yml b/.drone.yml index e0327d91b..a3ee4b8d3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -83,3 +83,27 @@ trigger: - push node_selector: drone-builds: true +--- +kind: pipeline +type: docker +name: mesh-publish-release-notes + +steps: + - name: publish + image: plugins/github-release + settings: + api_key: + from_secret: github_public_repo + files: + - / + note: RELEASE_CHANGELOG.md + when: + event: tag + ref: + - refs/tags/v* +trigger: + event: + include: + - tag +node_selector: + drone-builds: true diff --git a/.gitignore b/.gitignore index 13529b4eb..75951be8a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ rpc/clients/typescript/ganache.log *.wasm browser/lib browser/ts/generated +browser/dist/bundle.js examples/browser/dist/bundle.js integration-tests/browser/dist/bundle.js !integration-tests/data/standalone-0/keys/privKey diff --git a/CHANGELOG.md b/CHANGELOG.md index a18006830..7d9573f37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ This changelog is a work in progress and may contain notes for versions which have not actually been released. Check the [Releases](https://github.com/0xProject/0x-mesh/releases) page to see full release notes and more information about the latest released versions. +## v9.0.0 + +### Breaking changes 🛠 + +- As a result of implementing custom order filters, some of the code Mesh uses under the hood to share orders with peers has changed. As a result this version of Mesh cannot share orders with any older versions and vice versa ([#630](https://github.com/0xProject/0x-mesh/pull/630)). +- Implemented a new protocol for sharing existing orders with peers. This will drastically reduce bandwidth and CPU usage and increase the speed at which _new_ orders are propagated. ([#692](https://github.com/0xProject/0x-mesh/pull/692)). +- Rename `RPC_ADDR` to `WS_RPC_ADDR` since we now support both WS and HTTP JSON-RPC endpoints. ([#658](https://github.com/0xProject/0x-mesh/pull/658)) + +### Features ✅ + +- Implemented custom order filters, which allow users to filter out all but the orders they care about. When a custom order filter is specified, Mesh will only send and receive orders that pass the filter. ([#630](https://github.com/0xProject/0x-mesh/pull/630)). +- Developers can now override the contract addresses for any testnet using the `CUSTOM_CONTRACT_ADDRESSES` env config ([#640](https://github.com/0xProject/0x-mesh/pull/640)). +- Added `getOrdersForPageAsync` method to `@0x/mesh-rpc-client` WS client interface so that clients can paginate through the retrieved orders themselves ([#642](https://github.com/0xProject/0x-mesh/pull/642)). +- Added support for passing in your own Web3 provider when using the `@0x/mesh-browser` package. ([#665](https://github.com/0xProject/0x-mesh/pull/665)). +- Add support for orders involving Chai ERC20Bridge assetData ([#663](https://github.com/0xProject/0x-mesh/pull/663)) +- Add support for calling JSON-RPC methods over HTTP (env config `HTTP_RPC_ADDR` defaults to `localhost:60556`). ([#658](https://github.com/0xProject/0x-mesh/pull/658)) + +### Bug fixes 🐞 + +- Fixed some of the browser typescript bindings to be consistent with the Go and smart contract implementations ([#697](https://github.com/0xProject/0x-mesh/pull/697)). + ## v8.2.0 ### Features ✅ @@ -13,7 +34,6 @@ This changelog is a work in progress and may contain notes for versions which ha - Update DevUtils contract address to fix intermittent revert issues. ([#671](https://github.com/0xProject/0x-mesh/pull/671)). - ## v8.1.2 ### Bug fixes 🐞 @@ -30,7 +50,6 @@ This changelog is a work in progress and may contain notes for versions which ha - Fixed a regression which can result in memory leaks. ([#650](https://github.com/0xProject/0x-mesh/pull/650)). - ## v8.1.0 ### Features ✅ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9641b5b0..76e855579 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,10 +30,13 @@ the dropdown menu in the GitHub UI to select `development`. ## Prerequisites - [GNU Make](https://www.gnu.org/software/make/) If you are using a Unix-like OS, you probably already have this. -- [Go version 1.12.x](https://golang.org/dl/) (or use [the version manager called "g"](https://github.com/stefanmaric/g)). Go 1.13 is not supported yet (see https://github.com/0xProject/0x-mesh/issues/480). -- [Node.js version >=11](https://nodejs.org/en/download/) (or use the [nvm version manager](https://github.com/creationix/nvm)) -- [Yarn package manager](https://yarnpkg.com/en/) -- [golangci-lint version 1.22.2](https://github.com/golangci/golangci-lint#install) +- [Go version 1.13.x](https://golang.org/dl/) (or use [the version manager called "g"](https://github.com/stefanmaric/g)). +- [Node.js version >=11](https://nodejs.org/en/download/) (or use the [nvm version manager](https://github.com/creationix/nvm)). +- [Yarn package manager](https://yarnpkg.com/en/). +- [golangci-lint version 1.22.2](https://github.com/golangci/golangci-lint#install). +- [Python](https://www.python.org/downloads/). (Many OSes already have this). +- [Google Chrome](https://www.google.com/chrome/). If you already have Google Chrome you typically don't need to do anything. On Ubuntu you can run `wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy install`. +- A C compiler such as [GCC](https://gcc.gnu.org/) or [Clang](https://clang.llvm.org/). Some OSes will already have this. On Ubuntu you can run `sudo apt-get install build-essential`. ## Installing Dependencies diff --git a/Makefile b/Makefile index 17cd7dc84..83350e27a 100644 --- a/Makefile +++ b/Makefile @@ -38,21 +38,25 @@ test-all: test-go test-wasm-node test-wasm-browser .PHONY: test-go -test-go: test-go-parallel test-go-serial +test-go: test-go-parallel test-go-serial test-browser-conversion + .PHONY: test-go-parallel test-go-parallel: go test ./... -race -timeout 30s + .PHONY: test-go-serial test-go-serial: go test ./zeroex/ordervalidator ./zeroex/orderwatch ./core -race -timeout 90s -p=1 --serial - .PHONY: test-browser-integration test-browser-integration: go test ./integration-tests -timeout 185s --enable-browser-integration-tests -run BrowserIntegration +.PHONY: test-browser-conversion +test-browser-conversion: + go test ./browser/go/conversion-test -timeout 185s --enable-browser-conversion-tests -run BrowserConversions .PHONY: test-wasm-node test-wasm-node: diff --git a/README.md b/README.md index 0d50b4aaa..f4496f8eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Version](https://img.shields.io/badge/version-8.2.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) +[![Version](https://img.shields.io/badge/version-9.0.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) [![Docs](https://img.shields.io/badge/docs-website-yellow.svg)](https://0x-org.gitbook.io/mesh) [![Chat with us on Discord](https://img.shields.io/badge/chat-Discord-blueViolet.svg)](https://discord.gg/HF7fHwk) [![Circle CI](https://img.shields.io/circleci/project/0xProject/0x-mesh/master.svg)](https://circleci.com/gh/0xProject/0x-mesh/tree/master) @@ -6,9 +6,15 @@ # 0x Mesh 0x Mesh is a peer-to-peer network for sharing orders that adhere to the -[0x order message format](https://0x.org/docs/guides/v2-specification#order-message-format). +[0x order message format](https://0x.org/docs/guides/v3-specification#orders). + +## Project status + +We have reached the point where Mesh is being used by some teams in production. We feel that for many use cases, Mesh is stable enough for production. However, we caution that there are some issues and shortcomings in its current state, which generally fall into two categories: + +- Order sharing: Mesh uses a significant amount of bandwidth for it's current order sharing algorithm and we intend on improving its efficiency by an order of magnitude. Until then, we advise you host your node on [Digital Ocean](https://www.digitalocean.com/) where it's hosting costs are cheaper (~$25 mo). We also know that orders are not propagating through the network as quickly as we would like. We have a lot of ideas for how to optimize order propagation speed in the future and there should be major improvements coming soon. See [#594](https://github.com/0xProject/0x-mesh/issues/594), [#551](https://github.com/0xProject/0x-mesh/issues/551), and [#638](https://github.com/0xProject/0x-mesh/issues/638). +- Browser usage: Mesh can run directly in the browser via the [@0x/mesh-browser](https://www.npmjs.com/package/@0x/mesh-browser) package. We have supported this for a while and have examples and integration tests in this repository. While the basic functionality is working, there are still some [important missing features and issues to address](https://github.com/0xProject/0x-mesh/issues?q=is%3Aopen+is%3Aissue+label%3Abrowser) before `@0x/mesh-browser` is feasible for most production use cases. -WARNING: This project is still under active development. Expect breaking changes before the official release. ## Overview @@ -18,14 +24,14 @@ WARNING: This project is still under active development. Expect breaking changes from market makers. This allows them to increase the depth of their order books and provide a better user experience. - Market makers can use Mesh to reach a broader audience. Their orders will be - sent throughout the network and are more likely to be filled. + sent throughout the network and picked up by many trading venues and are therefore more likely to be filled. - Mesh allows for a new type of relayer called a "serverless relayer". In the serverless relayer model, each user runs Mesh in their browser and there is no backend server or database. Instead, peers share orders directly with one another. (There are pros and cons to this approach and it is probably not suitable for all markets). -Both Relayers and Market makers can use Mesh to watch a set of orders for changes in fillability (e.g., cancellations, fills, expirations, etc...). +Both Relayers and Market makers can use Mesh to watch a set of 0x orders for changes in fillability (e.g., cancellations, fills, expirations, etc...). 0x Mesh is intended to be entirely automatic. It takes care of all the work of receiving, sharing, and validating orders so that you can focus on building your diff --git a/RELEASE_CHANGELOG.md b/RELEASE_CHANGELOG.md new file mode 100644 index 000000000..4f5b5b197 --- /dev/null +++ b/RELEASE_CHANGELOG.md @@ -0,0 +1,25 @@ +- [Docker image](https://hub.docker.com/r/0xorg/mesh/tags) +- [README](https://github.com/0xProject/0x-mesh/blob/v9.0.0/README.md) + +## Summary + +### Breaking changes 🛠 + +- As a result of implementing custom order filters, some of the code Mesh uses under the hood to share orders with peers has changed. As a result this version of Mesh cannot share orders with any older versions and vice versa ([#630](https://github.com/0xProject/0x-mesh/pull/630)). +- Implemented a new protocol for sharing existing orders with peers. This will drastically reduce bandwidth and CPU usage and increase the speed at which _new_ orders are propagated. ([#692](https://github.com/0xProject/0x-mesh/pull/692)). +- Rename `RPC_ADDR` to `WS_RPC_ADDR` since we now support both WS and HTTP JSON-RPC endpoints. ([#658](https://github.com/0xProject/0x-mesh/pull/658)) + +### Features ✅ + +- Implemented custom order filters, which allow users to filter out all but the orders they care about. When a custom order filter is specified, Mesh will only send and receive orders that pass the filter. ([#630](https://github.com/0xProject/0x-mesh/pull/630)). +- Developers can now override the contract addresses for any testnet using the `CUSTOM_CONTRACT_ADDRESSES` env config ([#640](https://github.com/0xProject/0x-mesh/pull/640)). +- Added `getOrdersForPageAsync` method to `@0x/mesh-rpc-client` WS client interface so that clients can paginate through the retrieved orders themselves ([#642](https://github.com/0xProject/0x-mesh/pull/642)). +- Added support for passing in your own Web3 provider when using the `@0x/mesh-browser` package. ([#665](https://github.com/0xProject/0x-mesh/pull/665)). +- Add support for orders involving Chai ERC20Bridge assetData ([#663](https://github.com/0xProject/0x-mesh/pull/663)) +- Add support for calling JSON-RPC methods over HTTP (env config `HTTP_RPC_ADDR` defaults to `localhost:60556`). ([#658](https://github.com/0xProject/0x-mesh/pull/658)) + +### Bug fixes 🐞 + +- Fixed some of the browser typescript bindings to be consistent with the Go and smart contract implementations ([#697](https://github.com/0xProject/0x-mesh/pull/697)). + + diff --git a/browser/conversion-tests/conversion_test.ts b/browser/conversion-tests/conversion_test.ts new file mode 100644 index 000000000..f1e60e0e2 --- /dev/null +++ b/browser/conversion-tests/conversion_test.ts @@ -0,0 +1,1067 @@ +import { RPCSubprovider, Web3ProviderEngine } from '@0x/subproviders'; +import { BigNumber, hexUtils, logUtils } from '@0x/utils'; + +import { + ContractEvent, + ERC1155ApprovalForAllEvent, + ERC1155TransferBatchEvent, + ERC1155TransferSingleEvent, + ERC20ApprovalEvent, + ERC20TransferEvent, + ERC721ApprovalEvent, + ERC721ApprovalForAllEvent, + ERC721TransferEvent, + ExchangeCancelEvent, + ExchangeCancelUpToEvent, + ExchangeFillEvent, + JsonSchema, + WethDepositEvent, + WethWithdrawalEvent, + WrapperConfig, + WrapperContractEvent, + WrapperERC1155TransferBatchEvent, + WrapperERC1155TransferSingleEvent, + WrapperERC20ApprovalEvent, + WrapperERC20TransferEvent, + WrapperERC721ApprovalEvent, + WrapperERC721TransferEvent, + WrapperExchangeCancelUpToEvent, + WrapperExchangeFillEvent, + WrapperGetOrdersResponse, + WrapperOrderEvent, + WrapperSignedOrder, + WrapperStats, + WrapperValidationResults, + WrapperWethDepositEvent, + WrapperWethWithdrawalEvent, +} from '../ts/types'; +import '../ts/wasm_exec'; +import { + configToWrapperConfig, + orderEventsHandlerToWrapperOrderEventsHandler, + signedOrderToWrapperSignedOrder, + wrapperAcceptedOrderInfoToAcceptedOrderInfo, + wrapperContractEventsToContractEvents, + wrapperOrderEventToOrderEvent, + wrapperRejectedOrderInfoToRejectedOrderInfo, + wrapperSignedOrderToSignedOrder, + wrapperValidationResultsToValidationResults, +} from '../ts/wrapper_conversion'; + +interface ConversionTestCase { + contractEvents: () => WrapperContractEvent[]; + getOrdersResponse: () => WrapperGetOrdersResponse[]; + orderEvents: () => WrapperOrderEvent[]; + signedOrders: () => WrapperSignedOrder[]; + stats: () => WrapperStats[]; + testConvertConfig: (...configs: WrapperConfig[]) => void; + validationResults: () => WrapperValidationResults[]; +} + +// The Go code sets certain global values and this is our only way of +// interacting with it. Define those values and their types here. +declare global { + // Defined in wasm_exec.ts + class Go { + public importObject: any; + public run(instance: WebAssembly.Instance): void; + } + + // Define variables that are defined in `browser/go/conversion-test.go` + const conversionTestCases: ConversionTestCase; +} + +// The interval (in milliseconds) to check whether Wasm is done loading. +const wasmLoadCheckIntervalMs = 100; + +// We use a global variable to track whether the Wasm code has finished loading. +let isWasmLoaded = false; +const loadEventName = '0xmeshtest'; +window.addEventListener(loadEventName, () => { + isWasmLoaded = true; +}); + +// Start compiling the WebAssembly as soon as the script is loaded. This lets +// us initialize as quickly as possible. +const go = new Go(); + +WebAssembly.instantiateStreaming(fetch('conversion_test.wasm'), go.importObject) + .then(module => { + go.run(module.instance); + }) + .catch(err => { + // tslint:disable-next-line no-console + console.error('Could not load Wasm'); + // tslint:disable-next-line no-console + console.error(err); + // If the Wasm bytecode didn't compile, Mesh won't work. We have no + // choice but to throw an error. + setImmediate(() => { + throw err; + }); + }); + +/*********************** Tests ***********************/ +// tslint:disable:custom-no-magic-numbers +// tslint:disable:no-console + +// Understanding these tests: +// +// This file is the "preemptive" component of the Browser Conversion Tests that +// will be served to the headless browser. In this context, preemptive simply indicates +// that this Typescript module is in control of the execution of the test. This +// is really just a consequence of the way in which Golang compiles to Wasm. +// +// The function of this file is to interact with functions that are exposed by the +// Wasm module and to ensure that these interactions behave as expected. Currently, +// all of the interactions that are involved simply convert Go structures to Javascript +// values by invoking the `JSValue` method and then return the data. Once the data +// has been received by this test code, this code is responsible for verifying the +// data it receives and then for reporting its results. +// +// Verification has been very simple in practice as it has only entailed equality +// comparisons so far. These findings must be reported so that the conversion test +// entry-point knows whether or not individual tests succeed or fail. The current +// methodology for reporting findings is to print a string of the from: "$description: true". +// These printed strings are received by the test's entry-point, which can then verify +// that the print statement corresponds to a registered "test case" in the entry-point. +// The entry-point verifies that all registered tests have passed, and it also has +// features that will cause the test to fail if (1) unexpected logs are received or (2) +// if some test cases were not tested. +(async () => { + // Wait for the Wasm module to finish initializing. + await waitForLoadAsync(); + + // Execute the Go --> Typescript tests + const contractEvents = conversionTestCases.contractEvents(); + testContractEvents(contractEvents); + const getOrdersResponse = conversionTestCases.getOrdersResponse(); + testGetOrdersResponse(getOrdersResponse); + const orderEvents = conversionTestCases.orderEvents(); + testOrderEvents(orderEvents); + const signedOrders = conversionTestCases.signedOrders(); + testSignedOrders(signedOrders); + const stats = conversionTestCases.stats(); + testStats(stats); + const validationResults = conversionTestCases.validationResults(); + testValidationResults(validationResults); + + // Execute the Typescript --> Go tests + const ethereumRPCURL = 'http://localhost:8545'; + + // Set up a Web3 Provider that uses the RPC endpoint + // tslint:disable:no-object-literal-type-assertion + const provider = new Web3ProviderEngine(); + provider.addProvider(new RPCSubprovider(ethereumRPCURL)); + conversionTestCases.testConvertConfig( + ...[ + (null as unknown) as WrapperConfig, + (undefined as unknown) as WrapperConfig, + {} as WrapperConfig, + { ethereumChainID: 1337 }, + configToWrapperConfig({ + ethereumChainID: 1337, + verbosity: 5, + useBootstrapList: false, + bootstrapList: [ + '/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF', + '/ip4/3.214.190.67/tcp/60557/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumG', + ], + blockPollingIntervalSeconds: 2, + ethereumRPCMaxContentLength: 524100, + ethereumRPCMaxRequestsPer24HrUTC: 500000, + ethereumRPCMaxRequestsPerSecond: 12, + enableEthereumRPCRateLimiting: false, + customContractAddresses: { + exchange: '0x48bacb9266a570d521063ef5dd96e61686dbe788', + devUtils: '0x38ef19fdf8e8415f18c307ed71967e19aac28ba1', + erc20Proxy: '0x1dc4c1cefef38a777b15aa20260a54e584b16c48', + erc721Proxy: '0x1d7022f5b17d2f8b695918fb48fa1089c9f85401', + erc1155Proxy: '0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f', + }, + maxOrdersInStorage: 500000, + customOrderFilter: { + id: '/foobarbaz', + }, + ethereumRPCURL: 'http://localhost:8545', + web3Provider: provider, + }), + ], + ); + // tslint:enable:no-object-literal-type-assertion + + // This special #jsFinished div is used to signal the headless Chrome driver + // that the JavaScript code is done running. This is not a native Javascript + // concept. Rather, it is our way of letting the Go program that serves this + // Javascript know whether or not the test has completed. + const finishedDiv = document.createElement('div'); + finishedDiv.setAttribute('id', 'jsFinished'); + document.body.appendChild(finishedDiv); +})().catch(err => { + console.log(err); +}); + +function prettyPrintTestCase(name: string, description: string): (section: string, value: boolean) => void { + return (section: string, value: boolean) => { + console.log(`(${name} | ${description} | ${section}): ${value}`); + }; +} + +function testContractEvents(contractEvents: WrapperContractEvent[]): void { + // ERC20ApprovalEvent + let printer = prettyPrintTestCase('contractEvent', 'ERC20ApprovalEvent'); + testContractEventPrelude(printer, contractEvents[0]); + printer('kind', contractEvents[0].kind === 'ERC20ApprovalEvent'); + const erc20ApprovalParams = contractEvents[0].parameters as WrapperERC20ApprovalEvent; + printer('parameters.owner', erc20ApprovalParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.spender', erc20ApprovalParams.spender === hexUtils.leftPad('0x5', 20)); + printer('parameters.value', erc20ApprovalParams.value === '1000'); + + // ERC20TransferEvent + printer = prettyPrintTestCase('contractEvent', 'ERC20TransferEvent'); + testContractEventPrelude(printer, contractEvents[1]); + printer('kind', contractEvents[1].kind === 'ERC20TransferEvent'); + const erc20TransferParams = contractEvents[1].parameters as WrapperERC20TransferEvent; + printer('parameters.from', erc20TransferParams.from === hexUtils.leftPad('0x4', 20)); + printer('parameters.to', erc20TransferParams.to === hexUtils.leftPad('0x5', 20)); + printer('parameters.value', erc20TransferParams.value === '1000'); + + // ERC721ApprovalEvent + printer = prettyPrintTestCase('contractEvent', 'ERC721ApprovalEvent'); + testContractEventPrelude(printer, contractEvents[2]); + printer('kind', contractEvents[2].kind === 'ERC721ApprovalEvent'); + const erc721ApprovalParams = contractEvents[2].parameters as WrapperERC721ApprovalEvent; + printer('parameters.owner', erc721ApprovalParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.approved', erc721ApprovalParams.approved === hexUtils.leftPad('0x5', 20)); + printer('parameters.tokenId', erc721ApprovalParams.tokenId === '1'); + + // ERC721ApprovalForAllEvent + printer = prettyPrintTestCase('contractEvent', 'ERC721ApprovalForAllEvent'); + testContractEventPrelude(printer, contractEvents[3]); + printer('kind', contractEvents[3].kind === 'ERC721ApprovalForAllEvent'); + const erc721ApprovalForAllParams = contractEvents[3].parameters as ERC721ApprovalForAllEvent; + printer('parameters.owner', erc721ApprovalForAllParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.operator', erc721ApprovalForAllParams.operator === hexUtils.leftPad('0x5', 20)); + printer('parameters.approved', erc721ApprovalForAllParams.approved); + + // ERC721TransferEvent + printer = prettyPrintTestCase('contractEvent', 'ERC721TransferEvent'); + testContractEventPrelude(printer, contractEvents[4]); + printer('kind', contractEvents[4].kind === 'ERC721TransferEvent'); + const erc721TransferParams = contractEvents[4].parameters as WrapperERC721TransferEvent; + printer('parameters.from', erc721TransferParams.from === hexUtils.leftPad('0x4', 20)); + printer('parameters.to', erc721TransferParams.to === hexUtils.leftPad('0x5', 20)); + printer('parameters.tokenId', erc721TransferParams.tokenId === '1'); + + // ERC1155ApprovalForAllEvent + printer = prettyPrintTestCase('contractEvent', 'ERC1155ApprovalForAllEvent'); + testContractEventPrelude(printer, contractEvents[5]); + printer('kind', contractEvents[5].kind === 'ERC1155ApprovalForAllEvent'); + const erc1155ApprovalForAllParams = contractEvents[5].parameters as ERC1155ApprovalForAllEvent; + printer('parameters.owner', erc1155ApprovalForAllParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.operator', erc1155ApprovalForAllParams.operator === hexUtils.leftPad('0x5', 20)); + printer('parameters.approved', !erc1155ApprovalForAllParams.approved); + + // ERC1155TransferSingleEvent + printer = prettyPrintTestCase('contractEvent', 'ERC1155TransferSingleEvent'); + testContractEventPrelude(printer, contractEvents[6]); + printer('kind', contractEvents[6].kind === 'ERC1155TransferSingleEvent'); + const erc1155TransferSingleParams = contractEvents[6].parameters as WrapperERC1155TransferSingleEvent; + printer('parameters.operator', erc1155TransferSingleParams.operator === hexUtils.leftPad('0x4', 20)); + printer('parameters.from', erc1155TransferSingleParams.from === hexUtils.leftPad('0x5', 20)); + printer('parameters.to', erc1155TransferSingleParams.to === hexUtils.leftPad('0x6', 20)); + printer('parameters.id', erc1155TransferSingleParams.id === '1'); + printer('parameters.value', erc1155TransferSingleParams.value === '100'); + + // ERC1155TransferBatchEvent + printer = prettyPrintTestCase('contractEvent', 'ERC1155TransferBatchEvent'); + testContractEventPrelude(printer, contractEvents[7]); + printer('kind', contractEvents[7].kind === 'ERC1155TransferBatchEvent'); + const erc1155TransferBatchParams = contractEvents[7].parameters as WrapperERC1155TransferBatchEvent; + printer('parameters.operator', erc1155TransferBatchParams.operator === hexUtils.leftPad('0x4', 20)); + printer('parameters.from', erc1155TransferBatchParams.from === hexUtils.leftPad('0x5', 20)); + printer('parameters.to', erc1155TransferBatchParams.to === hexUtils.leftPad('0x6', 20)); + printer('parameters.ids', erc1155TransferBatchParams.ids.length === 1 && erc1155TransferBatchParams.ids[0] === '1'); + printer( + 'parameters.values', + erc1155TransferBatchParams.values.length === 1 && erc1155TransferBatchParams.values[0] === '100', + ); + + // ExchangeFillEvent + printer = prettyPrintTestCase('contractEvent', 'ExchangeFillEvent'); + testContractEventPrelude(printer, contractEvents[8]); + printer('kind', contractEvents[8].kind === 'ExchangeFillEvent'); + const exchangeFillParams = contractEvents[8].parameters as WrapperExchangeFillEvent; + printer('parameters.makerAddress', exchangeFillParams.makerAddress === hexUtils.leftPad('0x4', 20)); + printer('parameters.takerAddress', exchangeFillParams.takerAddress === hexUtils.leftPad('0x0', 20)); + printer('parameters.senderAddress', exchangeFillParams.senderAddress === hexUtils.leftPad('0x5', 20)); + printer('parameters.feeRecipientAddress', exchangeFillParams.feeRecipientAddress === hexUtils.leftPad('0x6', 20)); + printer('parameters.makerAssetFilledAmount', exchangeFillParams.makerAssetFilledAmount === '456'); + printer('parameters.takerAssetFilledAmount', exchangeFillParams.takerAssetFilledAmount === '654'); + printer('parameters.makerFeePaid', exchangeFillParams.makerFeePaid === '12'); + printer('parameters.takerFeePaid', exchangeFillParams.takerFeePaid === '21'); + printer('parameters.protocolFeePaid', exchangeFillParams.protocolFeePaid === '150000'); + printer('parameters.orderHash', exchangeFillParams.orderHash === hexUtils.leftPad('0x7', 32)); + printer('parameters.makerAssetData', exchangeFillParams.makerAssetData === '0x'); + printer('parameters.takerAssetData', exchangeFillParams.takerAssetData === '0x'); + printer('parameters.makerFeeAssetData', exchangeFillParams.makerFeeAssetData === '0x'); + printer('parameters.takerFeeAssetData', exchangeFillParams.takerFeeAssetData === '0x'); + + // ExchangeCancelEvent + printer = prettyPrintTestCase('contractEvent', 'ExchangeCancelEvent'); + testContractEventPrelude(printer, contractEvents[9]); + printer('kind', contractEvents[9].kind === 'ExchangeCancelEvent'); + const exchangeCancelParams = contractEvents[9].parameters as ExchangeCancelEvent; + printer('parameters.makerAddress', exchangeCancelParams.makerAddress === hexUtils.leftPad('0x4', 20)); + printer('parameters.senderAddress', exchangeCancelParams.senderAddress === hexUtils.leftPad('0x5', 20)); + printer('parameters.feeRecipientAddress', exchangeCancelParams.feeRecipientAddress === hexUtils.leftPad('0x6', 20)); + printer('parameters.orderHash', exchangeCancelParams.orderHash === hexUtils.leftPad('0x7', 32)); + printer('parameters.makerAssetData', exchangeCancelParams.makerAssetData === '0x'); + printer('parameters.takerAssetData', exchangeCancelParams.takerAssetData === '0x'); + + // ExchangeCancelUpToEvent + printer = prettyPrintTestCase('contractEvent', 'ExchangeCancelUpToEvent'); + testContractEventPrelude(printer, contractEvents[10]); + printer('kind', contractEvents[10].kind === 'ExchangeCancelUpToEvent'); + const exchangeCancelUpToParams = contractEvents[10].parameters as WrapperExchangeCancelUpToEvent; + printer('parameters.makerAddress', exchangeCancelUpToParams.makerAddress === hexUtils.leftPad('0x4', 20)); + printer( + 'parameters.orderSenderAddress', + exchangeCancelUpToParams.orderSenderAddress === hexUtils.leftPad('0x5', 20), + ); + printer('parameters.orderEpoch', exchangeCancelUpToParams.orderEpoch === '50'); + + // WethDepositEvent + printer = prettyPrintTestCase('contractEvent', 'WethDepositEvent'); + testContractEventPrelude(printer, contractEvents[11]); + printer('kind', contractEvents[11].kind === 'WethDepositEvent'); + const wethDepositParams = contractEvents[11].parameters as WrapperWethDepositEvent; + printer('parameters.owner', wethDepositParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.value', wethDepositParams.value === '150000'); + + // WethWithdrawalEvent + printer = prettyPrintTestCase('contractEvent', 'WethWithdrawalEvent'); + testContractEventPrelude(printer, contractEvents[12]); + printer('kind', contractEvents[12].kind === 'WethWithdrawalEvent'); + const wethWithdrawalParams = contractEvents[12].parameters as WrapperWethWithdrawalEvent; + printer('parameters.owner', wethWithdrawalParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.value', wethWithdrawalParams.value === '150000'); + + // FooBarBaz + printer = prettyPrintTestCase('contractEvent', 'FooBarBazEvent'); + testContractEventPrelude(printer, contractEvents[13]); + printer('kind', contractEvents[13].kind === 'FooBarBazEvent'); + const fooBarBazParams = contractEvents[13].parameters as any; + printer('parameters.owner', fooBarBazParams.owner === hexUtils.leftPad('0x4', 20)); + printer('parameters.spender', fooBarBazParams.spender === hexUtils.leftPad('0x5', 20)); + printer('parameters.value', fooBarBazParams.value === '1'); +} + +function testContractEventPrelude( + printer: (section: string, value: boolean) => void, + contractEvent: WrapperContractEvent, +): void { + printer('blockHash', contractEvent.blockHash === hexUtils.leftPad(1, 32)); + printer('txHash', contractEvent.txHash === hexUtils.leftPad(2, 32)); + printer('txIndex', contractEvent.txIndex === 123); + printer('logIndex', contractEvent.logIndex === 321); + printer('isRemoved', !contractEvent.isRemoved); + printer('address', contractEvent.address === hexUtils.leftPad(3, 20)); +} + +function testGetOrdersResponse(getOrdersResponse: WrapperGetOrdersResponse[]): void { + let printer = prettyPrintTestCase('getOrdersResponse', 'EmptyOrderInfo'); + printer('snapshotID', getOrdersResponse[0].snapshotID === '208c81f9-6f8d-44aa-b6ea-0a3276ec7318'); + printer('snapshotTimestamp', getOrdersResponse[0].snapshotTimestamp === '2006-01-01T00:00:00Z'); + printer('orderInfo.length', getOrdersResponse[0].ordersInfos.length === 0); + + printer = prettyPrintTestCase('getOrdersResponse', 'OneOrderInfo'); + printer('snapshotID', getOrdersResponse[1].snapshotID === '208c81f9-6f8d-44aa-b6ea-0a3276ec7318'); + printer('snapshotTimestamp', getOrdersResponse[1].snapshotTimestamp === '2006-01-01T00:00:00Z'); + printer('orderInfo.length', getOrdersResponse[1].ordersInfos.length === 1); + printer('orderInfo.orderHash', getOrdersResponse[1].ordersInfos[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('orderInfo.signedOrder.chainId', getOrdersResponse[1].ordersInfos[0].signedOrder.chainId === 1337); + printer( + 'orderInfo.signedOrder.makerAddress', + getOrdersResponse[1].ordersInfos[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'orderInfo.signedOrder.takerAddress', + getOrdersResponse[1].ordersInfos[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'orderInfo.signedOrder.senderAddress', + getOrdersResponse[1].ordersInfos[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'orderInfo.signedOrder.feeRecipientAddress', + getOrdersResponse[1].ordersInfos[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'orderInfo.signedOrder.exchangeAddress', + getOrdersResponse[1].ordersInfos[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'orderInfo.signedOrder.makerAssetData', + getOrdersResponse[1].ordersInfos[0].signedOrder.makerAssetData === + '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer( + 'orderInfo.signedOrder.makerAssetAmount', + getOrdersResponse[1].ordersInfos[0].signedOrder.makerAssetAmount === '123456789', + ); + printer( + 'orderInfo.signedOrder.makerFeeAssetData', + getOrdersResponse[1].ordersInfos[0].signedOrder.makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('orderInfo.signedOrder.makerFee', getOrdersResponse[1].ordersInfos[0].signedOrder.makerFee === '89'); + printer( + 'orderInfo.signedOrder.takerAssetData', + getOrdersResponse[1].ordersInfos[0].signedOrder.takerAssetData === + '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer( + 'orderInfo.signedOrder.takerAssetAmount', + getOrdersResponse[1].ordersInfos[0].signedOrder.takerAssetAmount === '987654321', + ); + printer( + 'orderInfo.signedOrder.takerFeeAssetData', + getOrdersResponse[1].ordersInfos[0].signedOrder.takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('orderInfo.signedOrder.takerFee', getOrdersResponse[1].ordersInfos[0].signedOrder.takerFee === '12'); + printer( + 'orderInfo.signedOrder.expirationTimeSeconds', + getOrdersResponse[1].ordersInfos[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('orderInfo.signedOrder.salt', getOrdersResponse[1].ordersInfos[0].signedOrder.salt === '1532559225'); + printer( + 'orderInfo.fillableTakerAssetAmount', + getOrdersResponse[1].ordersInfos[0].fillableTakerAssetAmount === '987654321', + ); + + printer = prettyPrintTestCase('getOrdersResponse', 'TwoOrderInfos'); + printer('snapshotID', getOrdersResponse[2].snapshotID === '208c81f9-6f8d-44aa-b6ea-0a3276ec7318'); + printer('snapshotTimestamp', getOrdersResponse[2].snapshotTimestamp === '2006-01-01T00:00:00Z'); + printer('orderInfo.length', getOrdersResponse[2].ordersInfos.length === 2); + printer('orderInfo.orderHash', getOrdersResponse[2].ordersInfos[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('orderInfo.signedOrder.chainId', getOrdersResponse[2].ordersInfos[0].signedOrder.chainId === 1337); + printer( + 'orderInfo.signedOrder.makerAddress', + getOrdersResponse[2].ordersInfos[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'orderInfo.signedOrder.takerAddress', + getOrdersResponse[2].ordersInfos[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'orderInfo.signedOrder.senderAddress', + getOrdersResponse[2].ordersInfos[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'orderInfo.signedOrder.feeRecipientAddress', + getOrdersResponse[2].ordersInfos[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'orderInfo.signedOrder.exchangeAddress', + getOrdersResponse[2].ordersInfos[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'orderInfo.signedOrder.makerAssetData', + getOrdersResponse[2].ordersInfos[0].signedOrder.makerAssetData === '0x', + ); + printer( + 'orderInfo.signedOrder.makerAssetAmount', + getOrdersResponse[2].ordersInfos[0].signedOrder.makerAssetAmount === '0', + ); + printer( + 'orderInfo.signedOrder.makerFeeAssetData', + getOrdersResponse[2].ordersInfos[0].signedOrder.makerFeeAssetData === '0x', + ); + printer('orderInfo.signedOrder.makerFee', getOrdersResponse[2].ordersInfos[0].signedOrder.makerFee === '0'); + printer( + 'orderInfo.signedOrder.takerAssetData', + getOrdersResponse[2].ordersInfos[0].signedOrder.takerAssetData === '0x', + ); + printer( + 'orderInfo.signedOrder.takerAssetAmount', + getOrdersResponse[2].ordersInfos[0].signedOrder.takerAssetAmount === '0', + ); + printer( + 'orderInfo.signedOrder.takerFeeAssetData', + getOrdersResponse[2].ordersInfos[0].signedOrder.takerFeeAssetData === '0x', + ); + printer('orderInfo.signedOrder.takerFee', getOrdersResponse[2].ordersInfos[0].signedOrder.takerFee === '0'); + printer( + 'orderInfo.signedOrder.expirationTimeSeconds', + getOrdersResponse[2].ordersInfos[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('orderInfo.signedOrder.salt', getOrdersResponse[2].ordersInfos[0].signedOrder.salt === '1532559225'); + printer('orderInfo.fillableTakerAssetAmount', getOrdersResponse[2].ordersInfos[0].fillableTakerAssetAmount === '0'); + printer('orderInfo.orderHash', getOrdersResponse[2].ordersInfos[1].orderHash === hexUtils.leftPad('0x1', 32)); + printer('orderInfo.signedOrder.chainId', getOrdersResponse[2].ordersInfos[1].signedOrder.chainId === 1337); + printer( + 'orderInfo.signedOrder.makerAddress', + getOrdersResponse[2].ordersInfos[1].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'orderInfo.signedOrder.takerAddress', + getOrdersResponse[2].ordersInfos[1].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'orderInfo.signedOrder.senderAddress', + getOrdersResponse[2].ordersInfos[1].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'orderInfo.signedOrder.feeRecipientAddress', + getOrdersResponse[2].ordersInfos[1].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'orderInfo.signedOrder.exchangeAddress', + getOrdersResponse[2].ordersInfos[1].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'orderInfo.signedOrder.makerAssetData', + getOrdersResponse[2].ordersInfos[1].signedOrder.makerAssetData === + '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer( + 'orderInfo.signedOrder.makerAssetAmount', + getOrdersResponse[2].ordersInfos[1].signedOrder.makerAssetAmount === '123456789', + ); + printer( + 'orderInfo.signedOrder.makerFeeAssetData', + getOrdersResponse[2].ordersInfos[1].signedOrder.makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('orderInfo.signedOrder.makerFee', getOrdersResponse[2].ordersInfos[1].signedOrder.makerFee === '89'); + printer( + 'orderInfo.signedOrder.takerAssetData', + getOrdersResponse[2].ordersInfos[1].signedOrder.takerAssetData === + '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer( + 'orderInfo.signedOrder.takerAssetAmount', + getOrdersResponse[2].ordersInfos[1].signedOrder.takerAssetAmount === '987654321', + ); + printer( + 'orderInfo.signedOrder.takerFeeAssetData', + getOrdersResponse[2].ordersInfos[1].signedOrder.takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('orderInfo.signedOrder.takerFee', getOrdersResponse[2].ordersInfos[1].signedOrder.takerFee === '12'); + printer( + 'orderInfo.signedOrder.expirationTimeSeconds', + getOrdersResponse[2].ordersInfos[1].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('orderInfo.signedOrder.salt', getOrdersResponse[2].ordersInfos[1].signedOrder.salt === '1532559225'); + printer( + 'orderInfo.fillableTakerAssetAmount', + getOrdersResponse[2].ordersInfos[1].fillableTakerAssetAmount === '987654321', + ); +} + +function testOrderEvents(orderEvents: WrapperOrderEvent[]): void { + let printer = prettyPrintTestCase('orderEvent', 'EmptyContractEvents'); + printer('timestamp', orderEvents[0].timestamp === '2006-01-01T00:00:00Z'); + printer('orderHash', orderEvents[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('endState', orderEvents[0].endState === 'ADDED'); + printer('fillableTakerAssetAmount', orderEvents[0].fillableTakerAssetAmount === '1'); + printer('signedOrder.chainId', orderEvents[0].signedOrder.chainId === 1337); + printer('signedOrder.makerAddress', orderEvents[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20)); + printer('signedOrder.takerAddress', orderEvents[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20)); + printer('signedOrder.senderAddress', orderEvents[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20)); + printer( + 'signedOrder.feeRecipientAddress', + orderEvents[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer('signedOrder.exchangeAddress', orderEvents[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20)); + printer('signedOrder.makerAssetData', orderEvents[0].signedOrder.makerAssetData === '0x'); + printer('signedOrder.makerAssetAmount', orderEvents[0].signedOrder.makerAssetAmount === '0'); + printer('signedOrder.makerFeeAssetData', orderEvents[0].signedOrder.makerFeeAssetData === '0x'); + printer('signedOrder.makerFee', orderEvents[0].signedOrder.makerFee === '0'); + printer('signedOrder.takerAssetData', orderEvents[0].signedOrder.takerAssetData === '0x'); + printer('signedOrder.takerAssetAmount', orderEvents[0].signedOrder.takerAssetAmount === '0'); + printer('signedOrder.takerFeeAssetData', orderEvents[0].signedOrder.takerFeeAssetData === '0x'); + printer('signedOrder.takerFee', orderEvents[0].signedOrder.takerFee === '0'); + printer('signedOrder.expirationTimeSeconds', orderEvents[0].signedOrder.expirationTimeSeconds === '10000000000'); + printer('signedOrder.salt', orderEvents[0].signedOrder.salt === '1532559225'); + printer('contractEvents.length', orderEvents[0].contractEvents.length === 0); + + printer = prettyPrintTestCase('orderEvent', 'ExchangeFillContractEvent'); + printer('timestamp', orderEvents[1].timestamp === '2006-01-01T01:01:01Z'); + printer('orderHash', orderEvents[1].orderHash === hexUtils.leftPad('0x1', 32)); + printer('endState', orderEvents[1].endState === 'FILLED'); + printer('fillableTakerAssetAmount', orderEvents[1].fillableTakerAssetAmount === '0'); + printer('signedOrder.chainId', orderEvents[1].signedOrder.chainId === 1337); + printer('signedOrder.makerAddress', orderEvents[1].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20)); + printer('signedOrder.takerAddress', orderEvents[1].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20)); + printer('signedOrder.senderAddress', orderEvents[1].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20)); + printer( + 'signedOrder.feeRecipientAddress', + orderEvents[1].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer('signedOrder.exchangeAddress', orderEvents[1].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20)); + printer( + 'signedOrder.makerAssetData', + orderEvents[1].signedOrder.makerAssetData === + '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer('signedOrder.makerAssetAmount', orderEvents[1].signedOrder.makerAssetAmount === '123456789'); + printer( + 'signedOrder.makerFeeAssetData', + orderEvents[1].signedOrder.makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('signedOrder.makerFee', orderEvents[1].signedOrder.makerFee === '89'); + printer( + 'signedOrder.takerAssetData', + orderEvents[1].signedOrder.takerAssetData === + '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer('signedOrder.takerAssetAmount', orderEvents[1].signedOrder.takerAssetAmount === '987654321'); + printer( + 'signedOrder.takerFeeAssetData', + orderEvents[1].signedOrder.takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('signedOrder.takerFee', orderEvents[1].signedOrder.takerFee === '12'); + printer('signedOrder.expirationTimeSeconds', orderEvents[1].signedOrder.expirationTimeSeconds === '10000000000'); + printer('signedOrder.salt', orderEvents[1].signedOrder.salt === '1532559225'); + printer('contractEvents.length', orderEvents[1].contractEvents.length === 1); + printer('contractEvents.blockHash', orderEvents[1].contractEvents[0].blockHash === hexUtils.leftPad('0x1', 32)); + printer('contractEvents.txHash', orderEvents[1].contractEvents[0].txHash === hexUtils.leftPad('0x2', 32)); + printer('contractEvents.txIndex', orderEvents[1].contractEvents[0].txIndex === 123); + printer('contractEvents.logIndex', orderEvents[1].contractEvents[0].logIndex === 321); + printer('contractEvents.isRemoved', orderEvents[1].contractEvents[0].isRemoved === false); + printer('contractEvents.address', orderEvents[1].contractEvents[0].address === hexUtils.leftPad('0x5', 20)); + printer('contractEvents.kind', orderEvents[1].contractEvents[0].kind === 'ExchangeFillEvent'); +} + +function testSignedOrders(signedOrders: WrapperSignedOrder[]): void { + let printer = prettyPrintTestCase('signedOrder', 'NullAssetData'); + printer('chainId', signedOrders[0].chainId === 1337); + printer('makerAddress', signedOrders[0].makerAddress === hexUtils.leftPad('0x1', 20)); + printer('takerAddress', signedOrders[0].takerAddress === hexUtils.leftPad('0x2', 20)); + printer('senderAddress', signedOrders[0].senderAddress === hexUtils.leftPad('0x3', 20)); + printer('feeRecipientAddress', signedOrders[0].feeRecipientAddress === hexUtils.leftPad('0x4', 20)); + printer('exchangeAddress', signedOrders[0].exchangeAddress === hexUtils.leftPad('0x5', 20)); + printer('makerAssetData', signedOrders[0].makerAssetData === '0x'); + printer('makerAssetAmount', signedOrders[0].makerAssetAmount === '0'); + printer('makerFeeAssetData', signedOrders[0].makerFeeAssetData === '0x'); + printer('makerFee', signedOrders[0].makerFee === '0'); + printer('takerAssetData', signedOrders[0].takerAssetData === '0x'); + printer('takerAssetAmount', signedOrders[0].takerAssetAmount === '0'); + printer('takerFeeAssetData', signedOrders[0].takerFeeAssetData === '0x'); + printer('takerFee', signedOrders[0].takerFee === '0'); + printer('expirationTimeSeconds', signedOrders[0].expirationTimeSeconds === '10000000000'); + printer('salt', signedOrders[0].salt === '1532559225'); + printer('signature', signedOrders[0].signature === '0x'); + + printer = prettyPrintTestCase('signedOrder', 'NonNullAssetData'); + printer('chainId', signedOrders[1].chainId === 1337); + printer('makerAddress', signedOrders[1].makerAddress === hexUtils.leftPad('0x1', 20)); + printer('takerAddress', signedOrders[1].takerAddress === hexUtils.leftPad('0x2', 20)); + printer('senderAddress', signedOrders[1].senderAddress === hexUtils.leftPad('0x3', 20)); + printer('feeRecipientAddress', signedOrders[1].feeRecipientAddress === hexUtils.leftPad('0x4', 20)); + printer('exchangeAddress', signedOrders[1].exchangeAddress === hexUtils.leftPad('0x5', 20)); + printer( + 'makerAssetData', + signedOrders[1].makerAssetData === '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer('makerAssetAmount', signedOrders[1].makerAssetAmount === '123456789'); + printer( + 'makerFeeAssetData', + signedOrders[1].makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('makerFee', signedOrders[1].makerFee === '89'); + printer( + 'takerAssetData', + signedOrders[1].takerAssetData === '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer('takerAssetAmount', signedOrders[1].takerAssetAmount === '987654321'); + printer( + 'takerFeeAssetData', + signedOrders[1].takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('takerFee', signedOrders[1].takerFee === '12'); + printer('expirationTimeSeconds', signedOrders[1].expirationTimeSeconds === '10000000000'); + printer('salt', signedOrders[1].salt === '1532559225'); + printer( + 'signature', + signedOrders[1].signature === '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33', + ); +} + +function testStats(stats: WrapperStats[]): void { + const printer = prettyPrintTestCase('stats', 'RealisticStats'); + printer('version', stats[0].version === 'development'); + printer('pubSubTopic', stats[0].pubSubTopic === 'someTopic'); + printer('rendezvous', stats[0].rendezvous === '/0x-mesh/network/1337/version/2'); + printer('peerID', stats[0].peerID === '16Uiu2HAmGd949LwaV4KNvK2WDSiMVy7xEmW983VH75CMmefmMpP7'); + printer('ethereumChainID', stats[0].ethereumChainID === 1337); + printer('latestBlock | hash', stats[0].latestBlock.hash === hexUtils.leftPad('0x1', 32)); + printer('latestBlock | number', stats[0].latestBlock.number === 1500); + printer('numOrders', stats[0].numOrders === 100000); + printer('numPeers', stats[0].numPeers === 200); + printer('numOrdersIncludingRemoved', stats[0].numOrdersIncludingRemoved === 200000); + printer('numPinnedOrders', stats[0].numPinnedOrders === 400); + printer( + 'maxExpirationTime', + stats[0].maxExpirationTime === '115792089237316195423570985008687907853269984665640564039457584007913129639935', + ); + printer('startOfCurrentUTCDay', stats[0].startOfCurrentUTCDay === '2006-01-01 00:00:00 +0000 UTC'); + printer('ethRPCRequestsSentInCurrentUTCDay', stats[0].ethRPCRequestsSentInCurrentUTCDay === 100000); + printer('ethRPCRateLimitExpiredRequests', stats[0].ethRPCRateLimitExpiredRequests === 5000); +} + +function testValidationResults(validationResults: WrapperValidationResults[]): void { + let printer = prettyPrintTestCase('validationResults', 'EmptyValidationResults'); + printer('accepted.length', validationResults[0].accepted.length === 0); + printer('rejected.length', validationResults[0].rejected.length === 0); + + printer = prettyPrintTestCase('validationResults', 'OneAcceptedResult'); + printer('accepted.length', validationResults[1].accepted.length === 1); + printer('accepted.orderHash', validationResults[1].accepted[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('accepted.signedOrder.chainId', validationResults[1].accepted[0].signedOrder.chainId === 1337); + printer( + 'accepted.signedOrder.makerAddress', + validationResults[1].accepted[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'accepted.signedOrder.takerAddress', + validationResults[1].accepted[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'accepted.signedOrder.senderAddress', + validationResults[1].accepted[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'accepted.signedOrder.feeRecipientAddress', + validationResults[1].accepted[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'accepted.signedOrder.exchangeAddress', + validationResults[1].accepted[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'accepted.signedOrder.makerAssetData', + validationResults[1].accepted[0].signedOrder.makerAssetData === '0x', + ); + printer( + 'accepted.signedOrder.makerAssetAmount', + validationResults[1].accepted[0].signedOrder.makerAssetAmount === '0', + ); + printer( + 'accepted.signedOrder.makerFeeAssetData', + validationResults[1].accepted[0].signedOrder.makerFeeAssetData === '0x', + ); + printer('accepted.signedOrder.makerFee', validationResults[1].accepted[0].signedOrder.makerFee === '0'); + printer( + 'accepted.signedOrder.takerAssetData', + validationResults[1].accepted[0].signedOrder.takerAssetData === '0x', + ); + printer( + 'accepted.signedOrder.takerAssetAmount', + validationResults[1].accepted[0].signedOrder.takerAssetAmount === '0', + ); + printer( + 'accepted.signedOrder.takerFeeAssetData', + validationResults[1].accepted[0].signedOrder.takerFeeAssetData === '0x', + ); + printer('accepted.signedOrder.takerFee', validationResults[1].accepted[0].signedOrder.takerFee === '0'); + printer( + 'accepted.signedOrder.expirationTimeSeconds', + validationResults[1].accepted[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('accepted.signedOrder.salt', validationResults[1].accepted[0].signedOrder.salt === '1532559225'); + printer('accepted.signedOrder.signature', validationResults[1].accepted[0].signedOrder.signature === '0x'); + printer('accepted.fillableTakerAssetAmount', validationResults[1].accepted[0].fillableTakerAssetAmount === '0'); + printer('accepted.isNew', validationResults[1].accepted[0].isNew); + printer('rejected.length', validationResults[1].rejected.length === 0); + + printer = prettyPrintTestCase('validationResults', 'OneRejectedResult'); + printer('accepted.length', validationResults[2].accepted.length === 0); + printer('rejected.length', validationResults[2].rejected.length === 1); + printer('rejected.orderHash', validationResults[2].rejected[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('rejected.signedOrder.chainId', validationResults[2].rejected[0].signedOrder.chainId === 1337); + printer( + 'rejected.signedOrder.makerAddress', + validationResults[2].rejected[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'rejected.signedOrder.takerAddress', + validationResults[2].rejected[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'rejected.signedOrder.senderAddress', + validationResults[2].rejected[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'rejected.signedOrder.feeRecipientAddress', + validationResults[2].rejected[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'rejected.signedOrder.exchangeAddress', + validationResults[2].rejected[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'rejected.signedOrder.makerAssetData', + validationResults[2].rejected[0].signedOrder.makerAssetData === '0x', + ); + printer( + 'rejected.signedOrder.makerAssetAmount', + validationResults[2].rejected[0].signedOrder.makerAssetAmount === '0', + ); + printer( + 'rejected.signedOrder.makerFeeAssetData', + validationResults[2].rejected[0].signedOrder.makerFeeAssetData === '0x', + ); + printer('rejected.signedOrder.makerFee', validationResults[1].accepted[0].signedOrder.makerFee === '0'); + printer( + 'rejected.signedOrder.takerAssetData', + validationResults[2].rejected[0].signedOrder.takerAssetData === '0x', + ); + printer( + 'rejected.signedOrder.takerAssetAmount', + validationResults[2].rejected[0].signedOrder.takerAssetAmount === '0', + ); + printer( + 'rejected.signedOrder.takerFeeAssetData', + validationResults[2].rejected[0].signedOrder.takerFeeAssetData === '0x', + ); + printer('rejected.signedOrder.takerFee', validationResults[1].accepted[0].signedOrder.takerFee === '0'); + printer( + 'rejected.signedOrder.expirationTimeSeconds', + validationResults[2].rejected[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('rejected.signedOrder.salt', validationResults[2].rejected[0].signedOrder.salt === '1532559225'); + printer('rejected.signedOrder.signature', validationResults[2].rejected[0].signedOrder.signature === '0x'); + printer('rejected.kind', validationResults[2].rejected[0].kind === 'ZEROEX_VALIDATION'); + printer('rejected.status.code', validationResults[2].rejected[0].status.code === 'OrderHasInvalidMakerAssetData'); + printer( + 'rejected.status.message', + validationResults[2].rejected[0].status.message === + 'order makerAssetData must encode a supported assetData type', + ); + + printer = prettyPrintTestCase('validationResults', 'RealisticValidationResults'); + // Accepted 1 + printer('accepted.length', validationResults[3].accepted.length === 2); + printer('accepted.orderHash', validationResults[3].accepted[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('accepted.signedOrder.chainId', validationResults[3].accepted[0].signedOrder.chainId === 1337); + printer( + 'accepted.signedOrder.makerAddress', + validationResults[3].accepted[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'accepted.signedOrder.takerAddress', + validationResults[3].accepted[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'accepted.signedOrder.senderAddress', + validationResults[3].accepted[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'accepted.signedOrder.feeRecipientAddress', + validationResults[3].accepted[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'accepted.signedOrder.exchangeAddress', + validationResults[3].accepted[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'accepted.signedOrder.makerAssetData', + validationResults[3].accepted[0].signedOrder.makerAssetData === '0x', + ); + printer( + 'accepted.signedOrder.makerAssetAmount', + validationResults[3].accepted[0].signedOrder.makerAssetAmount === '0', + ); + printer( + 'accepted.signedOrder.makerFeeAssetData', + validationResults[3].accepted[0].signedOrder.makerFeeAssetData === '0x', + ); + printer('accepted.signedOrder.makerFee', validationResults[3].accepted[0].signedOrder.makerFee === '0'); + printer( + 'accepted.signedOrder.takerAssetData', + validationResults[3].accepted[0].signedOrder.takerAssetData === '0x', + ); + printer( + 'accepted.signedOrder.takerAssetAmount', + validationResults[3].accepted[0].signedOrder.takerAssetAmount === '0', + ); + printer( + 'accepted.signedOrder.takerFeeAssetData', + validationResults[3].accepted[0].signedOrder.takerFeeAssetData === '0x', + ); + printer('accepted.signedOrder.takerFee', validationResults[3].accepted[0].signedOrder.takerFee === '0'); + printer( + 'accepted.signedOrder.expirationTimeSeconds', + validationResults[3].accepted[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('accepted.signedOrder.salt', validationResults[3].accepted[0].signedOrder.salt === '1532559225'); + printer('accepted.signedOrder.signature', validationResults[3].accepted[0].signedOrder.signature === '0x'); + printer('accepted.fillableTakerAssetAmount', validationResults[3].accepted[0].fillableTakerAssetAmount === '0'); + printer('accepted.isNew', validationResults[3].accepted[0].isNew); + // Accepted 2 + printer('accepted.orderHash', validationResults[3].accepted[1].orderHash === hexUtils.leftPad('0x1', 32)); + printer('accepted.signedOrder.chainId', validationResults[3].accepted[1].signedOrder.chainId === 1337); + printer( + 'accepted.signedOrder.makerAddress', + validationResults[3].accepted[1].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'accepted.signedOrder.takerAddress', + validationResults[3].accepted[1].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'accepted.signedOrder.senderAddress', + validationResults[3].accepted[1].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'accepted.signedOrder.feeRecipientAddress', + validationResults[3].accepted[1].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'accepted.signedOrder.exchangeAddress', + validationResults[3].accepted[1].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'accepted.signedOrder.makerAssetData', + validationResults[3].accepted[1].signedOrder.makerAssetData === + '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer( + 'accepted.signedOrder.makerAssetAmount', + validationResults[3].accepted[1].signedOrder.makerAssetAmount === '123456789', + ); + printer( + 'accepted.signedOrder.makerFeeAssetData', + validationResults[3].accepted[1].signedOrder.makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('accepted.signedOrder.makerFee', validationResults[3].accepted[1].signedOrder.makerFee === '89'); + printer( + 'accepted.signedOrder.takerAssetData', + validationResults[3].accepted[1].signedOrder.takerAssetData === + '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer( + 'accepted.signedOrder.takerAssetAmount', + validationResults[3].accepted[1].signedOrder.takerAssetAmount === '987654321', + ); + printer( + 'accepted.signedOrder.takerFeeAssetData', + validationResults[3].accepted[1].signedOrder.takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('accepted.signedOrder.takerFee', validationResults[3].accepted[1].signedOrder.takerFee === '12'); + printer( + 'accepted.signedOrder.expirationTimeSeconds', + validationResults[3].accepted[1].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('accepted.signedOrder.salt', validationResults[3].accepted[1].signedOrder.salt === '1532559225'); + printer( + 'accepted.signedOrder.signature', + validationResults[3].accepted[1].signedOrder.signature === + '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33', + ); + printer( + 'accepted.fillableTakerAssetAmount', + validationResults[3].accepted[1].fillableTakerAssetAmount === '987654321', + ); + printer('accepted.isNew', validationResults[3].accepted[1].isNew); + // Rejected 1 + printer('rejected.length', validationResults[3].rejected.length === 1); + printer('rejected.orderHash', validationResults[3].rejected[0].orderHash === hexUtils.leftPad('0x1', 32)); + printer('rejected.signedOrder.chainId', validationResults[3].rejected[0].signedOrder.chainId === 1337); + printer( + 'rejected.signedOrder.makerAddress', + validationResults[3].rejected[0].signedOrder.makerAddress === hexUtils.leftPad('0x1', 20), + ); + printer( + 'rejected.signedOrder.takerAddress', + validationResults[3].rejected[0].signedOrder.takerAddress === hexUtils.leftPad('0x2', 20), + ); + printer( + 'rejected.signedOrder.senderAddress', + validationResults[3].rejected[0].signedOrder.senderAddress === hexUtils.leftPad('0x3', 20), + ); + printer( + 'rejected.signedOrder.feeRecipientAddress', + validationResults[3].rejected[0].signedOrder.feeRecipientAddress === hexUtils.leftPad('0x4', 20), + ); + printer( + 'rejected.signedOrder.exchangeAddress', + validationResults[3].rejected[0].signedOrder.exchangeAddress === hexUtils.leftPad('0x5', 20), + ); + printer( + 'rejected.signedOrder.makerAssetData', + validationResults[3].rejected[0].signedOrder.makerAssetData === + '0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', + ); + printer( + 'rejected.signedOrder.makerAssetAmount', + validationResults[3].rejected[0].signedOrder.makerAssetAmount === '123456789', + ); + printer( + 'rejected.signedOrder.makerFeeAssetData', + validationResults[3].rejected[0].signedOrder.makerFeeAssetData === + '0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064', + ); + printer('rejected.signedOrder.makerFee', validationResults[3].rejected[0].signedOrder.makerFee === '89'); + printer( + 'rejected.signedOrder.takerAssetData', + validationResults[3].rejected[0].signedOrder.takerAssetData === + '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ); + printer( + 'rejected.signedOrder.takerAssetAmount', + validationResults[3].rejected[0].signedOrder.takerAssetAmount === '987654321', + ); + printer( + 'rejected.signedOrder.takerFeeAssetData', + validationResults[3].rejected[0].signedOrder.takerFeeAssetData === + '0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3', + ); + printer('rejected.signedOrder.takerFee', validationResults[3].rejected[0].signedOrder.takerFee === '12'); + printer( + 'rejected.signedOrder.expirationTimeSeconds', + validationResults[3].rejected[0].signedOrder.expirationTimeSeconds === '10000000000', + ); + printer('rejected.signedOrder.salt', validationResults[3].rejected[0].signedOrder.salt === '1532559225'); + printer( + 'rejected.signedOrder.signature', + validationResults[3].rejected[0].signedOrder.signature === + '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33', + ); + printer('rejected.kind', validationResults[3].rejected[0].kind === 'MESH_ERROR'); + printer('rejected.status.code', validationResults[3].rejected[0].status.code === 'CoordinatorEndpointNotFound'); + printer( + 'rejected.status.message', + validationResults[3].rejected[0].status.message === + 'corresponding coordinator endpoint not found in CoordinatorRegistry contract', + ); +} + +// tslint:enable:no-console +// tslint:enable:custom-no-magic-numbers +/*********************** Utils ***********************/ + +async function waitForLoadAsync(): Promise { + // Note: this approach is not CPU efficient but it avoids race + // conditions and has the advantage of returning instantaneously if the + // Wasm code has already loaded. + while (!isWasmLoaded) { + await sleepAsync(wasmLoadCheckIntervalMs); + } +} + +async function sleepAsync(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} +// tslint:disable-line:max-file-line-count diff --git a/browser/dist/index.html b/browser/dist/index.html new file mode 100644 index 000000000..677468710 --- /dev/null +++ b/browser/dist/index.html @@ -0,0 +1,9 @@ + + + + Conversion tests for Mesh in the browser + + + + + diff --git a/browser/go/browserutil/browserutil.go b/browser/go/browserutil/browserutil.go new file mode 100644 index 000000000..6cb8d6395 --- /dev/null +++ b/browser/go/browserutil/browserutil.go @@ -0,0 +1,91 @@ +// +build js, wasm + +// NOTE(jalextowle): This file contains utilities used by browser based mesh nodes +// that need to be tested and would cause cyclic dependencies if they were moved +// to jsutil. +package browserutil + +import ( + "errors" + "syscall/js" + "time" + + "github.com/0xProject/0x-mesh/browser/go/jsutil" + "github.com/0xProject/0x-mesh/browser/go/providerwrapper" + "github.com/0xProject/0x-mesh/core" + "github.com/0xProject/0x-mesh/orderfilter" +) + +// ConvertConfig converts a JavaScript config object into a core.Config. It also +// adds default values for any that are missing in the JavaScript object. +func ConvertConfig(jsConfig js.Value) (core.Config, error) { + if jsutil.IsNullOrUndefined(jsConfig) { + return core.Config{}, errors.New("config is required") + } + + // Default config options. Some might be overridden. + config := core.Config{ + Verbosity: 2, + DataDir: "0x-mesh", + P2PTCPPort: 0, + P2PWebSocketsPort: 0, + UseBootstrapList: true, + BlockPollingInterval: 5 * time.Second, + EthereumRPCMaxContentLength: 524288, + EthereumRPCMaxRequestsPer24HrUTC: 100000, + EthereumRPCMaxRequestsPerSecond: 30, + EnableEthereumRPCRateLimiting: true, + MaxOrdersInStorage: 100000, + CustomOrderFilter: orderfilter.DefaultCustomOrderSchema, + } + + // Required config options + if ethereumChainID := jsConfig.Get("ethereumChainID"); jsutil.IsNullOrUndefined(ethereumChainID) { + return core.Config{}, errors.New("ethereumChainID is required") + } else { + config.EthereumChainID = ethereumChainID.Int() + } + + // Optional config options + if verbosity := jsConfig.Get("verbosity"); !jsutil.IsNullOrUndefined(verbosity) { + config.Verbosity = verbosity.Int() + } + if useBootstrapList := jsConfig.Get("useBootstrapList"); !jsutil.IsNullOrUndefined(useBootstrapList) { + config.UseBootstrapList = useBootstrapList.Bool() + } + if bootstrapList := jsConfig.Get("bootstrapList"); !jsutil.IsNullOrUndefined(bootstrapList) { + config.BootstrapList = bootstrapList.String() + } + if blockPollingIntervalSeconds := jsConfig.Get("blockPollingIntervalSeconds"); !jsutil.IsNullOrUndefined(blockPollingIntervalSeconds) { + config.BlockPollingInterval = time.Duration(blockPollingIntervalSeconds.Int()) * time.Second + } + if ethereumRPCMaxContentLength := jsConfig.Get("ethereumRPCMaxContentLength"); !jsutil.IsNullOrUndefined(ethereumRPCMaxContentLength) { + config.EthereumRPCMaxContentLength = ethereumRPCMaxContentLength.Int() + } + if ethereumRPCMaxRequestsPer24HrUTC := jsConfig.Get("ethereumRPCMaxRequestsPer24HrUTC"); !jsutil.IsNullOrUndefined(ethereumRPCMaxRequestsPer24HrUTC) { + config.EthereumRPCMaxRequestsPer24HrUTC = ethereumRPCMaxRequestsPer24HrUTC.Int() + } + if ethereumRPCMaxRequestsPerSecond := jsConfig.Get("ethereumRPCMaxRequestsPerSecond"); !jsutil.IsNullOrUndefined(ethereumRPCMaxRequestsPerSecond) { + config.EthereumRPCMaxRequestsPerSecond = ethereumRPCMaxRequestsPerSecond.Float() + } + if enableEthereumRPCRateLimiting := jsConfig.Get("enableEthereumRPCRateLimiting"); !jsutil.IsNullOrUndefined(enableEthereumRPCRateLimiting) { + config.EnableEthereumRPCRateLimiting = enableEthereumRPCRateLimiting.Bool() + } + if customContractAddresses := jsConfig.Get("customContractAddresses"); !jsutil.IsNullOrUndefined(customContractAddresses) { + config.CustomContractAddresses = customContractAddresses.String() + } + if maxOrdersInStorage := jsConfig.Get("maxOrdersInStorage"); !jsutil.IsNullOrUndefined(maxOrdersInStorage) { + config.MaxOrdersInStorage = maxOrdersInStorage.Int() + } + if customOrderFilter := jsConfig.Get("customOrderFilter"); !jsutil.IsNullOrUndefined(customOrderFilter) { + config.CustomOrderFilter = customOrderFilter.String() + } + if ethereumRPCURL := jsConfig.Get("ethereumRPCURL"); !jsutil.IsNullOrUndefined(ethereumRPCURL) && ethereumRPCURL.String() != "" { + config.EthereumRPCURL = ethereumRPCURL.String() + } + if web3Provider := jsConfig.Get("web3Provider"); !jsutil.IsNullOrUndefined(web3Provider) { + config.EthereumRPCClient = providerwrapper.NewRPCClient(web3Provider) + } + + return config, nil +} diff --git a/browser/go/conversion-test/conversion_test.go b/browser/go/conversion-test/conversion_test.go new file mode 100644 index 000000000..2fd18768d --- /dev/null +++ b/browser/go/conversion-test/conversion_test.go @@ -0,0 +1,493 @@ +// +build !js + +package main + +import ( + "context" + "flag" + "fmt" + "net/http" + "net/http/httptest" + "os/exec" + "sync" + "testing" + "time" + + "github.com/chromedp/cdproto/runtime" + "github.com/chromedp/chromedp" + "github.com/stretchr/testify/require" +) + +var testCases []string + +var browserConversionTestsEnabled bool + +// The test `TestBrowserConversions` has a non-standard timeout, so it needs to be +// run seperately from other go tests. +func init() { + flag.BoolVar(&browserConversionTestsEnabled, "enable-browser-conversion-tests", false, "enable browser conversion tests") + testing.Init() + flag.Parse() +} + +// This test is the entry-point to the Browser Conversion Tests. The other relevant +// files are "../../conversion-test/conversion_test.ts" and "./main.go." +// +// This entry-point builds the repository so that the current codebase is tested +// rather than an old version. After building, this test will register any test +// cases that are expected to be executed. Finally, a file server and a headless +// browser are initialized. The file server serves the "../../dist" directory, +// which will contain a webpage that contains a test script that will instantiate +// the Wasm buffer and execute the tests. As the tests are executed, test results +// are logged to the browser console, which this test will be able to access. As +// these logs are received, they are verified against registered test cases. Test +// failures, unexpected tests, and missing tests are all failure conditions for this +// test. +func TestBrowserConversions(t *testing.T) { + if !browserConversionTestsEnabled { + t.Skip("Browser conversion tests are disabled. You can enable them with the --enable-browser-conversion-tests flag") + } + + // Declare a context that will be used for all child processes, servers, and + // other goroutines. + ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second) + ctx, _ = chromedp.NewContext(ctx, chromedp.WithErrorf(t.Errorf)) + defer cancel() + + buildForTests(t, ctx) + + // Register the Go --> Typescript test cases that should be logged. + registerContractEventTest() + registerGetOrdersResponseTest("EmptyOrderInfo", 0) + registerGetOrdersResponseTest("OneOrderInfo", 1) + registerGetOrdersResponseTest("TwoOrderInfos", 2) + registerOrderEventTest("EmptyContractEvents", 0) + registerOrderEventTest("ExchangeFillContractEvent", 1) + registerSignedOrderTest("NullAssetData") + registerSignedOrderTest("NonNullAssetData") + registerStatsTest("RealisticStats") + registerValidationResultsTest("EmptyValidationResults", 0, 0) + registerValidationResultsTest("OneAcceptedResult", 1, 0) + registerValidationResultsTest("OneRejectedResult", 0, 1) + registerValidationResultsTest("RealisticValidationResults", 2, 1) + + // Register the Typescript --> Go test cases that should be logged. + registerConvertConfigTest("NullConfig") + registerConvertConfigTest("UndefinedConfig") + registerConvertConfigTest("EmptyConfig") + registerConvertConfigTest("MinimalConfig") + registerConvertConfigTest("FullConfig") + + // Start a simple HTTP server to serve the web page for the browser node. + ts := httptest.NewServer(http.FileServer(http.Dir("../../dist"))) + defer ts.Close() + + done := make(chan interface{}) + + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + startBrowserInstance(t, ctx, ts.URL, done) + }() + + go func() { + select { + case <-done: + // NOTE(jalextowle): It is somewhat useful to know whether or not + // there are test results that were logged in the typescript but were + // not registered in this test file. For these purposes, we wait for + // last logs to appear before closing the test. Logs that are logged + // after the sleeping period will still be ignored. + time.Sleep(2 * time.Second) + cancel() + } + }() + + wg.Wait() +} + +// NOTE(jalextowle): The ContractEvent tests and the event decoder tests are combined +// because it is important that `ContractEvents` are converted correctly, which directly +// tests event decoding. +func registerContractEventTest() { + // ERC20ApprovalEvent + registerContractEventPrelude("ERC20ApprovalEvent") + registerContractEventParams("ERC20ApprovalEvent", "owner") + registerContractEventParams("ERC20ApprovalEvent", "spender") + registerContractEventParams("ERC20ApprovalEvent", "value") + + // ERC20TransferEvent + registerContractEventPrelude("ERC20TransferEvent") + registerContractEventParams("ERC20TransferEvent", "from") + registerContractEventParams("ERC20TransferEvent", "to") + registerContractEventParams("ERC20TransferEvent", "value") + + // ERC721ApprovalEvent + registerContractEventPrelude("ERC721ApprovalEvent") + registerContractEventParams("ERC721ApprovalEvent", "owner") + registerContractEventParams("ERC721ApprovalEvent", "approved") + registerContractEventParams("ERC721ApprovalEvent", "tokenId") + + // ERC721ApprovalForAllEvent + registerContractEventPrelude("ERC721ApprovalForAllEvent") + registerContractEventParams("ERC721ApprovalForAllEvent", "owner") + registerContractEventParams("ERC721ApprovalForAllEvent", "operator") + registerContractEventParams("ERC721ApprovalForAllEvent", "approved") + + // ERC721TransferEvent + registerContractEventPrelude("ERC721TransferEvent") + registerContractEventParams("ERC721TransferEvent", "from") + registerContractEventParams("ERC721TransferEvent", "to") + registerContractEventParams("ERC721TransferEvent", "tokenId") + + // ERC1155ApprovalForAllEvent + registerContractEventPrelude("ERC1155ApprovalForAllEvent") + registerContractEventParams("ERC1155ApprovalForAllEvent", "owner") + registerContractEventParams("ERC1155ApprovalForAllEvent", "operator") + registerContractEventParams("ERC1155ApprovalForAllEvent", "approved") + + // ERC1155TransferSingleEvent + registerContractEventPrelude("ERC1155TransferSingleEvent") + registerContractEventParams("ERC1155TransferSingleEvent", "operator") + registerContractEventParams("ERC1155TransferSingleEvent", "from") + registerContractEventParams("ERC1155TransferSingleEvent", "to") + registerContractEventParams("ERC1155TransferSingleEvent", "id") + registerContractEventParams("ERC1155TransferSingleEvent", "value") + + // ERC1155TransferBatchEvent + registerContractEventPrelude("ERC1155TransferBatchEvent") + registerContractEventParams("ERC1155TransferBatchEvent", "operator") + registerContractEventParams("ERC1155TransferBatchEvent", "from") + registerContractEventParams("ERC1155TransferBatchEvent", "to") + registerContractEventParams("ERC1155TransferBatchEvent", "ids") + registerContractEventParams("ERC1155TransferBatchEvent", "values") + + // ExchangeFillEvent + registerContractEventPrelude("ExchangeFillEvent") + registerContractEventParams("ExchangeFillEvent", "makerAddress") + registerContractEventParams("ExchangeFillEvent", "takerAddress") + registerContractEventParams("ExchangeFillEvent", "senderAddress") + registerContractEventParams("ExchangeFillEvent", "feeRecipientAddress") + registerContractEventParams("ExchangeFillEvent", "makerAssetFilledAmount") + registerContractEventParams("ExchangeFillEvent", "takerAssetFilledAmount") + registerContractEventParams("ExchangeFillEvent", "makerFeePaid") + registerContractEventParams("ExchangeFillEvent", "takerFeePaid") + registerContractEventParams("ExchangeFillEvent", "protocolFeePaid") + registerContractEventParams("ExchangeFillEvent", "orderHash") + registerContractEventParams("ExchangeFillEvent", "makerAssetData") + registerContractEventParams("ExchangeFillEvent", "takerAssetData") + registerContractEventParams("ExchangeFillEvent", "makerFeeAssetData") + registerContractEventParams("ExchangeFillEvent", "takerFeeAssetData") + + // ExchangeCancelEvent + registerContractEventPrelude("ExchangeCancelEvent") + registerContractEventParams("ExchangeCancelEvent", "makerAddress") + registerContractEventParams("ExchangeCancelEvent", "senderAddress") + registerContractEventParams("ExchangeCancelEvent", "feeRecipientAddress") + registerContractEventParams("ExchangeCancelEvent", "orderHash") + registerContractEventParams("ExchangeCancelEvent", "makerAssetData") + registerContractEventParams("ExchangeCancelEvent", "takerAssetData") + + // ExchangeCancelUpToEvent + registerContractEventPrelude("ExchangeCancelUpToEvent") + registerContractEventParams("ExchangeCancelUpToEvent", "makerAddress") + registerContractEventParams("ExchangeCancelUpToEvent", "orderSenderAddress") + registerContractEventParams("ExchangeCancelUpToEvent", "orderEpoch") + + // WethDepositEvent + registerContractEventPrelude("WethDepositEvent") + registerContractEventParams("WethDepositEvent", "owner") + registerContractEventParams("WethDepositEvent", "value") + + // WethWithdrawalEvent + registerContractEventPrelude("WethWithdrawalEvent") + registerContractEventParams("WethWithdrawalEvent", "owner") + registerContractEventParams("WethWithdrawalEvent", "value") + + // FooBarBazEvent + registerContractEventPrelude("FooBarBazEvent") + registerContractEventParams("FooBarBazEvent", "owner") + registerContractEventParams("FooBarBazEvent", "spender") + registerContractEventParams("FooBarBazEvent", "value") +} + +func registerContractEventPrelude(description string) { + registerContractEventField(description, "blockHash") + registerContractEventField(description, "txHash") + registerContractEventField(description, "txIndex") + registerContractEventField(description, "logIndex") + registerContractEventField(description, "isRemoved") + registerContractEventField(description, "address") + registerContractEventField(description, "kind") +} + +func registerContractEventParams(description string, param string) { + registerContractEventField(description, fmt.Sprintf("parameters.%s", param)) +} + +func registerContractEventField(description string, field string) { + registerTest(fmt.Sprintf("(contractEvent | %s | %s)", description, field)) +} + +func registerConvertConfigTest(description string) { + registerConvertConfigField(description, "config") + registerConvertConfigField(description, "web3Provider") + registerConvertConfigField(description, "err") +} + +func registerConvertConfigField(description string, field string) { + registerTest(fmt.Sprintf("(convertConfig | %s | %s)", description, field)) +} + +func registerGetOrdersResponseTest(description string, orderInfoLength int) { + registerGetOrdersResponseField(description, "snapshotID") + registerGetOrdersResponseField(description, "snapshotTimestamp") + registerGetOrdersResponseField(description, "orderInfo.length") + for i := 0; i < orderInfoLength; i++ { + registerGetOrdersResponseField(description, "orderInfo.orderHash") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.chainId") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.makerAddress") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.takerAddress") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.senderAddress") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.feeRecipientAddress") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.exchangeAddress") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.makerAssetData") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.makerAssetAmount") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.makerFeeAssetData") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.makerFee") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.takerAssetData") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.takerAssetAmount") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.takerFeeAssetData") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.takerFee") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.expirationTimeSeconds") + registerGetOrdersResponseField(description, "orderInfo.signedOrder.salt") + registerGetOrdersResponseField(description, "orderInfo.fillableTakerAssetAmount") + } +} + +func registerOrderEventTest(description string, length int) { + registerOrderEventField(description, "timestamp") + registerOrderEventField(description, "orderHash") + registerOrderEventField(description, "endState") + registerOrderEventField(description, "fillableTakerAssetAmount") + registerOrderEventSignedOrder(description) + registerOrderEventContractEventsPrelude(description, length) +} + +func registerOrderEventContractEventsPrelude(description string, length int) { + boilerplate := "contractEvents." + registerOrderEventField(description, boilerplate+"length") + if length == 0 { + return + } + registerOrderEventField(description, boilerplate+"blockHash") + registerOrderEventField(description, boilerplate+"txHash") + registerOrderEventField(description, boilerplate+"txIndex") + registerOrderEventField(description, boilerplate+"logIndex") + registerOrderEventField(description, boilerplate+"isRemoved") + registerOrderEventField(description, boilerplate+"address") + registerOrderEventField(description, boilerplate+"kind") +} + +func registerOrderEventSignedOrder(description string) { + boilerplate := "signedOrder." + registerOrderEventField(description, boilerplate+"chainId") + registerOrderEventField(description, boilerplate+"makerAddress") + registerOrderEventField(description, boilerplate+"takerAddress") + registerOrderEventField(description, boilerplate+"senderAddress") + registerOrderEventField(description, boilerplate+"feeRecipientAddress") + registerOrderEventField(description, boilerplate+"exchangeAddress") + registerOrderEventField(description, boilerplate+"makerAssetData") + registerOrderEventField(description, boilerplate+"makerAssetAmount") + registerOrderEventField(description, boilerplate+"makerFeeAssetData") + registerOrderEventField(description, boilerplate+"makerFee") + registerOrderEventField(description, boilerplate+"takerAssetData") + registerOrderEventField(description, boilerplate+"takerAssetAmount") + registerOrderEventField(description, boilerplate+"takerFeeAssetData") + registerOrderEventField(description, boilerplate+"takerFee") + registerOrderEventField(description, boilerplate+"expirationTimeSeconds") + registerOrderEventField(description, boilerplate+"salt") +} + +func registerSignedOrderTest(description string) { + registerSignedOrderField(description, "chainId") + registerSignedOrderField(description, "makerAddress") + registerSignedOrderField(description, "takerAddress") + registerSignedOrderField(description, "senderAddress") + registerSignedOrderField(description, "feeRecipientAddress") + registerSignedOrderField(description, "exchangeAddress") + registerSignedOrderField(description, "makerAssetData") + registerSignedOrderField(description, "makerAssetAmount") + registerSignedOrderField(description, "makerFeeAssetData") + registerSignedOrderField(description, "makerFee") + registerSignedOrderField(description, "takerAssetData") + registerSignedOrderField(description, "takerAssetAmount") + registerSignedOrderField(description, "takerFeeAssetData") + registerSignedOrderField(description, "takerFee") + registerSignedOrderField(description, "expirationTimeSeconds") + registerSignedOrderField(description, "salt") + registerSignedOrderField(description, "signature") +} + +func registerStatsTest(description string) { + registerStatsField(description, "version") + registerStatsField(description, "pubSubTopic") + registerStatsField(description, "rendezvous") + registerStatsField(description, "peerID") + registerStatsField(description, "ethereumChainID") + registerStatsField(description, "latestBlock | hash") + registerStatsField(description, "latestBlock | number") + registerStatsField(description, "numOrders") + registerStatsField(description, "numPeers") + registerStatsField(description, "numOrdersIncludingRemoved") + registerStatsField(description, "numPinnedOrders") + registerStatsField(description, "maxExpirationTime") + registerStatsField(description, "startOfCurrentUTCDay") + registerStatsField(description, "ethRPCRequestsSentInCurrentUTCDay") + registerStatsField(description, "ethRPCRateLimitExpiredRequests") +} + +func registerValidationResultsTest(description string, acceptedLength int, rejectedLength int) { + registerValidationResultsField(description, "accepted.length") + for i := 0; i < acceptedLength; i++ { + registerValidationResultsField(description, "accepted.orderHash") + registerValidationResultsField(description, "accepted.signedOrder.chainId") + registerValidationResultsField(description, "accepted.signedOrder.makerAddress") + registerValidationResultsField(description, "accepted.signedOrder.takerAddress") + registerValidationResultsField(description, "accepted.signedOrder.senderAddress") + registerValidationResultsField(description, "accepted.signedOrder.feeRecipientAddress") + registerValidationResultsField(description, "accepted.signedOrder.exchangeAddress") + registerValidationResultsField(description, "accepted.signedOrder.makerAssetData") + registerValidationResultsField(description, "accepted.signedOrder.makerAssetAmount") + registerValidationResultsField(description, "accepted.signedOrder.makerFeeAssetData") + registerValidationResultsField(description, "accepted.signedOrder.makerFee") + registerValidationResultsField(description, "accepted.signedOrder.takerAssetData") + registerValidationResultsField(description, "accepted.signedOrder.takerAssetAmount") + registerValidationResultsField(description, "accepted.signedOrder.takerFeeAssetData") + registerValidationResultsField(description, "accepted.signedOrder.takerFee") + registerValidationResultsField(description, "accepted.signedOrder.expirationTimeSeconds") + registerValidationResultsField(description, "accepted.signedOrder.salt") + registerValidationResultsField(description, "accepted.signedOrder.signature") + registerValidationResultsField(description, "accepted.fillableTakerAssetAmount") + registerValidationResultsField(description, "accepted.isNew") + } + + registerValidationResultsField(description, "rejected.length") + for i := 0; i < rejectedLength; i++ { + registerValidationResultsField(description, "rejected.orderHash") + registerValidationResultsField(description, "rejected.signedOrder.chainId") + registerValidationResultsField(description, "rejected.signedOrder.makerAddress") + registerValidationResultsField(description, "rejected.signedOrder.takerAddress") + registerValidationResultsField(description, "rejected.signedOrder.senderAddress") + registerValidationResultsField(description, "rejected.signedOrder.feeRecipientAddress") + registerValidationResultsField(description, "rejected.signedOrder.exchangeAddress") + registerValidationResultsField(description, "rejected.signedOrder.makerAssetData") + registerValidationResultsField(description, "rejected.signedOrder.makerAssetAmount") + registerValidationResultsField(description, "rejected.signedOrder.makerFeeAssetData") + registerValidationResultsField(description, "rejected.signedOrder.makerFee") + registerValidationResultsField(description, "rejected.signedOrder.takerAssetData") + registerValidationResultsField(description, "rejected.signedOrder.takerAssetAmount") + registerValidationResultsField(description, "rejected.signedOrder.takerFeeAssetData") + registerValidationResultsField(description, "rejected.signedOrder.takerFee") + registerValidationResultsField(description, "rejected.signedOrder.expirationTimeSeconds") + registerValidationResultsField(description, "rejected.signedOrder.salt") + registerValidationResultsField(description, "rejected.signedOrder.signature") + registerValidationResultsField(description, "rejected.kind") + registerValidationResultsField(description, "rejected.status.code") + registerValidationResultsField(description, "rejected.status.message") + } +} + +func registerGetOrdersResponseField(description string, field string) { + registerTest(fmt.Sprintf("(getOrdersResponse | %s | %s)", description, field)) +} + +func registerOrderEventField(description string, field string) { + registerTest(fmt.Sprintf("(orderEvent | %s | %s)", description, field)) +} + +func registerSignedOrderField(description string, field string) { + registerTest(fmt.Sprintf("(signedOrder | %s | %s)", description, field)) +} + +func registerStatsField(description string, field string) { + registerTest(fmt.Sprintf("(stats | %s | %s)", description, field)) +} + +func registerValidationResultsField(description string, field string) { + registerTest(fmt.Sprintf("(validationResults | %s | %s)", description, field)) +} + +func registerTest(test string) { + testCases = append(testCases, fmt.Sprintf(`"%s: true"`, test)) +} + +func startBrowserInstance(t *testing.T, ctx context.Context, url string, done chan interface{}) { + testLength := len(testCases) + count := 0 + + // Use chromedp to visit the web page for the browser node. + chromedp.ListenTarget(ctx, func(ev interface{}) { + switch ev := ev.(type) { + case *runtime.EventConsoleAPICalled: + switch ev.Type { + case runtime.APITypeLog: + // Send console.log events through the channel. + for _, arg := range ev.Args { + if arg.Type == runtime.TypeString && count < testLength { + if testCases[count] != string(arg.Value) { + t.Errorf("expected: %s | actual: %s", testCases[count], string(arg.Value)) + } + count++ + if count == testLength { + done <- struct{}{} + } + } else if len(string(arg.Value)) > 1 { + t.Errorf("Unexpected test results: %s\n", string(arg.Value)) + } + } + case runtime.APITypeError: + // Report any console.error events as test failures. + for _, arg := range ev.Args { + t.Errorf("JavaScript console error: (%s) %s", arg.Type, arg.Value) + } + } + } + }) + + if err := chromedp.Run(ctx, + chromedp.Navigate(url), + // The #jsFinished element is one specifically created to indicate that the + // JavaScript code is done running. + chromedp.WaitVisible("#jsFinished", chromedp.ByID), + ); err != nil && err != context.Canceled { + t.Error(err) + } + if count < len(testCases) { + for i := count; i < len(testCases); i++ { + t.Errorf("expected: %s actual: no response", testCases[i]) + } + } +} + +func buildForTests(t *testing.T, ctx context.Context) { + fmt.Println("Clear yarn cache...") + cmd := exec.CommandContext(ctx, "yarn", "cache", "clean") + cmd.Dir = "../../" + output, err := cmd.CombinedOutput() + require.NoError(t, err, "could not clean yarn cache: %s", string(output)) + + fmt.Println("Installing dependencies for Wasm binary and Typescript bindings...") + cmd = exec.CommandContext(ctx, "yarn", "install") + cmd.Dir = "../../" + output, err = cmd.CombinedOutput() + require.NoError(t, err, "could not install depedencies for TypeScript bindings: %s", string(output)) + + fmt.Println("Building Wasm binary and Typescript bindings...") + cmd = exec.CommandContext(ctx, "yarn", "build") + cmd.Dir = "../../" + output, err = cmd.CombinedOutput() + require.NoError(t, err, "could not build Wasm binary and Typescript bindings: %s", string(output)) + fmt.Println("Finished building for tests") +} diff --git a/browser/go/conversion-test/main.go b/browser/go/conversion-test/main.go new file mode 100644 index 000000000..dfa296e45 --- /dev/null +++ b/browser/go/conversion-test/main.go @@ -0,0 +1,742 @@ +// +build js, wasm + +package main + +import ( + "fmt" + "math/big" + "reflect" + "syscall/js" + "time" + + "github.com/0xProject/0x-mesh/browser/go/browserutil" + "github.com/0xProject/0x-mesh/common/types" + "github.com/0xProject/0x-mesh/constants" + "github.com/0xProject/0x-mesh/core" + "github.com/0xProject/0x-mesh/orderfilter" + "github.com/0xProject/0x-mesh/zeroex" + "github.com/0xProject/0x-mesh/zeroex/ordervalidator" + "github.com/0xProject/0x-mesh/zeroex/orderwatch/decoder" + "github.com/ethereum/go-ethereum/common" +) + +const ( + loadEventName = "0xmeshtest" +) + +// This file has a very simple role in the browser conversion tests: create exposed +// functions that the typescript component of the test can access. These functions +// should expose data or functions that the typescript bundle cannot effectively test +// (for example values that have been converted to Javascript using `JSValue` methods). +func main() { + setGlobals() + triggerLoadEvent() + select {} +} + +func setGlobals() { + conversionTestCases := map[string]interface{}{ + "contractEvents": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC20ApprovalEvent", + Parameters: decoder.ERC20ApprovalEvent{ + Owner: common.HexToAddress("0x4"), + Spender: common.HexToAddress("0x5"), + Value: big.NewInt(1000), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC20TransferEvent", + Parameters: decoder.ERC20TransferEvent{ + From: common.HexToAddress("0x4"), + To: common.HexToAddress("0x5"), + Value: big.NewInt(1000), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC721ApprovalEvent", + Parameters: decoder.ERC721ApprovalEvent{ + Owner: common.HexToAddress("0x4"), + Approved: common.HexToAddress("0x5"), + TokenId: big.NewInt(1), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC721ApprovalForAllEvent", + Parameters: decoder.ERC721ApprovalForAllEvent{ + Owner: common.HexToAddress("0x4"), + Operator: common.HexToAddress("0x5"), + Approved: true, + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC721TransferEvent", + Parameters: decoder.ERC721TransferEvent{ + From: common.HexToAddress("0x4"), + To: common.HexToAddress("0x5"), + TokenId: big.NewInt(1), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC1155ApprovalForAllEvent", + Parameters: decoder.ERC1155ApprovalForAllEvent{ + Owner: common.HexToAddress("0x4"), + Operator: common.HexToAddress("0x5"), + Approved: false, + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC1155TransferSingleEvent", + Parameters: decoder.ERC1155TransferSingleEvent{ + Operator: common.HexToAddress("0x4"), + From: common.HexToAddress("0x5"), + To: common.HexToAddress("0x6"), + Id: big.NewInt(1), + Value: big.NewInt(100), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ERC1155TransferBatchEvent", + Parameters: decoder.ERC1155TransferBatchEvent{ + Operator: common.HexToAddress("0x4"), + From: common.HexToAddress("0x5"), + To: common.HexToAddress("0x6"), + Ids: []*big.Int{big.NewInt(1)}, + Values: []*big.Int{big.NewInt(100)}, + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ExchangeFillEvent", + Parameters: decoder.ExchangeFillEvent{ + MakerAddress: common.HexToAddress("0x4"), + TakerAddress: constants.NullAddress, + SenderAddress: common.HexToAddress("0x5"), + FeeRecipientAddress: common.HexToAddress("0x6"), + MakerAssetFilledAmount: big.NewInt(456), + TakerAssetFilledAmount: big.NewInt(654), + MakerFeePaid: big.NewInt(12), + TakerFeePaid: big.NewInt(21), + ProtocolFeePaid: big.NewInt(150000), + OrderHash: common.HexToHash("0x7"), + MakerAssetData: constants.NullBytes, + TakerAssetData: constants.NullBytes, + MakerFeeAssetData: constants.NullBytes, + TakerFeeAssetData: constants.NullBytes, + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ExchangeCancelEvent", + Parameters: decoder.ExchangeCancelEvent{ + MakerAddress: common.HexToAddress("0x4"), + SenderAddress: common.HexToAddress("0x5"), + FeeRecipientAddress: common.HexToAddress("0x6"), + OrderHash: common.HexToHash("0x7"), + MakerAssetData: constants.NullBytes, + TakerAssetData: constants.NullBytes, + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "ExchangeCancelUpToEvent", + Parameters: decoder.ExchangeCancelUpToEvent{ + MakerAddress: common.HexToAddress("0x4"), + OrderSenderAddress: common.HexToAddress("0x5"), + OrderEpoch: big.NewInt(50), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "WethDepositEvent", + Parameters: decoder.WethDepositEvent{ + Owner: common.HexToAddress("0x4"), + Value: big.NewInt(150000), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "WethWithdrawalEvent", + Parameters: decoder.WethWithdrawalEvent{ + Owner: common.HexToAddress("0x4"), + Value: big.NewInt(150000), + }, + }, + zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x3"), + Kind: "FooBarBazEvent", + // NOTE(jalextowle): We have to use something non-empty + // that implements `js.Wrapper` or else we'll experience + // a runtime panic. + Parameters: decoder.ERC20ApprovalEvent{ + Owner: common.HexToAddress("0x4"), + Spender: common.HexToAddress("0x5"), + Value: big.NewInt(1), + }, + }, + } + }), + "getOrdersResponse": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + types.GetOrdersResponse{ + SnapshotID: "208c81f9-6f8d-44aa-b6ea-0a3276ec7318", + SnapshotTimestamp: time.Date(2006, time.January, 1, 0, 0, 0, 0, time.UTC), + OrdersInfos: []*types.OrderInfo{}, + }, + types.GetOrdersResponse{ + SnapshotID: "208c81f9-6f8d-44aa-b6ea-0a3276ec7318", + SnapshotTimestamp: time.Date(2006, time.January, 1, 0, 0, 0, 0, time.UTC), + OrdersInfos: []*types.OrderInfo{ + &types.OrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + FillableTakerAssetAmount: big.NewInt(987654321), + }, + }, + }, + types.GetOrdersResponse{ + SnapshotID: "208c81f9-6f8d-44aa-b6ea-0a3276ec7318", + SnapshotTimestamp: time.Date(2006, time.January, 1, 0, 0, 0, 0, time.UTC), + OrdersInfos: []*types.OrderInfo{ + &types.OrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + FillableTakerAssetAmount: big.NewInt(0), + }, + &types.OrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + FillableTakerAssetAmount: big.NewInt(987654321), + }, + }, + }, + } + }), + "orderEvents": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + zeroex.OrderEvent{ + Timestamp: time.Date(2006, time.January, 1, 0, 0, 0, 0, time.UTC), + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + EndState: zeroex.ESOrderAdded, + FillableTakerAssetAmount: big.NewInt(1), + ContractEvents: []*zeroex.ContractEvent{}, + }, + zeroex.OrderEvent{ + Timestamp: time.Date(2006, time.January, 1, 1, 1, 1, 1, time.UTC), + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + EndState: zeroex.ESOrderFilled, + FillableTakerAssetAmount: big.NewInt(0), + ContractEvents: []*zeroex.ContractEvent{ + &zeroex.ContractEvent{ + BlockHash: common.HexToHash("0x1"), + TxHash: common.HexToHash("0x2"), + TxIndex: 123, + LogIndex: 321, + IsRemoved: false, + Address: common.HexToAddress("0x5"), + Kind: "ExchangeFillEvent", + Parameters: decoder.ExchangeFillEvent{ + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + MakerAssetFilledAmount: big.NewInt(123456789), + TakerAssetFilledAmount: big.NewInt(987654321), + MakerFeePaid: big.NewInt(89), + TakerFeePaid: big.NewInt(12), + ProtocolFeePaid: big.NewInt(150000), + OrderHash: common.HexToHash("0x1"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + }, + }, + }, + }, + } + }), + "signedOrders": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + } + }), + "stats": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + types.Stats{ + Version: "development", + PubSubTopic: "someTopic", + Rendezvous: "/0x-mesh/network/1337/version/2", + PeerID: "16Uiu2HAmGd949LwaV4KNvK2WDSiMVy7xEmW983VH75CMmefmMpP7", + EthereumChainID: 1337, + LatestBlock: types.LatestBlock{ + Hash: common.HexToHash("0x1"), + Number: 1500, + }, + NumPeers: 200, + NumOrders: 100000, + NumOrdersIncludingRemoved: 200000, + NumPinnedOrders: 400, + MaxExpirationTime: "115792089237316195423570985008687907853269984665640564039457584007913129639935", + StartOfCurrentUTCDay: time.Date(2006, time.January, 1, 0, 0, 0, 0, time.UTC), + EthRPCRequestsSentInCurrentUTCDay: 100000, + EthRPCRateLimitExpiredRequests: 5000, + }, + } + }), + "validationResults": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + return []interface{}{ + ordervalidator.ValidationResults{}, + ordervalidator.ValidationResults{ + Accepted: []*ordervalidator.AcceptedOrderInfo{ + &ordervalidator.AcceptedOrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + FillableTakerAssetAmount: big.NewInt(0), + IsNew: true, + }, + }, + }, + ordervalidator.ValidationResults{ + Rejected: []*ordervalidator.RejectedOrderInfo{ + &ordervalidator.RejectedOrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + Kind: ordervalidator.ZeroExValidation, + Status: ordervalidator.ROInvalidMakerAssetData, + }, + }, + }, + ordervalidator.ValidationResults{ + Accepted: []*ordervalidator.AcceptedOrderInfo{ + &ordervalidator.AcceptedOrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0x"), + MakerAssetAmount: big.NewInt(0), + MakerFeeAssetData: common.FromHex("0x"), + MakerFee: big.NewInt(0), + TakerAssetData: common.FromHex("0x"), + TakerAssetAmount: big.NewInt(0), + TakerFeeAssetData: common.FromHex("0x"), + TakerFee: big.NewInt(0), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x"), + }, + FillableTakerAssetAmount: big.NewInt(0), + IsNew: true, + }, + &ordervalidator.AcceptedOrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + FillableTakerAssetAmount: big.NewInt(987654321), + IsNew: true, + }, + }, + Rejected: []*ordervalidator.RejectedOrderInfo{ + &ordervalidator.RejectedOrderInfo{ + OrderHash: common.HexToHash("0x1"), + SignedOrder: &zeroex.SignedOrder{ + Order: zeroex.Order{ + ChainID: big.NewInt(1337), + MakerAddress: common.HexToAddress("0x1"), + TakerAddress: common.HexToAddress("0x2"), + SenderAddress: common.HexToAddress("0x3"), + FeeRecipientAddress: common.HexToAddress("0x4"), + ExchangeAddress: common.HexToAddress("0x5"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: big.NewInt(123456789), + MakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000034d402f14d58e001d8efbe6585051bf9706aa064"), + MakerFee: big.NewInt(89), + TakerAssetData: common.FromHex("0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + TakerAssetAmount: big.NewInt(987654321), + TakerFeeAssetData: common.FromHex("0xf47261b000000000000000000000000025b8fe1de9daf8ba351890744ff28cf7dfa8f5e3"), + TakerFee: big.NewInt(12), + ExpirationTimeSeconds: big.NewInt(10000000000), + Salt: big.NewInt(1532559225), + }, + Signature: common.FromHex("0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"), + }, + Kind: ordervalidator.MeshError, + Status: ordervalidator.ROCoordinatorEndpointNotFound, + }, + }, + }, + } + }), + "testConvertConfig": js.FuncOf(func(this js.Value, args []js.Value) interface{} { + if len(args) != 5 { + panic("Invalid number of test cases provided to testConvertConfig") + } + testConvertConfig("NullConfig", args[0], core.Config{}, "config is required", false) + testConvertConfig("UndefinedConfig", args[1], core.Config{}, "config is required", false) + testConvertConfig("EmptyConfig", args[2], core.Config{}, "ethereumChainID is required", false) + testConvertConfig("MinimalConfig", args[3], core.Config{ + Verbosity: 2, + DataDir: "0x-mesh", + P2PTCPPort: 0, + P2PWebSocketsPort: 0, + UseBootstrapList: true, + BlockPollingInterval: 5 * time.Second, + EthereumRPCMaxContentLength: 524288, + EthereumRPCMaxRequestsPer24HrUTC: 100000, + EthereumRPCMaxRequestsPerSecond: 30, + EnableEthereumRPCRateLimiting: true, + MaxOrdersInStorage: 100000, + CustomOrderFilter: orderfilter.DefaultCustomOrderSchema, + EthereumChainID: 1337, + }, "", false) + testConvertConfig("FullConfig", args[4], core.Config{ + Verbosity: 5, + DataDir: "0x-mesh", + P2PTCPPort: 0, + P2PWebSocketsPort: 0, + UseBootstrapList: false, + BootstrapList: "/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF,/ip4/3.214.190.67/tcp/60557/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumG", + BlockPollingInterval: 2 * time.Second, + EthereumRPCMaxContentLength: 524100, + EthereumRPCMaxRequestsPer24HrUTC: 500000, + EthereumRPCMaxRequestsPerSecond: 12, + EnableEthereumRPCRateLimiting: false, + MaxOrdersInStorage: 500000, + CustomOrderFilter: `{"id":"/foobarbaz"}`, + CustomContractAddresses: "{\"exchange\":\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"devUtils\":\"0x38ef19fdf8e8415f18c307ed71967e19aac28ba1\",\"erc20Proxy\":\"0x1dc4c1cefef38a777b15aa20260a54e584b16c48\",\"erc721Proxy\":\"0x1d7022f5b17d2f8b695918fb48fa1089c9f85401\",\"erc1155Proxy\":\"0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f\"}", + EthereumChainID: 1337, + EthereumRPCURL: "http://localhost:8545", + }, "", true) + return nil + }), + } + js.Global().Set("conversionTestCases", conversionTestCases) +} + +func testConvertConfig(description string, jsConfig js.Value, expectedConfig core.Config, expectedErr string, expectProvider bool) { + actualConfig, actualErr := browserutil.ConvertConfig(jsConfig) + actualErrString := "" + if actualErr != nil { + actualErrString = actualErr.Error() + } + + // Test the config + rpcClient := actualConfig.EthereumRPCClient + actualConfig.EthereumRPCClient = nil + prettyPrintTest(fmt.Sprintf("(convertConfig | %s | config): ", description), expectedConfig, actualConfig) + actualConfig.EthereumRPCClient = rpcClient + // NOTE(jalextowle): This is not a robust validation on the Web3Provider. In the event that provider + // conversions appear to be causing issues, this validation may need to be improved. + if expectProvider { + fmt.Printf("(convertConfig | %s | web3Provider): %t\n", description, actualConfig.EthereumRPCClient != nil) + } else { + fmt.Printf("(convertConfig | %s | web3Provider): %t\n", description, actualConfig.EthereumRPCClient == nil) + } + + // Test the err + prettyPrintTest(fmt.Sprintf("(convertConfig | %s | err): ", description), expectedErr, actualErrString) +} + +func prettyPrintTest(testHeader string, expected, actual interface{}) { + if !reflect.DeepEqual(expected, actual) { + fmt.Printf(testHeader+"\"%+v\" is not equal to \"%+v\"\n", expected, actual) + } else { + fmt.Println(testHeader + "true") + } +} + +// triggerLoadEvent triggers the global load event to indicate that the Wasm is +// done loading. +func triggerLoadEvent() { + event := js.Global().Get("document").Call("createEvent", "Event") + event.Call("initEvent", loadEventName, true, true) + js.Global().Call("dispatchEvent", event) +} diff --git a/browser/go/jsutil/jsutil.go b/browser/go/jsutil/jsutil.go new file mode 100644 index 000000000..5070cfaac --- /dev/null +++ b/browser/go/jsutil/jsutil.go @@ -0,0 +1,78 @@ +// +build js,wasm + +// Package jsutil contains various utility functions for working with +// JavaScript and WebAssembly +package jsutil + +import ( + "bytes" + "encoding/json" + "fmt" + "syscall/js" +) + +// ErrorToJS converts a Go error to a JavaScript Error. +func ErrorToJS(err error) js.Value { + return js.Global().Get("Error").New(err.Error()) +} + +// IsNullOrUndefined returns true if the given JavaScript value is either null +// or undefined. +func IsNullOrUndefined(value js.Value) bool { + return value == js.Null() || value == js.Undefined() +} + +// WrapInPromise converts a potentially blocking Go function to a non-blocking +// JavaScript Promise. If the function returns an error, the promise will reject +// with that error. Otherwise, the promise will resolve with the first return +// value. +func WrapInPromise(f func() (interface{}, error)) js.Value { + var executor js.Func + executor = js.FuncOf(func(this js.Value, args []js.Value) interface{} { + resolve := args[0] + reject := args[1] + go func() { + defer executor.Release() + if result, err := f(); err != nil { + reject.Invoke(ErrorToJS(err)) + } else { + resolve.Invoke(result) + } + }() + return nil + }) + return js.Global().Get("Promise").New(executor) +} + +// InefficientlyConvertToJS converts the given Go value to a JS value by +// encoding to JSON and then decoding it. This function is not very efficient +// and its use should be phased out over time as much as possible. +func InefficientlyConvertToJS(value interface{}) (js.Value, error) { + var jsValue interface{} + buf := bytes.Buffer{} + if err := json.NewEncoder(&buf).Encode(value); err != nil { + return js.Undefined(), err + } + if err := json.NewDecoder(&buf).Decode(&jsValue); err != nil { + return js.Undefined(), err + } + return js.ValueOf(jsValue), nil +} + +// InefficientlyConvertFromJS converts the given JS value to a Go value and sets +// it. This function is not very efficient and its use should be phased out over +// time as much as possible. +func InefficientlyConvertFromJS(jsValue js.Value, value interface{}) (err error) { + defer func() { + if e := recover(); e != nil { + switch e := e.(type) { + case error: + err = e + default: + err = fmt.Errorf("unexpected error: (%T) %s", e, e) + } + } + }() + jsonString := js.Global().Get("JSON").Call("stringify", jsValue) + return json.Unmarshal([]byte(jsonString.String()), value) +} diff --git a/browser/go/main.go b/browser/go/mesh-browser/main.go similarity index 56% rename from browser/go/main.go rename to browser/go/mesh-browser/main.go index abcf40497..1c5b18471 100644 --- a/browser/go/main.go +++ b/browser/go/mesh-browser/main.go @@ -5,10 +5,11 @@ package main import ( "context" "encoding/json" - "errors" "syscall/js" "time" + "github.com/0xProject/0x-mesh/browser/go/browserutil" + "github.com/0xProject/0x-mesh/browser/go/jsutil" "github.com/0xProject/0x-mesh/core" "github.com/0xProject/0x-mesh/zeroex" "github.com/ethereum/go-ethereum/event" @@ -38,8 +39,8 @@ func setGlobals() { zeroexMesh := map[string]interface{}{ // newWrapperAsync(config: Config): Promise; "newWrapperAsync": js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return wrapInPromise(func() (interface{}, error) { - config, err := convertConfig(args[0]) + return jsutil.WrapInPromise(func() (interface{}, error) { + config, err := browserutil.ConvertConfig(args[0]) if err != nil { return nil, err } @@ -71,75 +72,6 @@ type MeshWrapper struct { orderEventsHandler js.Value } -// convertConfig converts a JavaScript config object into a core.Config. It also -// adds default values for any that are missing in the JavaScript object. -func convertConfig(jsConfig js.Value) (core.Config, error) { - if isNullOrUndefined(jsConfig) { - return core.Config{}, errors.New("config is required") - } - - // Default config options. Some might be overridden. - config := core.Config{ - Verbosity: 2, - DataDir: "0x-mesh", - P2PTCPPort: 0, - P2PWebSocketsPort: 0, - UseBootstrapList: true, - BlockPollingInterval: 5 * time.Second, - EthereumRPCMaxContentLength: 524288, - EthereumRPCMaxRequestsPer24HrUTC: 100000, - EthereumRPCMaxRequestsPerSecond: 30, - EnableEthereumRPCRateLimiting: true, - MaxOrdersInStorage: 100000, - } - - // Required config options - if ethereumRPCURL := jsConfig.Get("ethereumRPCURL"); isNullOrUndefined(ethereumRPCURL) || ethereumRPCURL.String() == "" { - return core.Config{}, errors.New("ethereumRPCURL is required") - } else { - config.EthereumRPCURL = ethereumRPCURL.String() - } - if ethereumChainID := jsConfig.Get("ethereumChainID"); isNullOrUndefined(ethereumChainID) { - return core.Config{}, errors.New("ethereumChainID is required") - } else { - config.EthereumChainID = ethereumChainID.Int() - } - - // Optional config options - if verbosity := jsConfig.Get("verbosity"); !isNullOrUndefined(verbosity) { - config.Verbosity = verbosity.Int() - } - if useBootstrapList := jsConfig.Get("useBootstrapList"); !isNullOrUndefined(useBootstrapList) { - config.UseBootstrapList = useBootstrapList.Bool() - } - if bootstrapList := jsConfig.Get("bootstrapList"); !isNullOrUndefined(bootstrapList) { - config.BootstrapList = bootstrapList.String() - } - if blockPollingIntervalSeconds := jsConfig.Get("blockPollingIntervalSeconds"); !isNullOrUndefined(blockPollingIntervalSeconds) { - config.BlockPollingInterval = time.Duration(blockPollingIntervalSeconds.Int()) * time.Second - } - if ethereumRPCMaxContentLength := jsConfig.Get("ethereumRPCMaxContentLength"); !isNullOrUndefined(ethereumRPCMaxContentLength) { - config.EthereumRPCMaxContentLength = ethereumRPCMaxContentLength.Int() - } - if ethereumRPCMaxRequestsPer24HrUTC := jsConfig.Get("ethereumRPCMaxRequestsPer24HrUTC"); !isNullOrUndefined(ethereumRPCMaxRequestsPer24HrUTC) { - config.EthereumRPCMaxRequestsPer24HrUTC = ethereumRPCMaxRequestsPer24HrUTC.Int() - } - if ethereumRPCMaxRequestsPerSecond := jsConfig.Get("ethereumRPCMaxRequestsPerSecond"); !isNullOrUndefined(ethereumRPCMaxRequestsPerSecond) { - config.EthereumRPCMaxRequestsPerSecond = ethereumRPCMaxRequestsPerSecond.Float() - } - if enableEthereumRPCRateLimiting := jsConfig.Get("enableEthereumRPCRateLimiting"); !isNullOrUndefined(enableEthereumRPCRateLimiting) { - config.EnableEthereumRPCRateLimiting = enableEthereumRPCRateLimiting.Bool() - } - if customContractAddresses := jsConfig.Get("customContractAddresses"); !isNullOrUndefined(customContractAddresses) { - config.CustomContractAddresses = customContractAddresses.String() - } - if maxOrdersInStorage := jsConfig.Get("maxOrdersInStorage"); !isNullOrUndefined(maxOrdersInStorage) { - config.MaxOrdersInStorage = maxOrdersInStorage.Int() - } - - return config, nil -} - // NewMeshWrapper creates a new wrapper from the given config. func NewMeshWrapper(config core.Config) (*MeshWrapper, error) { app, err := core.New(config) @@ -185,13 +117,13 @@ func (cw *MeshWrapper) Start() error { select { case err := <-cw.errChan: // core.App exited with an error. Call errHandler. - if !isNullOrUndefined(cw.errHandler) { - cw.errHandler.Invoke(errorToJS(err)) + if !jsutil.IsNullOrUndefined(cw.errHandler) { + cw.errHandler.Invoke(jsutil.ErrorToJS(err)) } case <-cw.ctx.Done(): return case events := <-cw.orderEvents: - if !isNullOrUndefined(cw.orderEventsHandler) { + if !jsutil.IsNullOrUndefined(cw.orderEventsHandler) { eventsJS := make([]interface{}, len(events)) for i, event := range events { eventsJS[i] = event.JSValue() @@ -209,11 +141,8 @@ func (cw *MeshWrapper) Start() error { // core.App.AddOrders, converts the result into basic JavaScript types (string, // int, etc.) and returns it. func (cw *MeshWrapper) AddOrders(rawOrders js.Value, pinned bool) (js.Value, error) { - // HACK(albrow): There is a more effecient way to do this, but for now, - // just use JSON to convert to the Go type. - encodedOrders := js.Global().Get("JSON").Call("stringify", rawOrders).String() var rawMessages []*json.RawMessage - if err := json.Unmarshal([]byte(encodedOrders), &rawMessages); err != nil { + if err := jsutil.InefficientlyConvertFromJS(rawOrders, &rawMessages); err != nil { return js.Undefined(), err } results, err := cw.app.AddOrders(cw.ctx, rawMessages, pinned) @@ -253,7 +182,7 @@ func (cw *MeshWrapper) JSValue() js.Value { return js.ValueOf(map[string]interface{}{ // startAsync(): Promise; "startAsync": js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return wrapInPromise(func() (interface{}, error) { + return jsutil.WrapInPromise(func() (interface{}, error) { return nil, cw.Start() }) }), @@ -271,17 +200,17 @@ func (cw *MeshWrapper) JSValue() js.Value { }), // getStatsAsync(): Promise "getStatsAsync": js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return wrapInPromise(func() (interface{}, error) { + return jsutil.WrapInPromise(func() (interface{}, error) { return cw.GetStats() }) }), // getOrdersForPageAsync(page: number, perPage: number, snapshotID?: string): Promise "getOrdersForPageAsync": js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return wrapInPromise(func() (interface{}, error) { + return jsutil.WrapInPromise(func() (interface{}, error) { // snapshotID is optional in the JavaScript function. Check if it is // null or undefined. snapshotID := "" - if !isNullOrUndefined(args[2]) { + if !jsutil.IsNullOrUndefined(args[2]) { snapshotID = args[2].String() } return cw.GetOrders(args[0].Int(), args[1].Int(), snapshotID) @@ -289,40 +218,9 @@ func (cw *MeshWrapper) JSValue() js.Value { }), // addOrdersAsync(orders: Array): Promise "addOrdersAsync": js.FuncOf(func(this js.Value, args []js.Value) interface{} { - return wrapInPromise(func() (interface{}, error) { + return jsutil.WrapInPromise(func() (interface{}, error) { return cw.AddOrders(args[0], args[1].Bool()) }) }), }) } - -// errorToJS converts a Go error to a JavaScript Error. -func errorToJS(err error) js.Value { - return js.Global().Get("Error").New(err.Error()) -} - -func isNullOrUndefined(value js.Value) bool { - return value == js.Null() || value == js.Undefined() -} - -// wrapInPromise converts a potentially blocking Go function to a non-blocking -// JavaScript Promise. If the function returns an error, the promise will reject -// with that error. Otherwise, the promise will resolve with the first return -// value. -func wrapInPromise(f func() (interface{}, error)) js.Value { - var executor js.Func - executor = js.FuncOf(func(this js.Value, args []js.Value) interface{} { - resolve := args[0] - reject := args[1] - go func() { - defer executor.Release() - if result, err := f(); err != nil { - reject.Invoke(errorToJS(err)) - } else { - resolve.Invoke(result) - } - }() - return nil - }) - return js.Global().Get("Promise").New(executor) -} diff --git a/browser/go/providerwrapper/providerwrapper.go b/browser/go/providerwrapper/providerwrapper.go new file mode 100644 index 000000000..296d68700 --- /dev/null +++ b/browser/go/providerwrapper/providerwrapper.go @@ -0,0 +1,183 @@ +// +build js,wasm + +// Package providerwrapper wraps a web3 provider in order to implement the +// RPCClient interface. +package providerwrapper + +import ( + "context" + "errors" + "fmt" + "math" + "math/rand" + "syscall/js" + + "github.com/0xProject/0x-mesh/browser/go/jsutil" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" + log "github.com/sirupsen/logrus" +) + +// Ensure that we implement the ethclient.RPCClient interface. +var _ ethclient.RPCClient = &RPCClient{} + +type RPCClient struct { + // provider is the underlying Web3 provider which will be used for sending + // requests. + provider js.Value +} + +func NewRPCClient(provider js.Value) *RPCClient { + return &RPCClient{ + provider: provider, + } +} + +// CallContext performs a JSON-RPC call with the given arguments. If the context is +// canceled before the call has successfully returned, CallContext returns immediately. +// +// The result must be a pointer so that package json can unmarshal into it. You +// can also pass nil, in which case the result is ignored. +func (c *RPCClient) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error { + // Notable type definitions from Web3: + // + // interface JSONRPCRequestPayload { + // params: any[]; + // method: string; + // id: number; + // jsonrpc: string; + // } + // + // interface JSONRPCResponseError { + // message: string; + // code: number; + // } + // + // interface JSONRPCResponsePayload { + // result: any; + // id: number; + // jsonrpc: string; + // error?: JSONRPCResponseError; + // } + // + // type JSONRPCErrorCallback = (err: Error | null, result?: JSONRPCResponsePayload) => void; + // + // sendAsync(payload: JSONRPCRequestPayload, callback: JSONRPCErrorCallback): void; + // + + // Set up payload + payload := map[string]interface{}{ + "jsonrpc": "2.0", + "id": rand.Intn(math.MaxInt32), + "method": method, + } + if len(args) > 0 { + // Convert args to a value that is compatible with syscall/js. Since we don't + // know the underlying type of args, the only reliable way to do this is to + // convert to and from JSON. + convertedParams, err := jsutil.InefficientlyConvertToJS(args) + if err != nil { + return fmt.Errorf("invalid args for JSON payload: %s", err.Error()) + } + payload["params"] = convertedParams + } + + // Set up the callback function + resultChan := make(chan js.Value, 1) + errChan := make(chan error, 1) + var callback js.Func + callback = js.FuncOf(func(this js.Value, args []js.Value) interface{} { + defer callback.Release() + go func() { + if len(args) == 0 { + errChan <- errors.New("JSONRPCErrorCallback called with no arguments") + return + } + jsError := args[0] + if !jsutil.IsNullOrUndefined(jsError) { + errChan <- js.Error{ + Value: jsError, + } + return + } + if len(args) < 2 { + errChan <- errors.New("JSONRPCErrorCallback called with null/undefined error but no results") + return + } + resultChan <- args[1] + return + }() + return nil + }) + + // Call sendAsync and use select to wait for the results. + c.provider.Call("sendAsync", payload, callback) + select { + case <-ctx.Done(): + return ctx.Err() + case err := <-errChan: + return err + case jsResult := <-resultChan: + if rpcErr := jsResult.Get("error"); !jsutil.IsNullOrUndefined(rpcErr) { + return jsErrorToRPCError(rpcErr) + } + if result == nil { + return nil + } + if err := jsutil.InefficientlyConvertFromJS(jsResult.Get("result"), result); err != nil { + return fmt.Errorf("could not decode JSON RPC response: %s", err.Error()) + } + return nil + } +} + +// BatchCall sends all given requests as a single batch and waits for the server +// to return a response for all of them. The wait duration is bounded by the +// context's deadline. +// +// In contrast to CallContext, BatchCallContext only returns errors that have occurred +// while sending the request. Any error specific to a request is reported through the +// Error field of the corresponding BatchElem. +// +// Note that batch calls may not be executed atomically on the server side. +func (c *RPCClient) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error { + log.WithField("batch", b).Error("BatchCallContext was unexpectedly called in the browser") + return errors.New("BatchCallContext not yet implemented") +} + +// EthSubscribe registers a subscripion under the "eth" namespace. +func (c *RPCClient) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*rpc.ClientSubscription, error) { + log.WithField("args", args).Error("EthSubscribe was unexpectedly called in the browser") + return nil, errors.New("EthSubscribe not yet implemented") +} + +// Close is a no-op in this implementation. +func (c *RPCClient) Close() { + // no-op for now. +} + +// rpcError is an implementation of rpc.Error from the go-ethereum/rpc package. +type rpcError struct { + Message string + Code int +} + +var _ rpc.Error = &rpcError{} + +func (e rpcError) Error() string { + if e.Message == "" { + return fmt.Sprintf("json-rpc error %d", e.Code) + } + return e.Message +} + +func (e rpcError) ErrorCode() int { + return e.Code +} + +func jsErrorToRPCError(jsError js.Value) rpc.Error { + return &rpcError{ + Message: jsError.Get("message").String(), + Code: jsError.Get("code").Int(), + } +} diff --git a/browser/package.json b/browser/package.json index 24b648b36..8cb1ddc21 100644 --- a/browser/package.json +++ b/browser/package.json @@ -1,14 +1,18 @@ { "name": "@0x/mesh-browser", - "version": "8.2.0", + "version": "9.0.0", "description": "TypeScript and JavaScript bindings for running Mesh directly in the browser.", "main": "./lib/index.js", "license": "Apache-2.0", "scripts": { - "build": "yarn build:go && yarn build:generate && yarn build:ts", + "prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc", + "build": "yarn build:go && yarn build:generate && yarn build:ts && yarn build:bundle", + "build:bundle": "node --max_old_space_size=3072 ./node_modules/webpack/bin/webpack.js --mode=development", "build:ts": "node --max_old_space_size=4096 ./node_modules/.bin/tsc -b", - "build:generate": "go run ./scripts/generate_wasm_buffer.go", - "build:go": "GOOS=js GOARCH=wasm go build -o ./wasm/main.wasm ./go/main.go", + "build:generate": "INPUT_PATH=./wasm/main.wasm OUTPUT_PATH=./ts/generated/wasm_buffer.ts go run ./scripts/generate_wasm_buffer.go", + "build:go": "yarn build:go:main && yarn build:go:conversion-test", + "build:go:main": "GOOS=js GOARCH=wasm go build -o ./wasm/main.wasm ./go/mesh-browser/main.go", + "build:go:conversion-test": "GOOS=js GOARCH=wasm go build -o ./dist/conversion_test.wasm ./go/conversion-test/main.go", "docs:md": "ts-doc-gen --sourceDir=./ts --output=${npm_package_config_docsPath}", "lint": "tslint --format stylish --project ." }, @@ -16,16 +20,23 @@ "docsPath": "../docs/browser" }, "devDependencies": { + "@0x/subproviders": "^6.0.5", "@0x/ts-doc-gen": "^0.0.16", "@0x/tslint-config": "^4.0.0", "@types/base64-arraybuffer": "^0.1.0", + "ignore-loader": "^0.1.2", + "prettier": "^1.19.1", + "ts-loader": "^6.2.1", "tslint": "5.11.0", - "typescript": "^3.5.3" + "typescript": "^3.5.3", + "webpack": "^4.41.5", + "webpack-cli": "^3.3.10" }, "dependencies": { "@0x/order-utils": "^10.0.1", "@0x/utils": "^5.1.2", "base64-arraybuffer": "^0.2.0", - "browserfs": "^1.4.3" + "browserfs": "^1.4.3", + "ethereum-types": "^3.0.0" } } diff --git a/browser/scripts/generate_wasm_buffer.go b/browser/scripts/generate_wasm_buffer.go index 7a0af31ce..accff0ab3 100644 --- a/browser/scripts/generate_wasm_buffer.go +++ b/browser/scripts/generate_wasm_buffer.go @@ -6,20 +6,27 @@ import ( "io/ioutil" "os" "path/filepath" -) -const ( - inputPath = "./wasm/main.wasm" - outputPath = "./ts/generated/wasm_buffer.ts" + "github.com/plaid/go-envvar/envvar" ) +type EnvVars struct { + InputPath string `envvar:"INPUT_PATH"` + OutputPath string `envvar:"OUTPUT_PATH"` +} + var ( prefix = []byte("import * as base64 from 'base64-arraybuffer';\nexport const wasmBuffer = base64.decode('") suffix = []byte("');\n") ) func main() { - wasmBytcode, err := ioutil.ReadFile(inputPath) + env := EnvVars{} + if err := envvar.Parse(&env); err != nil { + panic(err) + } + + wasmBytcode, err := ioutil.ReadFile(env.InputPath) if err != nil { panic(err) } @@ -28,7 +35,7 @@ func main() { encodedWasmBytcode := make([]byte, encodedLen) base64.StdEncoding.Encode(encodedWasmBytcode, wasmBytcode) - outputDir := filepath.Dir(outputPath) + outputDir := filepath.Dir(env.OutputPath) if err := os.MkdirAll(outputDir, os.ModePerm); err != nil { panic(err) } @@ -37,7 +44,7 @@ func main() { // encoded as a base64 string. This is the most reliable way to load Wasm such // that users just see a TypeScript/JavaScript package and without relying on // a third-party server. - outputFile, err := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) + outputFile, err := os.OpenFile(env.OutputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) if err != nil { panic(err) } diff --git a/browser/ts/index.ts b/browser/ts/index.ts index bddf2071c..28df58689 100644 --- a/browser/ts/index.ts +++ b/browser/ts/index.ts @@ -1,5 +1,4 @@ import { SignedOrder } from '@0x/order-utils'; -import { BigNumber } from '@0x/utils'; import * as BrowserFS from 'browserfs'; import { wasmBuffer } from './generated/wasm_buffer'; @@ -7,6 +6,84 @@ import './wasm_exec'; export { SignedOrder } from '@0x/order-utils'; export { BigNumber } from '@0x/utils'; +export { SupportedProvider } from 'ethereum-types'; + +import { + AcceptedOrderInfo, + Config, + ContractAddresses, + ContractEvent, + ERC1155ApprovalForAllEvent, + ERC1155TransferBatchEvent, + ERC1155TransferSingleEvent, + ERC20ApprovalEvent, + ERC20TransferEvent, + ERC721ApprovalEvent, + ERC721ApprovalForAllEvent, + ERC721TransferEvent, + ExchangeCancelEvent, + ExchangeCancelUpToEvent, + ExchangeFillEvent, + GetOrdersResponse, + JsonSchema, + LatestBlock, + MeshWrapper, + OrderEvent, + OrderEventEndState, + OrderInfo, + RejectedOrderInfo, + RejectedOrderKind, + RejectedOrderStatus, + Stats, + ValidationResults, + Verbosity, + WethDepositEvent, + WethWithdrawalEvent, + WrapperOrderEvent, + WrapperStats, + WrapperValidationResults, + ZeroExMesh, +} from './types'; +import { + configToWrapperConfig, + orderEventsHandlerToWrapperOrderEventsHandler, + signedOrderToWrapperSignedOrder, + wrapperGetOrdersResponseToGetOrdersResponse, + wrapperStatsToStats, + wrapperValidationResultsToValidationResults, +} from './wrapper_conversion'; + +export { + AcceptedOrderInfo, + Config, + ContractAddresses, + ContractEvent, + ERC1155ApprovalForAllEvent, + ERC1155TransferSingleEvent, + ERC1155TransferBatchEvent, + ERC20ApprovalEvent, + ERC20TransferEvent, + ERC721ApprovalEvent, + ERC721ApprovalForAllEvent, + ERC721TransferEvent, + ExchangeCancelEvent, + ExchangeCancelUpToEvent, + ExchangeFillEvent, + GetOrdersResponse, + LatestBlock, + JsonSchema, + OrderEvent, + OrderEventEndState, + OrderInfo, + RejectedOrderInfo, + RejectedOrderKind, + RejectedOrderStatus, + Stats, + ValidationResults, + Verbosity, + WethDepositEvent, + WethWithdrawalEvent, +}; // The Go code sets certain global values and this is our only way of // interacting with it. Define those values and their types here. @@ -46,563 +123,6 @@ BrowserFS.configure( // The interval (in milliseconds) to check whether Wasm is done loading. const wasmLoadCheckIntervalMs = 100; -// Note(albrow): This is currently copied over from core/core.go. We need to keep -// both definitions in sync, so if you change one you must also change the -// other. -/** - * A set of configuration options for Mesh. - */ -export interface Config { - // Verbosity is the logging verbosity. Defaults to Verbosity.Error meaning - // only errors will be logged. - verbosity?: Verbosity; - // The URL of an Ethereum node which supports the Ethereum JSON RPC API. - // Used to validate and watch orders. - ethereumRPCURL: string; - // EthereumChainID is the chain ID specifying which Ethereum chain you wish to - // run your Mesh node for - ethereumChainID: number; - // UseBootstrapList is whether to bootstrap the DHT by connecting to a - // specific set of peers. - useBootstrapList?: boolean; - // bootstrapList is a list of multiaddresses to use for bootstrapping the - // DHT (e.g., - // "/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF"). - // Defaults to the hard-coded default bootstrap list. - bootstrapList?: string[]; - // The polling interval (in seconds) to wait before checking for a new - // Ethereum block that might contain transactions that impact the - // fillability of orders stored by Mesh. Different chains have different - // block producing intervals: POW chains are typically slower (e.g., - // Mainnet) and POA chains faster (e.g., Kovan) so one should adjust the - // polling interval accordingly. Defaults to 5. - blockPollingIntervalSeconds?: number; - // The maximum request Content-Length accepted by the backing Ethereum RPC - // endpoint used by Mesh. Geth & Infura both limit a request's content - // length to 1024 * 512 Bytes. Parity and Alchemy have much higher limits. - // When batch validating 0x orders, we will fit as many orders into a - // request without crossing the max content length. The default value is - // appropriate for operators using Geth or Infura. If using Alchemy or - // Parity, feel free to double the default max in order to reduce the number - // of RPC calls made by Mesh. Defaults to 524288 bytes. - ethereumRPCMaxContentLength?: number; - // Determines whether or not Mesh should limit the number of Ethereum RPC - // requests it sends. It defaults to true. Disabling Ethereum RPC rate - // limiting can reduce latency for receiving order events in some network - // conditions, but can also potentially lead to higher costs or other rate - // limiting issues outside of Mesh, depending on your Ethereum RPC provider. - // If set to false, ethereumRPCMaxRequestsPer24HrUTC and - // ethereumRPCMaxRequestsPerSecond will have no effect. - enableEthereumRPCRateLimiting?: boolean; - // A cap on the number of Ethereum JSON-RPC requests a Mesh node will make - // per 24hr UTC time window (time window starts and ends at midnight UTC). - // It defaults to 200k but can be increased well beyond this limit depending - // on your infrastructure or Ethereum RPC provider. - ethereumRPCMaxRequestsPer24HrUTC?: number; - // A cap on the number of Ethereum JSON-RPC requests a Mesh node will make - // per second. This limits the concurrency of these requests and prevents - // the Mesh node from getting rate-limited. It defaults to the recommended - // 30 rps for Infura's free tier, and can be increased to 100 rpc for pro - // users, and potentially higher on alternative infrastructure. - ethereumRPCMaxRequestsPerSecond?: number; - // A set of custom addresses to use for the configured network ID. The - // contract addresses for most common networks are already included by - // default, so this is typically only needed for testing on custom networks. - // The given addresses are added to the default list of addresses for known - // chains and overriding any contract addresses for known chains is not - // allowed. The addresses for exchange, devUtils, erc20Proxy, and - // erc721Proxy are required for each chain. For example: - // - // { - // exchange: "0x48bacb9266a570d521063ef5dd96e61686dbe788", - // devUtils: "0x38ef19fdf8e8415f18c307ed71967e19aac28ba1", - // erc20Proxy: "0x1dc4c1cefef38a777b15aa20260a54e584b16c48", - // erc721Proxy: "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401" - // } - // - customContractAddresses?: ContractAddresses; - // The maximum number of orders that Mesh will keep in storage. As the - // number of orders in storage grows, Mesh will begin enforcing a limit on - // maximum expiration time for incoming orders and remove any orders with an - // expiration time too far in the future. Defaults to 100,000. - maxOrdersInStorage?: number; -} - -export interface ContractAddresses { - exchange: string; - devUtils: string; - erc20Proxy: string; - erc721Proxy: string; - erc1155Proxy: string; - coordinator?: string; - coordinatorRegistry?: string; - weth9?: string; - zrxToken?: string; -} - -export interface LatestBlock { - number: number; - hash: string; -} - -interface WrapperStats { - version: string; - pubSubTopic: string; - rendezvous: string; - peerID: string; - ethereumChainID: number; - latestBlock: LatestBlock; - numPeers: number; - numOrders: number; - numOrdersIncludingRemoved: number; - numPinnedOrders: number; - maxExpirationTime: string; // string instead of BigNumber - startOfCurrentUTCDay: string; // string instead of Date - ethRPCRequestsSentInCurrentUTCDay: number; - ethRPCRateLimitExpiredRequests: number; -} - -export interface Stats { - version: string; - pubSubTopic: string; - rendezvous: string; - peerID: string; - ethereumChainID: number; - latestBlock: LatestBlock; - numPeers: number; - numOrders: number; - numOrdersIncludingRemoved: number; - numPinnedOrders: number; - maxExpirationTime: BigNumber; - startOfCurrentUTCDay: Date; - ethRPCRequestsSentInCurrentUTCDay: number; - ethRPCRateLimitExpiredRequests: number; -} - -interface WrapperOrderInfo { - orderHash: string; - signedOrder: WrapperSignedOrder; - fillableTakerAssetAmount: string; -} - -export interface OrderInfo { - orderHash: string; - signedOrder: SignedOrder; - fillableTakerAssetAmount: BigNumber; -} - -interface WrapperGetOrdersResponse { - snapshotID: string; - snapshotTimestamp: number; - ordersInfos: WrapperOrderInfo[]; -} - -export interface GetOrdersResponse { - snapshotID: string; - snapshotTimestamp: number; - ordersInfos: OrderInfo[]; -} - -export enum Verbosity { - Panic = 0, - Fatal = 1, - Error = 2, - Warn = 3, - Info = 4, - Debug = 5, - Trace = 6, -} - -// The global entrypoint for creating a new MeshWrapper. -interface ZeroExMesh { - newWrapperAsync(config: WrapperConfig): Promise; -} - -// A direct translation of the MeshWrapper type in Go. Its API exposes only -// simple JavaScript types like number and string, some of which will be -// converted. For example, we will convert some strings to BigNumbers. -interface MeshWrapper { - startAsync(): Promise; - onError(handler: (err: Error) => void): void; - onOrderEvents(handler: (events: WrapperOrderEvent[]) => void): void; - getStatsAsync(): Promise; - getOrdersForPageAsync(page: number, perPage: number, snapshotID?: string): Promise; - addOrdersAsync(orders: WrapperSignedOrder[], pinned: boolean): Promise; -} - -// The type for configuration exposed by MeshWrapper. -interface WrapperConfig { - verbosity?: number; - ethereumRPCURL: string; - ethereumChainID: number; - useBootstrapList?: boolean; - bootstrapList?: string; // comma-separated string instead of an array of strings. - blockPollingIntervalSeconds?: number; - ethereumRPCMaxContentLength?: number; - ethereumRPCMaxRequestsPer24HrUTC?: number; - ethereumRPCMaxRequestsPerSecond?: number; - enableEthereumRPCRateLimiting?: boolean; - customContractAddresses?: string; // json-encoded instead of Object. - maxOrdersInStorage?: number; -} - -// The type for signed orders exposed by MeshWrapper. Unlike other types, the -// analog isn't defined here. Instead we re-use the definition in -// @0x/order-utils. -interface WrapperSignedOrder { - makerAddress: string; - makerAssetData: string; - makerAssetAmount: string; - makerFee: string; - makerFeeAssetData: string; - takerAddress: string; - takerAssetData: string; - takerFeeAssetData: string; - takerAssetAmount: string; - takerFee: string; - senderAddress: string; - feeRecipientAddress: string; - expirationTimeSeconds: string; - salt: string; - signature: string; - exchangeAddress: string; - chainId: number; -} - -export interface ERC20TransferEvent { - from: string; - to: string; - value: BigNumber; -} - -interface WrapperERC20TransferEvent { - from: string; - to: string; - value: string; -} - -export interface ERC20ApprovalEvent { - owner: string; - spender: string; - value: BigNumber; -} - -interface WrapperERC20ApprovalEvent { - owner: string; - spender: string; - value: string; -} - -export interface ERC721TransferEvent { - from: string; - to: string; - tokenId: BigNumber; -} - -interface WrapperERC721TransferEvent { - from: string; - to: string; - tokenId: string; -} - -export interface ERC721ApprovalEvent { - owner: string; - approved: string; - tokenId: BigNumber; -} - -interface WrapperERC721ApprovalEvent { - owner: string; - approved: string; - tokenId: string; -} - -export interface ERC721ApprovalForAllEvent { - owner: string; - operator: string; - approved: boolean; -} - -export interface ERC1155TransferSingleEvent { - operator: string; - from: string; - to: string; - id: BigNumber; - value: BigNumber; -} - -interface WrapperERC1155TransferSingleEvent { - operator: string; - from: string; - to: string; - id: string; - value: string; -} - -export interface ERC1155TransferBatchEvent { - operator: string; - from: string; - to: string; - ids: BigNumber[]; - values: BigNumber[]; -} - -interface WrapperERC1155TransferBatchEvent { - operator: string; - from: string; - to: string; - ids: string[]; - values: string[]; -} - -export interface ERC1155ApprovalForAllEvent { - owner: string; - operator: string; - approved: boolean; -} - -export interface ExchangeFillEvent { - makerAddress: string; - takerAddress: string; - senderAddress: string; - feeRecipientAddress: string; - makerAssetFilledAmount: BigNumber; - takerAssetFilledAmount: BigNumber; - makerFeePaid: BigNumber; - takerFeePaid: BigNumber; - orderHash: string; - makerAssetData: string; - takerAssetData: string; -} - -interface WrapperExchangeFillEvent { - makerAddress: string; - takerAddress: string; - senderAddress: string; - feeRecipientAddress: string; - makerAssetFilledAmount: string; - takerAssetFilledAmount: string; - makerFeePaid: string; - takerFeePaid: string; - orderHash: string; - makerAssetData: string; - takerAssetData: string; -} - -export interface ExchangeCancelEvent { - makerAddress: string; - senderAddress: string; - feeRecipientAddress: string; - orderHash: string; - makerAssetData: string; - takerAssetData: string; -} - -export interface ExchangeCancelUpToEvent { - makerAddress: string; - senderAddress: string; - orderEpoch: BigNumber; -} - -interface WrapperExchangeCancelUpToEvent { - makerAddress: string; - senderAddress: string; - orderEpoch: string; -} - -export interface WethWithdrawalEvent { - owner: string; - value: BigNumber; -} - -interface WrapperWethWithdrawalEvent { - owner: string; - value: string; -} - -export interface WethDepositEvent { - owner: string; - value: BigNumber; -} - -interface WrapperWethDepositEvent { - owner: string; - value: string; -} - -enum ContractEventKind { - ERC20TransferEvent = 'ERC20TransferEvent', - ERC20ApprovalEvent = 'ERC20ApprovalEvent', - ERC721TransferEvent = 'ERC721TransferEvent', - ERC721ApprovalEvent = 'ERC721ApprovalEvent', - ERC721ApprovalForAllEvent = 'ERC721ApprovalForAllEvent', - ERC1155ApprovalForAllEvent = 'ERC1155ApprovalForAllEvent', - ERC1155TransferSingleEvent = 'ERC1155TransferSingleEvent', - ERC1155TransferBatchEvent = 'ERC1155TransferBatchEvent', - ExchangeFillEvent = 'ExchangeFillEvent', - ExchangeCancelEvent = 'ExchangeCancelEvent', - ExchangeCancelUpToEvent = 'ExchangeCancelUpToEvent', - WethDepositEvent = 'WethDepositEvent', - WethWithdrawalEvent = 'WethWithdrawalEvent', -} - -type WrapperContractEventParameters = - | WrapperERC20TransferEvent - | WrapperERC20ApprovalEvent - | WrapperERC721TransferEvent - | WrapperERC721ApprovalEvent - | WrapperExchangeFillEvent - | WrapperExchangeCancelUpToEvent - | WrapperWethWithdrawalEvent - | WrapperWethDepositEvent - | ERC721ApprovalForAllEvent - | ExchangeCancelEvent - | WrapperERC1155TransferSingleEvent - | WrapperERC1155TransferBatchEvent - | ERC1155ApprovalForAllEvent; - -type ContractEventParameters = - | ERC20TransferEvent - | ERC20ApprovalEvent - | ERC721TransferEvent - | ERC721ApprovalEvent - | ExchangeFillEvent - | ExchangeCancelUpToEvent - | WethWithdrawalEvent - | WethDepositEvent - | ERC721ApprovalForAllEvent - | ExchangeCancelEvent - | ERC1155TransferSingleEvent - | ERC1155TransferBatchEvent - | ERC1155ApprovalForAllEvent; - -export interface ContractEvent { - blockHash: string; - txHash: string; - txIndex: number; - logIndex: number; - isRemoved: string; - address: string; - kind: ContractEventKind; - parameters: ContractEventParameters; -} - -// The type for order events exposed by MeshWrapper. -interface WrapperContractEvent { - blockHash: string; - txHash: string; - txIndex: number; - logIndex: number; - isRemoved: string; - address: string; - kind: string; - parameters: WrapperContractEventParameters; -} - -export enum OrderEventEndState { - Invalid = 'INVALID', - Added = 'ADDED', - Filled = 'FILLED', - FullyFilled = 'FULLY_FILLED', - Cancelled = 'CANCELLED', - Expired = 'EXPIRED', - Unexpired = 'UNEXPIRED', - Unfunded = 'UNFUNDED', - FillabilityIncreased = 'FILLABILITY_INCREASED', - StoppedWatching = 'STOPPED_WATCHING', -} - -interface WrapperOrderEvent { - timestamp: string; - orderHash: string; - signedOrder: WrapperSignedOrder; - endState: OrderEventEndState; - fillableTakerAssetAmount: string; - contractEvents: WrapperContractEvent[]; -} - -/** - * Order events are fired by Mesh whenever an order is added, canceled, expired, - * or filled. - */ -export interface OrderEvent { - timestampMs: number; - orderHash: string; - signedOrder: SignedOrder; - endState: OrderEventEndState; - fillableTakerAssetAmount: BigNumber; - contractEvents: ContractEvent[]; -} - -// The type for validation results exposed by MeshWrapper. -interface WrapperValidationResults { - accepted: WrapperAcceptedOrderInfo[]; - rejected: WrapperRejectedOrderInfo[]; -} - -// The type for accepted orders exposed by MeshWrapper. -interface WrapperAcceptedOrderInfo { - orderHash: string; - signedOrder: WrapperSignedOrder; - fillableTakerAssetAmount: string; - isNew: boolean; -} - -// The type for rejected orders exposed by MeshWrapper. -interface WrapperRejectedOrderInfo { - orderHash: string; - signedOrder: WrapperSignedOrder; - kind: RejectedOrderKind; - status: RejectedOrderStatus; -} - -/** - * Indicates which orders where accepted, which were rejected, and why. - */ -export interface ValidationResults { - accepted: AcceptedOrderInfo[]; - rejected: RejectedOrderInfo[]; -} - -/** - * Info for any orders that were accepted. - */ -export interface AcceptedOrderInfo { - orderHash: string; - signedOrder: SignedOrder; - fillableTakerAssetAmount: BigNumber; - isNew: boolean; -} - -/** - * Info for any orders that were rejected, including the reason they were - * rejected. - */ -export interface RejectedOrderInfo { - orderHash: string; - signedOrder: SignedOrder; - kind: RejectedOrderKind; - status: RejectedOrderStatus; -} - -/** - * A set of categories for rejected orders. - */ -export enum RejectedOrderKind { - ZeroExValidation = 'ZEROEX_VALIDATION', - MeshError = 'MESH_ERROR', - MeshValidation = 'MESH_VALIDATION', - CoordinatorError = 'COORDINATOR_ERROR', -} - -/** - * Provides more information about why an order was rejected. - */ -export interface RejectedOrderStatus { - code: string; - message: string; -} - // We use a global variable to track whether the Wasm code has finished loading. let isWasmLoaded = false; const loadEventName = '0xmeshload'; @@ -814,247 +334,4 @@ async function waitForLoadAsync(): Promise { async function sleepAsync(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } - -function configToWrapperConfig(config: Config): WrapperConfig { - const bootstrapList = config.bootstrapList == null ? undefined : config.bootstrapList.join(','); - const customContractAddresses = - config.customContractAddresses == null ? undefined : JSON.stringify(config.customContractAddresses); - return { - ...config, - bootstrapList, - customContractAddresses, - }; -} - -function wrapperSignedOrderToSignedOrder(wrapperSignedOrder: WrapperSignedOrder): SignedOrder { - return { - ...wrapperSignedOrder, - makerFee: new BigNumber(wrapperSignedOrder.makerFee), - takerFee: new BigNumber(wrapperSignedOrder.takerFee), - makerAssetAmount: new BigNumber(wrapperSignedOrder.makerAssetAmount), - takerAssetAmount: new BigNumber(wrapperSignedOrder.takerAssetAmount), - salt: new BigNumber(wrapperSignedOrder.salt), - expirationTimeSeconds: new BigNumber(wrapperSignedOrder.expirationTimeSeconds), - }; -} - -function wrapperContractEventsToContractEvents(wrapperContractEvents: WrapperContractEvent[]): ContractEvent[] { - const contractEvents: ContractEvent[] = []; - if (wrapperContractEvents === null) { - return contractEvents; - } - wrapperContractEvents.forEach(wrapperContractEvent => { - const kind = wrapperContractEvent.kind as ContractEventKind; - const rawParameters = wrapperContractEvent.parameters; - let parameters: ContractEventParameters; - switch (kind) { - case ContractEventKind.ERC20TransferEvent: - const erc20TransferEvent = rawParameters as WrapperERC20TransferEvent; - parameters = { - from: erc20TransferEvent.from, - to: erc20TransferEvent.to, - value: new BigNumber(erc20TransferEvent.value), - }; - break; - case ContractEventKind.ERC20ApprovalEvent: - const erc20ApprovalEvent = rawParameters as WrapperERC20ApprovalEvent; - parameters = { - owner: erc20ApprovalEvent.owner, - spender: erc20ApprovalEvent.spender, - value: new BigNumber(erc20ApprovalEvent.value), - }; - break; - case ContractEventKind.ERC721TransferEvent: - const erc721TransferEvent = rawParameters as WrapperERC721TransferEvent; - parameters = { - from: erc721TransferEvent.from, - to: erc721TransferEvent.to, - tokenId: new BigNumber(erc721TransferEvent.tokenId), - }; - break; - case ContractEventKind.ERC721ApprovalEvent: - const erc721ApprovalEvent = rawParameters as WrapperERC721ApprovalEvent; - parameters = { - owner: erc721ApprovalEvent.owner, - approved: erc721ApprovalEvent.approved, - tokenId: new BigNumber(erc721ApprovalEvent.tokenId), - }; - break; - case ContractEventKind.ERC721ApprovalForAllEvent: - parameters = rawParameters as ERC721ApprovalForAllEvent; - break; - case ContractEventKind.ERC1155ApprovalForAllEvent: - parameters = rawParameters as ERC1155ApprovalForAllEvent; - break; - case ContractEventKind.ERC1155TransferSingleEvent: - const erc1155TransferSingleEvent = rawParameters as WrapperERC1155TransferSingleEvent; - parameters = { - operator: erc1155TransferSingleEvent.operator, - from: erc1155TransferSingleEvent.from, - to: erc1155TransferSingleEvent.to, - id: new BigNumber(erc1155TransferSingleEvent.id), - value: new BigNumber(erc1155TransferSingleEvent.value), - }; - break; - case ContractEventKind.ERC1155TransferBatchEvent: - const erc1155TransferBatchEvent = rawParameters as WrapperERC1155TransferBatchEvent; - const ids: BigNumber[] = []; - erc1155TransferBatchEvent.ids.forEach(id => { - ids.push(new BigNumber(id)); - }); - const values: BigNumber[] = []; - erc1155TransferBatchEvent.values.forEach(value => { - values.push(new BigNumber(value)); - }); - parameters = { - operator: erc1155TransferBatchEvent.operator, - from: erc1155TransferBatchEvent.from, - to: erc1155TransferBatchEvent.to, - ids, - values, - }; - break; - case ContractEventKind.ExchangeFillEvent: - const exchangeFillEvent = rawParameters as WrapperExchangeFillEvent; - parameters = { - makerAddress: exchangeFillEvent.makerAddress, - takerAddress: exchangeFillEvent.takerAddress, - senderAddress: exchangeFillEvent.senderAddress, - feeRecipientAddress: exchangeFillEvent.feeRecipientAddress, - makerAssetFilledAmount: new BigNumber(exchangeFillEvent.makerAssetFilledAmount), - takerAssetFilledAmount: new BigNumber(exchangeFillEvent.takerAssetFilledAmount), - makerFeePaid: new BigNumber(exchangeFillEvent.makerFeePaid), - takerFeePaid: new BigNumber(exchangeFillEvent.takerFeePaid), - orderHash: exchangeFillEvent.orderHash, - makerAssetData: exchangeFillEvent.makerAssetData, - takerAssetData: exchangeFillEvent.takerAssetData, - }; - break; - case ContractEventKind.ExchangeCancelEvent: - parameters = rawParameters as ExchangeCancelEvent; - break; - case ContractEventKind.ExchangeCancelUpToEvent: - const exchangeCancelUpToEvent = rawParameters as WrapperExchangeCancelUpToEvent; - parameters = { - makerAddress: exchangeCancelUpToEvent.makerAddress, - senderAddress: exchangeCancelUpToEvent.senderAddress, - orderEpoch: new BigNumber(exchangeCancelUpToEvent.orderEpoch), - }; - break; - case ContractEventKind.WethDepositEvent: - const wethDepositEvent = rawParameters as WrapperWethDepositEvent; - parameters = { - owner: wethDepositEvent.owner, - value: new BigNumber(wethDepositEvent.value), - }; - break; - case ContractEventKind.WethWithdrawalEvent: - const wethWithdrawalEvent = rawParameters as WrapperWethWithdrawalEvent; - parameters = { - owner: wethWithdrawalEvent.owner, - value: new BigNumber(wethWithdrawalEvent.value), - }; - break; - default: - throw new Error(`Unrecognized ContractEventKind: ${kind}`); - } - const contractEvent: ContractEvent = { - blockHash: wrapperContractEvent.blockHash, - txHash: wrapperContractEvent.txHash, - txIndex: wrapperContractEvent.txIndex, - logIndex: wrapperContractEvent.logIndex, - isRemoved: wrapperContractEvent.isRemoved, - address: wrapperContractEvent.address, - kind, - parameters, - }; - contractEvents.push(contractEvent); - }); - return contractEvents; -} - -function signedOrderToWrapperSignedOrder(signedOrder: SignedOrder): WrapperSignedOrder { - return { - ...signedOrder, - makerFee: signedOrder.makerFee.toString(), - takerFee: signedOrder.takerFee.toString(), - makerAssetAmount: signedOrder.makerAssetAmount.toString(), - takerAssetAmount: signedOrder.takerAssetAmount.toString(), - salt: signedOrder.salt.toString(), - expirationTimeSeconds: signedOrder.expirationTimeSeconds.toString(), - }; -} - -function wrapperOrderEventToOrderEvent(wrapperOrderEvent: WrapperOrderEvent): OrderEvent { - return { - ...wrapperOrderEvent, - timestampMs: new Date(wrapperOrderEvent.timestamp).getTime(), - signedOrder: wrapperSignedOrderToSignedOrder(wrapperOrderEvent.signedOrder), - fillableTakerAssetAmount: new BigNumber(wrapperOrderEvent.fillableTakerAssetAmount), - contractEvents: wrapperContractEventsToContractEvents(wrapperOrderEvent.contractEvents), - }; -} - -function orderEventsHandlerToWrapperOrderEventsHandler( - orderEventsHandler: (events: OrderEvent[]) => void, -): (events: WrapperOrderEvent[]) => void { - return (wrapperOrderEvents: WrapperOrderEvent[]) => { - const orderEvents = wrapperOrderEvents.map(wrapperOrderEventToOrderEvent); - orderEventsHandler(orderEvents); - }; -} - -function wrapperStatsToStats(wrapperStats: WrapperStats): Stats { - return { - ...wrapperStats, - startOfCurrentUTCDay: new Date(wrapperStats.startOfCurrentUTCDay), - maxExpirationTime: new BigNumber(wrapperStats.maxExpirationTime), - }; -} - -function wrapperGetOrdersResponseToGetOrdersResponse( - wrapperGetOrdersResponse: WrapperGetOrdersResponse, -): GetOrdersResponse { - return { - ...wrapperGetOrdersResponse, - ordersInfos: wrapperGetOrdersResponse.ordersInfos.map(wrapperOrderInfoToOrderInfo), - }; -} - -function wrapperOrderInfoToOrderInfo(wrapperOrderInfo: WrapperOrderInfo): OrderInfo { - return { - ...wrapperOrderInfo, - fillableTakerAssetAmount: new BigNumber(wrapperOrderInfo.fillableTakerAssetAmount), - signedOrder: wrapperSignedOrderToSignedOrder(wrapperOrderInfo.signedOrder), - }; -} - -function wrapperValidationResultsToValidationResults( - wrapperValidationResults: WrapperValidationResults, -): ValidationResults { - return { - accepted: wrapperValidationResults.accepted.map(wrapperAcceptedOrderInfoToAcceptedOrderInfo), - rejected: wrapperValidationResults.rejected.map(wrapperRejectedOrderInfoToRejectedOrderInfo), - }; -} - -function wrapperAcceptedOrderInfoToAcceptedOrderInfo( - wrapperAcceptedOrderInfo: WrapperAcceptedOrderInfo, -): AcceptedOrderInfo { - return { - ...wrapperAcceptedOrderInfo, - signedOrder: wrapperSignedOrderToSignedOrder(wrapperAcceptedOrderInfo.signedOrder), - fillableTakerAssetAmount: new BigNumber(wrapperAcceptedOrderInfo.fillableTakerAssetAmount), - }; -} - -function wrapperRejectedOrderInfoToRejectedOrderInfo( - wrapperRejectedOrderInfo: WrapperRejectedOrderInfo, -): RejectedOrderInfo { - return { - ...wrapperRejectedOrderInfo, - signedOrder: wrapperSignedOrderToSignedOrder(wrapperRejectedOrderInfo.signedOrder), - }; -} - // tslint:disable-next-line:max-file-line-count diff --git a/browser/ts/types.ts b/browser/ts/types.ts new file mode 100644 index 000000000..546f9d960 --- /dev/null +++ b/browser/ts/types.ts @@ -0,0 +1,649 @@ +import { SignedOrder } from '@0x/order-utils'; +import { BigNumber } from '@0x/utils'; +import { SupportedProvider, ZeroExProvider } from 'ethereum-types'; + +export { SignedOrder } from '@0x/order-utils'; +export { BigNumber } from '@0x/utils'; +export { SupportedProvider } from 'ethereum-types'; + +export interface WrapperGetOrdersResponse { + snapshotID: string; + snapshotTimestamp: string; + ordersInfos: WrapperOrderInfo[]; +} + +export interface GetOrdersResponse { + snapshotID: string; + snapshotTimestamp: number; + ordersInfos: OrderInfo[]; +} + +export interface WrapperOrderInfo { + orderHash: string; + signedOrder: WrapperSignedOrder; + fillableTakerAssetAmount: string; +} + +export interface OrderInfo { + orderHash: string; + signedOrder: SignedOrder; + fillableTakerAssetAmount: BigNumber; +} + +/** + * An interface for JSON schema types, which are used for custom order filters. + */ +export interface JsonSchema { + id?: string; + $schema?: string; + $ref?: string; + title?: string; + description?: string; + multipleOf?: number; + maximum?: number; + exclusiveMaximum?: boolean; + minimum?: number; + exclusiveMinimum?: boolean; + maxLength?: number; + minLength?: number; + pattern?: string | RegExp; + additionalItems?: boolean | JsonSchema; + items?: JsonSchema | JsonSchema[]; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxProperties?: number; + minProperties?: number; + required?: string[]; + additionalProperties?: boolean | JsonSchema; + definitions?: { + [name: string]: JsonSchema; + }; + properties?: { + [name: string]: JsonSchema; + }; + patternProperties?: { + [name: string]: JsonSchema; + }; + dependencies?: { + [name: string]: JsonSchema | string[]; + }; + enum?: any[]; + // NOTE(albrow): This interface type is based on + // https://github.com/tdegrunt/jsonschema/blob/9cb2cf847a33abb76b694c6ed4d8d12ef2037201/lib/index.d.ts#L50 + // but modified to include the 'const' field from the JSON Schema + // specification draft 6 (https://json-schema.org/understanding-json-schema/reference/generic.html#constant-values) + // See also: https://github.com/tdegrunt/jsonschema/issues/271 + const?: any; + type?: string | string[]; + format?: string; + allOf?: JsonSchema[]; + anyOf?: JsonSchema[]; + oneOf?: JsonSchema[]; + not?: JsonSchema; +} + +// Note(albrow): This is currently copied over from core/core.go. We need to keep +// both definitions in sync, so if you change one you must also change the +// other. +/** + * A set of configuration options for Mesh. + */ +export interface Config { + // Verbosity is the logging verbosity. Defaults to Verbosity.Error meaning + // only errors will be logged. + verbosity?: Verbosity; + // The URL of an Ethereum node which supports the Ethereum JSON RPC API. + // Used to validate and watch orders. + ethereumRPCURL?: string; + // EthereumChainID is the chain ID specifying which Ethereum chain you wish to + // run your Mesh node for + ethereumChainID: number; + // UseBootstrapList is whether to bootstrap the DHT by connecting to a + // specific set of peers. + useBootstrapList?: boolean; + // bootstrapList is a list of multiaddresses to use for bootstrapping the + // DHT (e.g., + // "/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF"). + // Defaults to the hard-coded default bootstrap list. + bootstrapList?: string[]; + // The polling interval (in seconds) to wait before checking for a new + // Ethereum block that might contain transactions that impact the + // fillability of orders stored by Mesh. Different chains have different + // block producing intervals: POW chains are typically slower (e.g., + // Mainnet) and POA chains faster (e.g., Kovan) so one should adjust the + // polling interval accordingly. Defaults to 5. + blockPollingIntervalSeconds?: number; + // The maximum request Content-Length accepted by the backing Ethereum RPC + // endpoint used by Mesh. Geth & Infura both limit a request's content + // length to 1024 * 512 Bytes. Parity and Alchemy have much higher limits. + // When batch validating 0x orders, we will fit as many orders into a + // request without crossing the max content length. The default value is + // appropriate for operators using Geth or Infura. If using Alchemy or + // Parity, feel free to double the default max in order to reduce the number + // of RPC calls made by Mesh. Defaults to 524288 bytes. + ethereumRPCMaxContentLength?: number; + // Determines whether or not Mesh should limit the number of Ethereum RPC + // requests it sends. It defaults to true. Disabling Ethereum RPC rate + // limiting can reduce latency for receiving order events in some network + // conditions, but can also potentially lead to higher costs or other rate + // limiting issues outside of Mesh, depending on your Ethereum RPC provider. + // If set to false, ethereumRPCMaxRequestsPer24HrUTC and + // ethereumRPCMaxRequestsPerSecond will have no effect. + enableEthereumRPCRateLimiting?: boolean; + // A cap on the number of Ethereum JSON-RPC requests a Mesh node will make + // per 24hr UTC time window (time window starts and ends at midnight UTC). + // It defaults to 200k but can be increased well beyond this limit depending + // on your infrastructure or Ethereum RPC provider. + ethereumRPCMaxRequestsPer24HrUTC?: number; + // A cap on the number of Ethereum JSON-RPC requests a Mesh node will make + // per second. This limits the concurrency of these requests and prevents + // the Mesh node from getting rate-limited. It defaults to the recommended + // 30 rps for Infura's free tier, and can be increased to 100 rpc for pro + // users, and potentially higher on alternative infrastructure. + ethereumRPCMaxRequestsPerSecond?: number; + // A set of custom addresses to use for the configured network ID. The + // contract addresses for most common networks are already included by + // default, so this is typically only needed for testing on custom networks. + // The given addresses are added to the default list of addresses for known + // chains and overriding any contract addresses for known chains is not + // allowed. The addresses for exchange, devUtils, erc20Proxy, and + // erc721Proxy are required for each chain. For example: + // + // { + // exchange: "0x48bacb9266a570d521063ef5dd96e61686dbe788", + // devUtils: "0x38ef19fdf8e8415f18c307ed71967e19aac28ba1", + // erc20Proxy: "0x1dc4c1cefef38a777b15aa20260a54e584b16c48", + // erc721Proxy: "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401" + // } + // + customContractAddresses?: ContractAddresses; + // The maximum number of orders that Mesh will keep in storage. As the + // number of orders in storage grows, Mesh will begin enforcing a limit on + // maximum expiration time for incoming orders and remove any orders with an + // expiration time too far in the future. Defaults to 100,000. + maxOrdersInStorage?: number; + // A a JSON Schema object which will be used for validating incoming orders. + // If provided, Mesh will only receive orders from other peers in the + // network with the same filter. + // + // Here is an example filter which will only allow orders with a specific + // makerAssetData: + // + // { + // properties: { + // makerAssetData: { + // const: "0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c" + // } + // } + // } + // + // Note that you only need to include the requirements for your specific + // application in the filter. The default requirements for a valid order (e.g. + // all the required fields) are automatically included. For more information + // on JSON Schemas, see https://json-schema.org/ + customOrderFilter?: JsonSchema; + // Offers the ability to use your own web3 provider for all Ethereum RPC + // requests instead of the default. + web3Provider?: SupportedProvider; +} + +export interface ContractAddresses { + exchange: string; + devUtils: string; + erc20Proxy: string; + erc721Proxy: string; + erc1155Proxy: string; + coordinator?: string; + coordinatorRegistry?: string; + weth9?: string; + zrxToken?: string; +} + +export enum Verbosity { + Panic = 0, + Fatal = 1, + Error = 2, + Warn = 3, + Info = 4, + Debug = 5, + Trace = 6, +} + +// The global entrypoint for creating a new MeshWrapper. +export interface ZeroExMesh { + newWrapperAsync(config: WrapperConfig): Promise; +} + +// A direct translation of the MeshWrapper type in Go. Its API exposes only +// simple JavaScript types like number and string, some of which will be +// converted. For example, we will convert some strings to BigNumbers. +export interface MeshWrapper { + startAsync(): Promise; + onError(handler: (err: Error) => void): void; + onOrderEvents(handler: (events: WrapperOrderEvent[]) => void): void; + getStatsAsync(): Promise; + getOrdersForPageAsync(page: number, perPage: number, snapshotID?: string): Promise; + addOrdersAsync(orders: WrapperSignedOrder[], pinned: boolean): Promise; +} + +// The type for configuration exposed by MeshWrapper. +export interface WrapperConfig { + verbosity?: number; + ethereumRPCURL?: string; + ethereumChainID: number; + useBootstrapList?: boolean; + bootstrapList?: string; // comma-separated string instead of an array of strings. + blockPollingIntervalSeconds?: number; + ethereumRPCMaxContentLength?: number; + ethereumRPCMaxRequestsPer24HrUTC?: number; + ethereumRPCMaxRequestsPerSecond?: number; + enableEthereumRPCRateLimiting?: boolean; + customContractAddresses?: string; // json-encoded string instead of Object. + maxOrdersInStorage?: number; + customOrderFilter?: string; // json-encoded string instead of Object + web3Provider?: ZeroExProvider; // Standardized ZeroExProvider instead the more permissive SupportedProvider interface +} + +// The type for signed orders exposed by MeshWrapper. Unlike other types, the +// analog isn't defined here. Instead we re-use the definition in +// @0x/order-utils. +export interface WrapperSignedOrder { + makerAddress: string; + makerAssetData: string; + makerAssetAmount: string; + makerFee: string; + makerFeeAssetData: string; + takerAddress: string; + takerAssetData: string; + takerFeeAssetData: string; + takerAssetAmount: string; + takerFee: string; + senderAddress: string; + feeRecipientAddress: string; + expirationTimeSeconds: string; + salt: string; + signature: string; + exchangeAddress: string; + chainId: number; +} + +export interface ERC20TransferEvent { + from: string; + to: string; + value: BigNumber; +} + +export interface WrapperERC20TransferEvent { + from: string; + to: string; + value: string; +} + +export interface ERC20ApprovalEvent { + owner: string; + spender: string; + value: BigNumber; +} + +export interface WrapperERC20ApprovalEvent { + owner: string; + spender: string; + value: string; +} + +export interface ERC721TransferEvent { + from: string; + to: string; + tokenId: BigNumber; +} + +export interface WrapperERC721TransferEvent { + from: string; + to: string; + tokenId: string; +} + +export interface ERC721ApprovalEvent { + owner: string; + approved: string; + tokenId: BigNumber; +} + +export interface WrapperERC721ApprovalEvent { + owner: string; + approved: string; + tokenId: string; +} + +export interface ERC721ApprovalForAllEvent { + owner: string; + operator: string; + approved: boolean; +} + +export interface ERC1155TransferSingleEvent { + operator: string; + from: string; + to: string; + id: BigNumber; + value: BigNumber; +} + +export interface WrapperERC1155TransferSingleEvent { + operator: string; + from: string; + to: string; + id: string; + value: string; +} + +export interface ERC1155TransferBatchEvent { + operator: string; + from: string; + to: string; + ids: BigNumber[]; + values: BigNumber[]; +} + +export interface WrapperERC1155TransferBatchEvent { + operator: string; + from: string; + to: string; + ids: string[]; + values: string[]; +} + +export interface ERC1155ApprovalForAllEvent { + owner: string; + operator: string; + approved: boolean; +} + +export interface ExchangeFillEvent { + makerAddress: string; + takerAddress: string; + senderAddress: string; + feeRecipientAddress: string; + makerAssetFilledAmount: BigNumber; + takerAssetFilledAmount: BigNumber; + makerFeePaid: BigNumber; + takerFeePaid: BigNumber; + protocolFeePaid: BigNumber; + orderHash: string; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; +} + +export interface WrapperExchangeFillEvent { + makerAddress: string; + takerAddress: string; + senderAddress: string; + feeRecipientAddress: string; + makerAssetFilledAmount: string; + takerAssetFilledAmount: string; + makerFeePaid: string; + takerFeePaid: string; + protocolFeePaid: string; + orderHash: string; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; +} + +export interface ExchangeCancelEvent { + makerAddress: string; + senderAddress: string; + feeRecipientAddress: string; + orderHash: string; + makerAssetData: string; + takerAssetData: string; +} + +export interface ExchangeCancelUpToEvent { + makerAddress: string; + orderSenderAddress: string; + orderEpoch: BigNumber; +} + +export interface WrapperExchangeCancelUpToEvent { + makerAddress: string; + orderSenderAddress: string; + orderEpoch: string; +} + +export interface WethWithdrawalEvent { + owner: string; + value: BigNumber; +} + +export interface WrapperWethWithdrawalEvent { + owner: string; + value: string; +} + +export interface WethDepositEvent { + owner: string; + value: BigNumber; +} + +export interface WrapperWethDepositEvent { + owner: string; + value: string; +} + +export enum ContractEventKind { + ERC20TransferEvent = 'ERC20TransferEvent', + ERC20ApprovalEvent = 'ERC20ApprovalEvent', + ERC721TransferEvent = 'ERC721TransferEvent', + ERC721ApprovalEvent = 'ERC721ApprovalEvent', + ERC721ApprovalForAllEvent = 'ERC721ApprovalForAllEvent', + ERC1155ApprovalForAllEvent = 'ERC1155ApprovalForAllEvent', + ERC1155TransferSingleEvent = 'ERC1155TransferSingleEvent', + ERC1155TransferBatchEvent = 'ERC1155TransferBatchEvent', + ExchangeFillEvent = 'ExchangeFillEvent', + ExchangeCancelEvent = 'ExchangeCancelEvent', + ExchangeCancelUpToEvent = 'ExchangeCancelUpToEvent', + WethDepositEvent = 'WethDepositEvent', + WethWithdrawalEvent = 'WethWithdrawalEvent', +} + +export type WrapperContractEventParameters = + | WrapperERC20TransferEvent + | WrapperERC20ApprovalEvent + | WrapperERC721TransferEvent + | WrapperERC721ApprovalEvent + | WrapperExchangeFillEvent + | WrapperExchangeCancelUpToEvent + | WrapperWethWithdrawalEvent + | WrapperWethDepositEvent + | ERC721ApprovalForAllEvent + | ExchangeCancelEvent + | WrapperERC1155TransferSingleEvent + | WrapperERC1155TransferBatchEvent + | ERC1155ApprovalForAllEvent; + +export type ContractEventParameters = + | ERC20TransferEvent + | ERC20ApprovalEvent + | ERC721TransferEvent + | ERC721ApprovalEvent + | ExchangeFillEvent + | ExchangeCancelUpToEvent + | WethWithdrawalEvent + | WethDepositEvent + | ERC721ApprovalForAllEvent + | ExchangeCancelEvent + | ERC1155TransferSingleEvent + | ERC1155TransferBatchEvent + | ERC1155ApprovalForAllEvent; + +export interface ContractEvent { + blockHash: string; + txHash: string; + txIndex: number; + logIndex: number; + isRemoved: boolean; + address: string; + kind: ContractEventKind; + parameters: ContractEventParameters; +} + +// The type for order events exposed by MeshWrapper. +export interface WrapperContractEvent { + blockHash: string; + txHash: string; + txIndex: number; + logIndex: number; + isRemoved: boolean; + address: string; + kind: string; + parameters: WrapperContractEventParameters; +} + +export enum OrderEventEndState { + Invalid = 'INVALID', + Added = 'ADDED', + Filled = 'FILLED', + FullyFilled = 'FULLY_FILLED', + Cancelled = 'CANCELLED', + Expired = 'EXPIRED', + Unexpired = 'UNEXPIRED', + Unfunded = 'UNFUNDED', + FillabilityIncreased = 'FILLABILITY_INCREASED', + StoppedWatching = 'STOPPED_WATCHING', +} + +export interface WrapperOrderEvent { + timestamp: string; + orderHash: string; + signedOrder: WrapperSignedOrder; + endState: OrderEventEndState; + fillableTakerAssetAmount: string; + contractEvents: WrapperContractEvent[]; +} + +/** + * Order events are fired by Mesh whenever an order is added, canceled, expired, + * or filled. + */ +export interface OrderEvent { + timestampMs: number; + orderHash: string; + signedOrder: SignedOrder; + endState: OrderEventEndState; + fillableTakerAssetAmount: BigNumber; + contractEvents: ContractEvent[]; +} + +// The type for validation results exposed by MeshWrapper. +export interface WrapperValidationResults { + accepted: WrapperAcceptedOrderInfo[]; + rejected: WrapperRejectedOrderInfo[]; +} + +// The type for accepted orders exposed by MeshWrapper. +export interface WrapperAcceptedOrderInfo { + orderHash: string; + signedOrder: WrapperSignedOrder; + fillableTakerAssetAmount: string; + isNew: boolean; +} + +// The type for rejected orders exposed by MeshWrapper. +export interface WrapperRejectedOrderInfo { + orderHash: string; + signedOrder: WrapperSignedOrder; + kind: RejectedOrderKind; + status: RejectedOrderStatus; +} + +/** + * Indicates which orders where accepted, which were rejected, and why. + */ +export interface ValidationResults { + accepted: AcceptedOrderInfo[]; + rejected: RejectedOrderInfo[]; +} + +/** + * Info for any orders that were accepted. + */ +export interface AcceptedOrderInfo { + orderHash: string; + signedOrder: SignedOrder; + fillableTakerAssetAmount: BigNumber; + isNew: boolean; +} + +/** + * Info for any orders that were rejected, including the reason they were + * rejected. + */ +export interface RejectedOrderInfo { + orderHash: string; + signedOrder: SignedOrder; + kind: RejectedOrderKind; + status: RejectedOrderStatus; +} + +/** + * A set of categories for rejected orders. + */ +export enum RejectedOrderKind { + ZeroExValidation = 'ZEROEX_VALIDATION', + MeshError = 'MESH_ERROR', + MeshValidation = 'MESH_VALIDATION', + CoordinatorError = 'COORDINATOR_ERROR', +} + +/** + * Provides more information about why an order was rejected. + */ +export interface RejectedOrderStatus { + code: string; + message: string; +} + +export interface LatestBlock { + number: number; + hash: string; +} + +export interface WrapperStats { + version: string; + pubSubTopic: string; + rendezvous: string; + peerID: string; + ethereumChainID: number; + latestBlock: LatestBlock; + numPeers: number; + numOrders: number; + numOrdersIncludingRemoved: number; + numPinnedOrders: number; + maxExpirationTime: string; // string instead of BigNumber + startOfCurrentUTCDay: string; // string instead of Date + ethRPCRequestsSentInCurrentUTCDay: number; + ethRPCRateLimitExpiredRequests: number; +} + +export interface Stats { + version: string; + pubSubTopic: string; + rendezvous: string; + peerID: string; + ethereumChainID: number; + latestBlock: LatestBlock; + numPeers: number; + numOrders: number; + numOrdersIncludingRemoved: number; + numPinnedOrders: number; + maxExpirationTime: BigNumber; + startOfCurrentUTCDay: Date; + ethRPCRequestsSentInCurrentUTCDay: number; + ethRPCRateLimitExpiredRequests: number; +} +// tslint:disable-next-line:max-file-line-count diff --git a/browser/ts/wasm_exec.ts b/browser/ts/wasm_exec.ts index b627e2ee0..0e003ea8a 100644 --- a/browser/ts/wasm_exec.ts +++ b/browser/ts/wasm_exec.ts @@ -1,9 +1,20 @@ // Copyright 2018 The Go Authors. All rights reserved. +// Modified work copyright 2020 ZeroEx, Inc. // Use of this source code is governed by a BSD-style // license that can be found in the GO_LICENSE file. /* tslint:disable */ + (() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + if (typeof global !== 'undefined') { // global already exists } else if (typeof window !== 'undefined') { @@ -15,118 +26,124 @@ } // NOTE(albrow): Since we know this file is only for inclusion in browser - // environments, we can skip some Node.js-related logic. - - // // Map web browser API and Node.js API to a single common API (preferring web standards over Node.js API). - // const isNodeJS = global.process && global.process.title === "node"; - // if (isNodeJS) { - // global.require = require; - // global.fs = require("fs"); - - // const nodeCrypto = require("crypto"); - // global.crypto = { - // getRandomValues(b) { - // nodeCrypto.randomFillSync(b); - // }, - // }; - - // global.performance = { - // now() { - // const [sec, nsec] = process.hrtime(); - // return sec * 1000 + nsec / 1000000; - // }, - // }; - - // const util = require("util"); - // global.TextEncoder = util.TextEncoder; - // global.TextDecoder = util.TextDecoder; - // } else { - let outputBuf = ''; - (global as any).fs = { - constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused - writeSync(fd: any, buf: any) { - outputBuf += decoder.decode(buf); - const nl = outputBuf.lastIndexOf('\n'); - if (nl != -1) { - console.log(outputBuf.substr(0, nl)); - outputBuf = outputBuf.substr(nl + 1); - } - return buf.length; - }, - write(fd: any, buf: any, offset: any, length: any, position: any, callback: any) { - if (offset !== 0 || length !== buf.length || position !== null) { - throw new Error('not implemented'); - } - const n = this.writeSync(fd, buf); - callback(null, n); - }, - open(path: any, flags: any, mode: any, callback: any) { - const err = new Error('not implemented'); - (err as any).code = 'ENOSYS'; - callback(err); - }, - read(fd: any, buffer: any, offset: any, length: any, position: any, callback: any) { - const err = new Error('not implemented'); - (err as any).code = 'ENOSYS'; - callback(err); - }, - fsync(fd: any, callback: any) { - callback(null); - }, - }; + // environments, we can skip some Node.js-related logic. This means + // commenting out anything that involves `require`. + + // if (!(global as any).require && typeof require !== 'undefined') { + // (global as any).require = require; + // } + + // if (!(global as any).fs && (global as any).require) { + // (global as any).fs = require('fs'); + // } + + if (!(global as any).fs) { + let outputBuf = ''; + (global as any).fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd: any, buf: any) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf('\n'); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write( + fd: any, + buf: string | any[], + offset: number, + length: any, + position: null, + callback: (arg0: null, arg1: any) => void, + ) { + if (offset !== 0 || length !== buf.length || position !== null) { + throw new Error('not implemented'); + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + open(path: any, flags: any, mode: any, callback: (arg0: Error) => void) { + const err: any = new Error('not implemented'); + err.code = 'ENOSYS'; + callback(err); + }, + read(fd: any, buffer: any, offset: any, length: any, position: any, callback: (arg0: Error) => void) { + const err: any = new Error('not implemented'); + err.code = 'ENOSYS'; + callback(err); + }, + fsync(fd: any, callback: (arg0: null) => void) { + callback(null); + }, + }; + } + + // if (!(global as any).crypto) { + // const nodeCrypto = require('crypto'); + // (global as any).crypto = { + // getRandomValues(b: any) { + // nodeCrypto.randomFillSync(b); + // }, + // }; + // } + + if (!(global as any).performance) { + (global as any).performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + // if (!(global as any).TextEncoder) { + // (global as any).TextEncoder = require('util').TextEncoder; + // } + + // if (!(global as any).TextDecoder) { + // (global as any).TextDecoder = require('util').TextDecoder; // } + // End of polyfills for common API. + const encoder = new (TextEncoder as any)('utf-8'); const decoder = new TextDecoder('utf-8'); (global as any).Go = class { - argv: any; - env: any; - exit: any; - _callbackTimeouts: any; - _nextCallbackTimeoutID: any; - _inst: any; - _values: any; - _refs: any; - importObject: any; - exited: any; - _callbackShutdown: any; - _exitPromise: any; - _resolveExitPromise: any; - _pendingEvent: any; - _scheduledTimeouts: any; constructor() { - this.argv = ['js']; - this.env = {}; - this.exit = (code: any) => { + (this as any).argv = ['js']; + (this as any).env = {}; + (this as any).exit = (code: number) => { if (code !== 0) { console.warn('exit code:', code); } }; - this._exitPromise = new Promise(resolve => { - this._resolveExitPromise = resolve; + (this as any)._exitPromise = new Promise(resolve => { + (this as any)._resolveExitPromise = resolve; }); - this._pendingEvent = null; - this._scheduledTimeouts = new Map(); - this._nextCallbackTimeoutID = 1; + (this as any)._pendingEvent = null; + (this as any)._scheduledTimeouts = new Map(); + (this as any)._nextCallbackTimeoutID = 1; const mem = () => { // The buffer may change when requesting more memory. - return new DataView(this._inst.exports.mem.buffer); + return new DataView((this as any)._inst.exports.mem.buffer); }; - const setInt64 = (addr: any, v: any) => { + const setInt64 = (addr: number, v: number) => { mem().setUint32(addr + 0, v, true); mem().setUint32(addr + 4, Math.floor(v / 4294967296), true); }; - const getInt64 = (addr: any) => { + const getInt64 = (addr: number) => { const low = mem().getUint32(addr + 0, true); const high = mem().getInt32(addr + 4, true); return low + high * 4294967296; }; - const loadValue = (addr: any) => { + const loadValue = (addr: number) => { const f = mem().getFloat64(addr, true); if (f === 0) { return undefined; @@ -136,10 +153,10 @@ } const id = mem().getUint32(addr, true); - return this._values[id]; + return (this as any)._values[id]; }; - const storeValue = (addr: number, v: any) => { + const storeValue = (addr: number, v: string | number | Uint8Array | boolean) => { const nanHead = 0x7ff80000; if (typeof v === 'number') { @@ -175,11 +192,11 @@ return; } - let ref = this._refs.get(v); + let ref = (this as any)._refs.get(v); if (ref === undefined) { - ref = this._values.length; - this._values.push(v); - this._refs.set(v, ref); + ref = (this as any)._values.length; + (this as any)._values.push(v); + (this as any)._refs.set(v, ref); } let typeFlag = 0; switch (typeof v) { @@ -200,7 +217,7 @@ const loadSlice = (addr: number) => { const array = getInt64(addr + 0); const len = getInt64(addr + 8); - return new Uint8Array(this._inst.exports.mem.buffer, array, len); + return new Uint8Array((this as any)._inst.exports.mem.buffer, array, len); }; const loadSliceOfValues = (addr: number) => { @@ -216,11 +233,11 @@ const loadString = (addr: number) => { const saddr = getInt64(addr + 0); const len = getInt64(addr + 8); - return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len)); + return decoder.decode(new DataView((this as any)._inst.exports.mem.buffer, saddr, len)); }; const timeOrigin = Date.now() - performance.now(); - this.importObject = { + (this as any).importObject = { go: { // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported @@ -230,11 +247,11 @@ // func wasmExit(code int32) 'runtime.wasmExit': (sp: number) => { const code = mem().getInt32(sp + 8, true); - this.exited = true; - delete this._inst; - delete this._values; - delete this._refs; - this.exit(code); + (this as any).exited = true; + delete (this as any)._inst; + delete (this as any)._values; + delete (this as any)._refs; + (this as any).exit(code); }, // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) @@ -242,7 +259,7 @@ const fd = getInt64(sp + 8); const p = getInt64(sp + 16); const n = mem().getInt32(sp + 24, true); - (global as any).fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n)); + (global as any).fs.writeSync(fd, new Uint8Array((this as any)._inst.exports.mem.buffer, p, n)); }, // func nanotime() int64 @@ -259,13 +276,19 @@ // func scheduleTimeoutEvent(delay int64) int32 'runtime.scheduleTimeoutEvent': (sp: number) => { - const id = this._nextCallbackTimeoutID; - this._nextCallbackTimeoutID++; - this._scheduledTimeouts.set( + const id = (this as any)._nextCallbackTimeoutID; + (this as any)._nextCallbackTimeoutID++; + (this as any)._scheduledTimeouts.set( id, setTimeout( () => { - this._resume(); + (this as any)._resume(); + while ((this as any)._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn('scheduleTimeoutEvent: missed timeout event'); + (this as any)._resume(); + } }, getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early ), @@ -276,8 +299,8 @@ // func clearTimeoutEvent(id int32) 'runtime.clearTimeoutEvent': (sp: number) => { const id = mem().getInt32(sp + 8, true); - clearTimeout(this._scheduledTimeouts.get(id)); - this._scheduledTimeouts.delete(id); + clearTimeout((this as any)._scheduledTimeouts.get(id)); + (this as any)._scheduledTimeouts.delete(id); }, // func getRandomData(r []byte) @@ -293,7 +316,7 @@ // func valueGet(v ref, p string) ref 'syscall/js.valueGet': (sp: number) => { const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); - sp = this._inst.exports.getsp(); // see comment above + sp = (this as any)._inst.exports.getsp(); // see comment above storeValue(sp + 32, result); }, @@ -319,7 +342,7 @@ const m = Reflect.get(v, loadString(sp + 16)); const args = loadSliceOfValues(sp + 32); const result = Reflect.apply(m, v, args); - sp = this._inst.exports.getsp(); // see comment above + sp = (this as any)._inst.exports.getsp(); // see comment above storeValue(sp + 56, result); mem().setUint8(sp + 64, 1); } catch (err) { @@ -334,7 +357,7 @@ const v = loadValue(sp + 8); const args = loadSliceOfValues(sp + 16); const result = Reflect.apply(v, undefined, args); - sp = this._inst.exports.getsp(); // see comment above + sp = (this as any)._inst.exports.getsp(); // see comment above storeValue(sp + 40, result); mem().setUint8(sp + 48, 1); } catch (err) { @@ -349,7 +372,7 @@ const v = loadValue(sp + 8); const args = loadSliceOfValues(sp + 16); const result = Reflect.construct(v, args); - sp = this._inst.exports.getsp(); // see comment above + sp = (this as any)._inst.exports.getsp(); // see comment above storeValue(sp + 40, result); mem().setUint8(sp + 48, 1); } catch (err) { @@ -378,7 +401,35 @@ // func valueInstanceOf(v ref, t ref) bool 'syscall/js.valueInstanceOf': (sp: number) => { - (mem() as any).setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16)); + mem().setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16) ? 0 : 1); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + 'syscall/js.copyBytesToGo': (sp: number) => { + const dst = loadSlice(sp + 8); + const src = loadValue(sp + 32); + if (!(src instanceof Uint8Array)) { + mem().setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + mem().setUint8(sp + 48, 1); + }, + + // func copyBytesToJS(dst ref, src []byte) (int, bool) + 'syscall/js.copyBytesToJS': (sp: number) => { + const dst = loadValue(sp + 8); + const src = loadSlice(sp + 16); + if (!(dst instanceof Uint8Array)) { + mem().setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + mem().setUint8(sp + 48, 1); }, debug: (value: any) => { @@ -389,8 +440,8 @@ } async run(instance: any) { - this._inst = instance; - this._values = [ + (this as any)._inst = instance; + (this as any)._values = [ // TODO: garbage collection NaN, 0, @@ -398,35 +449,38 @@ true, false, global, - this._inst.exports.mem, this, ]; - this._refs = new Map(); - this.exited = false; + (this as any)._refs = new Map(); + (this as any).exited = false; - const mem = new DataView(this._inst.exports.mem.buffer); + const mem = new DataView((this as any)._inst.exports.mem.buffer); // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. let offset = 4096; const strPtr = (str: string) => { - let ptr = offset; - new Uint8Array(mem.buffer, offset, str.length + 1).set(encoder.encode(str + '\0')); - offset += str.length + (8 - (str.length % 8)); + const ptr = offset; + const bytes = encoder.encode(str + '\0'); + new Uint8Array(mem.buffer, offset, bytes.length).set(bytes); + offset += bytes.length; + if (offset % 8 !== 0) { + offset += 8 - (offset % 8); + } return ptr; }; - const argc = this.argv.length; + const argc = (this as any).argv.length; const argvPtrs = []; - this.argv.forEach((arg: any) => { + (this as any).argv.forEach((arg: any) => { argvPtrs.push(strPtr(arg)); }); - const keys = Object.keys(this.env).sort(); + const keys = Object.keys((this as any).env).sort(); argvPtrs.push(keys.length); keys.forEach(key => { - argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); + argvPtrs.push(strPtr(`${key}=${(this as any).env[key]}`)); }); const argv = offset; @@ -436,55 +490,65 @@ offset += 8; }); - this._inst.exports.run(argc, argv); - if (this.exited) { - this._resolveExitPromise(); + (this as any)._inst.exports.run(argc, argv); + if ((this as any).exited) { + (this as any)._resolveExitPromise(); } - await this._exitPromise; + await (this as any)._exitPromise; } _resume() { - if (this.exited) { + if ((this as any).exited) { throw new Error('Go program has already exited'); } - this._inst.exports.resume(); - if (this.exited) { - this._resolveExitPromise(); + (this as any)._inst.exports.resume(); + if ((this as any).exited) { + (this as any)._resolveExitPromise(); } } _makeFuncWrapper(id: any) { const go = this; - return function() { - const event = { id: id, this: go, args: arguments }; - go._pendingEvent = event; + return function(this: any) { + const event = { id: id, this: this, args: arguments }; + (go as any)._pendingEvent = event; go._resume(); return (event as any).result; }; } }; - // if (isNodeJS) { - // if (process.argv.length < 3) { - // process.stderr.write("usage: go_js_wasm_exec [wasm binary] [arguments]\n"); - // process.exit(1); - // } - - // const go = new Go(); - // go.argv = process.argv.slice(2); - // go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env); - // go.exit = process.exit; - // WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { - // process.on("exit", (code) => { // Node.js exits if no event handler is pending - // if (code === 0 && !go.exited) { - // // deadlock, make Go print error and stack traces - // go._pendingEvent = { id: 0 }; - // go._resume(); - // } - // }); - // return go.run(result.instance); - // }).catch((err) => { - // throw err; - // }); + // if ( + // (global as any).require && + // (global as any).require.main === module && + // global.process && + // global.process.versions && + // !(global.process.versions as any).electron + // ) { + // if (process.argv.length < 3) { + // console.error('usage: go_js_wasm_exec [wasm binary] [arguments]'); + // process.exit(1); + // } + + // const go: any = new Go(); + // go.argv = process.argv.slice(2); + // go.env = Object.assign({ TMPDIR: require('os').tmpdir() }, process.env); + // go.exit = process.exit; + // WebAssembly.instantiate((global as any).fs.readFileSync(process.argv[2]), go.importObject) + // .then(result => { + // process.on('exit', code => { + // // Node.js exits if no event handler is pending + // if (code === 0 && !go.exited) { + // // deadlock, make Go print error and stack traces + // go._pendingEvent = { id: 0 }; + // go._resume(); + // } + // }); + // return go.run(result.instance); + // }) + // .catch(err => { + // console.error(err); + // process.exit(1); + // }); // } })(); diff --git a/browser/ts/wrapper_conversion.ts b/browser/ts/wrapper_conversion.ts new file mode 100644 index 000000000..9d0ebda90 --- /dev/null +++ b/browser/ts/wrapper_conversion.ts @@ -0,0 +1,291 @@ +import { SignedOrder } from '@0x/order-utils'; +import { BigNumber, providerUtils } from '@0x/utils'; + +import { + AcceptedOrderInfo, + Config, + ContractEvent, + ContractEventKind, + ContractEventParameters, + ERC1155ApprovalForAllEvent, + ERC721ApprovalForAllEvent, + ExchangeCancelEvent, + GetOrdersResponse, + OrderEvent, + OrderInfo, + RejectedOrderInfo, + Stats, + ValidationResults, + WrapperAcceptedOrderInfo, + WrapperConfig, + WrapperContractEvent, + WrapperERC1155TransferBatchEvent, + WrapperERC1155TransferSingleEvent, + WrapperERC20ApprovalEvent, + WrapperERC20TransferEvent, + WrapperERC721ApprovalEvent, + WrapperERC721TransferEvent, + WrapperExchangeCancelUpToEvent, + WrapperExchangeFillEvent, + WrapperGetOrdersResponse, + WrapperOrderEvent, + WrapperOrderInfo, + WrapperRejectedOrderInfo, + WrapperSignedOrder, + WrapperStats, + WrapperValidationResults, + WrapperWethDepositEvent, + WrapperWethWithdrawalEvent, +} from './types'; + +// NOTE(jalextowle): These functions are only exported so that it's easier to share code with +// the conversion tests. They should not be used outside of `0x-mesh/browser/ts/index.ts`. +// tslint:disable:completed-docs +export function configToWrapperConfig(config: Config): WrapperConfig { + const bootstrapList = config.bootstrapList == null ? undefined : config.bootstrapList.join(','); + const customContractAddresses = + config.customContractAddresses == null ? undefined : JSON.stringify(config.customContractAddresses); + const customOrderFilter = config.customOrderFilter == null ? undefined : JSON.stringify(config.customOrderFilter); + const standardizedProvider = + config.web3Provider == null ? undefined : providerUtils.standardizeOrThrow(config.web3Provider); + return { + ...config, + bootstrapList, + customContractAddresses, + customOrderFilter, + web3Provider: standardizedProvider, + }; +} + +export function wrapperSignedOrderToSignedOrder(wrapperSignedOrder: WrapperSignedOrder): SignedOrder { + return { + ...wrapperSignedOrder, + makerFee: new BigNumber(wrapperSignedOrder.makerFee), + takerFee: new BigNumber(wrapperSignedOrder.takerFee), + makerAssetAmount: new BigNumber(wrapperSignedOrder.makerAssetAmount), + takerAssetAmount: new BigNumber(wrapperSignedOrder.takerAssetAmount), + salt: new BigNumber(wrapperSignedOrder.salt), + expirationTimeSeconds: new BigNumber(wrapperSignedOrder.expirationTimeSeconds), + }; +} + +export function wrapperContractEventsToContractEvents(wrapperContractEvents: WrapperContractEvent[]): ContractEvent[] { + const contractEvents: ContractEvent[] = []; + if (wrapperContractEvents === null) { + return contractEvents; + } + wrapperContractEvents.forEach(wrapperContractEvent => { + const kind = wrapperContractEvent.kind as ContractEventKind; + const rawParameters = wrapperContractEvent.parameters; + let parameters: ContractEventParameters; + switch (kind) { + case ContractEventKind.ERC20TransferEvent: + const erc20TransferEvent = rawParameters as WrapperERC20TransferEvent; + parameters = { + from: erc20TransferEvent.from, + to: erc20TransferEvent.to, + value: new BigNumber(erc20TransferEvent.value), + }; + break; + case ContractEventKind.ERC20ApprovalEvent: + const erc20ApprovalEvent = rawParameters as WrapperERC20ApprovalEvent; + parameters = { + owner: erc20ApprovalEvent.owner, + spender: erc20ApprovalEvent.spender, + value: new BigNumber(erc20ApprovalEvent.value), + }; + break; + case ContractEventKind.ERC721TransferEvent: + const erc721TransferEvent = rawParameters as WrapperERC721TransferEvent; + parameters = { + from: erc721TransferEvent.from, + to: erc721TransferEvent.to, + tokenId: new BigNumber(erc721TransferEvent.tokenId), + }; + break; + case ContractEventKind.ERC721ApprovalEvent: + const erc721ApprovalEvent = rawParameters as WrapperERC721ApprovalEvent; + parameters = { + owner: erc721ApprovalEvent.owner, + approved: erc721ApprovalEvent.approved, + tokenId: new BigNumber(erc721ApprovalEvent.tokenId), + }; + break; + case ContractEventKind.ERC721ApprovalForAllEvent: + parameters = rawParameters as ERC721ApprovalForAllEvent; + break; + case ContractEventKind.ERC1155ApprovalForAllEvent: + parameters = rawParameters as ERC1155ApprovalForAllEvent; + break; + case ContractEventKind.ERC1155TransferSingleEvent: + const erc1155TransferSingleEvent = rawParameters as WrapperERC1155TransferSingleEvent; + parameters = { + operator: erc1155TransferSingleEvent.operator, + from: erc1155TransferSingleEvent.from, + to: erc1155TransferSingleEvent.to, + id: new BigNumber(erc1155TransferSingleEvent.id), + value: new BigNumber(erc1155TransferSingleEvent.value), + }; + break; + case ContractEventKind.ERC1155TransferBatchEvent: + const erc1155TransferBatchEvent = rawParameters as WrapperERC1155TransferBatchEvent; + const ids: BigNumber[] = []; + erc1155TransferBatchEvent.ids.forEach(id => { + ids.push(new BigNumber(id)); + }); + const values: BigNumber[] = []; + erc1155TransferBatchEvent.values.forEach(value => { + values.push(new BigNumber(value)); + }); + parameters = { + operator: erc1155TransferBatchEvent.operator, + from: erc1155TransferBatchEvent.from, + to: erc1155TransferBatchEvent.to, + ids, + values, + }; + break; + case ContractEventKind.ExchangeFillEvent: + const exchangeFillEvent = rawParameters as WrapperExchangeFillEvent; + parameters = { + makerAddress: exchangeFillEvent.makerAddress, + takerAddress: exchangeFillEvent.takerAddress, + senderAddress: exchangeFillEvent.senderAddress, + feeRecipientAddress: exchangeFillEvent.feeRecipientAddress, + makerAssetFilledAmount: new BigNumber(exchangeFillEvent.makerAssetFilledAmount), + takerAssetFilledAmount: new BigNumber(exchangeFillEvent.takerAssetFilledAmount), + makerFeePaid: new BigNumber(exchangeFillEvent.makerFeePaid), + takerFeePaid: new BigNumber(exchangeFillEvent.takerFeePaid), + orderHash: exchangeFillEvent.orderHash, + makerAssetData: exchangeFillEvent.makerAssetData, + takerAssetData: exchangeFillEvent.takerAssetData, + }; + break; + case ContractEventKind.ExchangeCancelEvent: + parameters = rawParameters as ExchangeCancelEvent; + break; + case ContractEventKind.ExchangeCancelUpToEvent: + const exchangeCancelUpToEvent = rawParameters as WrapperExchangeCancelUpToEvent; + parameters = { + makerAddress: exchangeCancelUpToEvent.makerAddress, + orderSenderAddress: exchangeCancelUpToEvent.orderSenderAddress, + orderEpoch: new BigNumber(exchangeCancelUpToEvent.orderEpoch), + }; + break; + case ContractEventKind.WethDepositEvent: + const wethDepositEvent = rawParameters as WrapperWethDepositEvent; + parameters = { + owner: wethDepositEvent.owner, + value: new BigNumber(wethDepositEvent.value), + }; + break; + case ContractEventKind.WethWithdrawalEvent: + const wethWithdrawalEvent = rawParameters as WrapperWethWithdrawalEvent; + parameters = { + owner: wethWithdrawalEvent.owner, + value: new BigNumber(wethWithdrawalEvent.value), + }; + break; + default: + throw new Error(`Unrecognized ContractEventKind: ${kind}`); + } + const contractEvent: ContractEvent = { + blockHash: wrapperContractEvent.blockHash, + txHash: wrapperContractEvent.txHash, + txIndex: wrapperContractEvent.txIndex, + logIndex: wrapperContractEvent.logIndex, + isRemoved: wrapperContractEvent.isRemoved, + address: wrapperContractEvent.address, + kind, + parameters, + }; + contractEvents.push(contractEvent); + }); + return contractEvents; +} + +export function signedOrderToWrapperSignedOrder(signedOrder: SignedOrder): WrapperSignedOrder { + return { + ...signedOrder, + makerFee: signedOrder.makerFee.toString(), + takerFee: signedOrder.takerFee.toString(), + makerAssetAmount: signedOrder.makerAssetAmount.toString(), + takerAssetAmount: signedOrder.takerAssetAmount.toString(), + salt: signedOrder.salt.toString(), + expirationTimeSeconds: signedOrder.expirationTimeSeconds.toString(), + }; +} + +export function wrapperOrderEventToOrderEvent(wrapperOrderEvent: WrapperOrderEvent): OrderEvent { + return { + ...wrapperOrderEvent, + timestampMs: new Date(wrapperOrderEvent.timestamp).getTime(), + signedOrder: wrapperSignedOrderToSignedOrder(wrapperOrderEvent.signedOrder), + fillableTakerAssetAmount: new BigNumber(wrapperOrderEvent.fillableTakerAssetAmount), + contractEvents: wrapperContractEventsToContractEvents(wrapperOrderEvent.contractEvents), + }; +} + +export function orderEventsHandlerToWrapperOrderEventsHandler( + orderEventsHandler: (events: OrderEvent[]) => void, +): (events: WrapperOrderEvent[]) => void { + return (wrapperOrderEvents: WrapperOrderEvent[]) => { + const orderEvents = wrapperOrderEvents.map(wrapperOrderEventToOrderEvent); + orderEventsHandler(orderEvents); + }; +} + +export function wrapperValidationResultsToValidationResults( + wrapperValidationResults: WrapperValidationResults, +): ValidationResults { + return { + accepted: wrapperValidationResults.accepted.map(wrapperAcceptedOrderInfoToAcceptedOrderInfo), + rejected: wrapperValidationResults.rejected.map(wrapperRejectedOrderInfoToRejectedOrderInfo), + }; +} + +export function wrapperAcceptedOrderInfoToAcceptedOrderInfo( + wrapperAcceptedOrderInfo: WrapperAcceptedOrderInfo, +): AcceptedOrderInfo { + return { + ...wrapperAcceptedOrderInfo, + signedOrder: wrapperSignedOrderToSignedOrder(wrapperAcceptedOrderInfo.signedOrder), + fillableTakerAssetAmount: new BigNumber(wrapperAcceptedOrderInfo.fillableTakerAssetAmount), + }; +} + +export function wrapperRejectedOrderInfoToRejectedOrderInfo( + wrapperRejectedOrderInfo: WrapperRejectedOrderInfo, +): RejectedOrderInfo { + return { + ...wrapperRejectedOrderInfo, + signedOrder: wrapperSignedOrderToSignedOrder(wrapperRejectedOrderInfo.signedOrder), + }; +} + +export function wrapperStatsToStats(wrapperStats: WrapperStats): Stats { + return { + ...wrapperStats, + startOfCurrentUTCDay: new Date(wrapperStats.startOfCurrentUTCDay), + maxExpirationTime: new BigNumber(wrapperStats.maxExpirationTime), + }; +} + +export function wrapperGetOrdersResponseToGetOrdersResponse( + wrapperGetOrdersResponse: WrapperGetOrdersResponse, +): GetOrdersResponse { + return { + ...wrapperGetOrdersResponse, + snapshotTimestamp: new Date(wrapperGetOrdersResponse.snapshotTimestamp).getTime(), + ordersInfos: wrapperGetOrdersResponse.ordersInfos.map(wrapperOrderInfoToOrderInfo), + }; +} + +export function wrapperOrderInfoToOrderInfo(wrapperOrderInfo: WrapperOrderInfo): OrderInfo { + return { + ...wrapperOrderInfo, + fillableTakerAssetAmount: new BigNumber(wrapperOrderInfo.fillableTakerAssetAmount), + signedOrder: wrapperSignedOrderToSignedOrder(wrapperOrderInfo.signedOrder), + }; +} +// tslint:enable:completed-docs diff --git a/browser/tsconfig.json b/browser/tsconfig.json index b92b624db..c14df0f55 100644 --- a/browser/tsconfig.json +++ b/browser/tsconfig.json @@ -15,5 +15,6 @@ "typeRoots": ["node_modules/@0x/typescript-typings/types", "node_modules/@types"], "strict": true }, - "include": ["./ts/**/*", "./test/**/*"] + "include": ["./ts/**/*"], + "exclude": ["./conversion-tests/**/*"] } diff --git a/browser/webpack.config.js b/browser/webpack.config.js new file mode 100644 index 000000000..b41a4964f --- /dev/null +++ b/browser/webpack.config.js @@ -0,0 +1,29 @@ +const path = require('path'); + +module.exports = { + entry: './conversion-tests/conversion_test.ts', + node: { + fs: 'empty' + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: [{ + loader: 'ts-loader', + options: { + configFile: 'webpack.tsconfig.json', + } + }], + exclude: /node_modules/ + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + } +}; diff --git a/browser/webpack.tsconfig.json b/browser/webpack.tsconfig.json new file mode 100644 index 000000000..d6d5bc1a7 --- /dev/null +++ b/browser/webpack.tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "outDir": "lib", + "resolveJsonModule": true, + "module": "commonjs", + "target": "es5", + "lib": ["es2017", "dom"], + "experimentalDecorators": true, + "downlevelIteration": true, + "noImplicitReturns": true, + "pretty": true, + "skipLibCheck": true, + "declaration": true, + "typeRoots": ["node_modules/@0x/typescript-typings/types", "node_modules/@types"], + "strict": true + }, + "include": ["./conversion-tests/**/*", "./ts/**/*"], + "exclude": ["./ts/index.ts"] +} diff --git a/browser/yarn.lock b/browser/yarn.lock index 39fe12a74..c694aa6b1 100644 --- a/browser/yarn.lock +++ b/browser/yarn.lock @@ -13,6 +13,17 @@ lodash "^4.17.11" valid-url "^1.0.9" +"@0x/assert@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@0x/assert/-/assert-3.0.4.tgz#640bcd42d0b6286d45ee622e5622f71325ec63b4" + integrity sha512-vmERhbvSXNfpB3lHQfgGWInSJOSR0qPBDFQmTVyCJDLCDOq2T0S+Z95ntZkbuwvKE5LIk6hozu2CJobtR1OfHQ== + dependencies: + "@0x/json-schemas" "^5.0.4" + "@0x/typescript-typings" "^5.0.1" + "@0x/utils" "^5.2.0" + lodash "^4.17.11" + valid-url "^1.0.9" + "@0x/base-contract@^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/@0x/base-contract/-/base-contract-6.0.2.tgz#198bad06398bdb58da1b98a93bf41f4322e9a6cd" @@ -62,6 +73,16 @@ jsonschema "^1.2.0" lodash.values "^4.3.0" +"@0x/json-schemas@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@0x/json-schemas/-/json-schemas-5.0.4.tgz#c2963b59e72a12362a43c8cfc3c572abd9d567ad" + integrity sha512-cU/gonynMb6enY5IKUDryD0SeuflAOUDLOjzCVtpibrgUtrjw3BYUKEkj0eUpDvQm5oCT609GOEIVCl3iZ7fPw== + dependencies: + "@0x/typescript-typings" "^5.0.1" + "@types/node" "*" + jsonschema "^1.2.0" + lodash.values "^4.3.0" + "@0x/order-utils@^10.0.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@0x/order-utils/-/order-utils-10.0.1.tgz#5cd887e70e76df3117051582a01c74087c4cb9fa" @@ -76,6 +97,34 @@ ethers "~4.0.4" lodash "^4.17.11" +"@0x/subproviders@^6.0.5": + version "6.0.5" + resolved "https://registry.yarnpkg.com/@0x/subproviders/-/subproviders-6.0.5.tgz#4bf434beb440c0dc619937805a939d0e148ab404" + integrity sha512-sAVt1nXxlxy2LQ/Mx894iAsjFGbSD7QqoZNElRoXpTlPaoLUcaliHjJOR5beID/z7Cz3t0F0kYv9cD2F/mhCig== + dependencies: + "@0x/assert" "^3.0.4" + "@0x/types" "^3.1.1" + "@0x/typescript-typings" "^5.0.1" + "@0x/utils" "^5.2.0" + "@0x/web3-wrapper" "^7.0.4" + "@ledgerhq/hw-app-eth" "^4.3.0" + "@ledgerhq/hw-transport-u2f" "4.24.0" + "@types/hdkey" "^0.7.0" + "@types/web3-provider-engine" "^14.0.0" + bip39 "^2.5.0" + bn.js "^4.11.8" + ethereum-types "^3.0.0" + ethereumjs-tx "^1.3.5" + ethereumjs-util "^5.1.1" + ganache-core "^2.9.0-istanbul.0" + hdkey "^0.7.1" + json-rpc-error "2.0.0" + lodash "^4.17.11" + semaphore-async-await "^1.5.1" + web3-provider-engine "14.0.6" + optionalDependencies: + "@ledgerhq/hw-transport-node-hid" "^4.3.0" + "@0x/ts-doc-gen@^0.0.16": version "0.0.16" resolved "https://registry.yarnpkg.com/@0x/ts-doc-gen/-/ts-doc-gen-0.0.16.tgz#9ac03483803c89c5fd774a95d99a4cb0db070f69" @@ -198,6 +247,25 @@ js-sha3 "^0.7.0" lodash "^4.17.11" +"@0x/utils@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@0x/utils/-/utils-5.2.0.tgz#313c0fcf18d9614bf7a227fde3a084bdfbc459d4" + integrity sha512-/9TFzg+PcEmVPVDkWQ2tziZKnh5UjzoI1GksERT1kK8aNmPK1rm0UBQgDi0Y+0hwCLSEdq4qz0sjvhY9JdQSWw== + dependencies: + "@0x/types" "^3.1.1" + "@0x/typescript-typings" "^5.0.1" + "@types/node" "*" + abortcontroller-polyfill "^1.1.9" + bignumber.js "~9.0.0" + chalk "^2.3.0" + detect-node "2.0.3" + ethereum-types "^3.0.0" + ethereumjs-util "^5.1.1" + ethers "~4.0.4" + isomorphic-fetch "2.2.1" + js-sha3 "^0.7.0" + lodash "^4.17.11" + "@0x/web3-wrapper@^7.0.2": version "7.0.2" resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-7.0.2.tgz#afdd12a3c2518207d56372397ae91e4a90634f46" @@ -212,6 +280,20 @@ ethers "~4.0.4" lodash "^4.17.11" +"@0x/web3-wrapper@^7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-7.0.4.tgz#f07cb154bc43d0ba5b7137200aa216ba49ca033c" + integrity sha512-FpiDgIzO0Y/yPrmO2nM7SoInLOm3LM6imK8If1yqvsI133emMB5jTvxNW7sGK1dgB/wLdQsFRjsp2XnAxuM6TQ== + dependencies: + "@0x/assert" "^3.0.4" + "@0x/json-schemas" "^5.0.4" + "@0x/typescript-typings" "^5.0.1" + "@0x/utils" "^5.2.0" + ethereum-types "^3.0.0" + ethereumjs-util "^5.1.1" + ethers "~4.0.4" + lodash "^4.17.11" + "@babel/runtime@^7.1.5": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf" @@ -219,11 +301,99 @@ dependencies: regenerator-runtime "^0.13.2" +"@ledgerhq/devices@^4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-4.78.0.tgz#149b572f0616096e2bd5eb14ce14d0061c432be6" + integrity sha512-tWKS5WM/UU82czihnVjRwz9SXNTQzWjGJ/7+j/xZ70O86nlnGJ1aaFbs5/WTzfrVKpOKgj1ZoZkAswX67i/JTw== + dependencies: + "@ledgerhq/errors" "^4.78.0" + "@ledgerhq/logs" "^4.72.0" + rxjs "^6.5.3" + +"@ledgerhq/errors@^4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.78.0.tgz#23daf3af54d03b1bda3e616002b555da1bdb705a" + integrity sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg== + +"@ledgerhq/hw-app-eth@^4.3.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.78.0.tgz#fbd7ffe7f371d0c32a53f38c5149ab8d13514297" + integrity sha512-m4s4Zhy4lwYJjZB3xPeGV/8mxQcnoui+Eu1KDEl6atsquZHUpbtern/0hZl88+OlFUz0XrX34W3I9cqj61Y6KA== + dependencies: + "@ledgerhq/errors" "^4.78.0" + "@ledgerhq/hw-transport" "^4.78.0" + +"@ledgerhq/hw-transport-node-hid-noevents@^4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-4.78.0.tgz#6f0dbe1bbfad6516b42ad2d6b6b34a8b07e4cd46" + integrity sha512-CJPVR4wksq+apiXH2GnsttguBxmj9zdM2HjqZ3dHZN8SFW/9Xj3k+baS+pYoUISkECVxDrdfaW3Bd5dWv+jPUg== + dependencies: + "@ledgerhq/devices" "^4.78.0" + "@ledgerhq/errors" "^4.78.0" + "@ledgerhq/hw-transport" "^4.78.0" + "@ledgerhq/logs" "^4.72.0" + node-hid "^0.7.9" + +"@ledgerhq/hw-transport-node-hid@^4.3.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.78.0.tgz#abd99e0f918b810a61c035e5ab8c2bd8807aff55" + integrity sha512-OMrY2ecfQ1XjMAuuHqu3n3agMPR06HN1s0ENrKc+Twbb5A17jujpv07WzjxfTN2V1G7vgeZpRqrg2ulhowWbdg== + dependencies: + "@ledgerhq/devices" "^4.78.0" + "@ledgerhq/errors" "^4.78.0" + "@ledgerhq/hw-transport" "^4.78.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^4.78.0" + "@ledgerhq/logs" "^4.72.0" + lodash "^4.17.15" + node-hid "^0.7.9" + usb "^1.6.0" + +"@ledgerhq/hw-transport-u2f@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-4.24.0.tgz#d67cfc4abf6d9a900ed45f2e2df7fe06dfdff5c7" + integrity sha512-/gFjhkM0sJfZ7iUf8HoIkGufAWgPacrbb1LW0TvWnZwvsATVJ1BZJBtrr90Wo401PKsjVwYtFt3Ce4gOAUv9jQ== + dependencies: + "@ledgerhq/hw-transport" "^4.24.0" + u2f-api "0.2.7" + +"@ledgerhq/hw-transport@^4.24.0", "@ledgerhq/hw-transport@^4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.78.0.tgz#714786658e1f2fbc0569e06e2abf8d15d310d931" + integrity sha512-xQu16OMPQjFYLjqCysij+8sXtdWv2YLxPrB6FoLvEWGTlQ7yL1nUBRQyzyQtWIYqZd4THQowQmzm1VjxuN6SZw== + dependencies: + "@ledgerhq/devices" "^4.78.0" + "@ledgerhq/errors" "^4.78.0" + events "^3.0.0" + +"@ledgerhq/logs@^4.72.0": + version "4.72.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-4.72.0.tgz#43df23af013ad1135407e5cf33ca6e4c4c7708d5" + integrity sha512-o+TYF8vBcyySRsb2kqBDv/KMeme8a2nwWoG+lAWzbDmWfb2/MrVWYCVYDYvjXdSoI/Cujqy1i0gIDrkdxa9chA== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@types/base64-arraybuffer@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@types/base64-arraybuffer/-/base64-arraybuffer-0.1.0.tgz#739eea0a974d13ae831f96d97d882ceb0b187543" integrity sha512-oyV0CGER7tX6OlfnLfGze0XbsA7tfRuTtsQ2JbP8K5KBUzc24yoYRD+0XjMRQgOejvZWeIbtkNaHlE8akzj4aQ== +"@types/bignumber.js@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" + integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== + dependencies: + bignumber.js "*" + "@types/bn.js@^4.11.0", "@types/bn.js@^4.11.3": version "4.11.5" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.5.tgz#40e36197433f78f807524ec623afcf0169ac81dc" @@ -231,6 +401,27 @@ dependencies: "@types/node" "*" +"@types/bn.js@^4.11.4": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/ethereum-protocol@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/ethereum-protocol/-/ethereum-protocol-1.0.0.tgz#416e3827d5fdfa4658b0045b35a008747871b271" + integrity sha512-3DiI3Zxf81CgX+VhxNNFJBv/sfr1BFBKQK2sQ85hU9FwWJJMWV5gRDV79OUNShiwj3tYYIezU94qpucsb3dThQ== + dependencies: + bignumber.js "7.2.1" + +"@types/hdkey@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@types/hdkey/-/hdkey-0.7.1.tgz#9bc63ebbe96b107b277b65ea7a95442a677d0d61" + integrity sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q== + dependencies: + "@types/node" "*" + "@types/minimatch@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -241,6 +432,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== +"@types/node@^10.12.18", "@types/node@^10.3.2": + version "10.17.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.14.tgz#b6c60ebf2fb5e4229fdd751ff9ddfae0f5f31541" + integrity sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw== + +"@types/node@^12.6.1": + version "12.12.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.26.tgz#213e153babac0ed169d44a6d919501e68f59dea9" + integrity sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -254,11 +455,207 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/web3-provider-engine@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@types/web3-provider-engine/-/web3-provider-engine-14.0.0.tgz#43adc3b39dc9812b82aef8cd2d66577665ad59b0" + integrity sha512-yHr8mX2SoX3JNyfqdLXdO1UobsGhfiwSgtekbVxKLQrzD7vtpPkKbkIVsPFOhvekvNbPsCmDyeDCLkpeI9gSmA== + dependencies: + "@types/ethereum-protocol" "*" + +"@web3-js/scrypt-shim@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc" + integrity sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw== + dependencies: + scryptsy "^2.1.0" + semver "^6.3.0" + +"@web3-js/websocket@^1.0.29": + version "1.0.30" + resolved "https://registry.yarnpkg.com/@web3-js/websocket/-/websocket-1.0.30.tgz#9ea15b7b582cf3bf3e8bc1f4d3d54c0731a87f87" + integrity sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA== + dependencies: + debug "^2.2.0" + es5-ext "^0.10.50" + nan "^2.14.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + abortcontroller-polyfill@^1.1.9: version "1.4.0" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.4.0.tgz#0d5eb58e522a461774af8086414f68e1dda7a6c4" integrity sha512-3ZFfCRfDzx3GFjO6RAkYx81lPGpUS20ISxux9gLxuKnqafNcFQo59+IoZqpO2WvQlyc287B62HDnDdNYRmlvWA== +abstract-leveldown@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" + integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6" @@ -273,18 +670,73 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - xtend "~4.0.0" + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== 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= +aes-js@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.5.5: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -295,18 +747,66 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +any-promise@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -314,6 +814,128 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-each@^1.0.0, array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +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= + +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + 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= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" + integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^2.0.0" + stream-exhaust "^1.0.1" + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" @@ -321,19 +943,58 @@ async-eventemitter@^0.2.2: dependencies: async "^2.4.0" +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + +async@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.0.1, async@^2.1.2, async@^2.1.4, async@^2.4.0, async@^2.6.1: +async@^2.0.1, async@^2.1.2, async@^2.1.4, 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== dependencies: lodash "^4.17.14" -babel-code-frame@^6.22.0: +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-code-frame@^6.22.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" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -342,6 +1003,531 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" +babel-core@^6.0.14, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity 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" + 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" + 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" + 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" + 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" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity 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" + 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" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity 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" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity 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" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity 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" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity 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" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity 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" + 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" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity 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" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babelify@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= + dependencies: + babel-core "^6.0.14" + object-assign "^4.0.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + backbone@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" @@ -349,33 +1535,109 @@ backbone@^1.4.0: dependencies: underscore ">=1.8.3" +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base-x@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.7.tgz#1c5a7fafe8f66b4114063e8da102799d4e7c408f" + integrity sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw== + dependencies: + safe-buffer "^5.0.1" + base64-arraybuffer@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45" integrity sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ== +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bignumber.js@*, bignumber.js@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + +bignumber.js@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + bignumber.js@~8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137" integrity sha512-EiuvFrnbv0jFixEQ9f58jo7X0qI2lNGIr/MxntmVzQc5JUweDSh8y8hbTCAomFtqwUPIOWcLXP0VEOSZTG7FFw== -bignumber.js@~9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bindings@^1.2.1, bindings@^1.5.0: +bindings@^1.2.1, bindings@^1.4.0, 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" + integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + unorm "^1.3.3" + +bip39@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.6.0.tgz#9e3a720b42ec8b3fbe4038f1e445317b6a99321c" + integrity sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + 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" @@ -383,11 +1645,52 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0: +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bl@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" + integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== + dependencies: + readable-stream "^3.0.1" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= + +bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +body-parser@1.19.0, body-parser@^1.16.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -396,6 +1699,29 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -409,7 +1735,7 @@ browserfs@^1.4.3: async "^2.1.4" pako "^1.0.4" -browserify-aes@^1.0.6: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -421,7 +1747,34 @@ browserify-aes@^1.0.6: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-sha3@^0.0.4: +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sha3@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.4.tgz#086c47b8c82316c9d47022c26185954576dd8e26" integrity sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY= @@ -429,26 +1782,236 @@ browserify-sha3@^0.0.4: js-sha3 "^0.6.1" safe-buffer "^5.1.1" +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +bs58@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" + integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40= + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +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= + 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= +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.5, buffer@^5.2.1: + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + 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" + integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cachedown@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" + integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= + dependencies: + abstract-leveldown "^2.4.1" + lru-cache "^3.2.0" + +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= + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30000844: + version "1.0.30001025" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz#30336a8aca7f98618eb3cf38e35184e13d4e5fe6" + integrity sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -460,15 +2023,6 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" @@ -476,6 +2030,37 @@ checkpoint-store@^1.1.0: dependencies: functional-red-black-tree "^1.0.1" +chokidar@^2.0.0, chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + 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" @@ -484,6 +2069,25 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -493,11 +2097,76 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +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= + dependencies: + mimic-response "^1.0.0" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@2.1.2, clone@^2.0.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + 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= +coinstring@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/coinstring/-/coinstring-2.3.0.tgz#cdb63363a961502404a25afb82c2e26d5ff627a4" + integrity sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q= + dependencies: + bs58 "^2.0.1" + create-hash "^1.1.1" + +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -510,27 +2179,161 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@^2.12.1, commander@~2.20.3: +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.12.1, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookiejar@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + core-js-pure@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.0.tgz#c86e14d9316659af04dd54266addc9271f6164f8" integrity sha512-+YSSo7UFDFuVvMUr1HVFYArb22pYIKRDISBo6V50kRuS0MsXgsuDWmJYFu6dJsJupr77S486xRnDkr/BWQQonw== -core-util-is@~1.0.0: +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +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= -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: +cors@^2.8.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -541,7 +2344,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -553,6 +2356,25 @@ create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@^2.1.0, cross-fetch@^2.1.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" + integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw== + dependencies: + node-fetch "2.1.2" + whatwg-fetch "2.0.4" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -562,16 +2384,173 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + csstype@^2.2.0: version "2.6.8" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== -decamelize@^1.1.1: +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +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= +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= + +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" + integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-equal@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" @@ -594,6 +2573,78 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + 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" + 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" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity 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= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +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" + 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= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-node@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -604,6 +2655,15 @@ diff@^3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + doctrine@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" @@ -612,6 +2672,23 @@ doctrine@0.7.2: esutils "^1.1.6" isarray "0.0.1" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -621,7 +2698,58 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -elliptic@6.5.2, elliptic@^6.5.2: +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + +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= + 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= + +electron-to-chromium@^1.3.47: + version "1.3.345" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz#2569d0d54a64ef0f32a4b7e8c80afa5fe57c5d98" + integrity sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg== + +elliptic@6.3.3: + version "6.3.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" + integrity sha1-VILZZG1UvLif19mU/J4ulWiHbj8= + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + inherits "^2.0.1" + +elliptic@6.5.2, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== @@ -634,7 +2762,22 @@ elliptic@6.5.2, elliptic@^6.5.2: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -encoding-down@~5.0.0: +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== @@ -652,13 +2795,45 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -errno@~0.1.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: prr "~1.0.1" +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.17.0-next.1: version "1.17.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172" @@ -685,16 +2860,77 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, 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= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +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= + 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= +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + esutils@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" @@ -705,6 +2941,126 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eth-block-tracker@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" + integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== + dependencies: + eth-query "^2.1.0" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.3" + ethjs-util "^0.1.3" + json-rpc-engine "^3.6.0" + pify "^2.3.0" + tape "^4.6.3" + +eth-ens-namehash@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + +eth-json-rpc-infura@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== + dependencies: + cross-fetch "^2.1.1" + eth-json-rpc-middleware "^1.5.0" + json-rpc-engine "^3.4.0" + json-rpc-error "^2.0.0" + +eth-json-rpc-middleware@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== + dependencies: + async "^2.5.0" + eth-query "^2.1.2" + eth-tx-summary "^3.1.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.1.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^3.6.0" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + tape "^4.6.3" + +eth-lib@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" + integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + nano-json-stream-parser "^0.1.2" + servify "^0.1.12" + ws "^3.0.0" + xhr-request-promise "^0.1.2" + +eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-sig-util@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.3.0.tgz#c54a6ac8e8796f7e25f59cf436982a930e645231" + integrity sha512-ugD1AvaggvKaZDgnS19W5qOfepjGc7qHrt7TrAaL54gJw9SHvgIXJ3r2xOMW30RWJZNP+1GlTOy5oye7yXA4xA== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +eth-tx-summary@^3.1.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== + dependencies: + async "^2.1.2" + clone "^2.0.0" + concat-stream "^1.5.1" + end-of-stream "^1.1.0" + eth-query "^2.0.2" + ethereumjs-block "^1.4.1" + ethereumjs-tx "^1.1.1" + ethereumjs-util "^5.0.1" + ethereumjs-vm "^2.6.0" + through2 "^2.0.3" + ethashjs@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.7.tgz#30bfe4196726690a0c59d3b8272e70d4d0c34bae" @@ -715,6 +3071,23 @@ ethashjs@~0.0.7: ethereumjs-util "^4.0.1" miller-rabin "^4.0.0" +ethereum-bloom-filters@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz#9cdebb3ec20de96ec4a434c6bad6ea5a513037aa" + integrity sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + ethereum-types@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-2.1.6.tgz#57d9d515fad86ab987c0f6962c4203be37da8579" @@ -731,7 +3104,30 @@ ethereum-types@^3.0.0: "@types/node" "*" bignumber.js "~9.0.0" -ethereumjs-account@^3.0.0: +ethereumjs-abi@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= + dependencies: + bn.js "^4.10.0" + ethereumjs-util "^4.3.0" + +ethereumjs-abi@0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.7.tgz#d1d1c5cdb8d910a7d97645ba9e93be5d153bba2e" + integrity sha512-EMLOA8ICO5yAaXDhjVEfYjsJIXYutY8ufTE93eEKwsVtp2usQreKwsDTJ9zvam3omYqNuffr8IONIqb2uUslGQ== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== @@ -740,7 +3136,16 @@ ethereumjs-account@^3.0.0: rlp "^2.2.1" safe-buffer "^5.1.1" -ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2: +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@2.2.2, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== @@ -751,6 +3156,17 @@ ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2: ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" +ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + ethereumjs-blockchain@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.3.tgz#e013034633a30ad2006728e8e2b21956b267b773" @@ -776,12 +3192,12 @@ ethereumjs-blockstream@^7.0.0: source-map-support "0.5.6" uuid "3.2.1" -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" integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== -ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: +ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== @@ -789,7 +3205,28 @@ ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" -ethereumjs-util@^4.0.1: +ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + +ethereumjs-util@6.1.0, ethereumjs-util@~6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" + integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "0.1.6" + keccak "^1.0.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + +ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" integrity sha1-PpQosxfuvaPXJg2FT93alUsfG8Y= @@ -800,7 +3237,7 @@ ethereumjs-util@^4.0.1: rlp "^2.0.0" secp256k1 "^3.0.1" -ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1: +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: version "5.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== @@ -826,18 +3263,43 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.0: rlp "^2.2.3" secp256k1 "^3.0.1" -ethereumjs-util@~6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" - integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== +ethereumjs-vm@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.1.3.tgz#dc8eb45f47d775da9f0b2437d5e20896fdf66f37" + integrity sha512-RTrD0y7My4O6Qr1P2ZIsMfD6RzL6kU/RhBZ0a5XrPzAeR61crBS7or66ohDrvxDI/rDBxMi+6SnsELih6fzalw== dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "0.1.6" - keccak "^1.0.2" - rlp "^2.0.0" + async "^2.1.2" + async-eventemitter "^0.2.2" + core-js-pure "^3.0.1" + ethereumjs-account "^3.0.0" + ethereumjs-block "^2.2.2" + ethereumjs-blockchain "^4.0.3" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.2.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + util.promisify "^1.0.0" + +ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" safe-buffer "^5.1.1" - secp256k1 "^3.0.1" ethereumjs-vm@^4.0.0: version "4.1.2" @@ -860,6 +3322,37 @@ ethereumjs-vm@^4.0.0: safe-buffer "^5.1.1" util.promisify "^1.0.0" +ethereumjs-wallet@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz#b0eae6f327637c2aeb9ccb9047b982ac542e6ab1" + integrity sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w== + dependencies: + aes-js "^3.1.1" + bs58check "^2.1.2" + ethereumjs-util "^6.0.0" + hdkey "^1.1.0" + randombytes "^2.0.6" + safe-buffer "^5.1.2" + scrypt.js "^0.3.0" + utf8 "^3.0.0" + uuid "^3.3.2" + +ethers@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066" + integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog== + dependencies: + "@types/node" "^10.3.2" + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.3.3" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.3" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + ethers@~4.0.4: version "4.0.40" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.40.tgz#6e1963d10b5d336a13cd81b519c230cc17624653" @@ -875,6 +3368,14 @@ ethers@~4.0.4: uuid "2.0.1" xmlhttprequest "1.8.0" +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" @@ -883,7 +3384,17 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -evp_bytestokey@^1.0.3: +eventemitter3@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -904,6 +3415,131 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.14.0: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity 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" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + 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" @@ -911,11 +3547,117 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +fetch-ponyfill@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= + dependencies: + node-fetch "~1.7.1" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + 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== +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.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= + 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" @@ -923,26 +3665,182 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0, findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + flow-stoplight@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - graceful-fs "^4.2.0" + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +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= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + 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= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + 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= -function-bind@^1.1.1: +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -952,17 +3850,145 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +ganache-core@^2.9.0-istanbul.0: + version "2.10.1" + resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.10.1.tgz#89af8251b3a89593bfca46dfb837c230ca05e98f" + integrity sha512-C53TKRBWfMEeGAkH5idoCbBcNgKPJ+v1dFDVPKeg1D4ZA6N/PAo5HDVLS4UuZOthPqz9s+uEX6GdluOcXVvm4w== + dependencies: + abstract-leveldown "3.0.0" + async "2.6.2" + bip39 "2.5.0" + cachedown "1.0.0" + clone "2.1.2" + debug "3.2.6" + encoding-down "5.0.4" + eth-sig-util "2.3.0" + ethereumjs-abi "0.6.7" + ethereumjs-account "3.0.0" + ethereumjs-block "2.2.2" + ethereumjs-common "1.5.0" + ethereumjs-tx "2.1.2" + ethereumjs-util "6.1.0" + ethereumjs-vm "4.1.3" + heap "0.2.6" + level-sublevel "6.6.4" + levelup "3.1.1" + lodash "4.17.14" + merkle-patricia-tree "2.3.2" + seedrandom "3.0.1" + source-map-support "0.5.12" + tmp "0.1.0" + web3-provider-engine "14.2.1" + websocket "1.0.29" + optionalDependencies: + ethereumjs-wallet "0.6.3" + web3 "1.2.4" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + 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= -glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.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" + 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= + dependencies: + assert-plus "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-watcher@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" + +glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -974,11 +4000,150 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +got@9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +gulp-cli@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc" + integrity sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" + +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== + dependencies: + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + handlebars@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" @@ -990,6 +4155,19 @@ handlebars@^4.5.3: optionalDependencies: uglify-js "^3.1.4" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -1002,12 +4180,60 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has@^1.0.3: +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity 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" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -1038,6 +4264,28 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hdkey@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-0.7.1.tgz#caee4be81aa77921e909b8d228dd0f29acaee632" + integrity sha1-yu5L6BqneSHpCbjSKN0PKayu5jI= + dependencies: + coinstring "^2.0.0" + secp256k1 "^3.0.1" + +hdkey@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.1.tgz#c2b3bfd5883ff9529b72f2f08b28be0972a9f64a" + integrity sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA== + dependencies: + coinstring "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + +heap@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" + integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= + highlight.js@^9.17.1: version "9.17.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.17.1.tgz#14a4eded23fd314b05886758bb906e39dd627f9a" @@ -1054,13 +4302,101 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -iconv-lite@~0.4.13: +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.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= + +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= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-loader@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" + integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= + immediate@^3.2.3, immediate@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" @@ -1071,6 +4407,24 @@ immutable@3.8.2: resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1079,31 +4433,168 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interpret@^1.0.0: +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -is-callable@^1.1.4: +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity 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" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +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= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity 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" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity 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" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, 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= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + 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" @@ -1116,19 +4607,94 @@ is-fullwidth-code-point@^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= +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + 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= -is-regex@^1.0.4: +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: has "^1.0.3" -is-stream@^1.0.1, is-stream@^1.1.0: +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -1140,12 +4706,44 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@~1.0.0: +isarray@1.0.0, 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= @@ -1155,20 +4753,45 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isomorphic-fetch@2.2.1: - version "2.2.1" +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + 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" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@2.2.1: + version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +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= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -js-sha3@0.5.7: +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= @@ -1183,6 +4806,16 @@ js-sha3@^0.7.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a" integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA== +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -1196,6 +4829,94 @@ js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + 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= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== + dependencies: + async "^2.0.1" + babel-preset-env "^1.7.0" + babelify "^7.3.0" + json-rpc-error "^2.0.0" + promise-to-callback "^1.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-error@2.0.0, json-rpc-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + integrity 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" + 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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity 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= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -1203,11 +4924,31 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonschema@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.5.tgz#bab69d97fa28946aec0a56a9cc266d23fe80ae61" integrity sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw== +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + keccak@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" @@ -1236,6 +4977,52 @@ keccakjs@^0.2.0: browserify-sha3 "^0.0.4" sha3 "^1.2.2" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity 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" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -1243,6 +5030,20 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + level-codec@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247" @@ -1274,6 +5075,15 @@ level-errors@~1.0.3: dependencies: errno "~0.1.1" +level-iterator-stream@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" + integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.5" + xtend "^4.0.0" + level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" @@ -1309,6 +5119,29 @@ level-packager@~4.0.0: encoding-down "~5.0.0" levelup "^3.0.0" +level-post@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" + integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== + dependencies: + ltgt "^2.1.2" + +level-sublevel@6.6.4: + version "6.6.4" + resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" + integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== + dependencies: + bytewise "~1.1.0" + level-codec "^9.0.0" + level-errors "^2.0.0" + level-iterator-stream "^2.0.3" + ltgt "~2.1.1" + pull-defer "^0.2.2" + pull-level "^2.0.3" + pull-stream "^3.6.8" + typewiselite "~1.0.0" + xtend "~4.0.0" + level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" @@ -1317,6 +5150,16 @@ level-ws@0.0.0: readable-stream "~1.0.15" xtend "~2.1.1" +levelup@3.1.1, levelup@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" + integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== + dependencies: + deferred-leveldown "~4.0.0" + level-errors "~2.0.0" + level-iterator-stream "~3.0.0" + xtend "~4.0.0" + levelup@^1.2.1: version "1.3.9" resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" @@ -1330,15 +5173,44 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +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= dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" locate-path@^2.0.0: version "2.0.0" @@ -1348,16 +5220,63 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: +lodash@4.17.14: + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +looper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" + integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= + +looper@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" + 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" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" + integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= + dependencies: + pseudomap "^1.0.1" + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -1373,21 +5292,82 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -ltgt@~2.2.0: +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= +ltgt@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" + integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= + lunr@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + 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" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + marked@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -1397,6 +5377,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" @@ -1404,6 +5389,15 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" @@ -1428,7 +5422,28 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +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= + +merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== @@ -1442,6 +5457,38 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -1450,11 +5497,50 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46" + integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ== + +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= + 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" @@ -1472,27 +5558,186 @@ minimatch@^3.0.0, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + dependencies: + mkdirp "*" + +mkdirp@*: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" + integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g== + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mock-fs@^4.1.0: + version "4.10.4" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.10.4.tgz#4eaa3d6f7da2f44e1f3dd6b462cbbcb7b082e3d4" + integrity sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + nan@2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== -nan@^2.14.0, nan@^2.2.1: +nan@^2.0.8, nan@^2.11.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== -neo-async@^2.6.0: +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= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -node-fetch@^1.0.1: +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-abi@^2.7.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.14.0.tgz#24650e24e8ffad2b61352519263f0cf4e2ddbfe9" + integrity sha512-y54KGgEOHnRHlGQi7E5UiryRkH8bmksmQLj/9iLAjoje743YS+KaKB/sDYXgqtT0J16JT3c3AYJZNI98aU/kYg== + dependencies: + semver "^5.4.1" + +node-fetch@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" + integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= + +node-fetch@^1.0.1, node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== @@ -1500,6 +5745,83 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-hid@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-0.7.9.tgz#cc0cdf1418a286a7667f0b63642b5eeb544ccd05" + integrity sha512-vJnonTqmq3frCyTumJqG4g2IZcny3ynkfmbfDfQ90P3ZhRzcWYS/Um1ux6HFmAxmkaQnrZqIYHcGpL7kdqY8jA== + dependencies: + bindings "^1.5.0" + nan "^2.13.2" + prebuild-install "^5.3.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -1507,16 +5829,58 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -object-inspect@^1.7.0: +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= + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, 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= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0, object-inspect@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -1527,7 +5891,14 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= -object.assign@^4.1.0: +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.4, object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -1537,6 +5908,16 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.defaults@^1.0.0, object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + object.getownpropertydescriptors@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" @@ -1545,7 +5926,44 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -once@^1.3.0: +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +oboe@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= + 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= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1560,6 +5978,30 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + 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= + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -1569,11 +6011,45 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -1581,6 +6057,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -1588,67 +6071,547 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-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= + 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= -pako@^1.0.4: +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^1.0.4, pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-headers@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== + +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= + dependencies: + error-ex "^1.2.0" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +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= + 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= -path-is-absolute@^1.0.0: +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= -path-key@^2.0.0: +path-key@^2.0.0, 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= -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +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= + +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= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3, pbkdf2@^3.0.9: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +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= + +picomatch@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + 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= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +popper.js@1.14.3: + version "1.14.3" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" + integrity sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU= + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prebuild-install@^5.3.0, prebuild-install@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" + integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + +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= + +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= + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + +promisify-child-process@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/promisify-child-process/-/promisify-child-process-3.1.3.tgz#52a3b66638ae101fa2e68f9a2cbd101846042e33" + integrity sha512-qVox3vW2hqbktVw+IN7YZ/kgGA+u426ekmiZxiofNe9O4GSewjROwRQ4MQ6IbvhpeYSLqiLS0kMn+FWCz6ENlg== + dependencies: + "@babel/runtime" "^7.1.5" + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +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= + +pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pull-cat@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" + integrity 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" + integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== + +pull-level@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" + integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== + dependencies: + level-post "^1.0.7" + pull-cat "^1.1.9" + pull-live "^1.0.1" + pull-pushable "^2.0.0" + pull-stream "^3.4.0" + pull-window "^2.1.4" + stream-to-pull-stream "^1.7.1" + +pull-live@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" + integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= + dependencies: + pull-cat "^1.1.9" + pull-stream "^3.4.0" + +pull-pushable@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" + integrity 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" + integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== + +pull-window@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" + integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= + dependencies: + looper "^2.0.0" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.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= + +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + 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" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" -popper.js@1.14.3: - version "1.14.3" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095" - integrity sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU= +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" -promisify-child-process@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/promisify-child-process/-/promisify-child-process-3.1.3.tgz#52a3b66638ae101fa2e68f9a2cbd101846042e33" - integrity sha512-qVox3vW2hqbktVw+IN7YZ/kgGA+u426ekmiZxiofNe9O4GSewjROwRQ4MQ6IbvhpeYSLqiLS0kMn+FWCz6ENlg== +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: - "@babel/runtime" "^7.1.5" + randombytes "^2.0.5" + safe-buffer "^5.1.0" -prr@~1.0.1: +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^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.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +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= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" readable-stream@^1.0.33: version "1.1.14" @@ -1673,6 +6636,15 @@ readable-stream@^2.0.0, readable-stream@^2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.1, readable-stream@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" + integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.15: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -1683,6 +6655,15 @@ readable-stream@~1.0.15: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -1690,11 +6671,146 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + regenerator-runtime@^0.13.2: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + +request@^2.67.0, request@^2.79.0, request@^2.85.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -1705,6 +6821,43 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +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= + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + resolve@^1.1.6, resolve@^1.3.2: version "1.14.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" @@ -1712,7 +6865,40 @@ resolve@^1.1.6, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -rimraf@^2.6.3: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.4.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +resolve@~1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" + integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== + dependencies: + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + 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" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -1734,31 +6920,101 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3: dependencies: bn.js "^4.11.1" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -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: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +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.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +scrypt-js@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" + integrity sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q= + scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== +scrypt.js@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0" + integrity sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A== + dependencies: + scryptsy "^1.2.1" + optionalDependencies: + scrypt "^6.0.2" + +scrypt@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/scrypt/-/scrypt-6.0.3.tgz#04e014a5682b53fa50c2d5cce167d719c06d870d" + integrity sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0= + dependencies: + nan "^2.0.8" + +scryptsy@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" + integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= + dependencies: + pbkdf2 "^3.0.3" + +scryptsy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" + integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== + secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" @@ -1773,31 +7029,130 @@ secp256k1@^3.0.1: nan "^2.14.0" safe-buffer "^5.1.2" -semaphore@>=1.0.1, semaphore@^1.1.0: +seedrandom@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" + integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== + +seek-bzip@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= + dependencies: + commander "~2.8.1" + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + +semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -semver@^5.3.0: +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -set-blocking@^2.0.0: +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + +set-blocking@^2.0.0, 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= +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity 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" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + 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" @@ -1839,6 +7194,88 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-get@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" @@ -1847,17 +7284,170 @@ source-map-support@0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^1.0.1: +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"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= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +stream-to-pull-stream@^1.7.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" + integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== + dependencies: + looper "^3.0.0" + pull-stream "^3.2.3" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -1866,7 +7456,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -1874,6 +7464,24 @@ string-width@^2.0.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trim@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + string.prototype.trimleft@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" @@ -1890,6 +7498,13 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -1916,6 +7531,27 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-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= + dependencies: + is-utf8 "^0.2.0" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -1928,6 +7564,18 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +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= + +supports-color@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.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" @@ -1940,12 +7588,276 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +swarm-js@0.1.39: + version "0.1.39" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" + integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + decompress "^4.0.0" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^7.1.0" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request-promise "^0.1.2" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tape@^4.4.0, tape@^4.6.3: + version "4.13.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.0.tgz#e2f581ff5f12a7cbd787e9f83c76c2851782fce2" + integrity sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw== + dependencies: + deep-equal "~1.1.1" + defined "~1.0.0" + dotignore "~0.1.2" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.6" + has "~1.0.3" + inherits "~2.0.4" + is-regex "~1.0.5" + minimist "~1.2.0" + object-inspect "~1.7.0" + resolve "~1.14.2" + resumer "~0.0.0" + string.prototype.trim "~1.2.1" + through "~2.3.8" + +tar-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" + integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== + dependencies: + chownr "^1.1.1" + mkdirp "^0.5.1" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" + integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== + dependencies: + bl "^3.0.0" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^4.0.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.8, 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= + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +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= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity 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" + 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" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + tslib@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== -tslib@^1.8.0, tslib@^1.8.1: +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -2005,6 +7917,63 @@ tsutils@^3.0.0: dependencies: tslib "^1.8.1" +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +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= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +tweetnacl@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.2.tgz#39fba8d1f7a34706a3fc1fd8c04afcad7bb9e689" + integrity sha512-+8aPRjmXgf1VqvyxSlBUzKzeYqVS9Ai8vZ28g+mL7dNQl1jlUTCMDZnvNQdAS1xTywMkIXwJsfipsR/6s2+syw== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + typedoc-default-themes@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.6.2.tgz#b36d8910987a40e5a80353b88e178c6ffa78f24b" @@ -2045,6 +8014,28 @@ typescript@3.7.x, typescript@^3.5.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + 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" + integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= + +u2f-api@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" + integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== + uglify-js@^3.1.4: version "3.7.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.2.tgz#cb1a601e67536e9ed094a92dd1e333459643d3f9" @@ -2053,17 +8044,173 @@ uglify-js@^3.1.4: commander "~2.20.3" source-map "~0.6.1" -underscore@>=1.8.3, underscore@^1.9.1: +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unbzip2-stream@^1.0.9: + version "1.3.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" + integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +underscore@1.9.1, underscore@>=1.8.3, underscore@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" + integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -util-deprecate@~1.0.1: +unorm@^1.3.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity 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= + 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= + 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= + +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= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +usb@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.2.tgz#4ed7f0d8631c70192b33635f6a4e700d9e6bfe62" + integrity sha512-KcovLXRQuH63iEtnqXyDQGOi5dXHpLM5lZBIUsqSJQToua8nL2sVCieQTkzQBfLe5mCuvk40MgKciI61lgevWw== + dependencies: + bindings "^1.4.0" + nan "2.13.2" + prebuild-install "^5.3.3" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utf8@3.0.0, utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -2076,6 +8223,25 @@ util.promisify@^1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +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= + uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" @@ -2086,38 +8252,530 @@ uuid@3.2.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +v8flags@^3.0.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + valid-url@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + +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= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +web3-bzz@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821" + integrity sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A== + dependencies: + "@types/node" "^10.12.18" + got "9.6.0" + swarm-js "0.1.39" + underscore "1.9.1" + +web3-core-helpers@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f" + integrity sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.2.4" + web3-utils "1.2.4" + +web3-core-method@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed" + integrity sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.4" + web3-core-promievent "1.2.4" + web3-core-subscriptions "1.2.4" + web3-utils "1.2.4" + +web3-core-promievent@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb" + integrity sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw== + dependencies: + any-promise "1.3.0" + eventemitter3 "3.1.2" + +web3-core-requestmanager@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8" + integrity sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.4" + web3-providers-http "1.2.4" + web3-providers-ipc "1.2.4" + web3-providers-ws "1.2.4" + +web3-core-subscriptions@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99" + integrity sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw== + dependencies: + eventemitter3 "3.1.2" + underscore "1.9.1" + web3-core-helpers "1.2.4" + +web3-core@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6" + integrity sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A== + dependencies: + "@types/bignumber.js" "^5.0.0" + "@types/bn.js" "^4.11.4" + "@types/node" "^12.6.1" + web3-core-helpers "1.2.4" + web3-core-method "1.2.4" + web3-core-requestmanager "1.2.4" + web3-utils "1.2.4" + +web3-eth-abi@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8" + integrity sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg== + dependencies: + ethers "4.0.0-beta.3" + underscore "1.9.1" + web3-utils "1.2.4" + +web3-eth-accounts@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288" + integrity sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw== + dependencies: + "@web3-js/scrypt-shim" "^0.1.0" + any-promise "1.3.0" + crypto-browserify "3.12.0" + eth-lib "0.2.7" + ethereumjs-common "^1.3.2" + ethereumjs-tx "^2.1.1" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.2.4" + web3-core-helpers "1.2.4" + web3-core-method "1.2.4" + web3-utils "1.2.4" + +web3-eth-contract@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886" + integrity sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ== + dependencies: + "@types/bn.js" "^4.11.4" + underscore "1.9.1" + web3-core "1.2.4" + web3-core-helpers "1.2.4" + web3-core-method "1.2.4" + web3-core-promievent "1.2.4" + web3-core-subscriptions "1.2.4" + web3-eth-abi "1.2.4" + web3-utils "1.2.4" + +web3-eth-ens@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e" + integrity sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw== + dependencies: + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.2.4" + web3-core-helpers "1.2.4" + web3-core-promievent "1.2.4" + web3-eth-abi "1.2.4" + web3-eth-contract "1.2.4" + web3-utils "1.2.4" + +web3-eth-iban@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476" + integrity sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ== + dependencies: + bn.js "4.11.8" + web3-utils "1.2.4" + +web3-eth-personal@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b" + integrity sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw== + dependencies: + "@types/node" "^12.6.1" + web3-core "1.2.4" + web3-core-helpers "1.2.4" + web3-core-method "1.2.4" + web3-net "1.2.4" + web3-utils "1.2.4" + +web3-eth@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00" + integrity sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA== + dependencies: + underscore "1.9.1" + web3-core "1.2.4" + web3-core-helpers "1.2.4" + web3-core-method "1.2.4" + web3-core-subscriptions "1.2.4" + web3-eth-abi "1.2.4" + web3-eth-accounts "1.2.4" + web3-eth-contract "1.2.4" + web3-eth-ens "1.2.4" + web3-eth-iban "1.2.4" + web3-eth-personal "1.2.4" + web3-net "1.2.4" + web3-utils "1.2.4" + +web3-net@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458" + integrity sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A== + dependencies: + web3-core "1.2.4" + web3-core-method "1.2.4" + web3-utils "1.2.4" + +web3-provider-engine@14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0" + integrity sha512-tr5cGSyxfSC/JqiUpBlJtfZpwQf1yAA8L/zy1C6fDFm0ntR974pobJ4v4676atpZne4Ze5VFy3kPPahHe9gQiQ== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^3.0.0" + eth-json-rpc-infura "^3.1.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.67.0" + semaphore "^1.0.3" + tape "^4.4.0" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +web3-provider-engine@14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" + integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^3.0.0" + eth-json-rpc-infura "^3.1.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +web3-providers-http@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67" + integrity sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw== + dependencies: + web3-core-helpers "1.2.4" + xhr2-cookies "1.1.0" + +web3-providers-ipc@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd" + integrity sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og== + dependencies: + oboe "2.1.4" + underscore "1.9.1" + web3-core-helpers "1.2.4" + +web3-providers-ws@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f" + integrity sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ== + dependencies: + "@web3-js/websocket" "^1.0.29" + underscore "1.9.1" + web3-core-helpers "1.2.4" + +web3-shh@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd" + integrity sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ== + dependencies: + web3-core "1.2.4" + web3-core-method "1.2.4" + web3-core-subscriptions "1.2.4" + web3-net "1.2.4" + +web3-utils@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951" + integrity sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + underscore "1.9.1" + utf8 "3.0.0" + +web3@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9" + integrity sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A== + dependencies: + "@types/node" "^12.6.1" + web3-bzz "1.2.4" + web3-core "1.2.4" + web3-eth "1.2.4" + web3-eth-personal "1.2.4" + web3-net "1.2.4" + web3-shh "1.2.4" + web3-utils "1.2.4" + +webpack-cli@^3.3.10: + version "3.3.10" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13" + integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.5: + version "4.41.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" + integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket@1.0.29: + version "1.0.29" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" + integrity sha512-WhU8jKXC8sTh6ocLSqpZRlOKMNYGwUvjA5+XcIgIk/G3JCaDfkZUr0zA19sVSxJ0TEvm0i5IBzr54RZC4vzW7g== + dependencies: + debug "^2.2.0" + gulp "^4.0.2" + nan "^2.11.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +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= + 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= -which@^1.2.9: +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -2126,17 +8784,79 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@^5.1.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +xhr-request-promise@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d" + integrity sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0= + dependencies: + xhr-request "^1.0.1" + +xhr-request@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr2-cookies@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + dependencies: + cookiejar "^2.1.1" + +xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -2153,16 +8873,41 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + yargs-parser@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" @@ -2170,6 +8915,23 @@ yargs-parser@^8.1.0: dependencies: camelcase "^4.1.0" +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^10.0.3: version "10.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" @@ -2187,3 +8949,30 @@ yargs@^10.0.3: which-module "^2.0.0" y18n "^3.2.1" yargs-parser "^8.1.0" + +yargs@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" diff --git a/cmd/cut-release/main.go b/cmd/cut-release/main.go index f29e126a3..781aea854 100644 --- a/cmd/cut-release/main.go +++ b/cmd/cut-release/main.go @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "io/ioutil" "log" @@ -26,6 +27,29 @@ func main() { generateTypescriptClientDocs() generateTypescriptBrowserDocs() + + createReleaseChangelog(env.Version) +} + +func createReleaseChangelog(version string) { + regex := fmt.Sprintf(`(?ms)(## v%s\n)(.*?)(## v)`, version) + changelog, err := getFileContentsWithRegex("CHANGELOG.md", regex) + if err != nil { + log.Println("No CHANGELOG entries found for version", version) + return // Noop + } + + releaseChangelog := fmt.Sprintf(`- [Docker image](https://hub.docker.com/r/0xorg/mesh/tags) +- [README](https://github.com/0xProject/0x-mesh/blob/v%s/README.md) + +## Summary +%s +`, version, changelog) + + err = ioutil.WriteFile("RELEASE_CHANGELOG.md", []byte(releaseChangelog), 0644) + if err != nil { + log.Fatal(err) + } } func generateTypescriptClientDocs() { @@ -123,3 +147,19 @@ func updateFileWithRegex(filePath string, regex string, replacement string) { log.Fatal(err) } } + +func getFileContentsWithRegex(filePath string, regex string) (string, error) { + dat, err := ioutil.ReadFile(filePath) + if err != nil { + log.Fatal(err) + } + + var re = regexp.MustCompile(regex) + matches := re.FindAllStringSubmatch(string(dat), -1) + + if len(matches) < 1 || len(matches[0]) < 3 { + return "", errors.New("No contents found") + } + + return matches[0][2], nil +} diff --git a/cmd/mesh-bootstrap/main.go b/cmd/mesh-bootstrap/main.go index 9edd1fc5d..bb40af75f 100644 --- a/cmd/mesh-bootstrap/main.go +++ b/cmd/mesh-bootstrap/main.go @@ -15,6 +15,7 @@ import ( "github.com/0xProject/0x-mesh/loghooks" "github.com/0xProject/0x-mesh/p2p" "github.com/0xProject/0x-mesh/p2p/banner" + sqlds "github.com/0xProject/sql-datastore" "github.com/ipfs/go-datastore" leveldbStore "github.com/ipfs/go-ds-leveldb" libp2p "github.com/libp2p/go-libp2p" @@ -33,7 +34,6 @@ import ( "github.com/libp2p/go-libp2p/p2p/host/relay" filter "github.com/libp2p/go-maddr-filter" ma "github.com/multiformats/go-multiaddr" - sqlds "github.com/opaolini/go-ds-sql" "github.com/plaid/go-envvar/envvar" log "github.com/sirupsen/logrus" ) @@ -100,6 +100,9 @@ type Config struct { // database driver. // NOTE: Currently only `postgres` driver is supported. SQLDBEngine string `envvar:"SQL_DB_ENGINE" default:"postgres"` + // UseBootstrapList determines whether or not to use the list of hard-coded + // peers to bootstrap the DHT for peer discovery. + UseBootstrapList bool `envvar:"USE_BOOTSTRAP_LIST" default:"true"` // BootstrapList is a comma-separated list of multiaddresses to use for // bootstrapping the DHT (e.g., // "/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF"). @@ -273,13 +276,6 @@ func main() { if err := kadDHT.Bootstrap(ctx); err != nil { log.WithField("error", err).Fatal("could not bootstrap DHT") } - bootstrapList := p2p.DefaultBootstrapList - if config.BootstrapList != "" { - bootstrapList = strings.Split(config.BootstrapList, ",") - } - if err := p2p.ConnectToBootstrapList(ctx, basicHost, bootstrapList); err != nil { - log.WithField("error", err).Fatal("could not connect to bootstrap peers") - } // Configure banner. banner := banner.New(ctx, banner.Config{ @@ -290,18 +286,30 @@ func main() { LogBandwidthUsageStats: true, }) - // Protect each other bootstrap peer via the connection manager so that we - // maintain an active connection to them. Also prevent other bootstrap nodes - // from being banned. - bootstrapAddrInfos, err := p2p.BootstrapListToAddrInfos(bootstrapList) - if err != nil { - log.WithField("error", err).Fatal("could not parse bootstrap list") - } - for _, addrInfo := range bootstrapAddrInfos { - connManager.Protect(addrInfo.ID, "bootstrap-peer") - for _, addr := range addrInfo.Addrs { - _ = banner.ProtectIP(addr) + if config.UseBootstrapList { + bootstrapList := p2p.DefaultBootstrapList + if config.BootstrapList != "" { + bootstrapList = strings.Split(config.BootstrapList, ",") + } + if err := p2p.ConnectToBootstrapList(ctx, basicHost, bootstrapList); err != nil { + log.WithField("error", err).Fatal("could not connect to bootstrap peers") + } + + // Protect each other bootstrap peer via the connection manager so that we + // maintain an active connection to them. Also prevent other bootstrap nodes + // from being banned. + bootstrapAddrInfos, err := p2p.BootstrapListToAddrInfos(bootstrapList) + if err != nil { + log.WithField("error", err).Fatal("could not parse bootstrap list") + } + + for _, addrInfo := range bootstrapAddrInfos { + connManager.Protect(addrInfo.ID, "bootstrap-peer") + for _, addr := range addrInfo.Addrs { + _ = banner.ProtectIP(addr) + } } + } log.WithFields(map[string]interface{}{ diff --git a/cmd/mesh/main.go b/cmd/mesh/main.go index 284ac760d..8da827809 100644 --- a/cmd/mesh/main.go +++ b/cmd/mesh/main.go @@ -11,6 +11,7 @@ import ( "sync" "github.com/0xProject/0x-mesh/core" + "github.com/0xProject/0x-mesh/rpc" "github.com/plaid/go-envvar/envvar" log "github.com/sirupsen/logrus" ) @@ -18,9 +19,12 @@ import ( // standaloneConfig contains configuration options specific to running 0x Mesh // in standalone mode (i.e. not in a browser). type standaloneConfig struct { - // RPCAddr is the interface and port to use for the JSON-RPC API over + // WSRPCAddr is the interface and port to use for the JSON-RPC API over // WebSockets. By default, 0x Mesh will listen on localhost and port 60557. - RPCAddr string `envvar:"RPC_ADDR" default:"localhost:60557"` + WSRPCAddr string `envvar:"WS_RPC_ADDR" default:"localhost:60557"` + // HTTPRPCAddr is the interface and port to use for the JSON-RPC API over + // HTTP. By default, 0x Mesh will listen on localhost and port 60556. + HTTPRPCAddr string `envvar:"HTTP_RPC_ADDR" default:"localhost:60556"` } func main() { @@ -56,14 +60,27 @@ func main() { } }() - // Start RPC server. - rpcErrChan := make(chan error, 1) + // Start WS RPC server. + wsRPCErrChan := make(chan error, 1) wg.Add(1) go func() { defer wg.Done() - log.WithField("rpc_addr", config.RPCAddr).Info("starting RPC server") - if err := listenRPC(ctx, app, config); err != nil { - rpcErrChan <- err + log.WithField("ws_rpc_addr", config.WSRPCAddr).Info("starting WS RPC server") + rpcServer := instantiateServer(ctx, app, config.WSRPCAddr) + if err := rpcServer.Listen(ctx, rpc.WSHandler); err != nil { + wsRPCErrChan <- err + } + }() + + // Start HTTP RPC server. + httpRPCErrChan := make(chan error, 1) + wg.Add(1) + go func() { + defer wg.Done() + log.WithField("http_rpc_addr", config.HTTPRPCAddr).Info("starting HTTP RPC server") + rpcServer := instantiateServer(ctx, app, config.HTTPRPCAddr) + if err := rpcServer.Listen(ctx, rpc.HTTPHandler); err != nil { + httpRPCErrChan <- err } }() @@ -77,9 +94,12 @@ func main() { case err := <-coreErrChan: cancel() log.WithField("error", err.Error()).Error("core app exited with error") - case err := <-rpcErrChan: + case err := <-wsRPCErrChan: + cancel() + log.WithField("error", err.Error()).Error("WS RPC server returned error") + case err := <-httpRPCErrChan: cancel() - log.WithField("error", err.Error()).Error("RPC server returned error") + log.WithField("error", err.Error()).Error("HTTP RPC server returned error") } // If we reached here it means there was an error. Wait for all goroutines diff --git a/cmd/mesh/rpc_handler.go b/cmd/mesh/rpc_handler.go index d49e51eb1..f235b71a1 100644 --- a/cmd/mesh/rpc_handler.go +++ b/cmd/mesh/rpc_handler.go @@ -32,11 +32,9 @@ type rpcHandler struct { ctx context.Context } -// listenRPC starts the RPC server and listens on config.RPCAddr. It blocks -// until there is an error or the RPC server is closed. -func listenRPC(ctx context.Context, app *core.App, config standaloneConfig) error { +// instantiateServer instantiates a new RPC server with the rpcHandler. +func instantiateServer(ctx context.Context, app *core.App, rpcAddr string) *rpc.Server { // Initialize the JSON RPC WebSocket server (but don't start it yet). - rpcAddr := fmt.Sprintf("%s", config.RPCAddr) rpcHandler := &rpcHandler{ app: app, ctx: ctx, @@ -57,7 +55,7 @@ func listenRPC(ctx context.Context, app *core.App, config standaloneConfig) erro } log.WithField("address", rpcServer.Addr().String()).Info("started RPC server") }() - return rpcServer.Listen(ctx) + return rpcServer } // GetOrders is called when an RPC client calls GetOrders. diff --git a/cmd/peer-id-to-pub-key/REAMDE.md b/cmd/peer-id-to-pub-key/REAMDE.md new file mode 100644 index 000000000..02e78137c --- /dev/null +++ b/cmd/peer-id-to-pub-key/REAMDE.md @@ -0,0 +1,9 @@ +`peer-id-to-pub-key` is a command line tool that extracts a public key from a +peer ID. It expects exactly one argument, the peer ID. + +Example usage: + +``` +> peer-id-to-pub-key 16Uiu2HAmB6yLoF4hjCdUKHqJa5XqBg3K8q7AxtBhboAomRG8df9x +02e8f0963e96c881b4c90b91f03910896e7ef0dc4392e21d13ba87c8335912e6cf +``` diff --git a/cmd/peer-id-to-pub-key/main.go b/cmd/peer-id-to-pub-key/main.go new file mode 100644 index 000000000..996b09ee7 --- /dev/null +++ b/cmd/peer-id-to-pub-key/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "encoding/hex" + "fmt" + "log" + "os" + + peer "github.com/libp2p/go-libp2p-core/peer" +) + +func main() { + if len(os.Args) != 2 { + log.Fatal("expects exactly one argument") + } + peerIDString := os.Args[1] + peerID, err := peer.IDB58Decode(peerIDString) + if err != nil { + log.Fatal(err) + } + pubKey, err := peerID.ExtractPublicKey() + if err != nil { + log.Fatal(err) + } + rawPubKey, err := pubKey.Raw() + if err != nil { + log.Fatal(err) + } + fmt.Println(hex.EncodeToString(rawPubKey)) +} diff --git a/common/types/types_js.go b/common/types/types_js.go index d9918bac1..646c39d99 100644 --- a/common/types/types_js.go +++ b/common/types/types_js.go @@ -7,18 +7,7 @@ import ( "syscall/js" ) -func (s *Stats) JSValue() js.Value { - // TODO(albrow): Optimize this. Remove other uses of the JSON - // encoding/decoding hack. - encodedStats, err := json.Marshal(s) - if err != nil { - panic(err) - } - statsJS := js.Global().Get("JSON").Call("parse", string(encodedStats)) - return statsJS -} - -func (r *GetOrdersResponse) JSValue() js.Value { +func (r GetOrdersResponse) JSValue() js.Value { // TODO(albrow): Optimize this. Remove other uses of the JSON // encoding/decoding hack. encodedResponse, err := json.Marshal(r) @@ -28,3 +17,29 @@ func (r *GetOrdersResponse) JSValue() js.Value { responseJS := js.Global().Get("JSON").Call("parse", string(encodedResponse)) return responseJS } + +func (l LatestBlock) JSValue() js.Value { + return js.ValueOf(map[string]interface{}{ + "number": l.Number, + "hash": l.Hash.String(), + }) +} + +func (s Stats) JSValue() js.Value { + return js.ValueOf(map[string]interface{}{ + "version": s.Version, + "pubSubTopic": s.PubSubTopic, + "rendezvous": s.Rendezvous, + "peerID": s.PeerID, + "ethereumChainID": s.EthereumChainID, + "latestBlock": s.LatestBlock.JSValue(), + "numPeers": s.NumPeers, + "numOrders": s.NumOrders, + "numOrdersIncludingRemoved": s.NumOrdersIncludingRemoved, + "numPinnedOrders": s.NumPinnedOrders, + "maxExpirationTime": s.MaxExpirationTime, + "startOfCurrentUTCDay": s.StartOfCurrentUTCDay.String(), + "ethRPCRequestsSentInCurrentUTCDay": s.EthRPCRequestsSentInCurrentUTCDay, + "ethRPCRateLimitExpiredRequests": s.EthRPCRateLimitExpiredRequests, + }) +} diff --git a/core/core.go b/core/core.go index ef7e83662..1bee2c0c7 100644 --- a/core/core.go +++ b/core/core.go @@ -4,6 +4,7 @@ package core import ( "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -14,6 +15,7 @@ import ( "github.com/0xProject/0x-mesh/common/types" "github.com/0xProject/0x-mesh/constants" + "github.com/0xProject/0x-mesh/core/ordersync" "github.com/0xProject/0x-mesh/db" "github.com/0xProject/0x-mesh/encoding" "github.com/0xProject/0x-mesh/ethereum" @@ -25,6 +27,7 @@ import ( "github.com/0xProject/0x-mesh/keys" "github.com/0xProject/0x-mesh/loghooks" "github.com/0xProject/0x-mesh/meshdb" + "github.com/0xProject/0x-mesh/orderfilter" "github.com/0xProject/0x-mesh/p2p" "github.com/0xProject/0x-mesh/zeroex" "github.com/0xProject/0x-mesh/zeroex/ordervalidator" @@ -32,14 +35,15 @@ import ( "github.com/albrow/stringset" "github.com/benbjohnson/clock" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rpc" "github.com/google/uuid" - p2pcrypto "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + p2pcrypto "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" peerstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" log "github.com/sirupsen/logrus" - "github.com/xeipuuv/gojsonschema" ) const ( @@ -57,7 +61,11 @@ const ( estimatedNonPollingEthereumRPCRequestsPer24Hrs = 50000 // logStatsInterval is how often to log stats for this node. logStatsInterval = 5 * time.Minute - version = "8.2.0" + version = "9.0.0" + // ordersyncMinPeers is the minimum amount of peers to receive orders from + // before considering the ordersync process finished. + ordersyncMinPeers = 5 + paginationSubprotocolPerPage = 500 ) // Note(albrow): The Config type is currently copied to browser/ts/index.ts. We @@ -126,14 +134,15 @@ type Config struct { // is typically only needed for testing on custom chains/networks. The given // addresses are added to the default list of addresses for known chains/networks and // overriding any contract addresses for known chains/networks is not allowed. The - // addresses for exchange, devUtils, erc20Proxy, and erc721Proxy are required + // addresses for exchange, devUtils, erc20Proxy, erc721Proxy and erc1155Proxy are required // for each chain/network. For example: // // { // "exchange":"0x48bacb9266a570d521063ef5dd96e61686dbe788", // "devUtils": "0x38ef19fdf8e8415f18c307ed71967e19aac28ba1", // "erc20Proxy": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48", - // "erc721Proxy": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401" + // "erc721Proxy": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401", + // "erc1155Proxy": "0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f" // } // CustomContractAddresses string `envvar:"CUSTOM_CONTRACT_ADDRESSES" default:""` @@ -142,6 +151,30 @@ type Config struct { // enforcing a limit on maximum expiration time for incoming orders and remove // any orders with an expiration time too far in the future. MaxOrdersInStorage int `envvar:"MAX_ORDERS_IN_STORAGE" default:"100000"` + // CustomOrderFilter is a stringified JSON Schema which will be used for + // validating incoming orders. If provided, Mesh will only receive orders from + // other peers in the network with the same filter. + // + // Here is an example filter which will only allow orders with a specific + // makerAssetData: + // + // { + // "properties": { + // "makerAssetData": { + // "const": "0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c" + // } + // } + // } + // + // Note that you only need to include the requirements for your specific + // application in the filter. The default requirements for a valid order (e.g. + // all the required fields) are automatically included. For more information + // on JSON Schemas, see https://json-schema.org/ + CustomOrderFilter string `envvar:"CUSTOM_ORDER_FILTER" default:"{}"` + // EthereumRPCClient is the client to use for all Ethereum RPC reuqests. It is only + // settable in browsers and cannot be set via environment variable. If + // provided, EthereumRPCURL will be ignored. + EthereumRPCClient ethclient.RPCClient `envvar:"-"` } type snapshotInfo struct { @@ -159,27 +192,30 @@ type App struct { blockWatcher *blockwatch.Watcher orderWatcher *orderwatch.Watcher orderValidator *ordervalidator.OrderValidator - orderJSONSchema *gojsonschema.Schema - meshMessageJSONSchema *gojsonschema.Schema + orderFilter *orderfilter.Filter snapshotExpirationWatcher *expirationwatch.Watcher muIdToSnapshotInfo sync.Mutex idToSnapshotInfo map[string]snapshotInfo ethRPCRateLimiter ratelimit.RateLimiter ethRPCClient ethrpcclient.Client - orderSelector *orderSelector db *meshdb.MeshDB + ordersyncService *ordersync.Service // started is closed to signal that the App has been started. Some methods // will block until after the App is started. started chan struct{} } +var setupLoggerOnce = &sync.Once{} + func New(config Config) (*App, error) { // Configure logger // TODO(albrow): Don't use global variables for log settings. - log.SetFormatter(&log.JSONFormatter{}) - log.SetLevel(log.Level(config.Verbosity)) - log.AddHook(loghooks.NewKeySuffixHook()) + setupLoggerOnce.Do(func() { + log.SetFormatter(&log.JSONFormatter{}) + log.SetLevel(log.Level(config.Verbosity)) + log.AddHook(loghooks.NewKeySuffixHook()) + }) // Add custom contract addresses if needed. if config.CustomContractAddresses != "" { @@ -205,16 +241,18 @@ func New(config Config) (*App, error) { } config = unquoteConfig(config) - // Ensure ETHEREUM_RPC_MAX_REQUESTS_PER_24_HR_UTC is reasonably set given BLOCK_POLLING_INTERVAL - per24HrPollingRequests := int((24 * time.Hour) / config.BlockPollingInterval) - minNumOfEthRPCRequestsIn24HrPeriod := per24HrPollingRequests + estimatedNonPollingEthereumRPCRequestsPer24Hrs - if minNumOfEthRPCRequestsIn24HrPeriod > config.EthereumRPCMaxRequestsPer24HrUTC { - return nil, fmt.Errorf( - "Given BLOCK_POLLING_INTERVAL (%s), there are insufficient remaining ETH RPC requests in a 24hr period for Mesh to function properly. Increase ETHEREUM_RPC_MAX_REQUESTS_PER_24_HR_UTC to at least %d (currently configured to: %d)", - config.BlockPollingInterval, - minNumOfEthRPCRequestsIn24HrPeriod, - config.EthereumRPCMaxRequestsPer24HrUTC, - ) + if config.EnableEthereumRPCRateLimiting { + // Ensure ETHEREUM_RPC_MAX_REQUESTS_PER_24_HR_UTC is reasonably set given BLOCK_POLLING_INTERVAL + per24HrPollingRequests := int((24 * time.Hour) / config.BlockPollingInterval) + minNumOfEthRPCRequestsIn24HrPeriod := per24HrPollingRequests + estimatedNonPollingEthereumRPCRequestsPer24Hrs + if minNumOfEthRPCRequestsIn24HrPeriod > config.EthereumRPCMaxRequestsPer24HrUTC { + return nil, fmt.Errorf( + "Given BLOCK_POLLING_INTERVAL (%s), there are insufficient remaining ETH RPC requests in a 24hr period for Mesh to function properly. Increase ETHEREUM_RPC_MAX_REQUESTS_PER_24_HR_UTC to at least %d (currently configured to: %d)", + config.BlockPollingInterval, + minNumOfEthRPCRequestsIn24HrPeriod, + config.EthereumRPCMaxRequestsPer24HrUTC, + ) + } } // Initialize db @@ -244,7 +282,22 @@ func New(config Config) (*App, error) { } // Initialize the ETH client, which will be used by various watchers. - ethClient, err := ethrpcclient.New(config.EthereumRPCURL, ethereumRPCRequestTimeout, ethRPCRateLimiter) + var ethRPCClient ethclient.RPCClient + if config.EthereumRPCClient != nil { + if config.EthereumRPCURL != "" { + log.Warn("Ignoring EthereumRPCURL and using the provided EthereumRPCClient") + } + ethRPCClient = config.EthereumRPCClient + } else if config.EthereumRPCURL != "" { + ethRPCClient, err = rpc.Dial(config.EthereumRPCURL) + if err != nil { + log.WithError(err).Error("Could not dial EthereumRPCURL") + return nil, err + } + } else { + return nil, errors.New("cannot initialize core.App: neither EthereumRPCURL or EthereumRPCClient were provided") + } + ethClient, err := ethrpcclient.New(ethRPCClient, ethereumRPCRequestTimeout, ethRPCRateLimiter) if err != nil { return nil, err } @@ -292,21 +345,15 @@ func New(config Config) (*App, error) { return nil, err } - snapshotExpirationWatcher := expirationwatch.New() - - orderJSONSchema, err := setupOrderSchemaValidator() + // Initialize the order filter + orderFilter, err := orderfilter.New(config.EthereumChainID, config.CustomOrderFilter) if err != nil { - return nil, err - } - meshMessageJSONSchema, err := setupMeshMessageSchemaValidator() - if err != nil { - return nil, err - } - orderSelector := &orderSelector{ - nextOffset: 0, - db: meshDB, + return nil, fmt.Errorf("invalid custom order filter: %s", err.Error()) } + // Initialize remaining fields. + snapshotExpirationWatcher := expirationwatch.New() + app := &App{ started: make(chan struct{}), config: config, @@ -316,11 +363,9 @@ func New(config Config) (*App, error) { blockWatcher: blockWatcher, orderWatcher: orderWatcher, orderValidator: orderValidator, - orderJSONSchema: orderJSONSchema, - meshMessageJSONSchema: meshMessageJSONSchema, + orderFilter: orderFilter, snapshotExpirationWatcher: snapshotExpirationWatcher, idToSnapshotInfo: map[string]snapshotInfo{}, - orderSelector: orderSelector, ethRPCRateLimiter: ethRPCRateLimiter, ethRPCClient: ethClient, db: meshDB, @@ -345,8 +390,24 @@ func unquoteConfig(config Config) Config { return config } -func getPubSubTopic(chainID int) string { - return fmt.Sprintf("/0x-orders/network/%d/version/2", chainID) +func getPublishTopics(chainID int, customFilter *orderfilter.Filter) ([]string, error) { + defaultTopic, err := orderfilter.GetDefaultTopic(chainID) + if err != nil { + return nil, err + } + customTopic := customFilter.Topic() + if defaultTopic == customTopic { + // If we're just using the default order filter, we don't need to publish to + // multiple topics. + return []string{defaultTopic}, nil + } else { + // If we are using a custom order filter, publish to *both* the default + // topic and the custom topic. All orders that match the custom order filter + // must necessarily match the default filter. This also allows us to + // implement cross-topic forwarding in the future. + // See https://github.com/0xProject/0x-mesh/pull/563 + return []string{defaultTopic, customTopic}, nil + } } func getRendezvous(chainID int) string { @@ -394,6 +455,12 @@ func initMetadata(chainID int, meshDB *meshdb.MeshDB) (*meshdb.Metadata, error) } func (app *App) Start(ctx context.Context) error { + // Get the publish topics depending on our custom order filter. + publishTopics, err := getPublishTopics(app.config.EthereumChainID, app.orderFilter) + if err != nil { + return err + } + // Create a child context so that we can preemptively cancel if there is an // error. innerCtx, cancel := context.WithCancel(ctx) @@ -408,6 +475,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing app.db") + }() <-innerCtx.Done() app.db.Close() }() @@ -417,6 +487,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing eth RPC rate limiter") + }() ethRPCRateLimiterErrChan <- app.ethRPCRateLimiter.Start(innerCtx, rateLimiterCheckpointInterval) }() @@ -424,6 +497,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing snapshot expiration watcher") + }() ticker := time.NewTicker(expirationPollingInterval) for { select { @@ -445,6 +521,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing order watcher") + }() log.Info("starting order watcher") orderWatcherErrChan <- app.orderWatcher.Watch(innerCtx) }() @@ -460,6 +539,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing block watcher") + }() log.Info("starting block watcher") blockWatcherErrChan <- app.blockWatcher.Watch(innerCtx) }() @@ -494,35 +576,61 @@ func (app *App) Start(ctx context.Context) error { bootstrapList = strings.Split(app.config.BootstrapList, ",") } nodeConfig := p2p.Config{ - Topic: getPubSubTopic(app.config.EthereumChainID), - TCPPort: app.config.P2PTCPPort, - WebSocketsPort: app.config.P2PWebSocketsPort, - Insecure: false, - PrivateKey: app.privKey, - MessageHandler: app, - RendezvousString: getRendezvous(app.config.EthereumChainID), - UseBootstrapList: app.config.UseBootstrapList, - BootstrapList: bootstrapList, - DataDir: filepath.Join(app.config.DataDir, "p2p"), + SubscribeTopic: app.orderFilter.Topic(), + PublishTopics: publishTopics, + TCPPort: app.config.P2PTCPPort, + WebSocketsPort: app.config.P2PWebSocketsPort, + Insecure: false, + PrivateKey: app.privKey, + MessageHandler: app, + RendezvousString: getRendezvous(app.config.EthereumChainID), + UseBootstrapList: app.config.UseBootstrapList, + BootstrapList: bootstrapList, + DataDir: filepath.Join(app.config.DataDir, "p2p"), + CustomMessageValidator: app.orderFilter.ValidatePubSubMessage, } app.node, err = p2p.New(innerCtx, nodeConfig) if err != nil { return err } + // Register and start ordersync service. + ordersyncSubprotocols := []ordersync.Subprotocol{ + NewFilteredPaginationSubprotocol(app, paginationSubprotocolPerPage), + } + app.ordersyncService = ordersync.New(innerCtx, app.node, ordersyncSubprotocols) + orderSyncErrChan := make(chan error, 1) + wg.Add(1) + go func() { + defer wg.Done() + defer func() { + log.Debug("closing ordersync service") + }() + if err := app.ordersyncService.GetOrders(innerCtx, ordersyncMinPeers); err != nil { + orderSyncErrChan <- err + } + }() + // Start the p2p node. p2pErrChan := make(chan error, 1) wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing p2p node") + }() addrs := app.node.Multiaddrs() log.WithFields(map[string]interface{}{ "addresses": addrs, + "topic": app.orderFilter.Topic(), }).Info("starting p2p node") wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing new addrs checker") + }() app.periodicallyCheckForNewAddrs(innerCtx, addrs) }() @@ -533,6 +641,9 @@ func (app *App) Start(ctx context.Context) error { wg.Add(1) go func() { defer wg.Done() + defer func() { + log.Debug("closing periodic stats logger") + }() app.periodicallyLogStats(innerCtx) }() @@ -557,14 +668,20 @@ func (app *App) Start(ctx context.Context) error { return err } case err := <-blockWatcherErrChan: - log.WithError(err).Error("block watcher exited with error") if err != nil { + log.WithError(err).Error("block watcher exited with error") cancel() return err } case err := <-ethRPCRateLimiterErrChan: - log.WithError(err).Error("ETH JSON-RPC ratelimiter exited with error") if err != nil { + log.WithError(err).Error("ETH JSON-RPC ratelimiter exited with error") + cancel() + return err + } + case err := <-orderSyncErrChan: + if err != nil { + log.WithError(err).Error("ordersync service exited with error") cancel() return err } @@ -573,6 +690,7 @@ func (app *App) Start(ctx context.Context) error { // Wait for all goroutines to exit. If we reached here it means we are done // and there are no errors. wg.Wait() + log.Debug("app successfully closed") return nil } @@ -714,7 +832,7 @@ func (app *App) AddOrders(ctx context.Context, signedOrdersRaw []*json.RawMessag schemaValidOrders := []*zeroex.SignedOrder{} for _, signedOrderRaw := range signedOrdersRaw { signedOrderBytes := []byte(*signedOrderRaw) - result, err := app.schemaValidateOrder(signedOrderBytes) + result, err := app.orderFilter.ValidateOrderJSON(signedOrderBytes) if err != nil { signedOrder := &zeroex.SignedOrder{} if err := signedOrder.UnmarshalJSON(signedOrderBytes); err != nil { @@ -804,7 +922,7 @@ func (app *App) AddOrders(ctx context.Context, signedOrdersRaw []*json.RawMessag func (app *App) shareOrder(order *zeroex.SignedOrder) error { <-app.started - encoded, err := encoding.OrderToRawMessage(order) + encoded, err := encoding.OrderToRawMessage(app.orderFilter.Topic(), order) if err != nil { return err } @@ -850,7 +968,7 @@ func (app *App) GetStats() (*types.Stats, error) { response := &types.Stats{ Version: version, - PubSubTopic: getPubSubTopic(app.config.EthereumChainID), + PubSubTopic: app.orderFilter.Topic(), Rendezvous: getRendezvous(app.config.EthereumChainID), PeerID: app.peerID.String(), EthereumChainID: app.config.EthereumChainID, diff --git a/core/core_test.go b/core/core_test.go index 840e15168..97a003e64 100644 --- a/core/core_test.go +++ b/core/core_test.go @@ -3,14 +3,35 @@ package core import ( + "context" + "flag" + "math/big" + "sync" "testing" + "time" + "github.com/0xProject/0x-mesh/constants" + "github.com/0xProject/0x-mesh/ethereum" "github.com/0xProject/0x-mesh/meshdb" + "github.com/0xProject/0x-mesh/scenario" + "github.com/0xProject/0x-mesh/zeroex" + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/ethclient" + ethrpc "github.com/ethereum/go-ethereum/rpc" "github.com/google/uuid" + "github.com/libp2p/go-libp2p-core/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +const ( + // blockProcessingWaitTime is the amount of time to wait for Mesh to process + // new blocks that have been mined. + blockProcessingWaitTime = 1 * time.Second + // ordersyncWaitTime is the amount of time to wait for ordersync to run. + ordersyncWaitTime = 2 * time.Second +) + func TestEthereumChainDetection(t *testing.T) { meshDB, err := meshdb.New("/tmp/meshdb_testing/" + uuid.New().String()) require.NoError(t, err) @@ -28,3 +49,151 @@ func TestEthereumChainDetection(t *testing.T) { _, err = initMetadata(2, meshDB) assert.Error(t, err) } + +func newTestApp(t *testing.T) *App { + dataDir := "/tmp/test_node/" + uuid.New().String() + config := Config{ + Verbosity: 2, + DataDir: dataDir, + P2PTCPPort: 0, + P2PWebSocketsPort: 0, + EthereumRPCURL: constants.GanacheEndpoint, + EthereumChainID: constants.TestChainID, + UseBootstrapList: false, + BootstrapList: "", + BlockPollingInterval: 250 * time.Millisecond, + EthereumRPCMaxContentLength: 524288, + EnableEthereumRPCRateLimiting: false, + EthereumRPCMaxRequestsPer24HrUTC: 99999999999999, + EthereumRPCMaxRequestsPerSecond: 99999999999999, + MaxOrdersInStorage: 100000, + CustomOrderFilter: "{}", + } + app, err := New(config) + require.NoError(t, err) + return app +} + +var ( + rpcClient *ethrpc.Client + ethClient *ethclient.Client + blockchainLifecycle *ethereum.BlockchainLifecycle +) + +// Since these tests must be run sequentially, we don't want them to run as part of +// the normal testing process. They will only be run if the "--serial" flag is used. +var serialTestsEnabled bool + +func init() { + flag.BoolVar(&serialTestsEnabled, "serial", false, "enable serial tests") + testing.Init() + flag.Parse() + + var err error + rpcClient, err = ethrpc.Dial(constants.GanacheEndpoint) + if err != nil { + panic(err) + } + ethClient = ethclient.NewClient(rpcClient) + blockchainLifecycle, err = ethereum.NewBlockchainLifecycle(rpcClient) + if err != nil { + panic(err) + } +} + +func TestOrderSync(t *testing.T) { + if !serialTestsEnabled { + t.Skip("Serial tests (tests which cannot run in parallel) are disabled. You can enable them with the --serial flag") + } + + teardownSubTest := setupSubTest(t) + defer teardownSubTest(t) + + // Set up two Mesh nodes. originalNode starts with some orders. newNode enters + // the network without any orders. + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + wg := &sync.WaitGroup{} + originalNode := newTestApp(t) + wg.Add(1) + go func() { + defer wg.Done() + require.NoError(t, originalNode.Start(ctx)) + }() + newNode := newTestApp(t) + wg.Add(1) + go func() { + defer wg.Done() + require.NoError(t, newNode.Start(ctx)) + }() + + // Manually add some orders to originalNode. + originalOrders := make([]*zeroex.SignedOrder, 10) + for i := range originalOrders { + originalOrders[i] = scenario.CreateWETHForZRXSignedTestOrder(t, ethClient, constants.GanacheAccount1, constants.GanacheAccount2, big.NewInt(20), big.NewInt(5)) + } + + // We have to wait for latest block to be processed by the Mesh node. + time.Sleep(blockProcessingWaitTime) + + results, err := originalNode.orderWatcher.ValidateAndStoreValidOrders(ctx, originalOrders, true, constants.TestChainID) + require.NoError(t, err) + require.Empty(t, results.Rejected, "tried to add orders but some were invalid: \n%s\n", spew.Sdump(results)) + + orderEventsChan := make(chan []*zeroex.OrderEvent) + orderEventsSub := newNode.SubscribeToOrderEvents(orderEventsChan) + defer orderEventsSub.Unsubscribe() + + // Connect the two nodes *after* adding orders to one of them. This should + // trigger the ordersync protocol. + err = originalNode.AddPeer(peer.AddrInfo{ + ID: newNode.node.ID(), + Addrs: newNode.node.Multiaddrs(), + }) + require.NoError(t, err) + + // Wait for newNode to get the orders via ordersync. + receivedAddedEvents := []*zeroex.OrderEvent{} +OrderEventLoop: + for { + select { + case <-ctx.Done(): + t.Fatalf("timed out waiting for %d order added events (received %d so far)", len(originalOrders), len(receivedAddedEvents)) + case orderEvents := <-orderEventsChan: + for _, orderEvent := range orderEvents { + if orderEvent.EndState == zeroex.ESOrderAdded { + receivedAddedEvents = append(receivedAddedEvents, orderEvent) + } + } + if len(receivedAddedEvents) >= len(originalOrders) { + break OrderEventLoop + } + } + } + + // Test that the orders are actually in the database and are returned by + // GetOrders. + newNodeOrdersResp, err := newNode.GetOrders(0, len(originalOrders), "") + require.NoError(t, err) + assert.Len(t, newNodeOrdersResp.OrdersInfos, len(originalOrders), "new node should have %d orders", len(originalOrders)) + for _, expectedOrder := range originalOrders { + orderHash, err := expectedOrder.ComputeOrderHash() + require.NoError(t, err) + expectedOrder.ResetHash() + var dbOrder meshdb.Order + require.NoError(t, newNode.db.Orders.FindByID(orderHash.Bytes(), &dbOrder)) + actualOrder := dbOrder.SignedOrder + assert.Equal(t, expectedOrder, actualOrder, "correct order was not stored in new node database") + } + + // Wait for nodes to exit without error. + cancel() + wg.Wait() +} + +func setupSubTest(t *testing.T) func(t *testing.T) { + blockchainLifecycle.Start(t) + return func(t *testing.T) { + blockchainLifecycle.Revert(t) + } +} diff --git a/core/message_handler.go b/core/message_handler.go index 0110adcf0..b6f701271 100644 --- a/core/message_handler.go +++ b/core/message_handler.go @@ -5,7 +5,6 @@ import ( "github.com/0xProject/0x-mesh/constants" "github.com/0xProject/0x-mesh/encoding" - "github.com/0xProject/0x-mesh/meshdb" "github.com/0xProject/0x-mesh/p2p" "github.com/0xProject/0x-mesh/zeroex" "github.com/0xProject/0x-mesh/zeroex/ordervalidator" @@ -16,11 +15,6 @@ import ( // Ensure that App implements p2p.MessageHandler. var _ p2p.MessageHandler = &App{} -type orderSelector struct { - nextOffset int - db *meshdb.MeshDB -} - func min(a int, b int) int { if a < b { return a @@ -28,82 +22,6 @@ func min(a int, b int) int { return b } -func (app *App) GetMessagesToShare(max int) ([][]byte, error) { - return app.orderSelector.GetMessagesToShare(max) -} - -func (orderSelector *orderSelector) GetMessagesToShare(max int) ([][]byte, error) { - // For now, we use a round robin strategy to select a set of orders to share. - // We might return less than max even if there are max or greater orders - // currently stored. - // Use a snapshot to make sure state doesn't change between our two queries. - ordersSnapshot, err := orderSelector.db.Orders.GetSnapshot() - if err != nil { - return nil, err - } - defer ordersSnapshot.Release() - notRemovedFilter := orderSelector.db.Orders.IsRemovedIndex.ValueFilter([]byte{0}) - count, err := ordersSnapshot.NewQuery(notRemovedFilter).Count() - if err != nil { - return nil, err - } - if count == 0 { - return nil, nil - } - - // Select up to the maximum number of orders starting at the offset that was - // calculated the last time this was called with `app`. - offset := min(orderSelector.nextOffset, count) - var selectedOrders []*meshdb.Order - if offset < count { - err = ordersSnapshot.NewQuery(notRemovedFilter).Offset(offset).Max(max).Run(&selectedOrders) - if err != nil { - return nil, err - } - } - - // If more orders can be shared than were selected, append the maximum amount of - // unique (in this round) orders that can be added to the selected orders without - // exceeding the maximum number to share. - overflow := min(max-len(selectedOrders), offset) - if overflow > 0 { - var overflowSelectedOrders []*meshdb.Order - err = ordersSnapshot.NewQuery(notRemovedFilter).Offset(0).Max(overflow).Run(&overflowSelectedOrders) - if err != nil { - return nil, err - } - selectedOrders = append(selectedOrders, overflowSelectedOrders...) - orderSelector.nextOffset = overflow - } else { - // Calculate the next offset and wrap back to 0 if the next offset is larger - // than or equal to count. - orderSelector.nextOffset += max - if orderSelector.nextOffset >= count { - orderSelector.nextOffset = 0 - } - } - - log.WithFields(map[string]interface{}{ - "maxNumberToShare": max, - "actualNumberToShare": len(selectedOrders), - }).Trace("preparing to share orders with peers") - - // After we have selected all the orders to share, we need to encode them to - // the message data format. - messageData := make([][]byte, len(selectedOrders)) - for i, order := range selectedOrders { - log.WithFields(map[string]interface{}{ - "order": order, - }).Trace("selected order to share") - encoded, err := encoding.OrderToRawMessage(order.SignedOrder) - if err != nil { - return nil, err - } - messageData[i] = encoded - } - return messageData, nil -} - func (app *App) HandleMessages(ctx context.Context, messages []*p2p.Message) error { // First we validate the messages and decode them into orders. orders := []*zeroex.SignedOrder{} @@ -121,28 +39,6 @@ func (app *App) HandleMessages(ctx context.Context, messages []*p2p.Message) err continue } - result, err := app.schemaValidateMeshMessage(msg.Data) - if err != nil { - log.WithFields(map[string]interface{}{ - "error": err, - "from": msg.From, - }).Trace("could not schema validate message") - app.handlePeerScoreEvent(msg.From, psInvalidMessage) - continue - } - if !result.Valid() { - formattedErrors := make([]string, len(result.Errors())) - for i, resultError := range result.Errors() { - formattedErrors[i] = resultError.String() - } - log.WithFields(map[string]interface{}{ - "errors": formattedErrors, - "from": msg.From, - }).Trace("order schema validation failed for message") - app.handlePeerScoreEvent(msg.From, psInvalidMessage) - continue - } - order, err := encoding.RawMessageToOrder(msg.Data) if err != nil { log.WithFields(map[string]interface{}{ @@ -185,11 +81,13 @@ func (app *App) HandleMessages(ctx context.Context, messages []*p2p.Message) err log.WithFields(map[string]interface{}{ "orderHash": acceptedOrderInfo.OrderHash.Hex(), "from": msg.From.String(), + "protocol": "GossipSub", }).Info("received new valid order from peer") log.WithFields(map[string]interface{}{ "order": acceptedOrderInfo.SignedOrder, "orderHash": acceptedOrderInfo.OrderHash.Hex(), "from": msg.From.String(), + "protocol": "GossipSub", }).Trace("all fields for new valid order received from peer") app.handlePeerScoreEvent(msg.From, psOrderStored) } @@ -213,3 +111,10 @@ func (app *App) HandleMessages(ctx context.Context, messages []*p2p.Message) err } return nil } + +func validateMessageSize(message *p2p.Message) error { + if len(message.Data) > constants.MaxMessageSizeInBytes { + return constants.ErrMaxMessageSize + } + return nil +} diff --git a/core/message_handler_test.go b/core/message_handler_test.go deleted file mode 100644 index d9766d7dd..000000000 --- a/core/message_handler_test.go +++ /dev/null @@ -1,252 +0,0 @@ -// +build !js - -package core - -import ( - "flag" - "math/big" - "testing" - "time" - - "github.com/0xProject/0x-mesh/constants" - "github.com/0xProject/0x-mesh/encoding" - "github.com/0xProject/0x-mesh/ethereum" - "github.com/0xProject/0x-mesh/meshdb" - "github.com/0xProject/0x-mesh/scenario" - "github.com/ethereum/go-ethereum/ethclient" - ethrpc "github.com/ethereum/go-ethereum/rpc" - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -var ( - rpcClient *ethrpc.Client - ethClient *ethclient.Client - blockchainLifecycle *ethereum.BlockchainLifecycle - makerAddress = constants.GanacheAccount1 - takerAddress = constants.GanacheAccount2 - tenDecimalsInBaseUnits = new(big.Int).Exp(big.NewInt(10), big.NewInt(10), nil) - wethAmount = new(big.Int).Mul(big.NewInt(2), tenDecimalsInBaseUnits) - zrxAmount = new(big.Int).Mul(big.NewInt(1), tenDecimalsInBaseUnits) -) - -// Since these tests must be run sequentially, we don't want them to run as part of -// the normal testing process. They will only be run if the "--serial" flag is used. -var serialTestsEnabled bool - -func init() { - flag.BoolVar(&serialTestsEnabled, "serial", false, "enable serial tests") - flag.Parse() - - var err error - rpcClient, err = ethrpc.Dial(constants.GanacheEndpoint) - if err != nil { - panic(err) - } - ethClient = ethclient.NewClient(rpcClient) - blockchainLifecycle, err = ethereum.NewBlockchainLifecycle(rpcClient) - if err != nil { - panic(err) - } -} - -func TestMessageSharingIsolated(t *testing.T) { - if !serialTestsEnabled { - t.Skip("Serial tests (tests which cannot run in parallel) are disabled. You can enable them with the --serial flag") - } - - meshDB, err := meshdb.New("/tmp/leveldb_testing/" + uuid.New().String()) - defer meshDB.Close() - require.NoError(t, err) - - testCases := []struct { - orderCount int - nextOffset int - max int - }{ - { - orderCount: 1, - nextOffset: 0, - max: 1, - }, - { - orderCount: 2, - nextOffset: 0, - max: 1, - }, - { - orderCount: 2, - nextOffset: 1, - max: 1, - }, - { - orderCount: 2, - nextOffset: 1, - max: 2, - }, - { - orderCount: 10, - nextOffset: 5, - max: 2, - }, - { - orderCount: 10, - nextOffset: 1, - max: 2, - }, - { - orderCount: 3, - nextOffset: 1, - max: 4, - }, - { - orderCount: 3, - nextOffset: 20, - max: 4, - }, - } - - for _, testCase := range testCases { - orders, err := signedTestOrders(t, testCase.orderCount) - - require.NoError(t, err) - - selector := &orderSelector{ - nextOffset: testCase.nextOffset, - db: meshDB, - } - - // Insert the orders into the database - insertOrders(t, selector, orders) - - // Ensure that the correct orders are shared - verifyRoundRobinSharing(t, selector, testCase.nextOffset, testCase.max) - - // Delete the orders from the database - deleteOrders(t, selector, orders) - } -} - -func TestMessagesSharedSerial(t *testing.T) { - if !serialTestsEnabled { - t.Skip("Serial tests (tests which cannot run in parallel) are disabled. You can enable them with the --serial flag") - } - - var allOrders []*meshdb.Order - meshDB, err := meshdb.New("/tmp/leveldb_testing/" + uuid.New().String()) - defer meshDB.Close() - require.NoError(t, err) - - selector := &orderSelector{ - nextOffset: 0, - db: meshDB, - } - - // Add five orders to the database - orders, err := signedTestOrders(t, 5) - require.NoError(t, err) - allOrders = orders - insertOrders(t, selector, orders) - verifyRoundRobinSharing(t, selector, 0, 3) - - // Add seven more orders to the database - orders, err = signedTestOrders(t, 7) - require.NoError(t, err) - allOrders = append(allOrders, orders...) - insertOrders(t, selector, orders) - verifyRoundRobinSharing(t, selector, 3, 10) - - // Delete three orders from the database - deleteOrders(t, selector, allOrders[0:3:3]) - verifyRoundRobinSharing(t, selector, selector.nextOffset, 5) - - // Add 12 more orders to the database - orders, err = signedTestOrders(t, 12) - require.NoError(t, err) - allOrders = append(allOrders, orders...) - insertOrders(t, selector, orders) - verifyRoundRobinSharing(t, selector, selector.nextOffset, 7) -} - -// Verify that the correct messages are shared by `GetMessagesToShare` given `orders`, a `nextOffset`, and `max` -func verifyRoundRobinSharing(t *testing.T, selector *orderSelector, nextOffset int, max int) { - notRemovedFilter := selector.db.Orders.IsRemovedIndex.ValueFilter([]byte{0}) - - // Get the number of orders in the database - count, err := selector.db.Orders.NewQuery(notRemovedFilter).Count() - require.NoError(t, err) - - expectedOrdersLength := min(max, count) - expectedOrders := make([][]byte, expectedOrdersLength) - - // Get all of the orders in the database. - var orderList []*meshdb.Order - err = selector.db.Orders.NewQuery(notRemovedFilter).Run(&orderList) - require.NoError(t, err) - - // Update `nextOffset` to zero if it is larger than the number of orders that are stored - if nextOffset > count { - nextOffset = 0 - } - - // Calculate the orders that we expect to be shared - for i := 0; i < expectedOrdersLength; i++ { - encodedOrder, err := encoding.OrderToRawMessage(orderList[(nextOffset+i)%count].SignedOrder) - require.NoError(t, err) - - expectedOrders[i] = encodedOrder - } - - // Get the actual list of orders that are shared - actualOrders, err := selector.GetMessagesToShare(max) - require.NoError(t, err) - - // Ensure that the result from `GetMessagesToShare` matches the expected result. - assert.Equal(t, expectedOrders, actualOrders) -} - -func deleteOrders(t *testing.T, selector *orderSelector, orders []*meshdb.Order) { - for _, order := range orders { - err := selector.db.Orders.Delete(order.ID()) - require.NoError(t, err) - } -} - -func insertOrders(t *testing.T, selector *orderSelector, orders []*meshdb.Order) { - for _, order := range orders { - err := selector.db.Orders.Insert(order) - require.NoError(t, err) - } -} - -func signedTestOrders(t *testing.T, orderCount int) ([]*meshdb.Order, error) { - orders := make([]*meshdb.Order, orderCount) - - for i := range orders { - order := scenario.CreateZRXForWETHSignedTestOrder( - t, - ethClient, - makerAddress, - takerAddress, - new(big.Int).Add(wethAmount, big.NewInt(int64(i))), - zrxAmount, - ) - - hash, err := order.ComputeOrderHash() - - if err != nil { - return nil, err - } - - orders[i] = &meshdb.Order{ - Hash: hash, - SignedOrder: order, - LastUpdated: time.Now(), - FillableTakerAssetAmount: order.TakerAssetAmount, - IsRemoved: false, - } - } - - return orders, nil -} diff --git a/core/ordersync/ordersync.go b/core/ordersync/ordersync.go new file mode 100644 index 000000000..6fa47b533 --- /dev/null +++ b/core/ordersync/ordersync.go @@ -0,0 +1,517 @@ +// Package ordersync contains the ordersync protocol, which is +// used for sharing existing orders between two peers, typically +// during initialization. The protocol consists of a requester +// (the peer requesting orders) and a provider (the peer providing +// them). +package ordersync + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math/rand" + "sync" + "time" + + "github.com/0xProject/0x-mesh/p2p" + "github.com/0xProject/0x-mesh/zeroex" + "github.com/albrow/stringset" + "github.com/jpillora/backoff" + network "github.com/libp2p/go-libp2p-core/network" + protocol "github.com/libp2p/go-libp2p-core/protocol" + peer "github.com/libp2p/go-libp2p-peer" + log "github.com/sirupsen/logrus" + "golang.org/x/time/rate" +) + +const ( + // TypeRequest is used to identify a JSON message as an ordersync request. + TypeRequest = "Request" + // TypeResponse is used to identify a JSON message as an ordersync response. + TypeResponse = "Response" + // requestResponseTimeout is the amount of time to wait for a response/request + // from the other side of the connection. It is used for both waiting for a request + // on a newly opened stream and waiting for a response after sending a request. + requestResponseTimeout = 30 * time.Second + // maxRequestsPerSecond is the maximum number of ordersync requests to allow per + // second. If this limit is exceeded, requests will be dropped. + maxRequestsPerSecond = 30 + // requestsBurst is the maximum number of requests to allow at once. + requestsBurst = 10 +) + +var ( + // retryBackoff defines how long to wait before trying again if we didn't get + // orders from enough peers during the ordersync process. + retryBackoff = &backoff.Backoff{ + Min: 250 * time.Millisecond, // First back-off length + Max: 1 * time.Minute, // Longest back-off length + Factor: 2, // Factor to multiple each successive back-off + } + // backoffMut is a mutex around retryBackoff, which otherwise appears to not + // be goroutine-safe. + backoffMut = &sync.Mutex{} + // ErrNoOrders is returned whenever the orders we are looking for cannot be + // found anywhere on the network. This can mean that we aren't connected to any + // peers on the same topic, that there are no orders for the topic throughout + // the entire network, or that there are peers that have the orders we're + // looking for, but they are refusing to give them to us. + ErrNoOrders = errors.New("no orders where received from any known peers") +) + +// NoMatchingSubprotocolsError is returned whenever two peers attempting to use +// the ordersync protocol cannot agree on a subprotocol to use. +type NoMatchingSubprotocolsError struct { + Requested []string + Supported []string +} + +func (e NoMatchingSubprotocolsError) Error() string { + return fmt.Sprintf("could not agree on an ordersync subprotocol (requested: %v, supported: %s)", e.Requested, e.Supported) +} + +const ( + // ID is the ID for the ordersync protocol. + ID = protocol.ID("/0x-mesh/order-sync/version/0") +) + +// Request represents a high-level ordersync request. It abstracts away some +// of the details of subprotocol negotiation and encoding/decoding. +type Request struct { + RequesterID peer.ID `json:"requesterID"` + Metadata interface{} `json:"metadata"` +} + +// rawRequest contains all the details we need at the lowest level to encode/decode +// the request and perform subprotocol negoatiation. +type rawRequest struct { + Type string `json:"type"` + Subprotocols []string `json:"subprotocols"` + Metadata json.RawMessage `json:"metadata"` +} + +// Response represents a high-level ordersync response. It abstracts away some +// of the details of subprotocol negotiation and encoding/decoding. +type Response struct { + ProviderID peer.ID `json:"providerID"` + Orders []*zeroex.SignedOrder `json:"orders"` + Complete bool `json:"complete"` + Metadata interface{} `json:"metadata"` +} + +// rawResponse contains all the details we need at the lowest level to encode/decode +// the response, perform subprotocol negoatiation, and more. +type rawResponse struct { + Type string `json:"type"` + Subprotocol string `json:"subprotocol"` + Orders []*zeroex.SignedOrder `json:"orders"` + Complete bool `json:"complete"` + Metadata json.RawMessage `json:"metadata"` +} + +// Service is the main entrypoint for running the ordersync protocol. It handles +// responding to and sending ordersync requests. +type Service struct { + ctx context.Context + node *p2p.Node + subprotocols map[string]Subprotocol + // requestRateLimiter is a rate limiter for incoming ordersync requests. It's + // shared between all peers. + requestRateLimiter *rate.Limiter +} + +// SupportedSubprotocols returns the subprotocols that are supported by the service. +func (s *Service) SupportedSubprotocols() []string { + sids := []string{} + for sid := range s.subprotocols { + sids = append(sids, sid) + } + return sids +} + +// Subprotocol is a lower-level protocol which defines the details for the +// request/response metadata. While the ordersync protocol supports sending +// requests and responses in order to synchronize orders between two peers +// in general, a subprotocol defines exactly what those requests and responses +// should look like and how each peer is expected to respond to them. +type Subprotocol interface { + // Name is the name of the subprotocol. Must be unique. + Name() string + // HandleOrderSyncRequest returns a Response based on the given Request. It is the + // implementation for the "provider" side of the subprotocol. + HandleOrderSyncRequest(context.Context, *Request) (*Response, error) + // HandleOrderSyncResponse handles a response (e.g. typically by saving orders to + // the database) and if needed creates and returns the next request that + // should be sent. If nextRequest is nil, the ordersync protocol is + // considered finished. HandleOrderSyncResponse is the implementation for the + // "requester" side of the subprotocol. + HandleOrderSyncResponse(context.Context, *Response) (nextRequest *Request, err error) + // ParseRequestMetadata converts raw request metadata into a concrete type + // that the subprotocol expects. + ParseRequestMetadata(metadata json.RawMessage) (interface{}, error) + // ParseResponseMetadata converts raw response metadata into a concrete type + // that the subprotocol expects. + ParseResponseMetadata(metadata json.RawMessage) (interface{}, error) +} + +// New creates and returns a new ordersync service, which is used for both +// requesting orders from other peers and providing orders to peers who request +// them. New expects an array of subprotocols which the service will support, in the +// order of preference. The service will automatically pick the most preferred protocol +// that is supported by both peers for each request/response. +func New(ctx context.Context, node *p2p.Node, subprotocols []Subprotocol) *Service { + supportedSubprotocols := map[string]Subprotocol{} + for _, subp := range subprotocols { + supportedSubprotocols[subp.Name()] = subp + } + s := &Service{ + ctx: ctx, + node: node, + subprotocols: supportedSubprotocols, + requestRateLimiter: rate.NewLimiter(maxRequestsPerSecond, requestsBurst), + } + s.node.SetStreamHandler(ID, s.HandleStream) + return s +} + +// GetMatchingSubprotocol returns the most preferred subprotocol to use +// based on the given request. +func (s *Service) GetMatchingSubprotocol(rawReq *rawRequest) (Subprotocol, error) { + for _, protoID := range rawReq.Subprotocols { + subprotocol, found := s.subprotocols[protoID] + if found { + return subprotocol, nil + } + } + + err := NoMatchingSubprotocolsError{ + Requested: rawReq.Subprotocols, + Supported: s.SupportedSubprotocols(), + } + return nil, err +} + +// HandleStream is a stream handler that is used to handle incoming ordersync requests. +func (s *Service) HandleStream(stream network.Stream) { + if !s.requestRateLimiter.Allow() { + // Pre-emptively close the stream if we can't accept anymore requests. + log.WithFields(log.Fields{ + "requester": stream.Conn().RemotePeer().Pretty(), + }).Warn("closing ordersync stream because rate limiter is backed up") + _ = stream.Reset() + return + } + log.WithFields(log.Fields{ + "requester": stream.Conn().RemotePeer().Pretty(), + }).Trace("handling ordersync stream") + defer func() { + _ = stream.Close() + }() + requesterID := stream.Conn().RemotePeer() + + for { + if err := s.requestRateLimiter.Wait(s.ctx); err != nil { + log.WithFields(log.Fields{ + "requester": stream.Conn().RemotePeer().Pretty(), + }).Warn("ordersync rate limiter returned error") + return + } + rawReq, err := waitForRequest(s.ctx, stream) + if err != nil { + log.WithError(err).Warn("waitForRequest returned error") + return + } + log.WithFields(log.Fields{ + "requester": stream.Conn().RemotePeer().Pretty(), + }).Trace("received ordersync request") + if rawReq.Type != TypeRequest { + log.WithField("gotType", rawReq.Type).Warn("wrong type for Request") + s.handlePeerScoreEvent(requesterID, psInvalidMessage) + return + } + subprotocol, err := s.GetMatchingSubprotocol(rawReq) + if err != nil { + log.WithError(err).Warn("GetMatchingSubprotocol returned error") + s.handlePeerScoreEvent(requesterID, psSubprotocolNegotiationFailed) + return + } + res, err := handleRequestWithSubprotocol(s.ctx, subprotocol, requesterID, rawReq) + if err != nil { + log.WithError(err).Warn("subprotocol returned error") + return + } + encodedMetadata, err := json.Marshal(res.Metadata) + if err != nil { + log.WithError(err).Error("could not encode raw metadata") + return + } + s.handlePeerScoreEvent(requesterID, psValidMessage) + rawRes := rawResponse{ + Type: TypeResponse, + Subprotocol: subprotocol.Name(), + Orders: res.Orders, + Complete: res.Complete, + Metadata: encodedMetadata, + } + if err := json.NewEncoder(stream).Encode(rawRes); err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + "requester": requesterID.Pretty(), + }).Warn("could not encode ordersync response") + s.handlePeerScoreEvent(requesterID, psUnexpectedDisconnect) + return + } + if res.Complete { + return + } + } +} + +// GetOrders iterates through every peer the node is currently connected to +// and attempts to perform the ordersync protocol. It keeps trying until +// ordersync has been completed with minPeers, using an exponential backoff +// strategy between retries. +func (s *Service) GetOrders(ctx context.Context, minPeers int) error { + successfullySyncedPeers := stringset.New() + + for len(successfullySyncedPeers) < minPeers { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + // TODO(albrow): As a performance optimization, do this for loop + // partly in parallel. + currentNeighbors := s.node.Neighbors() + shufflePeers(currentNeighbors) + for _, peerID := range currentNeighbors { + if len(successfullySyncedPeers) >= minPeers { + return nil + } + if successfullySyncedPeers.Contains(peerID.Pretty()) { + continue + } + + log.WithFields(log.Fields{ + "provider": peerID.Pretty(), + }).Trace("requesting orders from neighbor via ordersync") + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + if err := s.getOrdersFromPeer(ctx, peerID); err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + "provider": peerID.Pretty(), + }).Warn("could not get orders from peer via ordersync") + continue + } else { + // TODO(albrow): Handle case where no orders were returned from this + // peer. This could be considered a valid response, depending on the implementation + // details of the subprotocol. We need to not try them again, but also not count + // them toward the number of peers we have successfully synced with. + log.WithFields(log.Fields{ + "provider": peerID.Pretty(), + }).Trace("succesfully got orders from peer via ordersync") + successfullySyncedPeers.Add(peerID.Pretty()) + } + } + + backoffMut.Lock() + delayBeforeNextRetry := retryBackoff.Duration() + backoffMut.Unlock() + log.WithFields(log.Fields{ + "delayBeforeNextRetry": delayBeforeNextRetry.String(), + "minPeers": minPeers, + "successfullySyncedPeers": len(successfullySyncedPeers), + }).Debug("ordersync could not get orders from enough peers (trying again soon)") + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(delayBeforeNextRetry): + continue + } + } + + return nil +} + +func handleRequestWithSubprotocol(ctx context.Context, subprotocol Subprotocol, requesterID peer.ID, rawReq *rawRequest) (*Response, error) { + req, err := parseRequestWithSubprotocol(subprotocol, requesterID, rawReq) + if err != nil { + return nil, err + } + return subprotocol.HandleOrderSyncRequest(ctx, req) +} + +func parseRequestWithSubprotocol(subprotocol Subprotocol, requesterID peer.ID, rawReq *rawRequest) (*Request, error) { + metadata, err := subprotocol.ParseRequestMetadata(rawReq.Metadata) + if err != nil { + return nil, err + } + return &Request{ + RequesterID: requesterID, + Metadata: metadata, + }, nil +} + +func parseResponseWithSubprotocol(subprotocol Subprotocol, providerID peer.ID, rawRes *rawResponse) (*Response, error) { + metadata, err := subprotocol.ParseResponseMetadata(rawRes.Metadata) + if err != nil { + return nil, err + } + return &Response{ + ProviderID: providerID, + Orders: rawRes.Orders, + Complete: rawRes.Complete, + Metadata: metadata, + }, nil +} + +func (s *Service) getOrdersFromPeer(ctx context.Context, providerID peer.ID) error { + stream, err := s.node.NewStream(ctx, providerID, ID) + if err != nil { + s.handlePeerScoreEvent(providerID, psUnexpectedDisconnect) + return err + } + defer func() { + _ = stream.Close() + }() + + var nextReq *Request + var selectedSubprotocol Subprotocol + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + var rawReq *rawRequest + if nextReq == nil { + // First request + rawReq = &rawRequest{ + Type: TypeRequest, + Subprotocols: s.SupportedSubprotocols(), + Metadata: nil, + } + } else { + encodedMetadata, err := json.Marshal(nextReq.Metadata) + if err != nil { + return err + } + rawReq = &rawRequest{ + Type: TypeRequest, + Subprotocols: []string{selectedSubprotocol.Name()}, + Metadata: encodedMetadata, + } + } + + if err := json.NewEncoder(stream).Encode(rawReq); err != nil { + s.handlePeerScoreEvent(providerID, psUnexpectedDisconnect) + return err + } + + rawRes, err := waitForResponse(ctx, stream) + if err != nil { + return err + } + s.handlePeerScoreEvent(providerID, psValidMessage) + + subprotocol, found := s.subprotocols[rawRes.Subprotocol] + if !found { + s.handlePeerScoreEvent(providerID, psSubprotocolNegotiationFailed) + return fmt.Errorf("unsupported subprotocol: %s", subprotocol) + } + selectedSubprotocol = subprotocol + res, err := parseResponseWithSubprotocol(subprotocol, providerID, rawRes) + if err != nil { + s.handlePeerScoreEvent(providerID, psInvalidMessage) + return err + } + + nextReq, err = subprotocol.HandleOrderSyncResponse(ctx, res) + if err != nil { + return err + } + s.handlePeerScoreEvent(providerID, receivedOrders) + + if rawRes.Complete { + return nil + } + } +} + +// shufflePeers randomizes the order of the given list of peers. +func shufflePeers(peers []peer.ID) { + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(peers), func(i, j int) { peers[i], peers[j] = peers[j], peers[i] }) +} + +func waitForRequest(parentCtx context.Context, stream network.Stream) (*rawRequest, error) { + ctx, cancel := context.WithTimeout(parentCtx, requestResponseTimeout) + defer cancel() + reqChan := make(chan *rawRequest, 1) + errChan := make(chan error, 1) + go func() { + var rawReq rawRequest + if err := json.NewDecoder(stream).Decode(&rawReq); err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + "requester": stream.Conn().RemotePeer().Pretty(), + }).Warn("could not encode ordersync request") + errChan <- err + return + } + reqChan <- &rawReq + }() + + select { + case <-ctx.Done(): + log.WithFields(log.Fields{ + "error": ctx.Err(), + "requester": stream.Conn().RemotePeer().Pretty(), + }).Warn("timed out waiting for ordersync request") + return nil, ctx.Err() + case err := <-errChan: + return nil, err + case rawReq := <-reqChan: + return rawReq, nil + } +} + +func waitForResponse(parentCtx context.Context, stream network.Stream) (*rawResponse, error) { + ctx, cancel := context.WithTimeout(parentCtx, requestResponseTimeout) + defer cancel() + resChan := make(chan *rawResponse, 1) + errChan := make(chan error, 1) + go func() { + var rawRes rawResponse + if err := json.NewDecoder(stream).Decode(&rawRes); err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + "provider": stream.Conn().RemotePeer().Pretty(), + }).Warn("could not encode ordersync response") + errChan <- err + return + } + resChan <- &rawRes + }() + + select { + case <-ctx.Done(): + log.WithFields(log.Fields{ + "error": ctx.Err(), + "provider": stream.Conn().RemotePeer().Pretty(), + }).Warn("timed out waiting for ordersync response") + return nil, ctx.Err() + case err := <-errChan: + return nil, err + case rawRes := <-resChan: + return rawRes, nil + } +} diff --git a/core/ordersync/peer_score.go b/core/ordersync/peer_score.go new file mode 100644 index 000000000..fd131ed32 --- /dev/null +++ b/core/ordersync/peer_score.go @@ -0,0 +1,39 @@ +package ordersync + +import ( + peer "github.com/libp2p/go-libp2p-core/peer" + log "github.com/sirupsen/logrus" +) + +type peerScoreEvent uint + +const ( + psInvalidMessage peerScoreEvent = iota + psValidMessage + psSubprotocolNegotiationFailed + psUnexpectedDisconnect + receivedOrders +) + +func (s *Service) handlePeerScoreEvent(id peer.ID, event peerScoreEvent) { + // Note: for some events, we use `SetPeerScore` instead of `AddPeerScore` in + // order to limit the maximum positive score associated with that event. + // Without this, peers could be incentivized to artificially increase their + // score in a way that doesn't benefit the network. (For example, they could + // spam the network with valid messages). + switch event { + case psInvalidMessage: + s.node.AddPeerScore(id, "ordersync/invalid-message", -5) + case psValidMessage: + s.node.SetPeerScore(id, "ordersync/valid-message", 5) + case psSubprotocolNegotiationFailed: + s.node.SetPeerScore(id, "ordersync/subprotocol-negotiation-failed", -5) + case psUnexpectedDisconnect: + s.node.AddPeerScore(id, "ordersync/unexpected-disconnect", -1) + case receivedOrders: + s.node.UnsetPeerScore(id, "ordersync/unexpected-disconnect") + s.node.SetPeerScore(id, "ordersync/received-orders", 10) + default: + log.WithField("event", event).Error("unknown ordersync peerScoreEvent") + } +} diff --git a/core/ordersync_subprotocols.go b/core/ordersync_subprotocols.go new file mode 100644 index 000000000..cf8862ca7 --- /dev/null +++ b/core/ordersync_subprotocols.go @@ -0,0 +1,176 @@ +package core + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/0xProject/0x-mesh/core/ordersync" + "github.com/0xProject/0x-mesh/orderfilter" + "github.com/0xProject/0x-mesh/zeroex" + log "github.com/sirupsen/logrus" +) + +// Ensure that FilteredPaginationSubProtocol implements the Subprotocol interface. +var _ ordersync.Subprotocol = (*FilteredPaginationSubProtocol)(nil) + +// FilteredPaginationSubProtocol is an ordersync subprotocol which returns all orders by +// paginating through them. It involves sending multiple requests until pagination is +// finished and all orders have been returned. +type FilteredPaginationSubProtocol struct { + app *App + orderFilter *orderfilter.Filter + perPage int +} + +// NewFilteredPaginationSubprotocol creates and returns a new FilteredPaginationSubprotocol +// which will respond with perPage orders for each individual request/response. +func NewFilteredPaginationSubprotocol(app *App, perPage int) *FilteredPaginationSubProtocol { + return &FilteredPaginationSubProtocol{ + app: app, + orderFilter: app.orderFilter, + perPage: perPage, + } +} + +// FilteredPaginationRequestMetadata is the request metadata for the +// FilteredPaginationSubProtocol. It keeps track of the current page and SnapshotID, +// which is expected to be an empty string on the first request. +type FilteredPaginationRequestMetadata struct { + Page int `json:"page"` + SnapshotID string `json:"snapshotID"` +} + +// FilteredPaginationResponseMetadata is the response metadata for the +// FilteredPaginationSubProtocol. It keeps track of the current page and SnapshotID. +type FilteredPaginationResponseMetadata struct { + Page int `json:"page"` + SnapshotID string `json:"snapshotID"` +} + +// Name returns the name of the FilteredPaginationSubProtocol +func (p *FilteredPaginationSubProtocol) Name() string { + return "/pagination-with-filter/version/0" +} + +// HandleOrderSyncRequest returns the orders for one page, based on the page number +// and snapshotID corresponding to the given request. This is +// the implementation for the "provider" side of the subprotocol. +func (p *FilteredPaginationSubProtocol) HandleOrderSyncRequest(ctx context.Context, req *ordersync.Request) (*ordersync.Response, error) { + var metadata *FilteredPaginationRequestMetadata + if req.Metadata == nil { + // Default metadata for the first request. + metadata = &FilteredPaginationRequestMetadata{ + Page: 0, + SnapshotID: "", + } + } else { + var ok bool + metadata, ok = req.Metadata.(*FilteredPaginationRequestMetadata) + if !ok { + return nil, fmt.Errorf("FilteredPaginationSubProtocol received request with wrong metadata type (got %T)", req.Metadata) + } + } + // It's possible that none of the orders in the current page match the filter. + // We don't want to respond with zero orders, so keep iterating until we find + // at least some orders that match the filter. + filteredOrders := []*zeroex.SignedOrder{} + var snapshotID string + var currentPage int + for currentPage = metadata.Page; len(filteredOrders) == 0; currentPage += 1 { + // Get the orders for this page. + ordersResp, err := p.app.GetOrders(currentPage, p.perPage, metadata.SnapshotID) + if err != nil { + return nil, err + } + snapshotID = ordersResp.SnapshotID + if len(ordersResp.OrdersInfos) == 0 { + // No more orders left. + break + } + // Filter the orders for this page. If none of them match the filter, we continue + // on to the next page. + for _, orderInfo := range ordersResp.OrdersInfos { + if matches, err := p.orderFilter.MatchOrder(orderInfo.SignedOrder); err != nil { + return nil, err + } else if matches { + filteredOrders = append(filteredOrders, orderInfo.SignedOrder) + } + } + } + + return &ordersync.Response{ + Orders: filteredOrders, + Complete: len(filteredOrders) == 0, + Metadata: &FilteredPaginationResponseMetadata{ + Page: currentPage, + SnapshotID: snapshotID, + }, + }, nil +} + +// HandleOrderSyncResponse handles the orders for one page by validating them, storing them +// in the database, and firing the appropriate events. It also returns the next request to +// be sent. This is the implementation for the "requester" side of the subprotocol. +func (p *FilteredPaginationSubProtocol) HandleOrderSyncResponse(ctx context.Context, res *ordersync.Response) (*ordersync.Request, error) { + if res.Metadata == nil { + return nil, errors.New("FilteredPaginationSubProtocol received response with nil metadata") + } + metadata, ok := res.Metadata.(*FilteredPaginationResponseMetadata) + if !ok { + return nil, fmt.Errorf("FilteredPaginationSubProtocol received response with wrong metadata type (got %T)", res.Metadata) + } + filteredOrders := []*zeroex.SignedOrder{} + for _, order := range res.Orders { + if matches, err := p.orderFilter.MatchOrder(order); err != nil { + return nil, err + } else if matches { + filteredOrders = append(filteredOrders, order) + } else if !matches { + p.app.handlePeerScoreEvent(res.ProviderID, psReceivedOrderDoesNotMatchFilter) + } + } + validationResults, err := p.app.orderWatcher.ValidateAndStoreValidOrders(ctx, filteredOrders, false, p.app.chainID) + if err != nil { + return nil, err + } + for _, acceptedOrderInfo := range validationResults.Accepted { + if acceptedOrderInfo.IsNew { + log.WithFields(map[string]interface{}{ + "orderHash": acceptedOrderInfo.OrderHash.Hex(), + "from": res.ProviderID.Pretty(), + "protocol": "ordersync", + }).Info("received new valid order from peer") + log.WithFields(map[string]interface{}{ + "order": acceptedOrderInfo.SignedOrder, + "orderHash": acceptedOrderInfo.OrderHash.Hex(), + "from": res.ProviderID.Pretty(), + "protocol": "ordersync", + }).Trace("all fields for new valid order received from peer") + } + } + + return &ordersync.Request{ + Metadata: &FilteredPaginationRequestMetadata{ + Page: metadata.Page + 1, + SnapshotID: metadata.SnapshotID, + }, + }, nil +} + +func (p *FilteredPaginationSubProtocol) ParseRequestMetadata(metadata json.RawMessage) (interface{}, error) { + var parsed FilteredPaginationRequestMetadata + if err := json.Unmarshal(metadata, &parsed); err != nil { + return nil, err + } + return &parsed, nil +} + +func (p *FilteredPaginationSubProtocol) ParseResponseMetadata(metadata json.RawMessage) (interface{}, error) { + var parsed FilteredPaginationResponseMetadata + if err := json.Unmarshal(metadata, &parsed); err != nil { + return nil, err + } + return &parsed, nil +} diff --git a/core/peer_score.go b/core/peer_score.go index c9f005616..7616b3a05 100644 --- a/core/peer_score.go +++ b/core/peer_score.go @@ -1,7 +1,7 @@ package core import ( - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" log "github.com/sirupsen/logrus" ) @@ -11,6 +11,7 @@ const ( psInvalidMessage peerScoreEvent = iota psValidMessage psOrderStored + psReceivedOrderDoesNotMatchFilter ) func (app *App) handlePeerScoreEvent(id peer.ID, event peerScoreEvent) { @@ -26,6 +27,8 @@ func (app *App) handlePeerScoreEvent(id peer.ID, event peerScoreEvent) { app.node.SetPeerScore(id, "valid-message", 5) case psOrderStored: app.node.SetPeerScore(id, "order-stored", 10) + case psReceivedOrderDoesNotMatchFilter: + app.node.SetPeerScore(id, "received-order-does-not-match-filter", -10) default: log.WithField("event", event).Error("unknown peerScoreEvent") } diff --git a/core/validation.go b/core/validation.go deleted file mode 100644 index 0b3f15f41..000000000 --- a/core/validation.go +++ /dev/null @@ -1,91 +0,0 @@ -package core - -import ( - "github.com/0xProject/0x-mesh/constants" - "github.com/0xProject/0x-mesh/p2p" - "github.com/xeipuuv/gojsonschema" -) - -// JSON-schema schemas -var ( - addressSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/addressSchema","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}`) - wholeNumberSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/wholeNumberSchema","anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"integer"}]}`) - hexSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/hexSchema","type":"string","pattern":"^0x(([0-9a-fA-F])*)?$"}`) - orderSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/orderSchema","properties":{"makerAddress":{"$ref":"/addressSchema"},"takerAddress":{"$ref":"/addressSchema"},"makerFee":{"$ref":"/wholeNumberSchema"},"takerFee":{"$ref":"/wholeNumberSchema"},"senderAddress":{"$ref":"/addressSchema"},"makerAssetAmount":{"$ref":"/wholeNumberSchema"},"takerAssetAmount":{"$ref":"/wholeNumberSchema"},"makerAssetData":{"$ref":"/hexSchema"},"takerAssetData":{"$ref":"/hexSchema"},"makerFeeAssetData":{"$ref":"/hexSchema"},"takerFeeAssetData":{"$ref":"/hexSchema"},"salt":{"$ref":"/wholeNumberSchema"},"feeRecipientAddress":{"$ref":"/addressSchema"},"expirationTimeSeconds":{"$ref":"/wholeNumberSchema"},"exchangeAddress":{"$ref":"/addressSchema"},"chainId": {"type": "number"}},"required":["makerAddress","takerAddress","makerFee","takerFee","senderAddress","makerAssetAmount","takerAssetAmount","makerAssetData","takerAssetData","makerFeeAssetData","takerFeeAssetData","salt","feeRecipientAddress","expirationTimeSeconds","exchangeAddress","chainId"],"type":"object"}`) - signedOrderSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/signedOrderSchema","allOf":[{"$ref":"/orderSchema"},{"properties":{"signature":{"$ref":"/hexSchema"}},"required":["signature"]}]}`) - meshMessageSchemaLoader = gojsonschema.NewStringLoader(`{"id":"/meshMessageSchema","properties":{"MessageType":{"type":"string"},"Order":{"$ref":"/signedOrderSchema"}},"required":["MessageType","Order"]}`) -) - -func setupMeshMessageSchemaValidator() (*gojsonschema.Schema, error) { - sl := gojsonschema.NewSchemaLoader() - if err := sl.AddSchemas(addressSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(wholeNumberSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(hexSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(orderSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(signedOrderSchemaLoader); err != nil { - return nil, err - } - schema, err := sl.Compile(meshMessageSchemaLoader) - if err != nil { - return nil, err - } - return schema, nil -} - -func setupOrderSchemaValidator() (*gojsonschema.Schema, error) { - sl := gojsonschema.NewSchemaLoader() - if err := sl.AddSchemas(addressSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(wholeNumberSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(hexSchemaLoader); err != nil { - return nil, err - } - if err := sl.AddSchemas(orderSchemaLoader); err != nil { - return nil, err - } - schema, err := sl.Compile(signedOrderSchemaLoader) - if err != nil { - return nil, err - } - return schema, nil -} - -func (app *App) schemaValidateOrder(o []byte) (*gojsonschema.Result, error) { - orderLoader := gojsonschema.NewBytesLoader(o) - - result, err := app.orderJSONSchema.Validate(orderLoader) - if err != nil { - return nil, err - } - - return result, nil -} - -func (app *App) schemaValidateMeshMessage(o []byte) (*gojsonschema.Result, error) { - messageLoader := gojsonschema.NewBytesLoader(o) - - result, err := app.meshMessageJSONSchema.Validate(messageLoader) - if err != nil { - return nil, err - } - - return result, nil -} - -func validateMessageSize(message *p2p.Message) error { - if len(message.Data) > constants.MaxMessageSizeInBytes { - return constants.ErrMaxMessageSize - } - return nil -} diff --git a/core/validation_test.go b/core/validation_test.go deleted file mode 100644 index be828f869..000000000 --- a/core/validation_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build !js - -package core - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/xeipuuv/gojsonschema" -) - -const ( - validSignedOrderJSON = `{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","makerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","takerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","exchangeAddress":"0x4f833a24e1f95d70f028921e27040ca56e09ab0b","exchange":"0x080bf510fcbf18b91105470639e9561022937712","chainId":1,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}` - misspelledFieldSignedOrderJSON = `{"makerAdress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","makerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","takerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","exchangeAddress":"0x4f833a24e1f95d70f028921e27040ca56e09ab0b","exchange":"0x080bf510fcbf18b91105470639e9561022937712","chainId":1,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}` - wrongTypeSignedOrderJSON = `{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"hi","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","makerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","takerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","exchangeAddress":"0x4f833a24e1f95d70f028921e27040ca56e09ab0b","exchange":"0x080bf510fcbf18b91105470639e9561022937712","chainId":1,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}` - missingFieldSignedOrderJSON = `{"takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","makerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","takerFeeAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","exchangeAddress":"0x4f833a24e1f95d70f028921e27040ca56e09ab0b","exchange":"0x080bf510fcbf18b91105470639e9561022937712","chainId":1,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}` -) - -func TestValidateOrderSchema(t *testing.T) { - schema, err := setupOrderSchemaValidator() - require.NoError(t, err) - - testCases := []struct { - input string - expectedErrors []string - }{ - { - input: validSignedOrderJSON, - expectedErrors: []string{}, - }, - { - input: misspelledFieldSignedOrderJSON, - expectedErrors: []string{ - "makerAddress is required", - "Must validate all the schemas (allOf)", - }, - }, - { - input: missingFieldSignedOrderJSON, - expectedErrors: []string{ - "makerAddress is required", - "Must validate all the schemas (allOf)", - }, - }, - { - input: wrongTypeSignedOrderJSON, - expectedErrors: []string{ - "Does not match pattern '^0x[0-9a-fA-F]{40}$'", - "Must validate all the schemas (allOf)", - }, - }, - } - - for _, testCase := range testCases { - orderLoader := gojsonschema.NewStringLoader(testCase.input) - result, err := schema.Validate(orderLoader) - require.NoError(t, err) - expectedIsValid := len(testCase.expectedErrors) == 0 - assert.Equal(t, expectedIsValid, result.Valid()) - errs := result.Errors() - require.Len(t, errs, len(testCase.expectedErrors)) - for i, expectedErr := range testCase.expectedErrors { - assert.Equal(t, expectedErr, errs[i].Description()) - } - } -} diff --git a/dockerfiles/mesh-bootstrap/Dockerfile b/dockerfiles/mesh-bootstrap/Dockerfile index 150867181..242b9d402 100644 --- a/dockerfiles/mesh-bootstrap/Dockerfile +++ b/dockerfiles/mesh-bootstrap/Dockerfile @@ -4,7 +4,7 @@ # # mesh-builder produces a statically linked binary -FROM golang:1.12.13-alpine3.9 as mesh-builder +FROM golang:1.13.4-alpine3.10 as mesh-builder RUN apk update && apk add ca-certificates nodejs-current npm make git dep gcc build-base musl linux-headers diff --git a/dockerfiles/mesh/Dockerfile b/dockerfiles/mesh/Dockerfile index 3b46503d3..a9bc9e7bd 100644 --- a/dockerfiles/mesh/Dockerfile +++ b/dockerfiles/mesh/Dockerfile @@ -4,7 +4,7 @@ # # mesh-builder produces a statically linked binary -FROM golang:1.12.13-alpine3.9 as mesh-builder +FROM golang:1.13.4-alpine3.10 as mesh-builder RUN apk update && apk add ca-certificates nodejs-current npm make git dep gcc build-base musl linux-headers @@ -24,9 +24,12 @@ WORKDIR /usr/mesh COPY --from=mesh-builder /0x-mesh/mesh /usr/mesh/mesh -ENV RPC_ADDR=localhost:60557 +ENV WS_RPC_ADDR=localhost:60557 EXPOSE 60557 +ENV HTTP_RPC_ADDR=localhost:60556 +EXPOSE 60556 + ENV P2P_TCP_PORT=60558 EXPOSE 60558 ENV P2P_WEBSOCKETS_PORT=60559 diff --git a/docs/browser/reference.md b/docs/browser/reference.md index 87aaf1347..ecb0889b6 100644 --- a/docs/browser/reference.md +++ b/docs/browser/reference.md @@ -14,7 +14,7 @@ sending orders through the 0x Mesh network. \+ **new Mesh**(`config`: [Config](#interface-config)): *[Mesh](#class-mesh)* -*Defined in [index.ts:641](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L641)* +*Defined in [index.ts:161](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L161)* Instantiates a new Mesh instance. @@ -34,7 +34,7 @@ An instance of Mesh ▸ **addOrdersAsync**(`orders`: SignedOrder[], `pinned`: boolean): *Promise‹[ValidationResults](#interface-validationresults)›* -*Defined in [index.ts:791](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L791)* +*Defined in [index.ts:311](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L311)* Validates and adds the given orders to Mesh. If an order is successfully added, Mesh will share it with any peers in the network and start @@ -61,7 +61,7 @@ ___ ▸ **getOrdersAsync**(`perPage`: number): *Promise‹[GetOrdersResponse](#interface-getordersresponse)›* -*Defined in [index.ts:720](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L720)* +*Defined in [index.ts:240](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L240)* Get all 0x signed orders currently stored in the Mesh node @@ -81,7 +81,7 @@ ___ ▸ **getOrdersForPageAsync**(`page`: number, `perPage`: number, `snapshotID?`: undefined | string): *Promise‹[GetOrdersResponse](#interface-getordersresponse)›* -*Defined in [index.ts:762](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L762)* +*Defined in [index.ts:282](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L282)* Get page of 0x signed orders stored on the Mesh node at the specified snapshot @@ -103,7 +103,7 @@ ___ ▸ **getStatsAsync**(): *Promise‹[Stats](#interface-stats)›* -*Defined in [index.ts:703](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L703)* +*Defined in [index.ts:223](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L223)* Returns various stats about Mesh, including the total number of orders and the number of peers Mesh is connected to. @@ -116,7 +116,7 @@ ___ ▸ **onError**(`handler`: function): *void* -*Defined in [index.ts:661](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L661)* +*Defined in [index.ts:181](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L181)* Registers a handler which will be called in the event of a critical error. Note that the handler will not be called for non-critical errors. @@ -145,7 +145,7 @@ ___ ▸ **onOrderEvents**(`handler`: function): *void* -*Defined in [index.ts:676](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L676)* +*Defined in [index.ts:196](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L196)* Registers a handler which will be called for any incoming order events. Order events are fired whenver an order is added, canceled, expired, or @@ -174,7 +174,7 @@ ___ ▸ **startAsync**(): *Promise‹void›* -*Defined in [index.ts:687](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L687)* +*Defined in [index.ts:207](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/index.ts#L207)* Starts the Mesh node in the background. Mesh will automatically find peers in the network and begin receiving orders from them. @@ -182,6 +182,116 @@ peers in the network and begin receiving orders from them. **Returns:** *Promise‹void›* +
+ +# Enumeration: ContractEventKind + + +### Enumeration members + +## ERC1155ApprovalForAllEvent + +• **ERC1155ApprovalForAllEvent**: = "ERC1155ApprovalForAllEvent" + +*Defined in [types.ts:444](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L444)* + +___ + +## ERC1155TransferBatchEvent + +• **ERC1155TransferBatchEvent**: = "ERC1155TransferBatchEvent" + +*Defined in [types.ts:446](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L446)* + +___ + +## ERC1155TransferSingleEvent + +• **ERC1155TransferSingleEvent**: = "ERC1155TransferSingleEvent" + +*Defined in [types.ts:445](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L445)* + +___ + +## ERC20ApprovalEvent + +• **ERC20ApprovalEvent**: = "ERC20ApprovalEvent" + +*Defined in [types.ts:440](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L440)* + +___ + +## ERC20TransferEvent + +• **ERC20TransferEvent**: = "ERC20TransferEvent" + +*Defined in [types.ts:439](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L439)* + +___ + +## ERC721ApprovalEvent + +• **ERC721ApprovalEvent**: = "ERC721ApprovalEvent" + +*Defined in [types.ts:442](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L442)* + +___ + +## ERC721ApprovalForAllEvent + +• **ERC721ApprovalForAllEvent**: = "ERC721ApprovalForAllEvent" + +*Defined in [types.ts:443](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L443)* + +___ + +## ERC721TransferEvent + +• **ERC721TransferEvent**: = "ERC721TransferEvent" + +*Defined in [types.ts:441](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L441)* + +___ + +## ExchangeCancelEvent + +• **ExchangeCancelEvent**: = "ExchangeCancelEvent" + +*Defined in [types.ts:448](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L448)* + +___ + +## ExchangeCancelUpToEvent + +• **ExchangeCancelUpToEvent**: = "ExchangeCancelUpToEvent" + +*Defined in [types.ts:449](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L449)* + +___ + +## ExchangeFillEvent + +• **ExchangeFillEvent**: = "ExchangeFillEvent" + +*Defined in [types.ts:447](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L447)* + +___ + +## WethDepositEvent + +• **WethDepositEvent**: = "WethDepositEvent" + +*Defined in [types.ts:450](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L450)* + +___ + +## WethWithdrawalEvent + +• **WethWithdrawalEvent**: = "WethWithdrawalEvent" + +*Defined in [types.ts:451](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L451)* + +
# Enumeration: OrderEventEndState @@ -193,7 +303,7 @@ peers in the network and begin receiving orders from them. • **Added**: = "ADDED" -*Defined in [index.ts:504](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L504)* +*Defined in [types.ts:509](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L509)* ___ @@ -201,7 +311,7 @@ ___ • **Cancelled**: = "CANCELLED" -*Defined in [index.ts:507](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L507)* +*Defined in [types.ts:512](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L512)* ___ @@ -209,7 +319,7 @@ ___ • **Expired**: = "EXPIRED" -*Defined in [index.ts:508](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L508)* +*Defined in [types.ts:513](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L513)* ___ @@ -217,7 +327,7 @@ ___ • **FillabilityIncreased**: = "FILLABILITY_INCREASED" -*Defined in [index.ts:511](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L511)* +*Defined in [types.ts:516](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L516)* ___ @@ -225,7 +335,7 @@ ___ • **Filled**: = "FILLED" -*Defined in [index.ts:505](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L505)* +*Defined in [types.ts:510](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L510)* ___ @@ -233,7 +343,7 @@ ___ • **FullyFilled**: = "FULLY_FILLED" -*Defined in [index.ts:506](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L506)* +*Defined in [types.ts:511](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L511)* ___ @@ -241,7 +351,7 @@ ___ • **Invalid**: = "INVALID" -*Defined in [index.ts:503](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L503)* +*Defined in [types.ts:508](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L508)* ___ @@ -249,7 +359,7 @@ ___ • **StoppedWatching**: = "STOPPED_WATCHING" -*Defined in [index.ts:512](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L512)* +*Defined in [types.ts:517](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L517)* ___ @@ -257,7 +367,7 @@ ___ • **Unexpired**: = "UNEXPIRED" -*Defined in [index.ts:509](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L509)* +*Defined in [types.ts:514](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L514)* ___ @@ -265,7 +375,7 @@ ___ • **Unfunded**: = "UNFUNDED" -*Defined in [index.ts:510](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L510)* +*Defined in [types.ts:515](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L515)*
@@ -281,7 +391,7 @@ A set of categories for rejected orders. • **CoordinatorError**: = "COORDINATOR_ERROR" -*Defined in [index.ts:595](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L595)* +*Defined in [types.ts:600](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L600)* ___ @@ -289,7 +399,7 @@ ___ • **MeshError**: = "MESH_ERROR" -*Defined in [index.ts:593](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L593)* +*Defined in [types.ts:598](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L598)* ___ @@ -297,7 +407,7 @@ ___ • **MeshValidation**: = "MESH_VALIDATION" -*Defined in [index.ts:594](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L594)* +*Defined in [types.ts:599](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L599)* ___ @@ -305,7 +415,7 @@ ___ • **ZeroExValidation**: = "ZEROEX_VALIDATION" -*Defined in [index.ts:592](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L592)* +*Defined in [types.ts:597](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L597)*
@@ -319,7 +429,7 @@ ___ • **Debug**: = 5 -*Defined in [index.ts:212](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L212)* +*Defined in [types.ts:209](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L209)* ___ @@ -327,7 +437,7 @@ ___ • **Error**: = 2 -*Defined in [index.ts:209](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L209)* +*Defined in [types.ts:206](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L206)* ___ @@ -335,7 +445,7 @@ ___ • **Fatal**: = 1 -*Defined in [index.ts:208](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L208)* +*Defined in [types.ts:205](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L205)* ___ @@ -343,7 +453,7 @@ ___ • **Info**: = 4 -*Defined in [index.ts:211](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L211)* +*Defined in [types.ts:208](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L208)* ___ @@ -351,7 +461,7 @@ ___ • **Panic**: = 0 -*Defined in [index.ts:207](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L207)* +*Defined in [types.ts:204](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L204)* ___ @@ -359,7 +469,7 @@ ___ • **Trace**: = 6 -*Defined in [index.ts:213](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L213)* +*Defined in [types.ts:210](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L210)* ___ @@ -367,7 +477,7 @@ ___ • **Warn**: = 3 -*Defined in [index.ts:210](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L210)* +*Defined in [types.ts:207](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L207)*
@@ -387,7 +497,7 @@ Info for any orders that were accepted. • **fillableTakerAssetAmount**: *BigNumber* -*Defined in [index.ts:573](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L573)* +*Defined in [types.ts:578](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L578)* ___ @@ -395,7 +505,7 @@ ___ • **isNew**: *boolean* -*Defined in [index.ts:574](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L574)* +*Defined in [types.ts:579](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L579)* ___ @@ -403,7 +513,7 @@ ___ • **orderHash**: *string* -*Defined in [index.ts:571](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L571)* +*Defined in [types.ts:576](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L576)* ___ @@ -411,7 +521,7 @@ ___ • **signedOrder**: *SignedOrder* -*Defined in [index.ts:572](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L572)* +*Defined in [types.ts:577](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L577)*
@@ -431,7 +541,7 @@ A set of configuration options for Mesh. • **blockPollingIntervalSeconds**? : *undefined | number* -*Defined in [index.ts:79](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L79)* +*Defined in [types.ts:116](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L116)* ___ @@ -439,15 +549,23 @@ ___ • **bootstrapList**? : *string[]* -*Defined in [index.ts:72](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L72)* +*Defined in [types.ts:109](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L109)* ___ ## `Optional` customContractAddresses -• **customContractAddresses**? : *[ContractAddresses](#class-contractaddresses)* +• **customContractAddresses**? : *[ContractAddresses](#interface-contractaddresses)* + +*Defined in [types.ts:160](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L160)* + +___ + +## `Optional` customOrderFilter -*Defined in [index.ts:123](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L123)* +• **customOrderFilter**? : *[JsonSchema](#interface-jsonschema)* + +*Defined in [types.ts:185](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L185)* ___ @@ -455,7 +573,7 @@ ___ • **enableEthereumRPCRateLimiting**? : *undefined | false | true* -*Defined in [index.ts:96](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L96)* +*Defined in [types.ts:133](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L133)* ___ @@ -463,7 +581,7 @@ ___ • **ethereumChainID**: *number* -*Defined in [index.ts:64](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L64)* +*Defined in [types.ts:101](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L101)* ___ @@ -471,7 +589,7 @@ ___ • **ethereumRPCMaxContentLength**? : *undefined | number* -*Defined in [index.ts:88](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L88)* +*Defined in [types.ts:125](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L125)* ___ @@ -479,7 +597,7 @@ ___ • **ethereumRPCMaxRequestsPer24HrUTC**? : *undefined | number* -*Defined in [index.ts:101](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L101)* +*Defined in [types.ts:138](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L138)* ___ @@ -487,15 +605,15 @@ ___ • **ethereumRPCMaxRequestsPerSecond**? : *undefined | number* -*Defined in [index.ts:107](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L107)* +*Defined in [types.ts:144](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L144)* ___ -## ethereumRPCURL +## `Optional` ethereumRPCURL -• **ethereumRPCURL**: *string* +• **ethereumRPCURL**? : *undefined | string* -*Defined in [index.ts:61](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L61)* +*Defined in [types.ts:98](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L98)* ___ @@ -503,7 +621,7 @@ ___ • **maxOrdersInStorage**? : *undefined | number* -*Defined in [index.ts:128](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L128)* +*Defined in [types.ts:165](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L165)* ___ @@ -511,7 +629,7 @@ ___ • **useBootstrapList**? : *undefined | false | true* -*Defined in [index.ts:67](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L67)* +*Defined in [types.ts:104](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L104)* ___ @@ -519,7 +637,15 @@ ___ • **verbosity**? : *[Verbosity](#enumeration-verbosity)* -*Defined in [index.ts:58](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L58)* +*Defined in [types.ts:95](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L95)* + +___ + +## `Optional` web3Provider + +• **web3Provider**? : *SupportedProvider* + +*Defined in [types.ts:188](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L188)*
@@ -537,7 +663,7 @@ ___ • **coordinator**? : *undefined | string* -*Defined in [index.ts:137](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L137)* +*Defined in [types.ts:197](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L197)* ___ @@ -545,7 +671,7 @@ ___ • **coordinatorRegistry**? : *undefined | string* -*Defined in [index.ts:138](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L138)* +*Defined in [types.ts:198](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L198)* ___ @@ -553,7 +679,7 @@ ___ • **devUtils**: *string* -*Defined in [index.ts:133](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L133)* +*Defined in [types.ts:193](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L193)* ___ @@ -561,7 +687,7 @@ ___ • **erc1155Proxy**: *string* -*Defined in [index.ts:136](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L136)* +*Defined in [types.ts:196](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L196)* ___ @@ -569,7 +695,7 @@ ___ • **erc20Proxy**: *string* -*Defined in [index.ts:134](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L134)* +*Defined in [types.ts:194](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L194)* ___ @@ -577,7 +703,7 @@ ___ • **erc721Proxy**: *string* -*Defined in [index.ts:135](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L135)* +*Defined in [types.ts:195](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L195)* ___ @@ -585,7 +711,7 @@ ___ • **exchange**: *string* -*Defined in [index.ts:132](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L132)* +*Defined in [types.ts:192](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L192)* ___ @@ -593,7 +719,7 @@ ___ • **weth9**? : *undefined | string* -*Defined in [index.ts:139](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L139)* +*Defined in [types.ts:199](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L199)* ___ @@ -601,7 +727,7 @@ ___ • **zrxToken**? : *undefined | string* -*Defined in [index.ts:140](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L140)* +*Defined in [types.ts:200](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L200)*
@@ -619,7 +745,7 @@ ___ • **address**: *string* -*Defined in [index.ts:485](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L485)* +*Defined in [types.ts:490](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L490)* ___ @@ -627,23 +753,23 @@ ___ • **blockHash**: *string* -*Defined in [index.ts:480](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L480)* +*Defined in [types.ts:485](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L485)* ___ ## isRemoved -• **isRemoved**: *string* +• **isRemoved**: *boolean* -*Defined in [index.ts:484](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L484)* +*Defined in [types.ts:489](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L489)* ___ ## kind -• **kind**: *ContractEventKind* +• **kind**: *[ContractEventKind](#enumeration-contracteventkind)* -*Defined in [index.ts:486](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L486)* +*Defined in [types.ts:491](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L491)* ___ @@ -651,15 +777,15 @@ ___ • **logIndex**: *number* -*Defined in [index.ts:483](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L483)* +*Defined in [types.ts:488](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L488)* ___ ## parameters -• **parameters**: *ContractEventParameters* +• **parameters**: *[ContractEventParameters](#contracteventparameters)* -*Defined in [index.ts:487](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L487)* +*Defined in [types.ts:492](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L492)* ___ @@ -667,7 +793,7 @@ ___ • **txHash**: *string* -*Defined in [index.ts:481](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L481)* +*Defined in [types.ts:486](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L486)* ___ @@ -675,7 +801,7 @@ ___ • **txIndex**: *number* -*Defined in [index.ts:482](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L482)* +*Defined in [types.ts:487](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L487)*
@@ -693,7 +819,7 @@ ___ • **approved**: *boolean* -*Defined in [index.ts:361](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L361)* +*Defined in [types.ts:360](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L360)* ___ @@ -701,7 +827,7 @@ ___ • **operator**: *string* -*Defined in [index.ts:360](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L360)* +*Defined in [types.ts:359](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L359)* ___ @@ -709,7 +835,7 @@ ___ • **owner**: *string* -*Defined in [index.ts:359](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L359)* +*Defined in [types.ts:358](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L358)*
@@ -727,7 +853,7 @@ ___ • **from**: *string* -*Defined in [index.ts:344](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L344)* +*Defined in [types.ts:343](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L343)* ___ @@ -735,7 +861,7 @@ ___ • **ids**: *BigNumber[]* -*Defined in [index.ts:346](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L346)* +*Defined in [types.ts:345](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L345)* ___ @@ -743,7 +869,7 @@ ___ • **operator**: *string* -*Defined in [index.ts:343](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L343)* +*Defined in [types.ts:342](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L342)* ___ @@ -751,7 +877,7 @@ ___ • **to**: *string* -*Defined in [index.ts:345](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L345)* +*Defined in [types.ts:344](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L344)* ___ @@ -759,7 +885,7 @@ ___ • **values**: *BigNumber[]* -*Defined in [index.ts:347](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L347)* +*Defined in [types.ts:346](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L346)*
@@ -777,7 +903,7 @@ ___ • **from**: *string* -*Defined in [index.ts:328](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L328)* +*Defined in [types.ts:327](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L327)* ___ @@ -785,7 +911,7 @@ ___ • **id**: *BigNumber* -*Defined in [index.ts:330](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L330)* +*Defined in [types.ts:329](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L329)* ___ @@ -793,7 +919,7 @@ ___ • **operator**: *string* -*Defined in [index.ts:327](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L327)* +*Defined in [types.ts:326](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L326)* ___ @@ -801,7 +927,7 @@ ___ • **to**: *string* -*Defined in [index.ts:329](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L329)* +*Defined in [types.ts:328](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L328)* ___ @@ -809,7 +935,7 @@ ___ • **value**: *BigNumber* -*Defined in [index.ts:331](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L331)* +*Defined in [types.ts:330](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L330)*
@@ -827,7 +953,7 @@ ___ • **owner**: *string* -*Defined in [index.ts:285](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L285)* +*Defined in [types.ts:284](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L284)* ___ @@ -835,7 +961,7 @@ ___ • **spender**: *string* -*Defined in [index.ts:286](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L286)* +*Defined in [types.ts:285](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L285)* ___ @@ -843,7 +969,7 @@ ___ • **value**: *BigNumber* -*Defined in [index.ts:287](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L287)* +*Defined in [types.ts:286](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L286)*
@@ -861,7 +987,7 @@ ___ • **from**: *string* -*Defined in [index.ts:273](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L273)* +*Defined in [types.ts:272](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L272)* ___ @@ -869,7 +995,7 @@ ___ • **to**: *string* -*Defined in [index.ts:274](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L274)* +*Defined in [types.ts:273](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L273)* ___ @@ -877,7 +1003,7 @@ ___ • **value**: *BigNumber* -*Defined in [index.ts:275](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L275)* +*Defined in [types.ts:274](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L274)*
@@ -895,7 +1021,7 @@ ___ • **approved**: *string* -*Defined in [index.ts:310](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L310)* +*Defined in [types.ts:309](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L309)* ___ @@ -903,7 +1029,7 @@ ___ • **owner**: *string* -*Defined in [index.ts:309](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L309)* +*Defined in [types.ts:308](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L308)* ___ @@ -911,7 +1037,7 @@ ___ • **tokenId**: *BigNumber* -*Defined in [index.ts:311](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L311)* +*Defined in [types.ts:310](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L310)*
@@ -929,7 +1055,7 @@ ___ • **approved**: *boolean* -*Defined in [index.ts:323](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L323)* +*Defined in [types.ts:322](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L322)* ___ @@ -937,7 +1063,7 @@ ___ • **operator**: *string* -*Defined in [index.ts:322](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L322)* +*Defined in [types.ts:321](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L321)* ___ @@ -945,7 +1071,7 @@ ___ • **owner**: *string* -*Defined in [index.ts:321](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L321)* +*Defined in [types.ts:320](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L320)*
@@ -963,7 +1089,7 @@ ___ • **from**: *string* -*Defined in [index.ts:297](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L297)* +*Defined in [types.ts:296](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L296)* ___ @@ -971,7 +1097,7 @@ ___ • **to**: *string* -*Defined in [index.ts:298](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L298)* +*Defined in [types.ts:297](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L297)* ___ @@ -979,7 +1105,7 @@ ___ • **tokenId**: *BigNumber* -*Defined in [index.ts:299](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L299)* +*Defined in [types.ts:298](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L298)*
@@ -997,7 +1123,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [index.ts:395](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L395)* +*Defined in [types.ts:400](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L400)* ___ @@ -1005,7 +1131,7 @@ ___ • **makerAddress**: *string* -*Defined in [index.ts:393](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L393)* +*Defined in [types.ts:398](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L398)* ___ @@ -1013,7 +1139,7 @@ ___ • **makerAssetData**: *string* -*Defined in [index.ts:397](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L397)* +*Defined in [types.ts:402](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L402)* ___ @@ -1021,7 +1147,7 @@ ___ • **orderHash**: *string* -*Defined in [index.ts:396](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L396)* +*Defined in [types.ts:401](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L401)* ___ @@ -1029,7 +1155,7 @@ ___ • **senderAddress**: *string* -*Defined in [index.ts:394](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L394)* +*Defined in [types.ts:399](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L399)* ___ @@ -1037,7 +1163,7 @@ ___ • **takerAssetData**: *string* -*Defined in [index.ts:398](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L398)* +*Defined in [types.ts:403](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L403)*
@@ -1055,7 +1181,7 @@ ___ • **makerAddress**: *string* -*Defined in [index.ts:402](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L402)* +*Defined in [types.ts:407](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L407)* ___ @@ -1063,15 +1189,15 @@ ___ • **orderEpoch**: *BigNumber* -*Defined in [index.ts:404](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L404)* +*Defined in [types.ts:409](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L409)* ___ -## senderAddress +## orderSenderAddress -• **senderAddress**: *string* +• **orderSenderAddress**: *string* -*Defined in [index.ts:403](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L403)* +*Defined in [types.ts:408](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L408)*
@@ -1089,7 +1215,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [index.ts:368](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L368)* +*Defined in [types.ts:367](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L367)* ___ @@ -1097,7 +1223,7 @@ ___ • **makerAddress**: *string* -*Defined in [index.ts:365](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L365)* +*Defined in [types.ts:364](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L364)* ___ @@ -1105,7 +1231,7 @@ ___ • **makerAssetData**: *string* -*Defined in [index.ts:374](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L374)* +*Defined in [types.ts:374](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L374)* ___ @@ -1113,7 +1239,15 @@ ___ • **makerAssetFilledAmount**: *BigNumber* -*Defined in [index.ts:369](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L369)* +*Defined in [types.ts:368](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L368)* + +___ + +## makerFeeAssetData + +• **makerFeeAssetData**: *string* + +*Defined in [types.ts:376](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L376)* ___ @@ -1121,7 +1255,7 @@ ___ • **makerFeePaid**: *BigNumber* -*Defined in [index.ts:371](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L371)* +*Defined in [types.ts:370](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L370)* ___ @@ -1129,7 +1263,15 @@ ___ • **orderHash**: *string* -*Defined in [index.ts:373](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L373)* +*Defined in [types.ts:373](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L373)* + +___ + +## protocolFeePaid + +• **protocolFeePaid**: *BigNumber* + +*Defined in [types.ts:372](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L372)* ___ @@ -1137,7 +1279,7 @@ ___ • **senderAddress**: *string* -*Defined in [index.ts:367](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L367)* +*Defined in [types.ts:366](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L366)* ___ @@ -1145,7 +1287,7 @@ ___ • **takerAddress**: *string* -*Defined in [index.ts:366](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L366)* +*Defined in [types.ts:365](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L365)* ___ @@ -1153,7 +1295,7 @@ ___ • **takerAssetData**: *string* -*Defined in [index.ts:375](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L375)* +*Defined in [types.ts:375](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L375)* ___ @@ -1161,7 +1303,15 @@ ___ • **takerAssetFilledAmount**: *BigNumber* -*Defined in [index.ts:370](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L370)* +*Defined in [types.ts:369](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L369)* + +___ + +## takerFeeAssetData + +• **takerFeeAssetData**: *string* + +*Defined in [types.ts:377](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L377)* ___ @@ -1169,7 +1319,7 @@ ___ • **takerFeePaid**: *BigNumber* -*Defined in [index.ts:372](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L372)* +*Defined in [types.ts:371](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L371)*
@@ -1185,9 +1335,9 @@ ___ ## ordersInfos -• **ordersInfos**: *[OrderInfo](#class-orderinfo)[]* +• **ordersInfos**: *[OrderInfo](#interface-orderinfo)[]* -*Defined in [index.ts:203](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L203)* +*Defined in [types.ts:18](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L18)* ___ @@ -1195,7 +1345,7 @@ ___ • **snapshotID**: *string* -*Defined in [index.ts:201](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L201)* +*Defined in [types.ts:16](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L16)* ___ @@ -1203,403 +1353,1966 @@ ___ • **snapshotTimestamp**: *number* -*Defined in [index.ts:202](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L202)* +*Defined in [types.ts:17](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L17)*
-# Interface: LatestBlock +# Interface: JsonSchema + +An interface for JSON schema types, which are used for custom order filters. ### Hierarchy -* **LatestBlock** +* **JsonSchema** ### Properties -## hash +## `Optional` $ref -• **hash**: *string* +• **$ref**? : *undefined | string* -*Defined in [index.ts:145](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L145)* +*Defined in [types.ts:39](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L39)* ___ -## number - -• **number**: *number* - -*Defined in [index.ts:144](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L144)* - - -
- -# Interface: OrderEvent - -Order events are fired by Mesh whenever an order is added, canceled, expired, -or filled. - -### Hierarchy - -* **OrderEvent** - - -### Properties - -## contractEvents +## `Optional` $schema -• **contractEvents**: *[ContractEvent](#class-contractevent)[]* +• **$schema**? : *undefined | string* -*Defined in [index.ts:534](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L534)* +*Defined in [types.ts:38](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L38)* ___ -## endState +## `Optional` additionalItems -• **endState**: *[OrderEventEndState](#enumeration-ordereventendstate)* +• **additionalItems**? : *boolean | [JsonSchema](#interface-jsonschema)* -*Defined in [index.ts:532](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L532)* +*Defined in [types.ts:50](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L50)* ___ -## fillableTakerAssetAmount +## `Optional` additionalProperties -• **fillableTakerAssetAmount**: *BigNumber* +• **additionalProperties**? : *boolean | [JsonSchema](#interface-jsonschema)* -*Defined in [index.ts:533](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L533)* +*Defined in [types.ts:58](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L58)* ___ -## orderHash +## `Optional` allOf -• **orderHash**: *string* +• **allOf**? : *[JsonSchema](#interface-jsonschema)[]* -*Defined in [index.ts:530](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L530)* +*Defined in [types.ts:80](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L80)* ___ -## signedOrder +## `Optional` anyOf -• **signedOrder**: *SignedOrder* +• **anyOf**? : *[JsonSchema](#interface-jsonschema)[]* -*Defined in [index.ts:531](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L531)* +*Defined in [types.ts:81](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L81)* ___ -## timestampMs - -• **timestampMs**: *number* - -*Defined in [index.ts:529](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L529)* +## `Optional` const +• **const**? : *any* -
+*Defined in [types.ts:77](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L77)* -# Interface: OrderInfo +___ -### Hierarchy +## `Optional` definitions -* **OrderInfo** +• **definitions**? : *undefined | object* +*Defined in [types.ts:59](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L59)* -### Properties +___ -## fillableTakerAssetAmount +## `Optional` dependencies -• **fillableTakerAssetAmount**: *BigNumber* +• **dependencies**? : *undefined | object* -*Defined in [index.ts:191](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L191)* +*Defined in [types.ts:68](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L68)* ___ -## orderHash +## `Optional` description -• **orderHash**: *string* +• **description**? : *undefined | string* -*Defined in [index.ts:189](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L189)* +*Defined in [types.ts:41](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L41)* ___ -## signedOrder - -• **signedOrder**: *SignedOrder* - -*Defined in [index.ts:190](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L190)* +## `Optional` enum +• **enum**? : *any[]* -
- -# Interface: RejectedOrderInfo +*Defined in [types.ts:71](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L71)* -Info for any orders that were rejected, including the reason they were -rejected. +___ -### Hierarchy +## `Optional` exclusiveMaximum -* **RejectedOrderInfo** +• **exclusiveMaximum**? : *undefined | false | true* +*Defined in [types.ts:44](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L44)* -### Properties +___ -## kind +## `Optional` exclusiveMinimum -• **kind**: *[RejectedOrderKind](#enumeration-rejectedorderkind)* +• **exclusiveMinimum**? : *undefined | false | true* -*Defined in [index.ts:584](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L584)* +*Defined in [types.ts:46](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L46)* ___ -## orderHash +## `Optional` format -• **orderHash**: *string* +• **format**? : *undefined | string* -*Defined in [index.ts:582](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L582)* +*Defined in [types.ts:79](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L79)* ___ -## signedOrder +## `Optional` id -• **signedOrder**: *SignedOrder* +• **id**? : *undefined | string* -*Defined in [index.ts:583](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L583)* +*Defined in [types.ts:37](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L37)* ___ -## status - -• **status**: *[RejectedOrderStatus](#class-rejectedorderstatus)* +## `Optional` items -*Defined in [index.ts:585](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L585)* +• **items**? : *[JsonSchema](#interface-jsonschema) | [JsonSchema](#interface-jsonschema)[]* +*Defined in [types.ts:51](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L51)* -
- -# Interface: RejectedOrderStatus - -Provides more information about why an order was rejected. +___ -### Hierarchy +## `Optional` maxItems -* **RejectedOrderStatus** +• **maxItems**? : *undefined | number* +*Defined in [types.ts:52](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L52)* -### Properties +___ -## code +## `Optional` maxLength -• **code**: *string* +• **maxLength**? : *undefined | number* -*Defined in [index.ts:602](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L602)* +*Defined in [types.ts:47](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L47)* ___ -## message - -• **message**: *string* - -*Defined in [index.ts:603](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L603)* +## `Optional` maxProperties +• **maxProperties**? : *undefined | number* -
+*Defined in [types.ts:55](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L55)* -# Interface: Stats +___ -### Hierarchy +## `Optional` maximum -* **Stats** +• **maximum**? : *undefined | number* +*Defined in [types.ts:43](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L43)* -### Properties +___ -## ethRPCRateLimitExpiredRequests +## `Optional` minItems -• **ethRPCRateLimitExpiredRequests**: *number* +• **minItems**? : *undefined | number* -*Defined in [index.ts:179](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L179)* +*Defined in [types.ts:53](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L53)* ___ -## ethRPCRequestsSentInCurrentUTCDay +## `Optional` minLength -• **ethRPCRequestsSentInCurrentUTCDay**: *number* +• **minLength**? : *undefined | number* -*Defined in [index.ts:178](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L178)* +*Defined in [types.ts:48](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L48)* ___ -## ethereumChainID +## `Optional` minProperties -• **ethereumChainID**: *number* +• **minProperties**? : *undefined | number* -*Defined in [index.ts:170](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L170)* +*Defined in [types.ts:56](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L56)* ___ -## latestBlock +## `Optional` minimum -• **latestBlock**: *[LatestBlock](#class-latestblock)* +• **minimum**? : *undefined | number* -*Defined in [index.ts:171](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L171)* +*Defined in [types.ts:45](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L45)* ___ -## maxExpirationTime +## `Optional` multipleOf -• **maxExpirationTime**: *BigNumber* +• **multipleOf**? : *undefined | number* -*Defined in [index.ts:176](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L176)* +*Defined in [types.ts:42](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L42)* ___ -## numOrders +## `Optional` not -• **numOrders**: *number* +• **not**? : *[JsonSchema](#interface-jsonschema)* -*Defined in [index.ts:173](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L173)* +*Defined in [types.ts:83](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L83)* ___ -## numOrdersIncludingRemoved +## `Optional` oneOf -• **numOrdersIncludingRemoved**: *number* +• **oneOf**? : *[JsonSchema](#interface-jsonschema)[]* -*Defined in [index.ts:174](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L174)* +*Defined in [types.ts:82](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L82)* ___ -## numPeers +## `Optional` pattern -• **numPeers**: *number* +• **pattern**? : *string | RegExp* -*Defined in [index.ts:172](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L172)* +*Defined in [types.ts:49](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L49)* ___ -## numPinnedOrders +## `Optional` patternProperties -• **numPinnedOrders**: *number* +• **patternProperties**? : *undefined | object* -*Defined in [index.ts:175](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L175)* +*Defined in [types.ts:65](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L65)* ___ -## peerID +## `Optional` properties -• **peerID**: *string* +• **properties**? : *undefined | object* -*Defined in [index.ts:169](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L169)* +*Defined in [types.ts:62](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L62)* ___ -## pubSubTopic +## `Optional` required -• **pubSubTopic**: *string* +• **required**? : *string[]* -*Defined in [index.ts:167](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L167)* +*Defined in [types.ts:57](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L57)* ___ -## rendezvous +## `Optional` title -• **rendezvous**: *string* +• **title**? : *undefined | string* -*Defined in [index.ts:168](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L168)* +*Defined in [types.ts:40](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L40)* ___ -## startOfCurrentUTCDay +## `Optional` type -• **startOfCurrentUTCDay**: *Date* +• **type**? : *string | string[]* -*Defined in [index.ts:177](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L177)* +*Defined in [types.ts:78](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L78)* ___ -## version +## `Optional` uniqueItems -• **version**: *string* +• **uniqueItems**? : *undefined | false | true* -*Defined in [index.ts:166](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L166)* +*Defined in [types.ts:54](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L54)*
-# Interface: ValidationResults - -Indicates which orders where accepted, which were rejected, and why. +# Interface: LatestBlock ### Hierarchy -* **ValidationResults** +* **LatestBlock** ### Properties -## accepted +## hash -• **accepted**: *[AcceptedOrderInfo](#class-acceptedorderinfo)[]* +• **hash**: *string* -*Defined in [index.ts:563](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L563)* +*Defined in [types.ts:613](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L613)* ___ -## rejected +## number -• **rejected**: *[RejectedOrderInfo](#class-rejectedorderinfo)[]* +• **number**: *number* -*Defined in [index.ts:564](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L564)* +*Defined in [types.ts:612](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L612)*
-# Interface: WethDepositEvent +# Interface: MeshWrapper ### Hierarchy -* **WethDepositEvent** +* **MeshWrapper** -### Properties +### Methods -## owner +## addOrdersAsync -• **owner**: *string* +▸ **addOrdersAsync**(`orders`: [WrapperSignedOrder](#interface-wrappersignedorder)[], `pinned`: boolean): *Promise‹[WrapperValidationResults](#interface-wrappervalidationresults)›* -*Defined in [index.ts:424](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L424)* +*Defined in [types.ts:227](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L227)* -___ +**Parameters:** -## value +Name | Type | +------ | ------ | +`orders` | [WrapperSignedOrder](#interface-wrappersignedorder)[] | +`pinned` | boolean | -• **value**: *BigNumber* +**Returns:** *Promise‹[WrapperValidationResults](#interface-wrappervalidationresults)›* -*Defined in [index.ts:425](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L425)* +___ +## getOrdersForPageAsync -
+▸ **getOrdersForPageAsync**(`page`: number, `perPage`: number, `snapshotID?`: undefined | string): *Promise‹[WrapperGetOrdersResponse](#interface-wrappergetordersresponse)›* -# Interface: WethWithdrawalEvent +*Defined in [types.ts:226](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L226)* -### Hierarchy +**Parameters:** -* **WethWithdrawalEvent** +Name | Type | +------ | ------ | +`page` | number | +`perPage` | number | +`snapshotID?` | undefined | string | +**Returns:** *Promise‹[WrapperGetOrdersResponse](#interface-wrappergetordersresponse)›* -### Properties +___ -## owner +## getStatsAsync + +▸ **getStatsAsync**(): *Promise‹[WrapperStats](#interface-wrapperstats)›* + +*Defined in [types.ts:225](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L225)* + +**Returns:** *Promise‹[WrapperStats](#interface-wrapperstats)›* + +___ + +## onError + +▸ **onError**(`handler`: function): *void* + +*Defined in [types.ts:223](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L223)* + +**Parameters:** + +▪ **handler**: *function* + +▸ (`err`: Error): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`err` | Error | + +**Returns:** *void* + +___ + +## onOrderEvents + +▸ **onOrderEvents**(`handler`: function): *void* + +*Defined in [types.ts:224](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L224)* + +**Parameters:** + +▪ **handler**: *function* + +▸ (`events`: [WrapperOrderEvent](#interface-wrapperorderevent)[]): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`events` | [WrapperOrderEvent](#interface-wrapperorderevent)[] | + +**Returns:** *void* + +___ + +## startAsync + +▸ **startAsync**(): *Promise‹void›* + +*Defined in [types.ts:222](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L222)* + +**Returns:** *Promise‹void›* + + +
+ +# Interface: OrderEvent + +Order events are fired by Mesh whenever an order is added, canceled, expired, +or filled. + +### Hierarchy + +* **OrderEvent** + + +### Properties + +## contractEvents + +• **contractEvents**: *[ContractEvent](#interface-contractevent)[]* + +*Defined in [types.ts:539](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L539)* + +___ + +## endState + +• **endState**: *[OrderEventEndState](#enumeration-ordereventendstate)* + +*Defined in [types.ts:537](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L537)* + +___ + +## fillableTakerAssetAmount + +• **fillableTakerAssetAmount**: *BigNumber* + +*Defined in [types.ts:538](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L538)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:535](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L535)* + +___ + +## signedOrder + +• **signedOrder**: *SignedOrder* + +*Defined in [types.ts:536](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L536)* + +___ + +## timestampMs + +• **timestampMs**: *number* + +*Defined in [types.ts:534](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L534)* + + +
+ +# Interface: OrderInfo + +### Hierarchy + +* **OrderInfo** + + +### Properties + +## fillableTakerAssetAmount + +• **fillableTakerAssetAmount**: *BigNumber* + +*Defined in [types.ts:30](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L30)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:28](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L28)* + +___ + +## signedOrder + +• **signedOrder**: *SignedOrder* + +*Defined in [types.ts:29](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L29)* + + +
+ +# Interface: RejectedOrderInfo + +Info for any orders that were rejected, including the reason they were +rejected. + +### Hierarchy + +* **RejectedOrderInfo** + + +### Properties + +## kind + +• **kind**: *[RejectedOrderKind](#enumeration-rejectedorderkind)* + +*Defined in [types.ts:589](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L589)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:587](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L587)* + +___ + +## signedOrder + +• **signedOrder**: *SignedOrder* + +*Defined in [types.ts:588](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L588)* + +___ + +## status + +• **status**: *[RejectedOrderStatus](#interface-rejectedorderstatus)* + +*Defined in [types.ts:590](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L590)* + + +
+ +# Interface: RejectedOrderStatus + +Provides more information about why an order was rejected. + +### Hierarchy + +* **RejectedOrderStatus** + + +### Properties + +## code + +• **code**: *string* + +*Defined in [types.ts:607](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L607)* + +___ + +## message + +• **message**: *string* + +*Defined in [types.ts:608](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L608)* + + +
+ +# Interface: Stats + +### Hierarchy + +* **Stats** + + +### Properties + +## ethRPCRateLimitExpiredRequests + +• **ethRPCRateLimitExpiredRequests**: *number* + +*Defined in [types.ts:647](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L647)* + +___ + +## ethRPCRequestsSentInCurrentUTCDay + +• **ethRPCRequestsSentInCurrentUTCDay**: *number* + +*Defined in [types.ts:646](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L646)* + +___ + +## ethereumChainID + +• **ethereumChainID**: *number* + +*Defined in [types.ts:638](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L638)* + +___ + +## latestBlock + +• **latestBlock**: *[LatestBlock](#interface-latestblock)* + +*Defined in [types.ts:639](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L639)* + +___ + +## maxExpirationTime + +• **maxExpirationTime**: *BigNumber* + +*Defined in [types.ts:644](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L644)* + +___ + +## numOrders + +• **numOrders**: *number* + +*Defined in [types.ts:641](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L641)* + +___ + +## numOrdersIncludingRemoved + +• **numOrdersIncludingRemoved**: *number* + +*Defined in [types.ts:642](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L642)* + +___ + +## numPeers + +• **numPeers**: *number* + +*Defined in [types.ts:640](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L640)* + +___ + +## numPinnedOrders + +• **numPinnedOrders**: *number* + +*Defined in [types.ts:643](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L643)* + +___ + +## peerID + +• **peerID**: *string* + +*Defined in [types.ts:637](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L637)* + +___ + +## pubSubTopic + +• **pubSubTopic**: *string* + +*Defined in [types.ts:635](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L635)* + +___ + +## rendezvous + +• **rendezvous**: *string* + +*Defined in [types.ts:636](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L636)* + +___ + +## startOfCurrentUTCDay + +• **startOfCurrentUTCDay**: *Date* + +*Defined in [types.ts:645](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L645)* + +___ + +## version + +• **version**: *string* + +*Defined in [types.ts:634](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L634)* + + +
+ +# Interface: ValidationResults + +Indicates which orders where accepted, which were rejected, and why. + +### Hierarchy + +* **ValidationResults** + + +### Properties + +## accepted + +• **accepted**: *[AcceptedOrderInfo](#interface-acceptedorderinfo)[]* + +*Defined in [types.ts:568](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L568)* + +___ + +## rejected + +• **rejected**: *[RejectedOrderInfo](#interface-rejectedorderinfo)[]* + +*Defined in [types.ts:569](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L569)* + + +
+ +# Interface: WethDepositEvent + +### Hierarchy + +* **WethDepositEvent** + + +### Properties + +## owner + +• **owner**: *string* + +*Defined in [types.ts:429](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L429)* + +___ + +## value + +• **value**: *BigNumber* + +*Defined in [types.ts:430](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L430)* + + +
+ +# Interface: WethWithdrawalEvent + +### Hierarchy + +* **WethWithdrawalEvent** + + +### Properties + +## owner + +• **owner**: *string* + +*Defined in [types.ts:419](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L419)* + +___ + +## value + +• **value**: *BigNumber* + +*Defined in [types.ts:420](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L420)* + + +
+ +# Interface: WrapperAcceptedOrderInfo + +### Hierarchy + +* **WrapperAcceptedOrderInfo** + + +### Properties + +## fillableTakerAssetAmount + +• **fillableTakerAssetAmount**: *string* + +*Defined in [types.ts:552](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L552)* + +___ + +## isNew + +• **isNew**: *boolean* + +*Defined in [types.ts:553](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L553)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:550](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L550)* + +___ + +## signedOrder + +• **signedOrder**: *[WrapperSignedOrder](#interface-wrappersignedorder)* + +*Defined in [types.ts:551](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L551)* + + +
+ +# Interface: WrapperConfig + +### Hierarchy + +* **WrapperConfig** + + +### Properties + +## `Optional` blockPollingIntervalSeconds + +• **blockPollingIntervalSeconds**? : *undefined | number* + +*Defined in [types.ts:237](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L237)* + +___ + +## `Optional` bootstrapList + +• **bootstrapList**? : *undefined | string* + +*Defined in [types.ts:236](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L236)* + +___ + +## `Optional` customContractAddresses + +• **customContractAddresses**? : *undefined | string* + +*Defined in [types.ts:242](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L242)* + +___ + +## `Optional` customOrderFilter + +• **customOrderFilter**? : *undefined | string* + +*Defined in [types.ts:244](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L244)* + +___ + +## `Optional` enableEthereumRPCRateLimiting + +• **enableEthereumRPCRateLimiting**? : *undefined | false | true* + +*Defined in [types.ts:241](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L241)* + +___ + +## ethereumChainID + +• **ethereumChainID**: *number* + +*Defined in [types.ts:234](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L234)* + +___ + +## `Optional` ethereumRPCMaxContentLength + +• **ethereumRPCMaxContentLength**? : *undefined | number* + +*Defined in [types.ts:238](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L238)* + +___ + +## `Optional` ethereumRPCMaxRequestsPer24HrUTC + +• **ethereumRPCMaxRequestsPer24HrUTC**? : *undefined | number* + +*Defined in [types.ts:239](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L239)* + +___ + +## `Optional` ethereumRPCMaxRequestsPerSecond + +• **ethereumRPCMaxRequestsPerSecond**? : *undefined | number* + +*Defined in [types.ts:240](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L240)* + +___ + +## `Optional` ethereumRPCURL + +• **ethereumRPCURL**? : *undefined | string* + +*Defined in [types.ts:233](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L233)* + +___ + +## `Optional` maxOrdersInStorage + +• **maxOrdersInStorage**? : *undefined | number* + +*Defined in [types.ts:243](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L243)* + +___ + +## `Optional` useBootstrapList + +• **useBootstrapList**? : *undefined | false | true* + +*Defined in [types.ts:235](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L235)* + +___ + +## `Optional` verbosity + +• **verbosity**? : *undefined | number* + +*Defined in [types.ts:232](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L232)* + +___ + +## `Optional` web3Provider + +• **web3Provider**? : *ZeroExProvider* + +*Defined in [types.ts:245](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L245)* + + +
+ +# Interface: WrapperContractEvent + +### Hierarchy + +* **WrapperContractEvent** + + +### Properties + +## address + +• **address**: *string* + +*Defined in [types.ts:502](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L502)* + +___ + +## blockHash + +• **blockHash**: *string* + +*Defined in [types.ts:497](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L497)* + +___ + +## isRemoved + +• **isRemoved**: *boolean* + +*Defined in [types.ts:501](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L501)* + +___ + +## kind + +• **kind**: *string* + +*Defined in [types.ts:503](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L503)* + +___ + +## logIndex + +• **logIndex**: *number* + +*Defined in [types.ts:500](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L500)* + +___ + +## parameters + +• **parameters**: *[WrapperContractEventParameters](#wrappercontracteventparameters)* + +*Defined in [types.ts:504](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L504)* + +___ + +## txHash + +• **txHash**: *string* + +*Defined in [types.ts:498](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L498)* + +___ + +## txIndex + +• **txIndex**: *number* + +*Defined in [types.ts:499](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L499)* + + +
+ +# Interface: WrapperERC1155TransferBatchEvent + +### Hierarchy + +* **WrapperERC1155TransferBatchEvent** + + +### Properties + +## from + +• **from**: *string* + +*Defined in [types.ts:351](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L351)* + +___ + +## ids + +• **ids**: *string[]* + +*Defined in [types.ts:353](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L353)* + +___ + +## operator + +• **operator**: *string* + +*Defined in [types.ts:350](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L350)* + +___ + +## to + +• **to**: *string* + +*Defined in [types.ts:352](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L352)* + +___ + +## values + +• **values**: *string[]* + +*Defined in [types.ts:354](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L354)* + + +
+ +# Interface: WrapperERC1155TransferSingleEvent + +### Hierarchy + +* **WrapperERC1155TransferSingleEvent** + + +### Properties + +## from + +• **from**: *string* + +*Defined in [types.ts:335](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L335)* + +___ + +## id + +• **id**: *string* + +*Defined in [types.ts:337](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L337)* + +___ + +## operator + +• **operator**: *string* + +*Defined in [types.ts:334](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L334)* + +___ + +## to + +• **to**: *string* + +*Defined in [types.ts:336](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L336)* + +___ + +## value + +• **value**: *string* + +*Defined in [types.ts:338](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L338)* + + +
+ +# Interface: WrapperERC20ApprovalEvent + +### Hierarchy + +* **WrapperERC20ApprovalEvent** + + +### Properties + +## owner + +• **owner**: *string* + +*Defined in [types.ts:290](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L290)* + +___ + +## spender + +• **spender**: *string* + +*Defined in [types.ts:291](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L291)* + +___ + +## value + +• **value**: *string* + +*Defined in [types.ts:292](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L292)* + + +
+ +# Interface: WrapperERC20TransferEvent + +### Hierarchy + +* **WrapperERC20TransferEvent** + + +### Properties + +## from + +• **from**: *string* + +*Defined in [types.ts:278](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L278)* + +___ + +## to + +• **to**: *string* + +*Defined in [types.ts:279](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L279)* + +___ + +## value + +• **value**: *string* + +*Defined in [types.ts:280](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L280)* + + +
+ +# Interface: WrapperERC721ApprovalEvent + +### Hierarchy + +* **WrapperERC721ApprovalEvent** + + +### Properties + +## approved + +• **approved**: *string* + +*Defined in [types.ts:315](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L315)* + +___ + +## owner + +• **owner**: *string* + +*Defined in [types.ts:314](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L314)* + +___ + +## tokenId + +• **tokenId**: *string* + +*Defined in [types.ts:316](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L316)* + + +
+ +# Interface: WrapperERC721TransferEvent + +### Hierarchy + +* **WrapperERC721TransferEvent** + + +### Properties + +## from + +• **from**: *string* + +*Defined in [types.ts:302](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L302)* + +___ + +## to + +• **to**: *string* + +*Defined in [types.ts:303](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L303)* + +___ + +## tokenId + +• **tokenId**: *string* + +*Defined in [types.ts:304](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L304)* + + +
+ +# Interface: WrapperExchangeCancelUpToEvent + +### Hierarchy + +* **WrapperExchangeCancelUpToEvent** + + +### Properties + +## makerAddress + +• **makerAddress**: *string* + +*Defined in [types.ts:413](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L413)* + +___ + +## orderEpoch + +• **orderEpoch**: *string* + +*Defined in [types.ts:415](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L415)* + +___ + +## orderSenderAddress + +• **orderSenderAddress**: *string* + +*Defined in [types.ts:414](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L414)* + + +
+ +# Interface: WrapperExchangeFillEvent + +### Hierarchy + +* **WrapperExchangeFillEvent** + + +### Properties + +## feeRecipientAddress + +• **feeRecipientAddress**: *string* + +*Defined in [types.ts:384](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L384)* + +___ + +## makerAddress + +• **makerAddress**: *string* + +*Defined in [types.ts:381](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L381)* + +___ + +## makerAssetData + +• **makerAssetData**: *string* + +*Defined in [types.ts:391](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L391)* + +___ + +## makerAssetFilledAmount + +• **makerAssetFilledAmount**: *string* + +*Defined in [types.ts:385](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L385)* + +___ + +## makerFeeAssetData + +• **makerFeeAssetData**: *string* + +*Defined in [types.ts:393](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L393)* + +___ + +## makerFeePaid + +• **makerFeePaid**: *string* + +*Defined in [types.ts:387](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L387)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:390](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L390)* + +___ + +## protocolFeePaid + +• **protocolFeePaid**: *string* + +*Defined in [types.ts:389](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L389)* + +___ + +## senderAddress + +• **senderAddress**: *string* + +*Defined in [types.ts:383](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L383)* + +___ + +## takerAddress + +• **takerAddress**: *string* + +*Defined in [types.ts:382](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L382)* + +___ + +## takerAssetData + +• **takerAssetData**: *string* + +*Defined in [types.ts:392](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L392)* + +___ + +## takerAssetFilledAmount + +• **takerAssetFilledAmount**: *string* + +*Defined in [types.ts:386](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L386)* + +___ + +## takerFeeAssetData + +• **takerFeeAssetData**: *string* + +*Defined in [types.ts:394](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L394)* + +___ + +## takerFeePaid + +• **takerFeePaid**: *string* + +*Defined in [types.ts:388](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L388)* + + +
+ +# Interface: WrapperGetOrdersResponse + +### Hierarchy + +* **WrapperGetOrdersResponse** + + +### Properties + +## ordersInfos + +• **ordersInfos**: *[WrapperOrderInfo](#interface-wrapperorderinfo)[]* + +*Defined in [types.ts:12](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L12)* + +___ + +## snapshotID + +• **snapshotID**: *string* + +*Defined in [types.ts:10](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L10)* + +___ + +## snapshotTimestamp + +• **snapshotTimestamp**: *string* + +*Defined in [types.ts:11](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L11)* + + +
+ +# Interface: WrapperOrderEvent + +### Hierarchy + +* **WrapperOrderEvent** + + +### Properties + +## contractEvents + +• **contractEvents**: *[WrapperContractEvent](#interface-wrappercontractevent)[]* + +*Defined in [types.ts:526](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L526)* + +___ + +## endState + +• **endState**: *[OrderEventEndState](#enumeration-ordereventendstate)* + +*Defined in [types.ts:524](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L524)* + +___ + +## fillableTakerAssetAmount + +• **fillableTakerAssetAmount**: *string* + +*Defined in [types.ts:525](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L525)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:522](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L522)* + +___ + +## signedOrder + +• **signedOrder**: *[WrapperSignedOrder](#interface-wrappersignedorder)* + +*Defined in [types.ts:523](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L523)* + +___ + +## timestamp + +• **timestamp**: *string* + +*Defined in [types.ts:521](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L521)* + + +
+ +# Interface: WrapperOrderInfo + +### Hierarchy + +* **WrapperOrderInfo** + + +### Properties + +## fillableTakerAssetAmount + +• **fillableTakerAssetAmount**: *string* + +*Defined in [types.ts:24](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L24)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:22](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L22)* + +___ + +## signedOrder + +• **signedOrder**: *[WrapperSignedOrder](#interface-wrappersignedorder)* + +*Defined in [types.ts:23](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L23)* + + +
+ +# Interface: WrapperRejectedOrderInfo + +### Hierarchy + +* **WrapperRejectedOrderInfo** + + +### Properties + +## kind + +• **kind**: *[RejectedOrderKind](#enumeration-rejectedorderkind)* + +*Defined in [types.ts:560](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L560)* + +___ + +## orderHash + +• **orderHash**: *string* + +*Defined in [types.ts:558](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L558)* + +___ + +## signedOrder + +• **signedOrder**: *[WrapperSignedOrder](#interface-wrappersignedorder)* + +*Defined in [types.ts:559](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L559)* + +___ + +## status + +• **status**: *[RejectedOrderStatus](#interface-rejectedorderstatus)* + +*Defined in [types.ts:561](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L561)* + + +
+ +# Interface: WrapperSignedOrder + +### Hierarchy + +* **WrapperSignedOrder** + + +### Properties + +## chainId + +• **chainId**: *number* + +*Defined in [types.ts:268](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L268)* + +___ + +## exchangeAddress + +• **exchangeAddress**: *string* + +*Defined in [types.ts:267](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L267)* + +___ + +## expirationTimeSeconds + +• **expirationTimeSeconds**: *string* + +*Defined in [types.ts:264](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L264)* + +___ + +## feeRecipientAddress + +• **feeRecipientAddress**: *string* + +*Defined in [types.ts:263](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L263)* + +___ + +## makerAddress + +• **makerAddress**: *string* + +*Defined in [types.ts:252](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L252)* + +___ + +## makerAssetAmount + +• **makerAssetAmount**: *string* + +*Defined in [types.ts:254](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L254)* + +___ + +## makerAssetData + +• **makerAssetData**: *string* + +*Defined in [types.ts:253](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L253)* + +___ + +## makerFee + +• **makerFee**: *string* + +*Defined in [types.ts:255](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L255)* + +___ + +## makerFeeAssetData + +• **makerFeeAssetData**: *string* + +*Defined in [types.ts:256](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L256)* + +___ + +## salt + +• **salt**: *string* + +*Defined in [types.ts:265](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L265)* + +___ + +## senderAddress + +• **senderAddress**: *string* + +*Defined in [types.ts:262](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L262)* + +___ + +## signature + +• **signature**: *string* + +*Defined in [types.ts:266](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L266)* + +___ + +## takerAddress + +• **takerAddress**: *string* + +*Defined in [types.ts:257](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L257)* + +___ + +## takerAssetAmount + +• **takerAssetAmount**: *string* + +*Defined in [types.ts:260](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L260)* + +___ + +## takerAssetData + +• **takerAssetData**: *string* + +*Defined in [types.ts:258](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L258)* + +___ + +## takerFee + +• **takerFee**: *string* + +*Defined in [types.ts:261](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L261)* + +___ + +## takerFeeAssetData + +• **takerFeeAssetData**: *string* + +*Defined in [types.ts:259](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L259)* + + +
+ +# Interface: WrapperStats + +### Hierarchy + +* **WrapperStats** + + +### Properties + +## ethRPCRateLimitExpiredRequests + +• **ethRPCRateLimitExpiredRequests**: *number* + +*Defined in [types.ts:630](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L630)* + +___ + +## ethRPCRequestsSentInCurrentUTCDay + +• **ethRPCRequestsSentInCurrentUTCDay**: *number* + +*Defined in [types.ts:629](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L629)* + +___ + +## ethereumChainID + +• **ethereumChainID**: *number* + +*Defined in [types.ts:621](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L621)* + +___ + +## latestBlock + +• **latestBlock**: *[LatestBlock](#interface-latestblock)* + +*Defined in [types.ts:622](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L622)* + +___ + +## maxExpirationTime + +• **maxExpirationTime**: *string* + +*Defined in [types.ts:627](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L627)* + +___ + +## numOrders + +• **numOrders**: *number* + +*Defined in [types.ts:624](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L624)* + +___ + +## numOrdersIncludingRemoved + +• **numOrdersIncludingRemoved**: *number* + +*Defined in [types.ts:625](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L625)* + +___ + +## numPeers + +• **numPeers**: *number* + +*Defined in [types.ts:623](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L623)* + +___ + +## numPinnedOrders + +• **numPinnedOrders**: *number* + +*Defined in [types.ts:626](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L626)* + +___ + +## peerID + +• **peerID**: *string* + +*Defined in [types.ts:620](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L620)* + +___ + +## pubSubTopic + +• **pubSubTopic**: *string* + +*Defined in [types.ts:618](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L618)* + +___ + +## rendezvous + +• **rendezvous**: *string* + +*Defined in [types.ts:619](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L619)* + +___ + +## startOfCurrentUTCDay + +• **startOfCurrentUTCDay**: *string* + +*Defined in [types.ts:628](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L628)* + +___ + +## version + +• **version**: *string* + +*Defined in [types.ts:617](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L617)* + + +
+ +# Interface: WrapperValidationResults + +### Hierarchy + +* **WrapperValidationResults** + + +### Properties + +## accepted + +• **accepted**: *[WrapperAcceptedOrderInfo](#interface-wrapperacceptedorderinfo)[]* + +*Defined in [types.ts:544](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L544)* + +___ + +## rejected + +• **rejected**: *[WrapperRejectedOrderInfo](#interface-wrapperrejectedorderinfo)[]* + +*Defined in [types.ts:545](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L545)* + + +
+ +# Interface: WrapperWethDepositEvent + +### Hierarchy + +* **WrapperWethDepositEvent** + + +### Properties + +## owner • **owner**: *string* -*Defined in [index.ts:414](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L414)* +*Defined in [types.ts:434](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L434)* ___ ## value -• **value**: *BigNumber* +• **value**: *string* + +*Defined in [types.ts:435](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L435)* + + +
+ +# Interface: WrapperWethWithdrawalEvent + +### Hierarchy + +* **WrapperWethWithdrawalEvent** + + +### Properties + +## owner + +• **owner**: *string* + +*Defined in [types.ts:424](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L424)* + +___ + +## value + +• **value**: *string* + +*Defined in [types.ts:425](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L425)* + + +
+ +# Interface: ZeroExMesh + +### Hierarchy + +* **ZeroExMesh** + + +### Methods + +## newWrapperAsync + +▸ **newWrapperAsync**(`config`: [WrapperConfig](#interface-wrapperconfig)): *Promise‹[MeshWrapper](#interface-meshwrapper)›* + +*Defined in [types.ts:215](https://github.com/0xProject/0x-mesh/blob/f4fb987/browser/ts/types.ts#L215)* + +**Parameters:** + +Name | Type | +------ | ------ | +`config` | [WrapperConfig](#interface-wrapperconfig) | -*Defined in [index.ts:415](https://github.com/0xProject/0x-mesh/blob/ae6de374/browser/ts/index.ts#L415)* +**Returns:** *Promise‹[MeshWrapper](#interface-meshwrapper)›*
diff --git a/docs/deployment.md b/docs/deployment.md index e27b41b4f..d5fdcb8eb 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -1,4 +1,4 @@ -[![Version](https://img.shields.io/badge/version-8.2.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) +[![Version](https://img.shields.io/badge/version-9.0.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) # 0x Mesh Deployment Guide @@ -138,6 +138,26 @@ type Config struct { // enforcing a limit on maximum expiration time for incoming orders and remove // any orders with an expiration time too far in the future. MaxOrdersInStorage int `envvar:"MAX_ORDERS_IN_STORAGE" default:"100000"` + // CustomOrderFilter is a stringified JSON Schema which will be used for + // validating incoming orders. If provided, Mesh will only receive orders from + // other peers in the network with the same filter. + // + // Here is an example filter which will only allow orders with a specific + // makerAssetData: + // + // { + // "properties": { + // "makerAssetData": { + // "const": "0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c" + // } + // } + // } + // + // Note that you only need to include the requirements for your specific + // application in the filter. The default requirements for a valid order (e.g. + // all the required fields) are automatically included. For more information + // on JSON Schemas, see https://json-schema.org/ + CustomOrderFilter string `envvar:"CUSTOM_ORDER_FILTER" default:"{}"` } ``` @@ -146,8 +166,10 @@ Mesh executable](../cmd/mesh/main.go): ```go type standaloneConfig struct { - // RPCAddr is the interface and port to use for the JSON-RPC API over + // WSRPCAddr is the interface and port to use for the JSON-RPC API over // WebSockets. By default, 0x Mesh will listen on localhost and port 60557. - RPCAddr string `envvar:"RPC_ADDR" default:"localhost:60557"` -} + WSRPCAddr string `envvar:"WS_RPC_ADDR" default:"localhost:60557"` + // HTTPRPCAddr is the interface and port to use for the JSON-RPC API over + // HTTP. By default, 0x Mesh will listen on localhost and port 60556. + HTTPRPCAddr string `envvar:"HTTP_RPC_ADDR" default:"localhost:60556"`} ``` diff --git a/docs/deployment_with_telemetry.md b/docs/deployment_with_telemetry.md index 30d01acb0..e05bfc553 100644 --- a/docs/deployment_with_telemetry.md +++ b/docs/deployment_with_telemetry.md @@ -1,4 +1,4 @@ -[![Version](https://img.shields.io/badge/version-8.2.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) +[![Version](https://img.shields.io/badge/version-9.0.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) ## Deploying a Telemetry-Enabled Mesh Node @@ -53,7 +53,8 @@ services: environment: - VERBOSITY=5 - ETHEREUM_CHAIN_ID=1 - - RPC_ADDR=mesh:60557 + - WS_RPC_ADDR=mesh:60557 + - HTTP_RPC_ADDR=mesh:60556 # Set your backing Ethereum JSON RPC endpoint below - ETHEREUM_RPC_URL= - BLOCK_POLLING_INTERVAL=5s @@ -83,7 +84,7 @@ services: In most cases, the only change you need to make to the __docker-compose.yml__ file is to set `ETHEREUM_RPC_URL` to your own Ethereum JSON RPC endpoint. The -`RPC_ADDR` above will allow any Docker containers running in the same Docker +`WS_RPC_ADDR` and `HTTP_RPC_ADDR` above will allow any Docker containers running in the same Docker Compose file to access the Mesh RPC API via [links](https://docs.docker.com/compose/networking/#links). To use this feature, be sure to add the following line to any containers you wish to access the Mesh @@ -97,8 +98,9 @@ links: You can then use the URL `ws://mesh:60557` to access the RPC API. Alternatively, if you want to open up your Mesh RPC API to the public internet, -you can set `RPC_ADDR=0.0.0.0:60557`. If you choose to go this route, we strongly -recommend using an external firewall to restrict who can access your RPC API. +you can set `WS_RPC_ADDR=0.0.0.0:60557` and `HTTP_RPC_ADDR=0.0.0.0:60556`. If +you choose to go this route, we strongly recommend using an external firewall +to restrict who can access your RPC API. ### Deploying with Docker Machine diff --git a/docs/json_rpc_clients/typescript/reference.md b/docs/json_rpc_clients/typescript/reference.md index d7bf24658..8daec9d69 100644 --- a/docs/json_rpc_clients/typescript/reference.md +++ b/docs/json_rpc_clients/typescript/reference.md @@ -18,6 +18,7 @@ websocket endpoint. * [addOrdersAsync](#addordersasync) * [destroy](#destroy) * [getOrdersAsync](#getordersasync) +* [getOrdersForPageAsync](#getordersforpageasync) * [getStatsAsync](#getstatsasync) * [onClose](#onclose) * [onReconnected](#onreconnected) @@ -30,7 +31,7 @@ websocket endpoint. \+ **new WSClient**(`url`: string, `wsOpts?`: [WSOpts](#interface-wsopts)): *[WSClient](#class-wsclient)* -*Defined in [ws_client.ts:252](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L252)* +*Defined in [ws_client.ts:252](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L252)* Instantiates a new WSClient instance @@ -51,7 +52,7 @@ An instance of WSClient ▸ **addOrdersAsync**(`signedOrders`: `SignedOrder`[], `pinned`: boolean): *`Promise`* -*Defined in [ws_client.ts:281](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L281)* +*Defined in [ws_client.ts:281](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L281)* Adds an array of 0x signed orders to the Mesh node. @@ -72,7 +73,7 @@ ___ ▸ **destroy**(): *void* -*Defined in [ws_client.ts:403](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L403)* +*Defined in [ws_client.ts:417](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L417)* destroy unsubscribes all active subscriptions, closes the websocket connection and stops the internal heartbeat connection liveness check. @@ -85,7 +86,7 @@ ___ ▸ **getOrdersAsync**(`perPage`: number): *`Promise`* -*Defined in [ws_client.ts:311](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L311)* +*Defined in [ws_client.ts:311](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L311)* Get all 0x signed orders currently stored in the Mesh node @@ -97,7 +98,29 @@ Name | Type | Default | Description | **Returns:** *`Promise`* -all orders, their hash and their fillableTakerAssetAmount +the snapshotID, snapshotTimestamp and all orders, their hashes and fillableTakerAssetAmounts + +___ + +### getOrdersForPageAsync + +▸ **getOrdersForPageAsync**(`page`: number, `perPage`: number, `snapshotID?`: undefined | string): *`Promise`* + +*Defined in [ws_client.ts:342](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L342)* + +Get page of 0x signed orders stored on the Mesh node at the specified snapshot + +**Parameters:** + +Name | Type | Default | Description | +------ | ------ | ------ | ------ | +`page` | number | - | Page index at which to retrieve orders | +`perPage` | number | 200 | number of signedOrders to fetch per paginated request | +`snapshotID?` | undefined \| string | - | The DB snapshot at which to fetch orders. If omitted, a new snapshot is created | + +**Returns:** *`Promise`* + +the snapshotID, snapshotTimestamp and all orders, their hashes and fillableTakerAssetAmounts ___ @@ -105,7 +128,7 @@ ___ ▸ **getStatsAsync**(): *`Promise`* -*Defined in [ws_client.ts:302](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L302)* +*Defined in [ws_client.ts:302](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L302)* **Returns:** *`Promise`* @@ -115,7 +138,7 @@ ___ ▸ **onClose**(`cb`: function): *void* -*Defined in [ws_client.ts:385](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L385)* +*Defined in [ws_client.ts:399](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L399)* Get notified when the underlying WS connection closes normally. If it closes with an error, WSClient automatically attempts to re-connect without emitting a `close` event. @@ -136,7 +159,7 @@ ___ ▸ **onReconnected**(`cb`: function): *void* -*Defined in [ws_client.ts:394](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L394)* +*Defined in [ws_client.ts:408](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L408)* Get notified when a connection to the underlying WS connection is re-established @@ -156,7 +179,7 @@ ___ ▸ **subscribeToOrdersAsync**(`cb`: function): *`Promise`* -*Defined in [ws_client.ts:345](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L345)* +*Defined in [ws_client.ts:359](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L359)* Subscribe to the 'orders' topic and receive order events from Mesh. This method returns a subscriptionId that can be used to `unsubscribe()` from this subscription. @@ -185,7 +208,7 @@ ___ ▸ **unsubscribeAsync**(`subscriptionId`: string): *`Promise`* -*Defined in [ws_client.ts:375](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/ws_client.ts#L375)* +*Defined in [ws_client.ts:389](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/ws_client.ts#L389)* Unsubscribe from a subscription @@ -225,7 +248,7 @@ Name | Type | Description | • **ERC1155ApprovalForAllEvent**: = "ERC1155ApprovalForAllEvent" -*Defined in [types.ts:222](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L222)* +*Defined in [types.ts:222](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L222)* ___ @@ -233,7 +256,7 @@ ___ • **ERC1155TransferBatchEvent**: = "ERC1155TransferBatchEvent" -*Defined in [types.ts:224](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L224)* +*Defined in [types.ts:224](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L224)* ___ @@ -241,7 +264,7 @@ ___ • **ERC1155TransferSingleEvent**: = "ERC1155TransferSingleEvent" -*Defined in [types.ts:223](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L223)* +*Defined in [types.ts:223](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L223)* ___ @@ -249,7 +272,7 @@ ___ • **ERC20ApprovalEvent**: = "ERC20ApprovalEvent" -*Defined in [types.ts:218](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L218)* +*Defined in [types.ts:218](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L218)* ___ @@ -257,7 +280,7 @@ ___ • **ERC20TransferEvent**: = "ERC20TransferEvent" -*Defined in [types.ts:217](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L217)* +*Defined in [types.ts:217](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L217)* ___ @@ -265,7 +288,7 @@ ___ • **ERC721ApprovalEvent**: = "ERC721ApprovalEvent" -*Defined in [types.ts:220](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L220)* +*Defined in [types.ts:220](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L220)* ___ @@ -273,7 +296,7 @@ ___ • **ERC721ApprovalForAllEvent**: = "ERC721ApprovalForAllEvent" -*Defined in [types.ts:221](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L221)* +*Defined in [types.ts:221](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L221)* ___ @@ -281,7 +304,7 @@ ___ • **ERC721TransferEvent**: = "ERC721TransferEvent" -*Defined in [types.ts:219](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L219)* +*Defined in [types.ts:219](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L219)* ___ @@ -289,7 +312,7 @@ ___ • **ExchangeCancelEvent**: = "ExchangeCancelEvent" -*Defined in [types.ts:226](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L226)* +*Defined in [types.ts:226](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L226)* ___ @@ -297,7 +320,7 @@ ___ • **ExchangeCancelUpToEvent**: = "ExchangeCancelUpToEvent" -*Defined in [types.ts:227](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L227)* +*Defined in [types.ts:227](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L227)* ___ @@ -305,7 +328,7 @@ ___ • **ExchangeFillEvent**: = "ExchangeFillEvent" -*Defined in [types.ts:225](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L225)* +*Defined in [types.ts:225](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L225)* ___ @@ -313,7 +336,7 @@ ___ • **WethDepositEvent**: = "WethDepositEvent" -*Defined in [types.ts:228](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L228)* +*Defined in [types.ts:228](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L228)* ___ @@ -321,7 +344,7 @@ ___ • **WethWithdrawalEvent**: = "WethWithdrawalEvent" -*Defined in [types.ts:229](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L229)* +*Defined in [types.ts:229](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L229)*
@@ -348,7 +371,7 @@ ___ • **Added**: = "ADDED" -*Defined in [types.ts:286](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L286)* +*Defined in [types.ts:286](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L286)* ___ @@ -356,7 +379,7 @@ ___ • **Cancelled**: = "CANCELLED" -*Defined in [types.ts:289](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L289)* +*Defined in [types.ts:289](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L289)* ___ @@ -364,7 +387,7 @@ ___ • **Expired**: = "EXPIRED" -*Defined in [types.ts:290](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L290)* +*Defined in [types.ts:290](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L290)* ___ @@ -372,7 +395,7 @@ ___ • **FillabilityIncreased**: = "FILLABILITY_INCREASED" -*Defined in [types.ts:294](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L294)* +*Defined in [types.ts:294](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L294)* ___ @@ -380,7 +403,7 @@ ___ • **Filled**: = "FILLED" -*Defined in [types.ts:287](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L287)* +*Defined in [types.ts:287](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L287)* ___ @@ -388,7 +411,7 @@ ___ • **FullyFilled**: = "FULLY_FILLED" -*Defined in [types.ts:288](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L288)* +*Defined in [types.ts:288](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L288)* ___ @@ -396,7 +419,7 @@ ___ • **Invalid**: = "INVALID" -*Defined in [types.ts:285](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L285)* +*Defined in [types.ts:285](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L285)* ___ @@ -404,7 +427,7 @@ ___ • **StoppedWatching**: = "STOPPED_WATCHING" -*Defined in [types.ts:292](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L292)* +*Defined in [types.ts:292](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L292)* ___ @@ -412,7 +435,7 @@ ___ • **Unexpired**: = "UNEXPIRED" -*Defined in [types.ts:291](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L291)* +*Defined in [types.ts:291](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L291)* ___ @@ -420,7 +443,7 @@ ___ • **Unfunded**: = "UNFUNDED" -*Defined in [types.ts:293](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L293)* +*Defined in [types.ts:293](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L293)*
@@ -451,7 +474,7 @@ ___ • **InternalError**: = "InternalError" -*Defined in [types.ts:358](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L358)* +*Defined in [types.ts:358](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L358)* ___ @@ -459,7 +482,7 @@ ___ • **MaxOrderSizeExceeded**: = "MaxOrderSizeExceeded" -*Defined in [types.ts:359](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L359)* +*Defined in [types.ts:359](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L359)* ___ @@ -467,7 +490,7 @@ ___ • **NetworkRequestFailed**: = "NetworkRequestFailed" -*Defined in [types.ts:362](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L362)* +*Defined in [types.ts:362](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L362)* ___ @@ -475,7 +498,7 @@ ___ • **OrderAlreadyStored**: = "OrderAlreadyStored" -*Defined in [types.ts:360](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L360)* +*Defined in [types.ts:360](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L360)* ___ @@ -483,7 +506,7 @@ ___ • **OrderCancelled**: = "OrderCancelled" -*Defined in [types.ts:367](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L367)* +*Defined in [types.ts:367](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L367)* ___ @@ -491,7 +514,7 @@ ___ • **OrderExpired**: = "OrderExpired" -*Defined in [types.ts:365](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L365)* +*Defined in [types.ts:365](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L365)* ___ @@ -499,7 +522,7 @@ ___ • **OrderForIncorrectChain**: = "OrderForIncorrectChain" -*Defined in [types.ts:361](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L361)* +*Defined in [types.ts:361](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L361)* ___ @@ -507,7 +530,7 @@ ___ • **OrderFullyFilled**: = "OrderFullyFilled" -*Defined in [types.ts:366](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L366)* +*Defined in [types.ts:366](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L366)* ___ @@ -515,7 +538,7 @@ ___ • **OrderHasInvalidMakerAssetAmount**: = "OrderHasInvalidMakerAssetAmount" -*Defined in [types.ts:363](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L363)* +*Defined in [types.ts:363](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L363)* ___ @@ -523,7 +546,7 @@ ___ • **OrderHasInvalidMakerAssetData**: = "OrderHasInvalidMakerAssetData" -*Defined in [types.ts:369](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L369)* +*Defined in [types.ts:369](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L369)* ___ @@ -531,7 +554,7 @@ ___ • **OrderHasInvalidSignature**: = "OrderHasInvalidSignature" -*Defined in [types.ts:371](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L371)* +*Defined in [types.ts:371](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L371)* ___ @@ -539,7 +562,7 @@ ___ • **OrderHasInvalidTakerAssetAmount**: = "OrderHasInvalidTakerAssetAmount" -*Defined in [types.ts:364](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L364)* +*Defined in [types.ts:364](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L364)* ___ @@ -547,7 +570,7 @@ ___ • **OrderHasInvalidTakerAssetData**: = "OrderHasInvalidTakerAssetData" -*Defined in [types.ts:370](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L370)* +*Defined in [types.ts:370](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L370)* ___ @@ -555,7 +578,7 @@ ___ • **OrderUnfunded**: = "OrderUnfunded" -*Defined in [types.ts:368](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L368)* +*Defined in [types.ts:368](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L368)*
@@ -575,7 +598,7 @@ ___ • **MeshError**: = "MESH_ERROR" -*Defined in [types.ts:353](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L353)* +*Defined in [types.ts:353](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L353)* ___ @@ -583,7 +606,7 @@ ___ • **MeshValidation**: = "MESH_VALIDATION" -*Defined in [types.ts:354](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L354)* +*Defined in [types.ts:354](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L354)* ___ @@ -591,7 +614,7 @@ ___ • **ZeroexValidation**: = "ZEROEX_VALIDATION" -*Defined in [types.ts:352](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L352)* +*Defined in [types.ts:352](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L352)*
@@ -616,7 +639,7 @@ ___ • **fillableTakerAssetAmount**: *`BigNumber`* -*Defined in [types.ts:335](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L335)* +*Defined in [types.ts:335](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L335)* ___ @@ -624,7 +647,7 @@ ___ • **isNew**: *boolean* -*Defined in [types.ts:336](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L336)* +*Defined in [types.ts:336](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L336)* ___ @@ -632,7 +655,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:333](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L333)* +*Defined in [types.ts:333](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L333)* ___ @@ -640,7 +663,7 @@ ___ • **signedOrder**: *`SignedOrder`* -*Defined in [types.ts:334](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L334)* +*Defined in [types.ts:334](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L334)*
@@ -672,7 +695,7 @@ Source: https://github.com/theturtle32/WebSocket-Node/blob/master/docs/WebSocket • **assembleFragments**? : *undefined | false | true* -*Defined in [types.ts:16](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L16)* +*Defined in [types.ts:16](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L16)* ___ @@ -680,7 +703,7 @@ ___ • **closeTimeout**? : *undefined | number* -*Defined in [types.ts:17](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L17)* +*Defined in [types.ts:17](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L17)* ___ @@ -688,7 +711,7 @@ ___ • **fragmentOutgoingMessages**? : *undefined | false | true* -*Defined in [types.ts:14](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L14)* +*Defined in [types.ts:14](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L14)* ___ @@ -696,7 +719,7 @@ ___ • **fragmentationThreshold**? : *undefined | number* -*Defined in [types.ts:15](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L15)* +*Defined in [types.ts:15](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L15)* ___ @@ -704,7 +727,7 @@ ___ • **maxReceivedFrameSize**? : *undefined | number* -*Defined in [types.ts:12](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L12)* +*Defined in [types.ts:12](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L12)* ___ @@ -712,7 +735,7 @@ ___ • **maxReceivedMessageSize**? : *undefined | number* -*Defined in [types.ts:13](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L13)* +*Defined in [types.ts:13](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L13)* ___ @@ -720,7 +743,7 @@ ___ • **tlsOptions**? : *any* -*Defined in [types.ts:18](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L18)* +*Defined in [types.ts:18](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L18)* ___ @@ -728,7 +751,7 @@ ___ • **webSocketVersion**? : *undefined | number* -*Defined in [types.ts:11](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L11)* +*Defined in [types.ts:11](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L11)*
@@ -757,7 +780,7 @@ ___ • **address**: *string* -*Defined in [types.ts:279](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L279)* +*Defined in [types.ts:279](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L279)* ___ @@ -765,7 +788,7 @@ ___ • **blockHash**: *string* -*Defined in [types.ts:274](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L274)* +*Defined in [types.ts:274](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L274)* ___ @@ -773,7 +796,7 @@ ___ • **isRemoved**: *string* -*Defined in [types.ts:278](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L278)* +*Defined in [types.ts:278](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L278)* ___ @@ -781,7 +804,7 @@ ___ • **kind**: *[ContractEventKind](#enumeration-contracteventkind)* -*Defined in [types.ts:280](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L280)* +*Defined in [types.ts:280](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L280)* ___ @@ -789,7 +812,7 @@ ___ • **logIndex**: *number* -*Defined in [types.ts:277](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L277)* +*Defined in [types.ts:277](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L277)* ___ @@ -797,7 +820,7 @@ ___ • **parameters**: *[ContractEventParameters](#contracteventparameters)* -*Defined in [types.ts:281](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L281)* +*Defined in [types.ts:281](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L281)* ___ @@ -805,7 +828,7 @@ ___ • **txHash**: *string* -*Defined in [types.ts:275](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L275)* +*Defined in [types.ts:275](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L275)* ___ @@ -813,7 +836,7 @@ ___ • **txIndex**: *number* -*Defined in [types.ts:276](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L276)* +*Defined in [types.ts:276](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L276)*
@@ -837,7 +860,7 @@ ___ • **approved**: *boolean* -*Defined in [types.ts:144](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L144)* +*Defined in [types.ts:144](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L144)* ___ @@ -845,7 +868,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:143](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L143)* +*Defined in [types.ts:143](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L143)* ___ @@ -853,7 +876,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:142](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L142)* +*Defined in [types.ts:142](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L142)*
@@ -879,7 +902,7 @@ ___ • **from**: *string* -*Defined in [types.ts:127](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L127)* +*Defined in [types.ts:127](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L127)* ___ @@ -887,7 +910,7 @@ ___ • **ids**: *`BigNumber`[]* -*Defined in [types.ts:129](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L129)* +*Defined in [types.ts:129](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L129)* ___ @@ -895,7 +918,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:126](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L126)* +*Defined in [types.ts:126](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L126)* ___ @@ -903,7 +926,7 @@ ___ • **to**: *string* -*Defined in [types.ts:128](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L128)* +*Defined in [types.ts:128](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L128)* ___ @@ -911,7 +934,7 @@ ___ • **values**: *`BigNumber`[]* -*Defined in [types.ts:130](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L130)* +*Defined in [types.ts:130](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L130)*
@@ -937,7 +960,7 @@ ___ • **from**: *string* -*Defined in [types.ts:111](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L111)* +*Defined in [types.ts:111](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L111)* ___ @@ -945,7 +968,7 @@ ___ • **id**: *`BigNumber`* -*Defined in [types.ts:113](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L113)* +*Defined in [types.ts:113](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L113)* ___ @@ -953,7 +976,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:110](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L110)* +*Defined in [types.ts:110](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L110)* ___ @@ -961,7 +984,7 @@ ___ • **to**: *string* -*Defined in [types.ts:112](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L112)* +*Defined in [types.ts:112](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L112)* ___ @@ -969,7 +992,7 @@ ___ • **value**: *`BigNumber`* -*Defined in [types.ts:114](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L114)* +*Defined in [types.ts:114](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L114)*
@@ -993,7 +1016,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:68](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L68)* +*Defined in [types.ts:68](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L68)* ___ @@ -1001,7 +1024,7 @@ ___ • **spender**: *string* -*Defined in [types.ts:69](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L69)* +*Defined in [types.ts:69](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L69)* ___ @@ -1009,7 +1032,7 @@ ___ • **value**: *`BigNumber`* -*Defined in [types.ts:70](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L70)* +*Defined in [types.ts:70](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L70)*
@@ -1033,7 +1056,7 @@ ___ • **from**: *string* -*Defined in [types.ts:56](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L56)* +*Defined in [types.ts:56](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L56)* ___ @@ -1041,7 +1064,7 @@ ___ • **to**: *string* -*Defined in [types.ts:57](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L57)* +*Defined in [types.ts:57](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L57)* ___ @@ -1049,7 +1072,7 @@ ___ • **value**: *`BigNumber`* -*Defined in [types.ts:58](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L58)* +*Defined in [types.ts:58](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L58)*
@@ -1073,7 +1096,7 @@ ___ • **approved**: *string* -*Defined in [types.ts:93](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L93)* +*Defined in [types.ts:93](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L93)* ___ @@ -1081,7 +1104,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:92](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L92)* +*Defined in [types.ts:92](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L92)* ___ @@ -1089,7 +1112,7 @@ ___ • **tokenId**: *`BigNumber`* -*Defined in [types.ts:94](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L94)* +*Defined in [types.ts:94](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L94)*
@@ -1113,7 +1136,7 @@ ___ • **approved**: *boolean* -*Defined in [types.ts:106](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L106)* +*Defined in [types.ts:106](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L106)* ___ @@ -1121,7 +1144,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:105](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L105)* +*Defined in [types.ts:105](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L105)* ___ @@ -1129,7 +1152,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:104](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L104)* +*Defined in [types.ts:104](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L104)*
@@ -1153,7 +1176,7 @@ ___ • **from**: *string* -*Defined in [types.ts:80](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L80)* +*Defined in [types.ts:80](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L80)* ___ @@ -1161,7 +1184,7 @@ ___ • **to**: *string* -*Defined in [types.ts:81](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L81)* +*Defined in [types.ts:81](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L81)* ___ @@ -1169,7 +1192,7 @@ ___ • **tokenId**: *`BigNumber`* -*Defined in [types.ts:82](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L82)* +*Defined in [types.ts:82](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L82)*
@@ -1196,7 +1219,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [types.ts:178](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L178)* +*Defined in [types.ts:178](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L178)* ___ @@ -1204,7 +1227,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:176](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L176)* +*Defined in [types.ts:176](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L176)* ___ @@ -1212,7 +1235,7 @@ ___ • **makerAssetData**: *string* -*Defined in [types.ts:180](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L180)* +*Defined in [types.ts:180](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L180)* ___ @@ -1220,7 +1243,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:179](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L179)* +*Defined in [types.ts:179](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L179)* ___ @@ -1228,7 +1251,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:177](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L177)* +*Defined in [types.ts:177](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L177)* ___ @@ -1236,7 +1259,7 @@ ___ • **takerAssetData**: *string* -*Defined in [types.ts:181](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L181)* +*Defined in [types.ts:181](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L181)*
@@ -1260,7 +1283,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:185](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L185)* +*Defined in [types.ts:185](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L185)* ___ @@ -1268,7 +1291,7 @@ ___ • **orderEpoch**: *`BigNumber`* -*Defined in [types.ts:187](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L187)* +*Defined in [types.ts:187](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L187)* ___ @@ -1276,7 +1299,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:186](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L186)* +*Defined in [types.ts:186](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L186)*
@@ -1308,7 +1331,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [types.ts:151](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L151)* +*Defined in [types.ts:151](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L151)* ___ @@ -1316,7 +1339,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:148](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L148)* +*Defined in [types.ts:148](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L148)* ___ @@ -1324,7 +1347,7 @@ ___ • **makerAssetData**: *string* -*Defined in [types.ts:157](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L157)* +*Defined in [types.ts:157](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L157)* ___ @@ -1332,7 +1355,7 @@ ___ • **makerAssetFilledAmount**: *`BigNumber`* -*Defined in [types.ts:152](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L152)* +*Defined in [types.ts:152](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L152)* ___ @@ -1340,7 +1363,7 @@ ___ • **makerFeePaid**: *`BigNumber`* -*Defined in [types.ts:154](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L154)* +*Defined in [types.ts:154](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L154)* ___ @@ -1348,7 +1371,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:156](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L156)* +*Defined in [types.ts:156](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L156)* ___ @@ -1356,7 +1379,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:150](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L150)* +*Defined in [types.ts:150](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L150)* ___ @@ -1364,7 +1387,7 @@ ___ • **takerAddress**: *string* -*Defined in [types.ts:149](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L149)* +*Defined in [types.ts:149](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L149)* ___ @@ -1372,7 +1395,7 @@ ___ • **takerAssetData**: *string* -*Defined in [types.ts:158](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L158)* +*Defined in [types.ts:158](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L158)* ___ @@ -1380,7 +1403,7 @@ ___ • **takerAssetFilledAmount**: *`BigNumber`* -*Defined in [types.ts:153](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L153)* +*Defined in [types.ts:153](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L153)* ___ @@ -1388,7 +1411,7 @@ ___ • **takerFeePaid**: *`BigNumber`* -*Defined in [types.ts:155](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L155)* +*Defined in [types.ts:155](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L155)*
@@ -1412,7 +1435,7 @@ ___ • **ordersInfos**: *[OrderInfo](#interface-orderinfo)[]* -*Defined in [types.ts:415](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L415)* +*Defined in [types.ts:415](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L415)* ___ @@ -1420,7 +1443,7 @@ ___ • **snapshotID**: *string* -*Defined in [types.ts:413](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L413)* +*Defined in [types.ts:413](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L413)* ___ @@ -1428,7 +1451,7 @@ ___ • **snapshotTimestamp**: *number* -*Defined in [types.ts:414](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L414)* +*Defined in [types.ts:414](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L414)*
@@ -1463,7 +1486,7 @@ ___ • **ethRPCRateLimitExpiredRequests**: *number* -*Defined in [types.ts:442](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L442)* +*Defined in [types.ts:442](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L442)* ___ @@ -1471,7 +1494,7 @@ ___ • **ethRPCRequestsSentInCurrentUTCDay**: *number* -*Defined in [types.ts:441](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L441)* +*Defined in [types.ts:441](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L441)* ___ @@ -1479,7 +1502,7 @@ ___ • **ethereumChainID**: *number* -*Defined in [types.ts:433](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L433)* +*Defined in [types.ts:433](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L433)* ___ @@ -1487,7 +1510,7 @@ ___ • **latestBlock**: *[LatestBlock](#interface-latestblock)* -*Defined in [types.ts:434](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L434)* +*Defined in [types.ts:434](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L434)* ___ @@ -1495,7 +1518,7 @@ ___ • **maxExpirationTime**: *string* -*Defined in [types.ts:439](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L439)* +*Defined in [types.ts:439](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L439)* ___ @@ -1503,7 +1526,7 @@ ___ • **numOrders**: *number* -*Defined in [types.ts:436](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L436)* +*Defined in [types.ts:436](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L436)* ___ @@ -1511,7 +1534,7 @@ ___ • **numOrdersIncludingRemoved**: *number* -*Defined in [types.ts:437](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L437)* +*Defined in [types.ts:437](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L437)* ___ @@ -1519,7 +1542,7 @@ ___ • **numPeers**: *number* -*Defined in [types.ts:435](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L435)* +*Defined in [types.ts:435](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L435)* ___ @@ -1527,7 +1550,7 @@ ___ • **numPinnedOrders**: *number* -*Defined in [types.ts:438](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L438)* +*Defined in [types.ts:438](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L438)* ___ @@ -1535,7 +1558,7 @@ ___ • **peerID**: *string* -*Defined in [types.ts:432](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L432)* +*Defined in [types.ts:432](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L432)* ___ @@ -1543,7 +1566,7 @@ ___ • **pubSubTopic**: *string* -*Defined in [types.ts:430](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L430)* +*Defined in [types.ts:430](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L430)* ___ @@ -1551,7 +1574,7 @@ ___ • **rendezvous**: *string* -*Defined in [types.ts:431](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L431)* +*Defined in [types.ts:431](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L431)* ___ @@ -1559,7 +1582,7 @@ ___ • **startOfCurrentUTCDay**: *string* -*Defined in [types.ts:440](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L440)* +*Defined in [types.ts:440](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L440)* ___ @@ -1567,7 +1590,7 @@ ___ • **version**: *string* -*Defined in [types.ts:429](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L429)* +*Defined in [types.ts:429](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L429)*
@@ -1590,7 +1613,7 @@ ___ • **result**: *string* -*Defined in [types.ts:304](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L304)* +*Defined in [types.ts:304](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L304)* ___ @@ -1598,7 +1621,7 @@ ___ • **subscription**: *string* -*Defined in [types.ts:303](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L303)* +*Defined in [types.ts:303](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L303)*
@@ -1621,7 +1644,7 @@ ___ • **hash**: *string* -*Defined in [types.ts:425](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L425)* +*Defined in [types.ts:425](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L425)* ___ @@ -1629,7 +1652,7 @@ ___ • **number**: *number* -*Defined in [types.ts:424](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L424)* +*Defined in [types.ts:424](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L424)*
@@ -1656,7 +1679,7 @@ ___ • **contractEvents**: *[ContractEvent](#interface-contractevent)[]* -*Defined in [types.ts:322](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L322)* +*Defined in [types.ts:322](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L322)* ___ @@ -1664,7 +1687,7 @@ ___ • **endState**: *[OrderEventEndState](#enumeration-ordereventendstate)* -*Defined in [types.ts:320](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L320)* +*Defined in [types.ts:320](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L320)* ___ @@ -1672,7 +1695,7 @@ ___ • **fillableTakerAssetAmount**: *`BigNumber`* -*Defined in [types.ts:321](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L321)* +*Defined in [types.ts:321](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L321)* ___ @@ -1680,7 +1703,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:318](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L318)* +*Defined in [types.ts:318](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L318)* ___ @@ -1688,7 +1711,7 @@ ___ • **signedOrder**: *`SignedOrder`* -*Defined in [types.ts:319](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L319)* +*Defined in [types.ts:319](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L319)* ___ @@ -1696,7 +1719,7 @@ ___ • **timestampMs**: *number* -*Defined in [types.ts:317](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L317)* +*Defined in [types.ts:317](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L317)*
@@ -1719,7 +1742,7 @@ ___ • **result**: *[RawOrderEvent](#interface-raworderevent)[]* -*Defined in [types.ts:299](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L299)* +*Defined in [types.ts:299](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L299)* ___ @@ -1727,7 +1750,7 @@ ___ • **subscription**: *string* -*Defined in [types.ts:298](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L298)* +*Defined in [types.ts:298](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L298)*
@@ -1751,7 +1774,7 @@ ___ • **fillableTakerAssetAmount**: *`BigNumber`* -*Defined in [types.ts:348](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L348)* +*Defined in [types.ts:348](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L348)* ___ @@ -1759,7 +1782,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:346](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L346)* +*Defined in [types.ts:346](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L346)* ___ @@ -1767,7 +1790,7 @@ ___ • **signedOrder**: *`SignedOrder`* -*Defined in [types.ts:347](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L347)* +*Defined in [types.ts:347](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L347)*
@@ -1792,7 +1815,7 @@ ___ • **fillableTakerAssetAmount**: *string* -*Defined in [types.ts:328](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L328)* +*Defined in [types.ts:328](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L328)* ___ @@ -1800,7 +1823,7 @@ ___ • **isNew**: *boolean* -*Defined in [types.ts:329](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L329)* +*Defined in [types.ts:329](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L329)* ___ @@ -1808,7 +1831,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:326](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L326)* +*Defined in [types.ts:326](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L326)* ___ @@ -1816,7 +1839,7 @@ ___ • **signedOrder**: *[StringifiedSignedOrder](#interface-stringifiedsignedorder)* -*Defined in [types.ts:327](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L327)* +*Defined in [types.ts:327](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L327)*
@@ -1840,7 +1863,7 @@ ___ • **ordersInfos**: *[RawAcceptedOrderInfo](#interface-rawacceptedorderinfo)[]* -*Defined in [types.ts:406](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L406)* +*Defined in [types.ts:406](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L406)* ___ @@ -1848,7 +1871,7 @@ ___ • **snapshotID**: *string* -*Defined in [types.ts:404](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L404)* +*Defined in [types.ts:404](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L404)* ___ @@ -1856,7 +1879,7 @@ ___ • **snapshotTimestamp**: *string* -*Defined in [types.ts:405](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L405)* +*Defined in [types.ts:405](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L405)*
@@ -1883,7 +1906,7 @@ ___ • **contractEvents**: *[StringifiedContractEvent](#interface-stringifiedcontractevent)[]* -*Defined in [types.ts:313](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L313)* +*Defined in [types.ts:313](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L313)* ___ @@ -1891,7 +1914,7 @@ ___ • **endState**: *[OrderEventEndState](#enumeration-ordereventendstate)* -*Defined in [types.ts:311](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L311)* +*Defined in [types.ts:311](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L311)* ___ @@ -1899,7 +1922,7 @@ ___ • **fillableTakerAssetAmount**: *string* -*Defined in [types.ts:312](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L312)* +*Defined in [types.ts:312](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L312)* ___ @@ -1907,7 +1930,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:309](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L309)* +*Defined in [types.ts:309](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L309)* ___ @@ -1915,7 +1938,7 @@ ___ • **signedOrder**: *[StringifiedSignedOrder](#interface-stringifiedsignedorder)* -*Defined in [types.ts:310](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L310)* +*Defined in [types.ts:310](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L310)* ___ @@ -1923,7 +1946,7 @@ ___ • **timestamp**: *string* -*Defined in [types.ts:308](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L308)* +*Defined in [types.ts:308](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L308)*
@@ -1947,7 +1970,7 @@ ___ • **fillableTakerAssetAmount**: *string* -*Defined in [types.ts:342](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L342)* +*Defined in [types.ts:342](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L342)* ___ @@ -1955,7 +1978,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:340](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L340)* +*Defined in [types.ts:340](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L340)* ___ @@ -1963,7 +1986,7 @@ ___ • **signedOrder**: *[StringifiedSignedOrder](#interface-stringifiedsignedorder)* -*Defined in [types.ts:341](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L341)* +*Defined in [types.ts:341](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L341)*
@@ -1988,7 +2011,7 @@ ___ • **kind**: *[RejectedKind](#enumeration-rejectedkind)* -*Defined in [types.ts:382](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L382)* +*Defined in [types.ts:382](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L382)* ___ @@ -1996,7 +2019,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:380](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L380)* +*Defined in [types.ts:380](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L380)* ___ @@ -2004,7 +2027,7 @@ ___ • **signedOrder**: *[StringifiedSignedOrder](#interface-stringifiedsignedorder)* -*Defined in [types.ts:381](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L381)* +*Defined in [types.ts:381](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L381)* ___ @@ -2012,7 +2035,7 @@ ___ • **status**: *[RejectedStatus](#interface-rejectedstatus)* -*Defined in [types.ts:383](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L383)* +*Defined in [types.ts:383](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L383)*
@@ -2035,7 +2058,7 @@ ___ • **accepted**: *[RawAcceptedOrderInfo](#interface-rawacceptedorderinfo)[]* -*Defined in [types.ts:394](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L394)* +*Defined in [types.ts:394](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L394)* ___ @@ -2043,7 +2066,7 @@ ___ • **rejected**: *[RawRejectedOrderInfo](#interface-rawrejectedorderinfo)[]* -*Defined in [types.ts:395](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L395)* +*Defined in [types.ts:395](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L395)*
@@ -2068,7 +2091,7 @@ ___ • **kind**: *[RejectedKind](#enumeration-rejectedkind)* -*Defined in [types.ts:389](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L389)* +*Defined in [types.ts:389](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L389)* ___ @@ -2076,7 +2099,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:387](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L387)* +*Defined in [types.ts:387](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L387)* ___ @@ -2084,7 +2107,7 @@ ___ • **signedOrder**: *`SignedOrder`* -*Defined in [types.ts:388](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L388)* +*Defined in [types.ts:388](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L388)* ___ @@ -2092,7 +2115,7 @@ ___ • **status**: *[RejectedStatus](#interface-rejectedstatus)* -*Defined in [types.ts:390](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L390)* +*Defined in [types.ts:390](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L390)*
@@ -2115,7 +2138,7 @@ ___ • **code**: *[RejectedCode](#enumeration-rejectedcode)* -*Defined in [types.ts:375](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L375)* +*Defined in [types.ts:375](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L375)* ___ @@ -2123,7 +2146,7 @@ ___ • **message**: *string* -*Defined in [types.ts:376](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L376)* +*Defined in [types.ts:376](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L376)*
@@ -2152,7 +2175,7 @@ ___ • **address**: *string* -*Defined in [types.ts:253](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L253)* +*Defined in [types.ts:253](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L253)* ___ @@ -2160,7 +2183,7 @@ ___ • **blockHash**: *string* -*Defined in [types.ts:248](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L248)* +*Defined in [types.ts:248](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L248)* ___ @@ -2168,7 +2191,7 @@ ___ • **isRemoved**: *string* -*Defined in [types.ts:252](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L252)* +*Defined in [types.ts:252](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L252)* ___ @@ -2176,7 +2199,7 @@ ___ • **kind**: *string* -*Defined in [types.ts:254](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L254)* +*Defined in [types.ts:254](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L254)* ___ @@ -2184,7 +2207,7 @@ ___ • **logIndex**: *number* -*Defined in [types.ts:251](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L251)* +*Defined in [types.ts:251](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L251)* ___ @@ -2192,7 +2215,7 @@ ___ • **parameters**: *[StringifiedContractEventParameters](#stringifiedcontracteventparameters)* -*Defined in [types.ts:255](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L255)* +*Defined in [types.ts:255](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L255)* ___ @@ -2200,7 +2223,7 @@ ___ • **txHash**: *string* -*Defined in [types.ts:249](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L249)* +*Defined in [types.ts:249](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L249)* ___ @@ -2208,7 +2231,7 @@ ___ • **txIndex**: *number* -*Defined in [types.ts:250](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L250)* +*Defined in [types.ts:250](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L250)*
@@ -2234,7 +2257,7 @@ ___ • **from**: *string* -*Defined in [types.ts:135](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L135)* +*Defined in [types.ts:135](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L135)* ___ @@ -2242,7 +2265,7 @@ ___ • **ids**: *string[]* -*Defined in [types.ts:137](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L137)* +*Defined in [types.ts:137](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L137)* ___ @@ -2250,7 +2273,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:134](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L134)* +*Defined in [types.ts:134](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L134)* ___ @@ -2258,7 +2281,7 @@ ___ • **to**: *string* -*Defined in [types.ts:136](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L136)* +*Defined in [types.ts:136](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L136)* ___ @@ -2266,7 +2289,7 @@ ___ • **values**: *string[]* -*Defined in [types.ts:138](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L138)* +*Defined in [types.ts:138](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L138)*
@@ -2292,7 +2315,7 @@ ___ • **from**: *string* -*Defined in [types.ts:119](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L119)* +*Defined in [types.ts:119](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L119)* ___ @@ -2300,7 +2323,7 @@ ___ • **id**: *string* -*Defined in [types.ts:121](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L121)* +*Defined in [types.ts:121](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L121)* ___ @@ -2308,7 +2331,7 @@ ___ • **operator**: *string* -*Defined in [types.ts:118](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L118)* +*Defined in [types.ts:118](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L118)* ___ @@ -2316,7 +2339,7 @@ ___ • **to**: *string* -*Defined in [types.ts:120](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L120)* +*Defined in [types.ts:120](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L120)* ___ @@ -2324,7 +2347,7 @@ ___ • **value**: *string* -*Defined in [types.ts:122](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L122)* +*Defined in [types.ts:122](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L122)*
@@ -2348,7 +2371,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:74](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L74)* +*Defined in [types.ts:74](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L74)* ___ @@ -2356,7 +2379,7 @@ ___ • **spender**: *string* -*Defined in [types.ts:75](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L75)* +*Defined in [types.ts:75](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L75)* ___ @@ -2364,7 +2387,7 @@ ___ • **value**: *string* -*Defined in [types.ts:76](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L76)* +*Defined in [types.ts:76](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L76)*
@@ -2388,7 +2411,7 @@ ___ • **from**: *string* -*Defined in [types.ts:62](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L62)* +*Defined in [types.ts:62](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L62)* ___ @@ -2396,7 +2419,7 @@ ___ • **to**: *string* -*Defined in [types.ts:63](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L63)* +*Defined in [types.ts:63](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L63)* ___ @@ -2404,7 +2427,7 @@ ___ • **value**: *string* -*Defined in [types.ts:64](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L64)* +*Defined in [types.ts:64](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L64)*
@@ -2428,7 +2451,7 @@ ___ • **approved**: *string* -*Defined in [types.ts:99](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L99)* +*Defined in [types.ts:99](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L99)* ___ @@ -2436,7 +2459,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:98](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L98)* +*Defined in [types.ts:98](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L98)* ___ @@ -2444,7 +2467,7 @@ ___ • **tokenId**: *string* -*Defined in [types.ts:100](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L100)* +*Defined in [types.ts:100](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L100)*
@@ -2468,7 +2491,7 @@ ___ • **from**: *string* -*Defined in [types.ts:86](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L86)* +*Defined in [types.ts:86](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L86)* ___ @@ -2476,7 +2499,7 @@ ___ • **to**: *string* -*Defined in [types.ts:87](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L87)* +*Defined in [types.ts:87](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L87)* ___ @@ -2484,7 +2507,7 @@ ___ • **tokenId**: *string* -*Defined in [types.ts:88](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L88)* +*Defined in [types.ts:88](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L88)*
@@ -2508,7 +2531,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:191](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L191)* +*Defined in [types.ts:191](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L191)* ___ @@ -2516,7 +2539,7 @@ ___ • **orderEpoch**: *string* -*Defined in [types.ts:193](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L193)* +*Defined in [types.ts:193](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L193)* ___ @@ -2524,7 +2547,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:192](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L192)* +*Defined in [types.ts:192](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L192)*
@@ -2556,7 +2579,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [types.ts:165](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L165)* +*Defined in [types.ts:165](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L165)* ___ @@ -2564,7 +2587,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:162](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L162)* +*Defined in [types.ts:162](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L162)* ___ @@ -2572,7 +2595,7 @@ ___ • **makerAssetData**: *string* -*Defined in [types.ts:171](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L171)* +*Defined in [types.ts:171](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L171)* ___ @@ -2580,7 +2603,7 @@ ___ • **makerAssetFilledAmount**: *string* -*Defined in [types.ts:166](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L166)* +*Defined in [types.ts:166](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L166)* ___ @@ -2588,7 +2611,7 @@ ___ • **makerFeePaid**: *string* -*Defined in [types.ts:168](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L168)* +*Defined in [types.ts:168](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L168)* ___ @@ -2596,7 +2619,7 @@ ___ • **orderHash**: *string* -*Defined in [types.ts:170](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L170)* +*Defined in [types.ts:170](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L170)* ___ @@ -2604,7 +2627,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:164](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L164)* +*Defined in [types.ts:164](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L164)* ___ @@ -2612,7 +2635,7 @@ ___ • **takerAddress**: *string* -*Defined in [types.ts:163](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L163)* +*Defined in [types.ts:163](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L163)* ___ @@ -2620,7 +2643,7 @@ ___ • **takerAssetData**: *string* -*Defined in [types.ts:172](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L172)* +*Defined in [types.ts:172](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L172)* ___ @@ -2628,7 +2651,7 @@ ___ • **takerAssetFilledAmount**: *string* -*Defined in [types.ts:167](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L167)* +*Defined in [types.ts:167](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L167)* ___ @@ -2636,7 +2659,7 @@ ___ • **takerFeePaid**: *string* -*Defined in [types.ts:169](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L169)* +*Defined in [types.ts:169](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L169)*
@@ -2671,7 +2694,7 @@ ___ • **exchangeAddress**: *string* -*Defined in [types.ts:49](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L49)* +*Defined in [types.ts:49](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L49)* ___ @@ -2679,7 +2702,7 @@ ___ • **expirationTimeSeconds**: *string* -*Defined in [types.ts:51](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L51)* +*Defined in [types.ts:51](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L51)* ___ @@ -2687,7 +2710,7 @@ ___ • **feeRecipientAddress**: *string* -*Defined in [types.ts:50](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L50)* +*Defined in [types.ts:50](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L50)* ___ @@ -2695,7 +2718,7 @@ ___ • **makerAddress**: *string* -*Defined in [types.ts:40](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L40)* +*Defined in [types.ts:40](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L40)* ___ @@ -2703,7 +2726,7 @@ ___ • **makerAssetAmount**: *string* -*Defined in [types.ts:44](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L44)* +*Defined in [types.ts:44](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L44)* ___ @@ -2711,7 +2734,7 @@ ___ • **makerAssetData**: *string* -*Defined in [types.ts:46](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L46)* +*Defined in [types.ts:46](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L46)* ___ @@ -2719,7 +2742,7 @@ ___ • **makerFee**: *string* -*Defined in [types.ts:42](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L42)* +*Defined in [types.ts:42](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L42)* ___ @@ -2727,7 +2750,7 @@ ___ • **salt**: *string* -*Defined in [types.ts:48](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L48)* +*Defined in [types.ts:48](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L48)* ___ @@ -2735,7 +2758,7 @@ ___ • **senderAddress**: *string* -*Defined in [types.ts:39](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L39)* +*Defined in [types.ts:39](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L39)* ___ @@ -2743,7 +2766,7 @@ ___ • **signature**: *string* -*Defined in [types.ts:52](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L52)* +*Defined in [types.ts:52](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L52)* ___ @@ -2751,7 +2774,7 @@ ___ • **takerAddress**: *string* -*Defined in [types.ts:41](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L41)* +*Defined in [types.ts:41](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L41)* ___ @@ -2759,7 +2782,7 @@ ___ • **takerAssetAmount**: *string* -*Defined in [types.ts:45](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L45)* +*Defined in [types.ts:45](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L45)* ___ @@ -2767,7 +2790,7 @@ ___ • **takerAssetData**: *string* -*Defined in [types.ts:47](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L47)* +*Defined in [types.ts:47](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L47)* ___ @@ -2775,7 +2798,7 @@ ___ • **takerFee**: *string* -*Defined in [types.ts:43](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L43)* +*Defined in [types.ts:43](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L43)*
@@ -2798,7 +2821,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:212](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L212)* +*Defined in [types.ts:212](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L212)* ___ @@ -2806,7 +2829,7 @@ ___ • **value**: *string* -*Defined in [types.ts:213](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L213)* +*Defined in [types.ts:213](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L213)*
@@ -2829,7 +2852,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:202](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L202)* +*Defined in [types.ts:202](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L202)* ___ @@ -2837,7 +2860,7 @@ ___ • **value**: *string* -*Defined in [types.ts:203](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L203)* +*Defined in [types.ts:203](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L203)*
@@ -2860,7 +2883,7 @@ ___ • **accepted**: *[AcceptedOrderInfo](#interface-acceptedorderinfo)[]* -*Defined in [types.ts:399](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L399)* +*Defined in [types.ts:399](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L399)* ___ @@ -2868,7 +2891,7 @@ ___ • **rejected**: *[RejectedOrderInfo](#interface-rejectedorderinfo)[]* -*Defined in [types.ts:400](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L400)* +*Defined in [types.ts:400](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L400)*
@@ -2891,7 +2914,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:207](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L207)* +*Defined in [types.ts:207](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L207)* ___ @@ -2899,7 +2922,7 @@ ___ • **value**: *`BigNumber`* -*Defined in [types.ts:208](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L208)* +*Defined in [types.ts:208](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L208)*
@@ -2922,7 +2945,7 @@ ___ • **owner**: *string* -*Defined in [types.ts:197](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L197)* +*Defined in [types.ts:197](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L197)* ___ @@ -2930,7 +2953,7 @@ ___ • **value**: *`BigNumber`* -*Defined in [types.ts:198](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L198)* +*Defined in [types.ts:198](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L198)*
@@ -2953,7 +2976,7 @@ ___ • **type**: *string* -*Defined in [types.ts:419](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L419)* +*Defined in [types.ts:419](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L419)* ___ @@ -2961,7 +2984,7 @@ ___ • **utf8Data**: *string* -*Defined in [types.ts:420](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L420)* +*Defined in [types.ts:420](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L420)*
@@ -2995,7 +3018,7 @@ reconnectDelay: time in milliseconds after which to attempt to reconnect to WS s • **clientConfig**? : *[ClientConfig](#interface-clientconfig)* -*Defined in [types.ts:34](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L34)* +*Defined in [types.ts:34](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L34)* ___ @@ -3003,7 +3026,7 @@ ___ • **headers**? : *undefined | `__type`* -*Defined in [types.ts:32](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L32)* +*Defined in [types.ts:32](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L32)* ___ @@ -3011,7 +3034,7 @@ ___ • **protocol**? : *undefined | string* -*Defined in [types.ts:33](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L33)* +*Defined in [types.ts:33](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L33)* ___ @@ -3019,7 +3042,7 @@ ___ • **reconnectDelay**? : *undefined | number* -*Defined in [types.ts:35](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L35)* +*Defined in [types.ts:35](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L35)* ___ @@ -3027,7 +3050,7 @@ ___ • **timeout**? : *undefined | number* -*Defined in [types.ts:31](https://github.com/0xProject/0x-mesh/blob/ae6de374/rpc/clients/typescript/src/types.ts#L31)* +*Defined in [types.ts:31](https://github.com/0xProject/0x-mesh/blob/f4fb987/rpc/clients/typescript/src/types.ts#L31)*
diff --git a/docs/rpc_api.md b/docs/rpc_api.md index 8e575b788..7815967ea 100644 --- a/docs/rpc_api.md +++ b/docs/rpc_api.md @@ -1,4 +1,4 @@ -[![Version](https://img.shields.io/badge/version-8.2.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) +[![Version](https://img.shields.io/badge/version-9.0.0-orange.svg)](https://github.com/0xProject/0x-mesh/releases) # 0x Mesh JSON-RPC API Documentation diff --git a/encoding/encoding.go b/encoding/encoding.go index 7805adb67..eaf762c89 100644 --- a/encoding/encoding.go +++ b/encoding/encoding.go @@ -8,15 +8,17 @@ import ( ) type orderMessage struct { - MessageType string - Order *zeroex.SignedOrder + MessageType string `json:"messageType"` + Order *zeroex.SignedOrder `json:"order"` + Topics []string `json:"topics"` } // OrderToRawMessage encodes an order into an order message to be sent over the wire -func OrderToRawMessage(order *zeroex.SignedOrder) ([]byte, error) { +func OrderToRawMessage(topic string, order *zeroex.SignedOrder) ([]byte, error) { return json.Marshal(orderMessage{ MessageType: "order", Order: order, + Topics: []string{topic}, }) } diff --git a/ethereum/contract_addresses.go b/ethereum/contract_addresses.go index b637371e7..8c7dc36ff 100644 --- a/ethereum/contract_addresses.go +++ b/ethereum/contract_addresses.go @@ -17,8 +17,8 @@ func GetContractAddressesForChainID(chainID int) (ContractAddresses, error) { } func AddContractAddressesForChainID(chainID int, addresses ContractAddresses) error { - if _, alreadExists := ChainIDToContractAddresses[chainID]; alreadExists { - return fmt.Errorf("cannot add contract addresses for chain ID %d: addresses for this chain id are already defined", chainID) + if chainID == 1 { + return fmt.Errorf("cannot add contract addresses for chainID 1: addresses for mainnet are hard-coded and cannot be changed") } if addresses.Exchange == constants.NullAddress { return fmt.Errorf("cannot add contract addresses for chain ID %d: Exchange address is required", chainID) @@ -54,6 +54,8 @@ type ContractAddresses struct { DevUtils common.Address `json:"devUtils"` WETH9 common.Address `json:"weth9"` ZRXToken common.Address `json:"zrxToken"` + ChaiBridge common.Address `json:"chaiBridge"` + ChaiToken common.Address `json:"chaiToken"` } // ChainIDToContractAddresses maps chainId to a mapping of contract name to Ethereum address @@ -70,6 +72,8 @@ var ChainIDToContractAddresses = map[int]ContractAddresses{ DevUtils: common.HexToAddress("0xb1a3d901bad1df7d710fc8d008db7cdd6bbbffe6"), WETH9: common.HexToAddress("0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), ZRXToken: common.HexToAddress("0xe41d2489571d322189246dafa5ebde1f4699f498"), + ChaiBridge: common.HexToAddress("0x77c31eba23043b9a72d13470f3a3a311344d7438"), + ChaiToken: common.HexToAddress("0x06af07097c9eeb7fd685c692751d5c66db49c215"), }, // Ropsten 3: ContractAddresses{ @@ -82,6 +86,8 @@ var ChainIDToContractAddresses = map[int]ContractAddresses{ DevUtils: common.HexToAddress("0xb1a3d901bad1df7d710fc8d008db7cdd6bbbffe6"), WETH9: common.HexToAddress("0xc778417e063141139fce010982780140aa0cd5ab"), ZRXToken: common.HexToAddress("0xff67881f8d12f372d91baae9752eb3631ff0ed00"), + ChaiBridge: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ChaiToken: common.HexToAddress("0x0000000000000000000000000000000000000000"), }, // Rinkeby 4: ContractAddresses{ @@ -94,6 +100,8 @@ var ChainIDToContractAddresses = map[int]ContractAddresses{ DevUtils: common.HexToAddress("0xb1a3d901bad1df7d710fc8d008db7cdd6bbbffe6"), WETH9: common.HexToAddress("0xc778417e063141139fce010982780140aa0cd5ab"), ZRXToken: common.HexToAddress("0x8080c7e4b81ecf23aa6f877cfbfd9b0c228c6ffa"), + ChaiBridge: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ChaiToken: common.HexToAddress("0x0000000000000000000000000000000000000000"), }, // Kovan 42: ContractAddresses{ @@ -106,6 +114,8 @@ var ChainIDToContractAddresses = map[int]ContractAddresses{ DevUtils: common.HexToAddress("0xb1a3d901bad1df7d710fc8d008db7cdd6bbbffe6"), WETH9: common.HexToAddress("0xd0a1e359811322d97991e03f863a0c30c2cf029c"), ZRXToken: common.HexToAddress("0x2002d3812f58e35f0ea1ffbf80a75a38c32175fa"), + ChaiBridge: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ChaiToken: common.HexToAddress("0x0000000000000000000000000000000000000000"), }, // Ganache snapshot 1337: ContractAddresses{ @@ -118,5 +128,7 @@ var ChainIDToContractAddresses = map[int]ContractAddresses{ DevUtils: common.HexToAddress("0xa31e64ea55b9b6bbb9d6a676738e9a5b23149f84"), WETH9: common.HexToAddress("0x0b1ba0af832d7c05fd64161e0db78e85978e8082"), ZRXToken: common.HexToAddress("0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + ChaiBridge: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ChaiToken: common.HexToAddress("0x0000000000000000000000000000000000000000"), }, } diff --git a/ethereum/ethrpcclient/eth_rpc_client.go b/ethereum/ethrpcclient/eth_rpc_client.go index db38c8d72..463caf178 100644 --- a/ethereum/ethrpcclient/eth_rpc_client.go +++ b/ethereum/ethrpcclient/eth_rpc_client.go @@ -12,7 +12,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/rpc" ) // Client defines the methods needed to satisfy the subsdet of ETH JSON-RPC client @@ -30,7 +29,10 @@ type Client interface { // client is a Client through which _all_ Ethereum JSON-RPC requests should be routed through. It // enforces a max requestTimeout and also rate-limits requests type client struct { - rpcClient *rpc.Client + // rpcClient is the underlying RPC client or provider + rpcClient ethclient.RPCClient + // client is the higher level Ethereum RPC client with lots of helper methods + // for converting Go types to JSON and vice versa. client *ethclient.Client requestTimeout time.Duration rateLimiter ratelimit.RateLimiter @@ -40,15 +42,8 @@ type client struct { } // New returns a new instance of client -func New(rpcURL string, requestTimeout time.Duration, rateLimiter ratelimit.RateLimiter) (Client, error) { - ethClient, err := ethclient.Dial(rpcURL) - if err != nil { - return nil, err - } - rpcClient, err := rpc.Dial(rpcURL) - if err != nil { - return nil, err - } +func New(rpcClient ethclient.RPCClient, requestTimeout time.Duration, rateLimiter ratelimit.RateLimiter) (Client, error) { + ethClient := ethclient.NewClient(rpcClient) return &client{ client: ethClient, rpcClient: rpcClient, diff --git a/ethereum/ratelimit/rate_limiter.go b/ethereum/ratelimit/rate_limiter.go index d9273c520..a74e7fbc5 100644 --- a/ethereum/ratelimit/rate_limiter.go +++ b/ethereum/ratelimit/rate_limiter.go @@ -93,8 +93,8 @@ func (r *rateLimiter) Start(ctx context.Context, checkpointInterval time.Duratio // Start 24hr UTC accrued grants resetter wg := &sync.WaitGroup{} + wg.Add(1) go func() { - wg.Add(1) defer wg.Done() for { now := r.aClock.Now() diff --git a/ethereum/ratelimit/rate_limiter_test.go b/ethereum/ratelimit/rate_limiter_test.go index 71617e5f7..788ac3d2d 100644 --- a/ethereum/ratelimit/rate_limiter_test.go +++ b/ethereum/ratelimit/rate_limiter_test.go @@ -23,7 +23,7 @@ const ( // grantTimingTolerance is the maximum allowed difference between the expected // time for a request to be granted and the actual time it is granted. Used // throughout these tests to account for subtle timing differences. - grantTimingTolerance = 20 * time.Millisecond + grantTimingTolerance = 50 * time.Millisecond ) // Scenario1: If the 24 hour limit has *not* been hit, requests should be diff --git a/examples/browser/src/index.ts b/examples/browser/src/index.ts index bb8576205..5d374d433 100644 --- a/examples/browser/src/index.ts +++ b/examples/browser/src/index.ts @@ -1,10 +1,11 @@ -import { Mesh, OrderEvent, SignedOrder, BigNumber } from '@0x/mesh-browser'; +import { Mesh, OrderEvent, SignedOrder, BigNumber, SupportedProvider } from '@0x/mesh-browser'; (async () => { - // Configure Mesh to use mainnet and Infura. + // Configure Mesh to use web3.currentProvider (e.g. provided by MetaMask). const mesh = new Mesh({ - ethereumRPCURL: 'https://mainnet.infura.io/v3/af2e590be00f463fbfd0b546784065ad', + verbosity: 4, ethereumChainID: 1, + web3Provider: (window as any).web3.currentProvider as SupportedProvider, }); // This handler will be called whenver there is a critical error. @@ -23,27 +24,28 @@ import { Mesh, OrderEvent, SignedOrder, BigNumber } from '@0x/mesh-browser'; // Start Mesh *after* we set up the handlers. await mesh.startAsync(); - // This order is for demonstration purposes only and is invalid. It will be - // rejected by Mesh. You can replace it with a valid order. + // This order is for demonstration purposes only and will likely be expired + // by the time you run this example. If so, it will be rejected by Mesh. You + // can replace it with a valid order. const order: SignedOrder = { - chainId: 1, - makerAddress: '0xa3eCE5D5B6319Fa785EfC10D3112769a46C6E149', - makerAssetData: '0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498', - makerAssetAmount: new BigNumber('1000000000000000000'), - makerFee: new BigNumber('0'), - makerFeeAssetData: '0x', + signature: + '0x1c68eb1e2577e9f51776bdb06ec51fcec9aec0ea1565eca5e243917cecaafaa46b3b9590ff6575bf1c048d0b4ec5773a2e3a8df3bf117e1613e2a7b57d6f95c95a02', + senderAddress: '0x0000000000000000000000000000000000000000', + makerAddress: '0x4418755f710468e223797a006603e29937e825bc', takerAddress: '0x0000000000000000000000000000000000000000', - takerAssetData: '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', - takerAssetAmount: new BigNumber('10000000000000000000000'), + makerFee: new BigNumber('0'), takerFee: new BigNumber('0'), + makerAssetAmount: new BigNumber('3000000000'), + takerAssetAmount: new BigNumber('19500000000000000000'), + makerAssetData: '0xf47261b0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + takerAssetData: '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + salt: new BigNumber('1579725034907'), + exchangeAddress: '0x61935cbdd02287b511119ddb11aeb42f1593b7ef', + feeRecipientAddress: '0xa258b39954cef5cb142fd567a46cddb31a670124', + expirationTimeSeconds: new BigNumber('1580329834'), + makerFeeAssetData: '0x', + chainId: 1, takerFeeAssetData: '0x', - senderAddress: '0x0000000000000000000000000000000000000000', - exchangeAddress: '0x080bf510FCbF18b91105470639e9561022937712', - feeRecipientAddress: '0x0000000000000000000000000000000000000000', - expirationTimeSeconds: new BigNumber('1586340602'), - salt: new BigNumber('41253767178111694375645046549067933145709740457131351457334397888365956743955'), - signature: - '0x1c0827552a3bde2c72560362950a69f581ae7a1e6fa8c160bb437f3a61002bb96c22b646edd3b103b976db4aa4840a11c13306b2a02a0bb6ce647806c858c238ec03', }; // Add the order and log the result. diff --git a/examples/browser/yarn.lock b/examples/browser/yarn.lock index 0fa29c830..3261d5457 100644 --- a/examples/browser/yarn.lock +++ b/examples/browser/yarn.lock @@ -69,6 +69,7 @@ "@0x/utils" "^5.1.2" base64-arraybuffer "^0.2.0" browserfs "^1.4.3" + ethereum-types "^3.0.0" "@0x/order-utils@^10.0.1": version "10.1.0" diff --git a/examples/go/README.md b/examples/go/README.md index a178d3b01..494914c3e 100644 --- a/examples/go/README.md +++ b/examples/go/README.md @@ -9,7 +9,7 @@ variables. ``` -RPC_ADDRESS=ws://167.71.80.233:60557 go run ./examples/go/subscribe-to-orders/main.go +WS_RPC_ADDR=ws://167.71.80.233:60557 go run ./examples/go/subscribe-to-orders/main.go ``` ### More Information diff --git a/examples/go/add-order/main.go b/examples/go/add-order/main.go index cc89ee24d..2e87d9408 100644 --- a/examples/go/add-order/main.go +++ b/examples/go/add-order/main.go @@ -20,7 +20,7 @@ import ( type clientEnvVars struct { // RPCAddress is the address of the 0x Mesh node to communicate with. - RPCAddress string `envvar:"RPC_ADDRESS"` + WSRPCAddress string `envvar:"WS_RPC_ADDR"` // EthereumRPCURL is the URL of an Etheruem node which supports the JSON RPC // API. EthereumRPCURL string `envvar:"ETHEREUM_RPC_URL"` @@ -51,7 +51,7 @@ func main() { panic(err) } - client, err := rpc.NewClient(env.RPCAddress) + client, err := rpc.NewClient(env.WSRPCAddress) if err != nil { log.WithError(err).Fatal("could not create client") } diff --git a/examples/go/subscribe-to-orders/main.go b/examples/go/subscribe-to-orders/main.go index 4e9107d8c..a32eb9535 100644 --- a/examples/go/subscribe-to-orders/main.go +++ b/examples/go/subscribe-to-orders/main.go @@ -14,7 +14,7 @@ import ( type clientEnvVars struct { // RPCAddress is the address of the 0x Mesh node to communicate with. - RPCAddress string `envvar:"RPC_ADDRESS"` + WSRPCAddress string `envvar:"WS_RPC_ADDR"` } func main() { @@ -25,7 +25,7 @@ func main() { panic(err) } - client, err := rpc.NewClient(env.RPCAddress) + client, err := rpc.NewClient(env.WSRPCAddress) if err != nil { log.WithError(err).Fatal("could not create client") } diff --git a/go.mod b/go.mod index 15abe0195..49696bced 100644 --- a/go.mod +++ b/go.mod @@ -1,154 +1,88 @@ module github.com/0xProject/0x-mesh -go 1.12 +go 1.13 replace ( - github.com/ethereum/go-ethereum => github.com/0xProject/go-ethereum v1.8.8-0.20191104224527-9d5c202240be - github.com/libp2p/go-ws-transport => github.com/libp2p/go-ws-transport v0.0.0-20191008032742-3098bba549e8 + github.com/ethereum/go-ethereum => github.com/0xProject/go-ethereum v1.8.8-0.20200121231321-1510563ddd1f + github.com/libp2p/go-flow-metrics => github.com/libp2p/go-flow-metrics v0.0.3 + github.com/libp2p/go-ws-transport => github.com/0xProject/go-ws-transport v0.1.1-0.20200201000210-2db3396fec39 + github.com/plaid/go-envvar => github.com/albrow/go-envvar v1.1.1-0.20200123010345-a6ece4436cb7 github.com/syndtr/goleveldb => github.com/0xProject/goleveldb v1.0.1-0.20191115232649-6a187a47701c ) require ( + github.com/0xProject/sql-datastore v0.0.0-20200129193319-32397013f115 github.com/albrow/stringset v2.1.0+incompatible - github.com/allegro/bigcache v0.0.0-20190618191010-69ea0af04088 - github.com/aristanetworks/goarista v0.0.0-20190712234253-ed1100a1c015 + github.com/allegro/bigcache v0.0.0-20190618191010-69ea0af04088 // indirect + github.com/aristanetworks/goarista v0.0.0-20190712234253-ed1100a1c015 // indirect github.com/benbjohnson/clock v0.0.0-20161215174838-7dc76406b6d3 - github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 + github.com/cespare/cp v1.1.1 // indirect github.com/chromedp/cdproto v0.0.0-20190827000638-b5ac1e37ce90 github.com/chromedp/chromedp v0.4.0 - github.com/coreos/go-semver v0.3.0 github.com/davecgh/go-spew v1.1.1 - github.com/deckarep/golang-set v1.7.1 - github.com/edsrzf/mmap-go v1.0.0 - github.com/elastic/gosigar v0.10.5 + github.com/deckarep/golang-set v1.7.1 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/elastic/gosigar v0.10.5 // indirect github.com/ethereum/go-ethereum v0.0.0-00010101000000-000000000000 - github.com/fd/go-nat v1.0.0 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20190528105824-2fd9b619dd3c - github.com/go-stack/stack v1.8.0 - github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee - github.com/gobwas/pool v0.2.0 - github.com/gobwas/ws v1.0.2 - github.com/gogo/protobuf v1.3.1 - github.com/golang/protobuf v1.3.2 - github.com/golang/snappy v0.0.1 + github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190528105824-2fd9b619dd3c // indirect + github.com/gibson042/canonicaljson-go v1.0.3 + github.com/golang/protobuf v1.3.2 // indirect github.com/google/uuid v1.1.1 - github.com/gorilla/websocket v1.4.1 github.com/hashicorp/golang-lru v0.5.3 - github.com/huin/goupnp v1.0.0 - github.com/ipfs/go-cid v0.0.3 - github.com/ipfs/go-datastore v0.1.1 - github.com/ipfs/go-ds-leveldb v0.0.2 - github.com/ipfs/go-ipfs-util v0.0.1 - github.com/ipfs/go-log v0.0.1 - github.com/ipfs/go-todocounter v0.0.1 - github.com/jackpal/gateway v1.0.5 - github.com/jackpal/go-nat-pmp v1.0.1 - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 - github.com/jbenet/goprocess v0.1.3 + github.com/ipfs/go-datastore v0.3.1 + github.com/ipfs/go-ds-leveldb v0.4.0 github.com/jpillora/backoff v0.0.0-20170918002102-8eab2debe79d - github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9 + github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9 // indirect github.com/karlseguin/ccache v2.0.3+incompatible - github.com/knq/sysutil v0.0.0-20181215143952-f05b59f0f307 - github.com/konsorten/go-windows-terminal-sequences v1.0.2 - github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b + github.com/karlseguin/expect v1.0.1 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/lib/pq v1.2.0 - github.com/libp2p/go-addr-util v0.0.1 - github.com/libp2p/go-buffer-pool v0.0.2 - github.com/libp2p/go-conn-security v0.0.0-20190226201940-b2fb4ac68c41 // indirect - github.com/libp2p/go-conn-security-multistream v0.1.0 - github.com/libp2p/go-eventbus v0.1.0 - github.com/libp2p/go-flow-metrics v0.0.1 - github.com/libp2p/go-libp2p v0.3.1 - github.com/libp2p/go-libp2p-autonat v0.1.0 + github.com/libp2p/go-conn-security v0.1.0 + github.com/libp2p/go-libp2p v0.5.1 github.com/libp2p/go-libp2p-autonat-svc v0.1.0 - github.com/libp2p/go-libp2p-circuit v0.1.2 - github.com/libp2p/go-libp2p-connmgr v0.1.1 - github.com/libp2p/go-libp2p-core v0.2.4 - github.com/libp2p/go-libp2p-crypto v0.1.0 + github.com/libp2p/go-libp2p-circuit v0.1.4 + github.com/libp2p/go-libp2p-connmgr v0.2.1 + github.com/libp2p/go-libp2p-core v0.3.0 github.com/libp2p/go-libp2p-discovery v0.2.0 - github.com/libp2p/go-libp2p-kad-dht v0.3.0 + github.com/libp2p/go-libp2p-kad-dht v0.5.0 github.com/libp2p/go-libp2p-peer v0.2.0 - github.com/libp2p/go-libp2p-peerstore v0.1.3 - github.com/libp2p/go-libp2p-protocol v0.0.0-20171212212132-b29f3d97e3a2 // indirect - github.com/libp2p/go-libp2p-pubsub v0.1.0 - github.com/libp2p/go-libp2p-record v0.1.1 - github.com/libp2p/go-libp2p-routing v0.1.0 - github.com/libp2p/go-libp2p-secio v0.2.0 - github.com/libp2p/go-libp2p-swarm v0.2.1 - github.com/libp2p/go-libp2p-transport v0.0.0-20190226201958-e8580c8a519d // indirect - github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 - github.com/libp2p/go-libp2p-yamux v0.2.1 + github.com/libp2p/go-libp2p-peerstore v0.1.4 + github.com/libp2p/go-libp2p-protocol v0.1.0 + github.com/libp2p/go-libp2p-pubsub v0.2.5 + github.com/libp2p/go-libp2p-swarm v0.2.2 github.com/libp2p/go-maddr-filter v0.0.5 - github.com/libp2p/go-mplex v0.1.0 - github.com/libp2p/go-msgio v0.0.4 - github.com/libp2p/go-nat v0.0.3 - github.com/libp2p/go-openssl v0.0.3 - github.com/libp2p/go-reuseport v0.0.1 - github.com/libp2p/go-reuseport-transport v0.0.2 - github.com/libp2p/go-stream-muxer-multistream v0.2.0 github.com/libp2p/go-tcp-transport v0.1.1 - github.com/libp2p/go-testutil v0.0.0-20190226202041-873eaa1a26ba // indirect - github.com/libp2p/go-ws-transport v0.1.0 - github.com/libp2p/go-yamux v1.2.3 - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e - github.com/mattn/go-colorable v0.1.2 - github.com/mattn/go-isatty v0.0.8 - github.com/mattn/go-runewidth v0.0.4 - github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 - github.com/minio/sha256-simd v0.1.1 - github.com/mr-tron/base58 v1.1.2 - github.com/multiformats/go-base32 v0.0.3 - github.com/multiformats/go-multiaddr v0.1.2 + github.com/libp2p/go-ws-transport v0.2.0 + github.com/mattn/go-colorable v0.1.2 // indirect + github.com/mattn/go-runewidth v0.0.4 // indirect + github.com/multiformats/go-multiaddr v0.2.0 github.com/multiformats/go-multiaddr-dns v0.2.0 - github.com/multiformats/go-multiaddr-fmt v0.1.0 - github.com/multiformats/go-multiaddr-net v0.1.0 - github.com/multiformats/go-multibase v0.0.1 - github.com/multiformats/go-multihash v0.0.8 - github.com/multiformats/go-multistream v0.1.0 - github.com/multiformats/go-varint v0.0.1 github.com/ocdogan/rbt v0.0.0-20160425054511-de6e2b48be33 - github.com/olekukonko/tablewriter v0.0.1 - github.com/opaolini/go-ds-sql v0.0.0-20191105113501-15a4c8e2fea5 - github.com/opentracing/opentracing-go v1.1.0 - github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 - github.com/pkg/errors v0.8.1 + github.com/olekukonko/tablewriter v0.0.1 // indirect + github.com/opentracing/opentracing-go v1.1.0 // indirect + github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 // indirect github.com/plaid/go-envvar v1.1.0 - github.com/pmezard/go-difflib v1.0.0 - github.com/prometheus/tsdb v0.10.0 - github.com/rjeczalik/notify v0.9.2 - github.com/rs/cors v1.7.0 + github.com/prometheus/tsdb v0.10.0 // indirect + github.com/rjeczalik/notify v0.9.2 // indirect + github.com/rs/cors v1.7.0 // indirect github.com/sirupsen/logrus v1.4.2 - github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 - github.com/spaolacci/murmur3 v1.1.0 - github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 - github.com/steakknife/bloomfilter v0.0.0-20180906043351-99ee86d9200f - github.com/steakknife/hamming v0.0.0-20180906055317-003c143a81c2 - github.com/stretchr/testify v1.3.0 + github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 // indirect + github.com/steakknife/bloomfilter v0.0.0-20180906043351-99ee86d9200f // indirect + github.com/steakknife/hamming v0.0.0-20180906055317-003c143a81c2 // indirect + github.com/stretchr/testify v1.4.0 github.com/syndtr/goleveldb v1.0.0 - github.com/tyler-smith/go-bip39 v1.0.2 - github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc - github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 - github.com/whyrusleeping/go-logging v0.0.1 - github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f - github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible // indirect - github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible // indirect - github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible // indirect - github.com/whyrusleeping/mafmt v1.2.8 - github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 - github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee - github.com/whyrusleeping/yamux v1.1.5 // indirect - github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 - github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 + github.com/tyler-smith/go-bip39 v1.0.2 // indirect + github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 // indirect + github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.1.0 - go.opencensus.io v0.22.1 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 - golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 - golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a - golang.org/x/text v0.3.2 + golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 gopkg.in/karlseguin/expect.v1 v1.0.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect ) diff --git a/go.sum b/go.sum index 877bc4373..c75b5fa73 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,26 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/0xProject/go-ethereum v1.8.8-0.20191104224527-9d5c202240be h1:48+Xt5qtLvEUOJJD2pxM4qVbF3eoTsYmHthq2+zT8M4= -github.com/0xProject/go-ethereum v1.8.8-0.20191104224527-9d5c202240be/go.mod h1:GCj8W8G7wxclyZu5dgA4vru0iUU4DK6pUE/FSPRd4Rg= +github.com/0xProject/go-ethereum v1.8.8-0.20200121231321-1510563ddd1f h1:3V/XMVlgBlSh+Q1G0kg8e4dEh3UxsTpce9Ix1dDyRiU= +github.com/0xProject/go-ethereum v1.8.8-0.20200121231321-1510563ddd1f/go.mod h1:GCj8W8G7wxclyZu5dgA4vru0iUU4DK6pUE/FSPRd4Rg= +github.com/0xProject/go-ws-transport v0.1.1-0.20200123233232-0b38359294da h1:8POpSF5LiutCqYqgG+vP4OcUFj3nnyOSddcSjUEbGKA= +github.com/0xProject/go-ws-transport v0.1.1-0.20200123233232-0b38359294da/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= +github.com/0xProject/go-ws-transport v0.1.1-0.20200131210609-7f37eee84b58 h1:p9qXd3Krt69MEC2YqNiNjuP+Hxe7cTuABx59GPLCc5s= +github.com/0xProject/go-ws-transport v0.1.1-0.20200131210609-7f37eee84b58/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= +github.com/0xProject/go-ws-transport v0.1.1-0.20200201000210-2db3396fec39 h1:zMth0Fw7e4MWjaNoN+lKzwdvqeNI2Mj12Zk63AMC3vI= +github.com/0xProject/go-ws-transport v0.1.1-0.20200201000210-2db3396fec39/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/0xProject/goleveldb v1.0.1-0.20191115232649-6a187a47701c h1:sMhvadadLwwpHsq4hDRAd+lcmQHJYpn44Oe9f7sFTmA= github.com/0xProject/goleveldb v1.0.1-0.20191115232649-6a187a47701c/go.mod h1:vCim/erjgVmww+K+tF4+tf/zs63CPRiOtgdXqLgTM1Q= github.com/0xProject/qunit v0.0.0-20190730000255-81c18fdf7752/go.mod h1:Onz5mS+Tpffz0tyRWdHDrqKcQ1ZFNeRhYHrNAkaMgeQ= +github.com/0xProject/sql-datastore v0.0.0-20200129193319-32397013f115 h1:OHq6PP4Y8Pjmhm9UB3RtYWQSgxJBQplojLCDZZLrVDg= +github.com/0xProject/sql-datastore v0.0.0-20200129193319-32397013f115/go.mod h1:7icquWqYm+GkgQsUyBs0C0N1SyCHXQYBnoHaazVYDQ0= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/albrow/go-envvar v1.1.1-0.20200123010345-a6ece4436cb7 h1:KyGi2bFjYJwahVfEJT1T5YvHTrEEYAqIZkIuxTAYRPY= +github.com/albrow/go-envvar v1.1.1-0.20200123010345-a6ece4436cb7/go.mod h1:jGxERjkVawmx7yWrFUix71jtSXm1ZtUai96wBHTwkPo= github.com/albrow/stringset v2.1.0+incompatible h1:P90SSV7fle22yLbhDSLRC8Jtec0tCE3A8hJihfxf25E= github.com/albrow/stringset v2.1.0+incompatible/go.mod h1:ltP0XRz96SPEM8ofD1BaE4IpTR2uCGSk6Z2VRfh1Llw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -25,9 +36,10 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190807005414-4063feeff79a/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 h1:A/EVblehb75cUgXA5njHPn0kLAsykn6mJGz7rnmW5W0= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -36,6 +48,8 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/chromedp/cdproto v0.0.0-20190812224334-39ef923dcb8d/go.mod h1:0YChpVzuLJC5CPr+x3xkHN6Z8KOSXjNbL7qV8Wc4GW0= github.com/chromedp/cdproto v0.0.0-20190827000638-b5ac1e37ce90 h1:CgIuU+BmhL7FOXl4nTH3L1pwPbAz1VlzexJNEfrS7Kw= @@ -47,7 +61,6 @@ github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsip github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -58,21 +71,33 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgraph-io/badger v1.6.0-rc1 h1:JphPpoBZJ3WHha133BGYlQqltSGIhV+VsEID0++nN9A= github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/gosigar v0.10.5 h1:GzPQ+78RaAb4J63unidA/JavQRKrB6s8IOzN6Ib59jo= github.com/elastic/gosigar v0.10.5/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gballet/go-libpcsclite v0.0.0-20190528105824-2fd9b619dd3c h1:gID5iWto0hEmbyMl+15Rkju0P+8uvF0jSn1cWdyv+5M= github.com/gballet/go-libpcsclite v0.0.0-20190528105824-2fd9b619dd3c/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gibson042/canonicaljson-go v1.0.3 h1:EAyF8L74AWabkyUmrvEFHEt/AGFQeD6RfwbAuf0j1bI= +github.com/gibson042/canonicaljson-go v1.0.3/go.mod h1:DsLpJTThXyGNO+KZlI85C1/KDcImpP67k/RKVjcaEqo= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -88,6 +113,7 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -98,70 +124,70 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/ipfs/go-cid v0.0.0-20190221041225-29a66d1820a3/go.mod h1:DEZAg7ik3SR8PY77P+hNaWtHtBirqeEgHbfmePL8WJA= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3 h1:UIAh32wymBpStoe83YCzwVQQ5Oy/H0FdxvUS6DJDzms= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-datastore v0.0.0-20190207190025-057884927798/go.mod h1:bYmHO9fuKO1Ca7dpdDBWQl0mndy5b0HFqSJjGlNYtzs= +github.com/ipfs/go-cid v0.0.4 h1:UlfXKrZx1DjZoBhQHmNHLC1fK1dUJDN20Y28A7s+gJ8= +github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.3/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.4/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1 h1:F4k0TkTAZGLFzBOrVKDAvch6JZtuN4NHkfdcEZL50aI= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-detect-race v0.0.0-20180212113132-5ea9f55c8a66/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.3.1 h1:SS1t869a6cctoSYmZXUk8eL6AzVXgASmKIWFNQkQ1jU= +github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-badger v0.0.5 h1:dxKuqw5T1Jm8OuV+lchA76H9QZFyPKZeLuT6bN42hJQ= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= +github.com/ipfs/go-ds-badger v0.0.7 h1:NMyh88Q50HG6/S2YD58DLkq0c0/ZQPMbSojONH+PRf4= +github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.0.2 h1:P5HB59Zblym0B5XYOeEyw3YtPtbpIqQCavCSWaWEEk8= -github.com/ipfs/go-ds-leveldb v0.0.2/go.mod h1:CWFeBh5IAAscWyG/QRH+lJaAlnLWjsfPSNs4teyPUp0= +github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= +github.com/ipfs/go-ds-leveldb v0.4.0 h1:l5RuxaIXDbCFqBonzGXGfMpCMBwrbJVrmqGTtqQKHaI= +github.com/ipfs/go-ds-leveldb v0.4.0/go.mod h1:NX127692WYenEjmlzyZunFv+f8nrKbH1s9eIaRNnhzs= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-util v0.0.0-20181102233336-05b6094b6fa9/go.mod h1:bmXd4M1Sn0MFKptfxu9KuWvtHySyFMzkSd2rcT8Hw80= github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv50= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-log v0.0.0-20190218133459-8924f37936b0/go.mod h1:AKYS9u+ECLT8t30brTaoVwu3f1FpGx6C0352oI1zQ0Q= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-todocounter v0.0.0-20161011214330-1e832b829506/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/ipfs/go-todocounter v0.0.1 h1:kITWA5ZcQZfrUnDNkRn04Xzh0YFaDFXsoO2A81Eb6Lw= -github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/ipfs/go-todocounter v0.0.2 h1:9UBngSQhylg2UDcxSAtpkT+rEWFr26hDPXVStE8LFyc= +github.com/ipfs/go-todocounter v0.0.2/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= +github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.2/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -176,6 +202,8 @@ github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9 h1:ZHuwnjpP8LsVsUYqTq github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karlseguin/ccache v2.0.3+incompatible h1:j68C9tWOROiOLWTS/kCGg9IcJG+ACqn5+0+t8Oh83UU= github.com/karlseguin/ccache v2.0.3+incompatible/go.mod h1:CM9tNPzT6EdRh14+jiW8mEF9mkNZuuE51qmgGYUB93w= +github.com/karlseguin/expect v1.0.1 h1:z4wy4npwwHSWKjGWH85WNJO42VQhovxTCZDSzhjo8hY= +github.com/karlseguin/expect v1.0.1/go.mod h1:zNBxMY8P21owkeogJELCLeHIt+voOSduHYTFUbwRAV8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -183,311 +211,149 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/knq/sysutil v0.0.0-20181215143952-f05b59f0f307 h1:vl4eIlySbjertFaNwiMjXsGrFVK25aOWLq7n+3gh2ls= github.com/knq/sysutil v0.0.0-20181215143952-f05b59f0f307/go.mod h1:BjPj+aVjl9FW/cCGiF3nGh5v+9Gd3VCgBQbod/GlMaQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20160527091731-6d1709049dea/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d h1:68u9r4wEvL3gYg2jvAOgROwZ3H+Y3hIDk4tbbmIjcYQ= +github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/libp2p/go-addr-util v0.0.0-20190226202102-c4f139148873/go.mod h1:doh2auL/Rkfq1xHxDrWJGHZ8yDojPerOZoPu9XVwRB8= github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-conn-security v0.0.0-20190226201940-b2fb4ac68c41 h1:9mAB66HuUt8oS9GWLTAmV2o3Qvd9lZJMPUCsieuNPp0= -github.com/libp2p/go-conn-security v0.0.0-20190226201940-b2fb4ac68c41/go.mod h1:lIqm8x2wrAxlG+6CzJ3z4Nk5/F73zdjkS6RKbHSbaJ4= -github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= -github.com/libp2p/go-conn-security-multistream v0.0.0-20190226202109-104c8a4422af/go.mod h1:hBY3HYjGnK86P3pX3wgr9IAfe3A/vZB830LJAMi1g88= -github.com/libp2p/go-conn-security-multistream v0.0.1/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= -github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= +github.com/libp2p/go-conn-security v0.1.0 h1:q8ii9TUOtSBD1gIoKTSOZIzPFP/agPM28amrCCoeIIA= +github.com/libp2p/go-conn-security v0.1.0/go.mod h1:NQdPF4opCZ5twtEUadzPL0tNSdkrbFc/HmLO7eWqEzY= github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-flow-metrics v0.0.0-20180906182756-7e5a55af4853/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.0-20191108131323-45424fab0a7c/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-libp2p v0.0.0-20190227195236-c4577c770392 h1:Mh44DwtlIbu1qOxFJhpZDhTmFPqjVHvAziOq1210Us8= -github.com/libp2p/go-libp2p v0.0.0-20190227195236-c4577c770392/go.mod h1:CyUlFa6Mw04PkmMg8gBIlHUl8j3TrEiA6oFiF4SgD8w= -github.com/libp2p/go-libp2p v0.0.1/go.mod h1:bmRs8I0vwn6iRaVssZnJx/epY6WPSKiLoK1vyle4EX0= -github.com/libp2p/go-libp2p v0.0.2/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p v0.0.3/go.mod h1:Qu8bWqFXiocPloabFGUcVG4kk94fLvfC8mWTDdFC9wE= -github.com/libp2p/go-libp2p v0.0.4/go.mod h1:B9yfFVwbsEmGPlyJROAoqrjumbMB2n0YrgNm1intDOY= -github.com/libp2p/go-libp2p v0.0.5/go.mod h1:IPMB1Wrj2VboCCJ7KK1FXpuWrXwHPu39QRsrOeoBSSI= -github.com/libp2p/go-libp2p v0.0.6/go.mod h1:GVha4XFiH3FvfC6QQYoryplldfKcucp0ThtenF+z9oU= -github.com/libp2p/go-libp2p v0.0.7/go.mod h1:GVha4XFiH3FvfC6QQYoryplldfKcucp0ThtenF+z9oU= -github.com/libp2p/go-libp2p v0.0.8/go.mod h1:GVha4XFiH3FvfC6QQYoryplldfKcucp0ThtenF+z9oU= -github.com/libp2p/go-libp2p v0.0.9/go.mod h1:IdP4uasqCpXlyJn6vMpg7qC4xhzTwJsMJ8t5ZYR6EB4= -github.com/libp2p/go-libp2p v0.0.10/go.mod h1:4QA44z9YCgzbDkl6Ke8x3soqPbajN2druld3QYsSMho= -github.com/libp2p/go-libp2p v0.0.11/go.mod h1:u9w5K67YwnvULrEVVdy2zzjVscvX5XTjGOpkr8+rU7E= -github.com/libp2p/go-libp2p v0.0.12/go.mod h1:l8kmLMc4DToz2TtA0aWEaE4/jVMALRKw8Kv2WTR0LHc= -github.com/libp2p/go-libp2p v0.0.13/go.mod h1:99u6nHehR0M9pxJM682dq44GDdowQBcQPxXNTPGoEgU= -github.com/libp2p/go-libp2p v0.0.14/go.mod h1:zu6wA39gea/OpQ+Yb8WKP5Rm+7M+Yq2RLeCI5wRq3Ws= -github.com/libp2p/go-libp2p v0.0.15/go.mod h1:zu6wA39gea/OpQ+Yb8WKP5Rm+7M+Yq2RLeCI5wRq3Ws= -github.com/libp2p/go-libp2p v0.0.16/go.mod h1:lMX+0+6rniTpb/Sy5kN8HHfKnJn/Y8FUuTmEYQ7jcic= -github.com/libp2p/go-libp2p v0.0.17/go.mod h1:nK+QFOAwkLtZXHVLpibwgt4JHUtZxll2jelMt3aGagE= -github.com/libp2p/go-libp2p v0.0.18/go.mod h1:VHOCpLJKpsBCFImjI0moE8le68TJ/W52omgqrpOpbms= -github.com/libp2p/go-libp2p v0.0.19/go.mod h1:vPRiD/jS0hZezwmjhBFMRg6y1nFk73SciCYjsaR2/Nk= -github.com/libp2p/go-libp2p v0.0.20/go.mod h1:Gqc+8/1bWNjLDeXW0iCdWiatL+dN2u7YLuOmWEQY5Vo= -github.com/libp2p/go-libp2p v0.0.21/go.mod h1:fwhRaZJcLTSAga5HwobjX20lO2pOBx4vQSiKrZv6i/A= -github.com/libp2p/go-libp2p v0.0.22/go.mod h1:PPOgYIzv/FDXLqdBa353nULz/d8pMjkxT5CbpAA6Jsc= -github.com/libp2p/go-libp2p v0.0.23/go.mod h1:LCZG1r7NRqnBKxrA9sU4KR7cAzze0DgL9j1GxyBFRyg= -github.com/libp2p/go-libp2p v0.0.24/go.mod h1:Tud6jI4LYXihNWiVMoG7YMwVO2XUwoP9vd40i5/B2EA= -github.com/libp2p/go-libp2p v0.0.25/go.mod h1:37g8bAoyqrg7CL+t5/LHnXU0SytNN9lVLjktuBe36ko= -github.com/libp2p/go-libp2p v0.0.26/go.mod h1:rPfIbMvxHGO8ngmqZtErdihcuw6zQ9ihYlXVEz2DGiI= -github.com/libp2p/go-libp2p v0.0.27/go.mod h1:kjeVlESxQisK2DvyKp38/UMHYd9gAMTj3C3XOB/DEZo= -github.com/libp2p/go-libp2p v0.0.28/go.mod h1:GBW0VbgEKe8ELXVpLQJduJYlJHRv/XfwP6Fo9TEcDJU= -github.com/libp2p/go-libp2p v0.0.29/go.mod h1:gQFCBfH+lPtQjjBF9x9pSNyCPrikhMqscf/XK6JZ7v0= -github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= +github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= -github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.1.2/go.mod h1:5nXHmf4Hs+NmkaMsmWcFJgUHTbYNpCfxr20lwus0p1c= -github.com/libp2p/go-libp2p v0.2.0/go.mod h1:5nXHmf4Hs+NmkaMsmWcFJgUHTbYNpCfxr20lwus0p1c= -github.com/libp2p/go-libp2p v0.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= -github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= -github.com/libp2p/go-libp2p v0.3.1 h1:opd8/1Sm9zFG37LzNQsIzMTMeBabhlcX5VlvLrNZPV0= -github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= -github.com/libp2p/go-libp2p-autonat v0.0.1/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.2/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.3/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.4/go.mod h1:fs71q5Xk+pdnKU014o2iq1RhMs9/PMaG5zXRFNnIIT4= -github.com/libp2p/go-libp2p-autonat v0.0.5/go.mod h1:cKt+qOSnWAZp0dqIuUk62v0/QAPw0vnLuVZnmzkOXRk= -github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= +github.com/libp2p/go-libp2p v0.5.0/go.mod h1:Os7a5Z3B+ErF4v7zgIJ7nBHNu2LYt8ZMLkTQUB3G/wA= +github.com/libp2p/go-libp2p v0.5.1 h1:kZ9jg+2B9IIptRcltBHKBrQdhXNNSrjCoztvrMx7tqI= +github.com/libp2p/go-libp2p v0.5.1/go.mod h1:Os7a5Z3B+ErF4v7zgIJ7nBHNu2LYt8ZMLkTQUB3G/wA= +github.com/libp2p/go-libp2p v6.0.23+incompatible h1:J/h9LNTeQwMhJeg3M96r/UOPLGxJn1vqJBb3LeKufpM= github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-autonat-svc v0.0.1/go.mod h1:S/z0LPmQ36tW6sa66pnt+JXvISOXWMucLn13Si8KAJs= -github.com/libp2p/go-libp2p-autonat-svc v0.0.2/go.mod h1:j4iMiw0d3diRm5iB0noXumtb0mPvWrM1qAyh640cp8w= -github.com/libp2p/go-libp2p-autonat-svc v0.0.3/go.mod h1:j4iMiw0d3diRm5iB0noXumtb0mPvWrM1qAyh640cp8w= -github.com/libp2p/go-libp2p-autonat-svc v0.0.4/go.mod h1:6aLiQelA0CKEcPR0TvE9bqJ7U8Mc0nVdwCoho3ROdck= -github.com/libp2p/go-libp2p-autonat-svc v0.0.5/go.mod h1:6aLiQelA0CKEcPR0TvE9bqJ7U8Mc0nVdwCoho3ROdck= -github.com/libp2p/go-libp2p-autonat-svc v0.0.6/go.mod h1:t55mabJijU0qY9no2aixaeF3IlafdsiRebUHFNFdwUM= +github.com/libp2p/go-libp2p-autonat v0.1.1 h1:WLBZcIRsjZlWdAZj9CiBSvU2wQXoUOiS1Zk1tM7DTJI= +github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= github.com/libp2p/go-libp2p-autonat-svc v0.1.0 h1:28IM7iWMDclZeVkpiFQaWVANwXwE7zLlpbnS7yXxrfs= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= -github.com/libp2p/go-libp2p-blankhost v0.0.0-20190226202150-19c1feb93864/go.mod h1:v1Lnlzn2DFfVeAk2O19BnVm/OaoRlFZwSyq015ZT11I= -github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= +github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-circuit v0.0.1/go.mod h1:Dqm0s/BiV63j8EEAs8hr1H5HudqvCAeXxDyic59lCwE= -github.com/libp2p/go-libp2p-circuit v0.0.2/go.mod h1:zV136p4UQ76qH/Wj+X/Hivcg6sf6Yb1G7YL8o+GGj38= -github.com/libp2p/go-libp2p-circuit v0.0.3/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-circuit v0.0.4/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-circuit v0.0.5/go.mod h1:p1cHJnB9xnX5/1vZLkXgKwmNEOQQuF/Hp+SkATXnXYk= -github.com/libp2p/go-libp2p-circuit v0.0.6/go.mod h1:W34ISBRpoCPUeOR26xzTbLo+s3hDO9153hJCfvHzBlg= -github.com/libp2p/go-libp2p-circuit v0.0.7/go.mod h1:DFCgZ2DklFGTUIZIhSvbbWXTErUgjyNrJGfDHOrTKIA= -github.com/libp2p/go-libp2p-circuit v0.0.8/go.mod h1:DFCgZ2DklFGTUIZIhSvbbWXTErUgjyNrJGfDHOrTKIA= -github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.2 h1:m7FkqcbveAyKJZESttlf4+b+6lZqVTYe0v2Csw7ZErc= -github.com/libp2p/go-libp2p-circuit v0.1.2/go.mod h1:nKVMY/Vp+zcuEGuEoFzRhzb/dMqs+1g3Jxd9qssM5RM= github.com/libp2p/go-libp2p-circuit v0.1.4 h1:Phzbmrg3BkVzbqd4ZZ149JxCuUWu2wZcXf/Kr6hZJj8= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-connmgr v0.1.1 h1:BIul1BPoN1vPAByMh6CeD33NpGjD+PkavmUjTS7uai8= -github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= +github.com/libp2p/go-libp2p-connmgr v0.2.1 h1:1ed0HFhCb39sIMK7QYgRBW0vibBBqFQMs4xt9a9AalY= +github.com/libp2p/go-libp2p-connmgr v0.2.1/go.mod h1:JReKEFcgzSHKT9lL3rhYcUtXBs9uMIiMKJGM1tl3xJE= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= github.com/libp2p/go-libp2p-core v0.2.4 h1:Et6ykkTwI6PU44tr8qUF9k43vP0aduMNniShAbUJJw8= github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= -github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= +github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= +github.com/libp2p/go-libp2p-core v0.3.0 h1:F7PqduvrztDtFsAa/bcheQ3azmNo+Nq7m8hQY5GiUW8= +github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.0.1/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-discovery v0.0.2/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-discovery v0.0.3/go.mod h1:ZkkF9xIFRLA1xCc7bstYFkd80gBGK8Fc1JqGoU2i+zI= -github.com/libp2p/go-libp2p-discovery v0.0.4/go.mod h1:ReQGiv7QTtza8FUWzewfuMmRDVOQVp+lxHlJJA8YQCM= -github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I= github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= +github.com/libp2p/go-libp2p-discovery v0.2.0 h1:1p3YSOq7VsgaL+xVHPi8XAmtGyas6D2J6rWBEfz/aiY= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-host v0.0.0-20190226202054-2aa838333967 h1:arERhb/u8bUN55fZ7YrG7EzJoQbfSRccbZMATNOXF2E= -github.com/libp2p/go-libp2p-host v0.0.0-20190226202054-2aa838333967/go.mod h1:iAthoepYpyqzb89f4RmqzF9+ebsWPFBTvSedSlcWupg= -github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= -github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.0-20190226202048-6a96ea29ac65 h1:Z2k4gQ2S+iVqLNKHIsVrY1v7I2b16YwoH5zCOFcVKvM= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.0-20190226202048-6a96ea29ac65/go.mod h1:2LbTwxMveREcmkOWo/s6MM7xDvSZbW8J8kYDF4Mj648= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.0-20180919000501-d240acf619f6 h1:TiljmHO1c0NEBUZ/gEjxRKBhMl2dLy9+WL8iKdbax00= -github.com/libp2p/go-libp2p-interface-pnet v0.0.0-20180919000501-d240acf619f6/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.0.2 h1:gU0zFBY5daynY0AqnENxExHQLkVb0lneL+99iRWRhLY= -github.com/libp2p/go-libp2p-kad-dht v0.0.2/go.mod h1:imCuD5x+TpIvxKMJ5Zgp3gsnVMFlNY9it8S7J+Ya6SI= -github.com/libp2p/go-libp2p-kad-dht v0.0.3/go.mod h1:RX/LjLbKnZHDt+3ecSUbk1ycOhyVpMtIUL47rSBTVW0= -github.com/libp2p/go-libp2p-kad-dht v0.0.4/go.mod h1:oaBflOQcuC8H+SVV0YN26H6AS+wcUEJyjUGV66vXuSY= -github.com/libp2p/go-libp2p-kad-dht v0.0.5/go.mod h1:oaBflOQcuC8H+SVV0YN26H6AS+wcUEJyjUGV66vXuSY= -github.com/libp2p/go-libp2p-kad-dht v0.0.6/go.mod h1:oaBflOQcuC8H+SVV0YN26H6AS+wcUEJyjUGV66vXuSY= -github.com/libp2p/go-libp2p-kad-dht v0.0.7/go.mod h1:X90f4pG3MNZN9VeCX0rcH8AY9g3AspA2x5EJ9AvU/gM= -github.com/libp2p/go-libp2p-kad-dht v0.0.8/go.mod h1:fGQfSQWWOxQFB97kETE09lYRLPRKaZZdguIq98fE5PI= -github.com/libp2p/go-libp2p-kad-dht v0.0.9/go.mod h1:RVllrB76xoaayqqBkLmXT8iIkMRNfLWSBuqAggP7W00= -github.com/libp2p/go-libp2p-kad-dht v0.0.10/go.mod h1:RVllrB76xoaayqqBkLmXT8iIkMRNfLWSBuqAggP7W00= -github.com/libp2p/go-libp2p-kad-dht v0.0.11/go.mod h1:UB+9NMT+gDVWnPfna+LlE1zeMY+fHbKrEeyu95QR1NQ= -github.com/libp2p/go-libp2p-kad-dht v0.0.12/go.mod h1:T56TYRczLz3sW9gdc9hIKIrCvGy/Gm/YI+364mATXzo= -github.com/libp2p/go-libp2p-kad-dht v0.0.13/go.mod h1:3A4xaZJeJ3zD3jCg17mtI+rA7uuXiiQdKVyAZOhZo1U= -github.com/libp2p/go-libp2p-kad-dht v0.0.14/go.mod h1:IETCKDE8BxDoyt2phfwJZRs+qrCHJ8KNo2HVth7+D8Y= -github.com/libp2p/go-libp2p-kad-dht v0.1.0/go.mod h1:EiH74cOsCxcu2Yh1XxQMpf1uHcLNm/hYEJBOIRlzHNE= -github.com/libp2p/go-libp2p-kad-dht v0.1.1/go.mod h1:1kj2Rk5pX3/0RwqMm9AMNCT7DzcMHYhgDN5VTi+cY0M= -github.com/libp2p/go-libp2p-kad-dht v0.2.0/go.mod h1:TmnCYcbasyFTKJg/P/AIIqJQYQ6+jgtYZTKUCLgu7js= -github.com/libp2p/go-libp2p-kad-dht v0.2.1 h1:+pb1DCkV/6oNQjTZVXl+Y++eV0rnelx/L8y1t4J+Rnw= -github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.3.0 h1:KUJaqW3kkHP6zcL0s1CDg+yO0NYNNPkXmG4FrnZbwzM= -github.com/libp2p/go-libp2p-kad-dht v0.3.0/go.mod h1:7nBsfkMq2zN1qPs6n/fNopJfvmK9NZRNicRrCnwQR8o= -github.com/libp2p/go-libp2p-kbucket v0.2.1 h1:q9Jfwww9XnXc1K9dyYuARJxJvIvhgYVaQCuziO/dF3c= -github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= -github.com/libp2p/go-libp2p-loggables v0.0.0-20190226201908-4c6f06110532/go.mod h1:jcP5HmpEBcQ2w5u9xhLkCv73GBPKz3weC/s6ZWhXn+k= -github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= +github.com/libp2p/go-libp2p-kad-dht v0.5.0 h1:kDMtCftpQOL2s84/dZmw5z4NmBe6ByeDLKpcn6TcyxU= +github.com/libp2p/go-libp2p-kad-dht v0.5.0/go.mod h1:42YDfiKXzIgaIexiEQ3rKZbVPVPziLOyHpXbOCVd814= +github.com/libp2p/go-libp2p-kbucket v0.2.3 h1:XtNfN4WUy0cfeJoJgWCf1lor4Pp3kBkFJ9vQ+Zs+VUM= +github.com/libp2p/go-libp2p-kbucket v0.2.3/go.mod h1:opWrBZSWnBYPc315q497huxY3sz1t488X6OiXUEYWKA= github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-metrics v0.0.0-20190226174147-1f0f4db04727 h1:d+QubbWRbDzYvAf5B/xxXkQMJY8nojml2oQlVFkLPf4= -github.com/libp2p/go-libp2p-metrics v0.0.0-20190226174147-1f0f4db04727/go.mod h1:ko4lRyuvbgwwxD2TJvt2RHONahjJlkn6l7L/iEbJBf0= -github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= -github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-nat v0.0.0-20190226202135-df5e02c31d7d/go.mod h1:cA6+rN+EcOAzmSL3vQ53VxX/FfOL1WGeJUvZgqjm2eQ= -github.com/libp2p/go-libp2p-nat v0.0.1/go.mod h1:4L6ajyUIlJvx1Cbh5pc6Ma6vMDpKXf3GgLO5u7W0oQ4= -github.com/libp2p/go-libp2p-nat v0.0.2/go.mod h1:QrjXQSD5Dj4IJOdEcjHRkWTSomyxRo6HnUkf/TfQpLQ= -github.com/libp2p/go-libp2p-nat v0.0.3/go.mod h1:pZbRd59Du4UU6BCFL3bi2zp2+2YNuu5CAxvIvZ4CSqQ= github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-net v0.0.0-20190226201932-e71fff5ba6e9 h1:Rx1GOAyaeba8cISnhBpvU5Zlz9mzgFuqJdVXTTsQoA4= -github.com/libp2p/go-libp2p-net v0.0.0-20190226201932-e71fff5ba6e9/go.mod h1:8W6Wx3AZbTRTe8zSMLoAmT3mGyau+w6kGIRk+Z+MZ7Q= -github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= -github.com/libp2p/go-libp2p-netutil v0.0.0-20190226202143-009c7e418419/go.mod h1:lpxjq1x/eUtPYAZAtnC7dKWjQeTuYIYz2ZIPNDDBj3g= -github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= +github.com/libp2p/go-libp2p-nat v0.0.5 h1:/mH8pXFVKleflDL1YwqMg27W9GD8kjEx7NY0P6eGc98= +github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= -github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.0.0-20190226201924-e2df3e49eabf/go.mod h1:lLfgn0N3z2t+ER57a88K7NTZjMO27ez5TyWSURd428E= -github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.2/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.3/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.4/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.5/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= -github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.1/go.mod h1:ojEWnwG7JpJLkJ9REWYXQslyu9ZLrPWPEcCdiZzEbSM= -github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3 h1:wMgajt1uM2tMiqf4M+4qWKVyyFc8SfA+84VV9glZq1M= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-protocol v0.0.0-20171212212132-b29f3d97e3a2 h1:ftsFA3rhuSWX7hNR1CalvmnCKhmncZG7Nyd79Ll6lh0= -github.com/libp2p/go-libp2p-protocol v0.0.0-20171212212132-b29f3d97e3a2/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= -github.com/libp2p/go-libp2p-pubsub v0.1.0 h1:SmQeMa7IUv5vadh0fYgYsafWCBA1sCy5d/68kIYqGcU= -github.com/libp2p/go-libp2p-pubsub v0.1.0/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-record v0.0.0-20190226223446-0f29df9dd657/go.mod h1:fsxr7H89UzzL4pG23Aq2n/5aNAXxdGEbyBVepo8oXy8= -github.com/libp2p/go-libp2p-record v0.1.1 h1:ZJK2bHXYUBqObHX+rHLSNrM3M8fmJUlUHrodDPPATmY= -github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= -github.com/libp2p/go-libp2p-routing v0.0.0-20190226202213-efb912a4c564/go.mod h1:Alff8O712wWiftX462zvknNmi5RmXtLq/gATcxJ/Hq8= -github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= +github.com/libp2p/go-libp2p-peerstore v0.1.4 h1:d23fvq5oYMJ/lkkbO4oTwBp/JP+I/1m5gZJobNXCE/k= +github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= +github.com/libp2p/go-libp2p-protocol v0.1.0 h1:HdqhEyhg0ToCaxgMhnOmUO8snQtt/kQlcjVk3UoJU3c= +github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= +github.com/libp2p/go-libp2p-pubsub v0.2.5 h1:tPKbkjAUI0xLGN3KKTKKy9TQEviVfrP++zJgH5Muke4= +github.com/libp2p/go-libp2p-pubsub v0.2.5/go.mod h1:9Q2RRq8ofXkoewORcyVlgUFDKLKw7BuYSlJVWRcVk3Y= +github.com/libp2p/go-libp2p-record v0.1.2 h1:M50VKzWnmUrk/M5/Dz99qO9Xh4vs8ijsK+7HkJvRP+0= +github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-routing v0.1.0 h1:hFnj3WR3E2tOcKaGpyzfP4gvFZ3t8JkQmbapN0Ct+oU= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= -github.com/libp2p/go-libp2p-secio v0.0.0-20190226201947-aa2813e066f6/go.mod h1:U7wBlYK2sZbUiTaGe6xJd/fyNq40gwn+jBk/iEUbUrA= -github.com/libp2p/go-libp2p-secio v0.0.1/go.mod h1:IdG6iQybdcYmbTzxp4J5dwtUEDTOvZrT0opIDVNPrJs= -github.com/libp2p/go-libp2p-secio v0.0.2/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= -github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0 h1:ywzZBsWEEz2KNTn5RtzauEDq5RFEefPsttXYwAWqHng= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-swarm v0.0.0-20190228072411-22f358a2d09a/go.mod h1:NHa7cA4/y8OKFw3BHQjLL9pwPDFXkgECO/k+2gqSFuk= -github.com/libp2p/go-libp2p-swarm v0.0.1/go.mod h1:mh+KZxkbd3lQnveQ3j2q60BM1Cw2mX36XXQqwfPOShs= -github.com/libp2p/go-libp2p-swarm v0.0.2/go.mod h1:n0cAAcKyndIrJWctQwjqXlAdIPBZzfdpBjx1SSvz30g= -github.com/libp2p/go-libp2p-swarm v0.0.3/go.mod h1:/2HbOacAKDYT1g0UEZjUPlzD+SBtvqkg4TaYeoBA2TY= -github.com/libp2p/go-libp2p-swarm v0.0.5/go.mod h1:+nkJir4feiXtWQjb/4CQHMEK8Vw+c5nVVxT8R5bs0yY= -github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= +github.com/libp2p/go-libp2p-secio v0.2.1 h1:eNWbJTdyPA7NxhP7J3c5lT97DC5d+u+IldkgCYFTPVA= +github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= -github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= -github.com/libp2p/go-libp2p-swarm v0.2.1 h1:9A8oQqPIZvbaRyrjViHeDYS7fE7fNtP7BRWdJrBHbe8= -github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2 h1:T4hUpgEs2r371PweU3DuH7EOmBIdTBCwWs+FLcgx3bQ= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U= github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-transport v0.0.0-20190226201958-e8580c8a519d h1:ErBx9a936Bg6OXLfYn/XA4BzA0SnSZ/SKsFq9QPsj2M= -github.com/libp2p/go-libp2p-transport v0.0.0-20190226201958-e8580c8a519d/go.mod h1:lcwgOszllbhvQXul37Kv5YbSYXPoUhRB2Z+Nr3jaBmo= -github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.0-20190227195104-83703858bb46/go.mod h1:5r+arPlxwtCEF1aVi/fTQF/ZWGSPHLxBov1DlXDevDA= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.1/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.2/go.mod h1:NJpUAgQab/8K6K0m+JmZCe5RUXG10UMEx4kWe9Ipj5c= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.3/go.mod h1:Ng1HzfMIopyYscMHNFmJqiMMcpgDlj0t+NyjVWW89ws= -github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= +github.com/libp2p/go-libp2p-testing v0.1.1 h1:U03z3HnGI7Ni8Xx6ONVZvUFOAzWYmolWf5W5jAOPNmU= +github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-maddr-filter v0.0.0-20190226202016-f2e84f9bcf48/go.mod h1:9uHkmfw086BVLQyQFAbe/peEO9Iley6dafqm3cKHIAk= -github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-mplex v0.0.0-20190227194811-070b6c36acd4/go.mod h1:00WmJEYVKH/Kz6wCom3VmxX7re6B/jgSZmkydBYAZ1w= -github.com/libp2p/go-mplex v0.0.1/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.0.2/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-msgio v0.0.1/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-nat v0.0.2/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= +github.com/libp2p/go-nat v0.0.4 h1:KbizNnq8YIf7+Hn7+VFL/xE0eDrkPru2zIO9NMwL8UQ= +github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= +github.com/libp2p/go-openssl v0.0.3 h1:wjlG7HvQkt4Fq4cfH33Ivpwp0omaElYEi9z26qaIkIk= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.0-20190218233603-6a75ffd916e5/go.mod h1:ViUXkfLbcaqzYb7Yyi7ZP/n8nAezADhH9oLvj6TA83E= +github.com/libp2p/go-openssl v0.0.4 h1:d27YZvLoTyMhIN4njrkr8zMDOM4lfpHIp6A+TK9fovg= +github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport-transport v0.0.0-20190228145407-8a125a1f2dbb/go.mod h1:mw+zSzEB6taNDI4zi7wFlXgzdxtQWEir6ZcomJ3VdoE= -github.com/libp2p/go-reuseport-transport v0.0.1/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-stream-muxer v0.0.0-20190218175335-a3f82916c8ad/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-tcp-transport v0.0.0-20190227195113-80ec1b10b24c/go.mod h1:K6Zi9TkPvn5m/m0bktlJ6Fv9Vna2wvr/jiCtTRC7T8o= -github.com/libp2p/go-tcp-transport v0.0.1/go.mod h1:mnjg0o0O5TmXUaUIanYPUqkW4+u6mK0en8rlpA6BBTs= -github.com/libp2p/go-tcp-transport v0.0.2/go.mod h1:VjZFHasNJ0QiJQNNwiFDy25qyGWTXQWs8GM5DR4/L1k= -github.com/libp2p/go-tcp-transport v0.0.3/go.mod h1:f11C2zvCaGDkE8aFPUKmuYZwd3pP6HI24LeLMWhJnkQ= -github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1 h1:yGlqURmqgNA2fvzjSgZNlHcsd/IulAnKM8Ncu+vlqnw= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-testutil v0.0.0-20190226202041-873eaa1a26ba/go.mod h1:8FHCRBHdt9BibhKebrOqVTJyW4cOZc52bfrGmw7ja+4= -github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-ws-transport v0.0.0-20191008032742-3098bba549e8 h1:F1fQYoej9mjMSkYq3fcdlZK8xGzn4Bhp3cxSgqswp6M= github.com/libp2p/go-ws-transport v0.0.0-20191008032742-3098bba549e8/go.mod h1:040XOA+VSh/dAe8ZsMIjP4EZpI8yMRDFVLyADY+snxs= -github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= -github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.1.1 h1:uYIT3tWc5mIJB2P+9kJ1rgOVCmsO1oW1VXoTmCiDRa0= -github.com/libp2p/go-ws-transport v0.1.1/go.mod h1:eoxG1EQUq9NC6TipLQwbOhyP80mg4gIbiAU3Atbml00= -github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -524,6 +390,8 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.1.3 h1:v+sk57XuaCKGXpWtVBX8YJzO7hMGx4Aajh4TQbdEFdc= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -531,11 +399,10 @@ github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.1.2 h1:HWYHNSyyllbQopmVIF5K7JKJugiah+L9/kuZKHbmNdQ= -github.com/multiformats/go-multiaddr v0.1.2/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.2.0 h1:lR52sFwcTCuQb6bTfnXF6zA2XfyYvyd+5a9qECv/J90= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0 h1:YWJoIDwLePniH7OU5hBnDZV6SWuvJqJ0YtN6pLeH9zA= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= @@ -550,11 +417,11 @@ github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmr github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8 h1:wrYcW5yxSi3dU07n5jnuS5PrNwyHy0zRHGVoUugWvXg= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.10 h1:lMoNbh2Ssd9PUF74Nz008KGzGPlfeV6wH3rit5IIGCM= +github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-varint v0.0.1 h1:TR/0rdQtnNxuN2IhiB639xC3tWM4IUi7DkTBVTdGW/M= @@ -567,11 +434,11 @@ github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8u github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opaolini/go-ds-sql v0.0.0-20191105113501-15a4c8e2fea5 h1:J9ici0vacWtjdJDQ+/o+BVTLFvaUZ8OGbfjJyOsmfCg= -github.com/opaolini/go-ds-sql v0.0.0-20191105113501-15a4c8e2fea5/go.mod h1:ETkfb1cGmQjIAwd4Pjg4m75gxxdg/L+hPYMnHs7hFiw= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -581,8 +448,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/plaid/go-envvar v1.1.0 h1:q/po6Vnxh1ANQugP9UVXp/DxbLpQCxVV7HeCq2iXMwA= -github.com/plaid/go-envvar v1.1.0/go.mod h1:l95NEcV3lksGLSdpHtPxDvs16HNNp6CQhtfo0ATM7ks= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -604,8 +469,8 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v0.0.0-20170819071325-9f5d223c6079/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -627,11 +492,11 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= @@ -639,27 +504,18 @@ github.com/whyrusleeping/go-logging v0.0.1 h1:fwpzlmT0kRC/Fmd0MdmGgJG/CXIZ6gFq46 github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f h1:M/lL30eFZTKnomXY6huvM6G0+gVquFNf6mxghaWlFUg= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v0.1.0/go.mod h1:OXL5hggHNZSsadXDlBJDD4eD3IQYEB3Yu6xpovd6pPw= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible h1:iqksILj8STw03EJQe7Laj4ubnw+ojOyik18cd5vPL1o= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v0.1.0/go.mod h1:/usW3LIBirW4h9ko1PnoF7tExBnbxPBszG0n4wylJr8= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible h1:BdYHctE9HJZLquG9tpTdwWcbG4FaX6tVKPGjCGgiVxo= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v0.1.1/go.mod h1:Yw+ayOEKERDHXLJ4GiE5AnBmldJW4QRLDzGFC9do8G0= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible h1:IGm/UP/JpEFS6D787sZnZg7RA6fZIR9c/Ms9DeAVNuk= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5 h1:4CK3aUUJQu0qpKZv5gEWJjNOQtdbdDhVVS6PJ+HimdE= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= -github.com/whyrusleeping/yamux v1.2.0/go.mod h1:Cgw3gpb4DrDZ1FrP/5pxg/cpiY54Gr5uCXwUylwi2GE= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= +github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b h1:6cLsL+2FW6dRAdl5iMtHgRogVCff0QpRi9653YmdcJA= github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -669,9 +525,10 @@ github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehp github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50= go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -683,14 +540,12 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -700,7 +555,6 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -715,7 +569,6 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -724,9 +577,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -752,14 +606,23 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/karlseguin/expect.v1 v1.0.1 h1:9u0iUltnhFbJTHaSIH0EP+cuTU5rafIgmcsEsg2JQFw= gopkg.in/karlseguin/expect.v1 v1.0.1/go.mod h1:uB7QIJBcclvYbwlUDkSCsGjAOMis3fP280LyhuDEf2I= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff h1:uuol9OUzSvZntY1v963NAbVd7A+PHLMz1FlCe3Lorcs= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/integration-tests/browser/src/index.ts b/integration-tests/browser/src/index.ts index 09a09c8c4..2b2f98634 100644 --- a/integration-tests/browser/src/index.ts +++ b/integration-tests/browser/src/index.ts @@ -5,6 +5,7 @@ import { signatureUtils, Order, orderHashUtils } from '@0x/order-utils'; const ethereumRPCURL = 'http://localhost:8545'; +// Set up a Web3 Provider that uses the RPC endpoint const provider = new Web3ProviderEngine(); provider.addProvider(new RPCSubprovider(ethereumRPCURL)); provider.start(); @@ -45,10 +46,13 @@ provider.start(); // Configure Mesh to use our local Ganache instance and local bootstrap // node. const mesh = new Mesh({ - verbosity: Verbosity.Debug, - ethereumRPCURL, + verbosity: Verbosity.Trace, ethereumChainID: 1337, bootstrapList: ['/ip4/127.0.0.1/tcp/60500/ws/ipfs/16Uiu2HAmGd949LwaV4KNvK2WDSiMVy7xEmW983VH75CMmefmMpP7'], + customOrderFilter: { + properties: { makerAddress: { const: '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb' } }, + }, + web3Provider: provider, }); // This handler will be called whenver there is a critical error. @@ -83,6 +87,12 @@ provider.start(); // Start Mesh *after* we set up the handlers. await mesh.startAsync(); + // HACK(albrow): Wait for GossipSub to initialize. We could remove this if we adjust + // how we are waiting for the order (what log message we look for). As the test is + // currently written it only passes when the order is received through GossipSub and + // fails if it was received through ordersync. + await sleepAsync(5000); + // Send an order to the network. In the integration tests we will check that // the order was received. const result = await mesh.addOrdersAsync([signedOrder as any]); @@ -100,10 +110,12 @@ provider.start(); console.log(JSON.stringify(stats)); // This special #jsFinished div is used to signal the headless Chrome driver - // that the JavaScript code is done running. + // that the JavaScript code is done running. This is not a native Javascript + // concept. Rather, it is our way of letting the Go program that serves this + // Javascript know whether or not the test has completed. const finishedDiv = document.createElement('div'); finishedDiv.setAttribute('id', 'jsFinished'); - document.querySelector('body')!.appendChild(finishedDiv); + document.body.appendChild(finishedDiv); })().catch(err => { if (err instanceof Error) { console.error(err.name + ': ' + err.message); @@ -111,3 +123,7 @@ provider.start(); console.error(err.toString()); } }); + +async function sleepAsync(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/integration-tests/browser/yarn.lock b/integration-tests/browser/yarn.lock index b2dce8a42..ef96d0337 100644 --- a/integration-tests/browser/yarn.lock +++ b/integration-tests/browser/yarn.lock @@ -63,12 +63,13 @@ lodash.values "^4.3.0" "@0x/mesh-browser@./../../browser/": - version "8.0.0-beta-0xv3" + version "1.0.0" dependencies: "@0x/order-utils" "^10.0.1" - "@0x/utils" "^5.1.1" + "@0x/utils" "^5.1.2" base64-arraybuffer "^0.2.0" browserfs "^1.4.3" + ethereum-types "^3.0.0" "@0x/order-utils@^10.0.1": version "10.0.1" @@ -151,6 +152,25 @@ js-sha3 "^0.7.0" lodash "^4.17.11" +"@0x/utils@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@0x/utils/-/utils-5.1.2.tgz#defc545a42343729c9bf7252f0b7413d7ba47694" + integrity sha512-p5BZxs3krXwkjBY8hrmGLkLp4BziVQ6z4tRFIcWSR8C4ptAlZ4QfFL1zqK6O6/rbOsGj+JSIpqRRrxJr2Is6LQ== + dependencies: + "@0x/types" "^3.1.1" + "@0x/typescript-typings" "^5.0.1" + "@types/node" "*" + abortcontroller-polyfill "^1.1.9" + bignumber.js "~9.0.0" + chalk "^2.3.0" + detect-node "2.0.3" + ethereum-types "^3.0.0" + ethereumjs-util "^5.1.1" + ethers "~4.0.4" + isomorphic-fetch "2.2.1" + js-sha3 "^0.7.0" + lodash "^4.17.11" + "@0x/web3-wrapper@^7.0.2": version "7.0.2" resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-7.0.2.tgz#afdd12a3c2518207d56372397ae91e4a90634f46" diff --git a/integration-tests/browser_integration_test.go b/integration-tests/browser_integration_test.go index 61395ca94..70eca31b9 100644 --- a/integration-tests/browser_integration_test.go +++ b/integration-tests/browser_integration_test.go @@ -54,12 +54,13 @@ func TestBrowserIntegration(t *testing.T) { // goroutines to block. standaloneLogMessages := make(chan string, 1024) count := int(atomic.AddInt32(&nodeCount, 1)) + customOrderFilter := `{"properties": { "makerAddress": { "const": "0x6ecbe1db9ef729cbe972c83fb886247691fb6beb" }}}` // Start the standalone node in a goroutine. wg.Add(1) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, standaloneLogMessages) + startStandaloneNode(t, ctx, count, customOrderFilter, standaloneLogMessages) }() // standaloneOrder is an order that will be sent to the network by the @@ -83,7 +84,7 @@ func TestBrowserIntegration(t *testing.T) { // Wait for the RPC server to start before sending the order. _, err := waitForLogSubstring(ctx, standaloneLogMessages, "started RPC server") require.NoError(t, err, "RPC server didn't start") - rpcClient, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + rpcClient, err := rpc.NewClient(standaloneWSRPCEndpointPrefix + strconv.Itoa(wsRPCPort+count)) require.NoError(t, err) results, err := rpcClient.AddOrders([]*zeroex.SignedOrder{standaloneOrder}) require.NoError(t, err) diff --git a/integration-tests/constants.go b/integration-tests/constants.go index c4083ec74..94422efc0 100644 --- a/integration-tests/constants.go +++ b/integration-tests/constants.go @@ -9,10 +9,12 @@ import ( const ( ethereumRPCURL = "http://localhost:8545" ethereumChainID = 1337 - rpcPort = 60501 + wsRPCPort = 60501 + httpRPCPort = 60701 standaloneDataDirPrefix = "./data/standalone-" - standaloneRPCEndpointPrefix = "ws://localhost:" + standaloneWSRPCEndpointPrefix = "ws://localhost:" + standaloneHTTPRPCEndpointPrefix = "http://localhost:" standaloneRPCAddrPrefix = "localhost:" standaloneBlockPollingInterval = "200ms" standaloneEthereumRPCMaxRequestsPer24HrUtc = "550000" diff --git a/integration-tests/rpc_integration_test.go b/integration-tests/rpc_integration_test.go index 716c2148b..f14252d52 100644 --- a/integration-tests/rpc_integration_test.go +++ b/integration-tests/rpc_integration_test.go @@ -24,7 +24,15 @@ import ( "github.com/stretchr/testify/require" ) -func TestAddOrdersSuccess(t *testing.T) { +func TestWSAddOrdersSuccess(t *testing.T) { + runAddOrdersSuccessTest(t, standaloneWSRPCEndpointPrefix, wsRPCPort) +} + +func TestHTTPAddOrdersSuccess(t *testing.T) { + runAddOrdersSuccessTest(t, standaloneHTTPRPCEndpointPrefix, httpRPCPort) +} + +func runAddOrdersSuccessTest(t *testing.T, rpcEndpointPrefix string, rpcPort int) { teardownSubTest := setupSubTest(t) defer teardownSubTest(t) @@ -41,14 +49,14 @@ func TestAddOrdersSuccess(t *testing.T) { count := int(atomic.AddInt32(&nodeCount, 1)) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, logMessages) + startStandaloneNode(t, ctx, count, "", logMessages) }() // Wait until the rpc server has been started, and then create an rpc client // that connects to the rpc server. _, err := waitForLogSubstring(ctx, logMessages, "started RPC server") require.NoError(t, err, "RPC server didn't start") - client, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + client, err := rpc.NewClient(rpcEndpointPrefix + strconv.Itoa(rpcPort+count)) require.NoError(t, err) // Create a new valid order. @@ -82,11 +90,19 @@ func TestAddOrdersSuccess(t *testing.T) { wg.Wait() } +func TestWSGetOrders(t *testing.T) { + runGetOrdersTest(t, standaloneWSRPCEndpointPrefix, wsRPCPort) +} + +func TestHTTPGetOrders(t *testing.T) { + runGetOrdersTest(t, standaloneHTTPRPCEndpointPrefix, httpRPCPort) +} + // TODO(jalextowle): Since the uuid creation process is inherently random, we // can't meaningfully sanity check the returnedSnapshotID in // this test. Unit testing should be implemented to verify that // this logic is correct, if necessary. -func TestGetOrders(t *testing.T) { +func runGetOrdersTest(t *testing.T, rpcEndpointPrefix string, rpcPort int) { teardownSubTest := setupSubTest(t) defer teardownSubTest(t) @@ -103,13 +119,13 @@ func TestGetOrders(t *testing.T) { count := int(atomic.AddInt32(&nodeCount, 1)) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, logMessages) + startStandaloneNode(t, ctx, count, "", logMessages) }() _, err := waitForLogSubstring(ctx, logMessages, "started RPC server") require.NoError(t, err, "RPC server didn't start") - client, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + client, err := rpc.NewClient(rpcEndpointPrefix + strconv.Itoa(rpcPort+count)) require.NoError(t, err) // Create 10 new valid orders. @@ -194,7 +210,15 @@ func TestGetOrders(t *testing.T) { wg.Wait() } -func TestGetStats(t *testing.T) { +func TestWSGetStats(t *testing.T) { + runGetStatsTest(t, standaloneWSRPCEndpointPrefix, wsRPCPort) +} + +func TestHTTPGetStats(t *testing.T) { + runGetStatsTest(t, standaloneHTTPRPCEndpointPrefix, httpRPCPort) +} + +func runGetStatsTest(t *testing.T, rpcEndpointPrefix string, rpcPort int) { teardownSubTest := setupSubTest(t) defer teardownSubTest(t) @@ -211,7 +235,7 @@ func TestGetStats(t *testing.T) { count := int(atomic.AddInt32(&nodeCount, 1)) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, logMessages) + startStandaloneNode(t, ctx, count, "", logMessages) }() // Wait for the rpc server to start and get the peer ID of the node. Start the @@ -223,7 +247,7 @@ func TestGetStats(t *testing.T) { require.NoError(t, err, "RPC server didn't start") err = json.Unmarshal([]byte(log), &jsonLog) require.NoError(t, err) - client, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + client, err := rpc.NewClient(rpcEndpointPrefix + strconv.Itoa(rpcPort+count)) require.NoError(t, err) getStatsResponse, err := client.GetStats() @@ -238,7 +262,7 @@ func TestGetStats(t *testing.T) { getStatsResponse.LatestBlock = types.LatestBlock{} // Ensure that the correct response was logged by "GetStats" - require.Equal(t, "/0x-orders/network/1337/version/2", getStatsResponse.PubSubTopic) + require.Equal(t, "/0x-orders/version/3/chain/1337/schema/e30=", getStatsResponse.PubSubTopic) require.Equal(t, "/0x-mesh/network/1337/version/2", getStatsResponse.Rendezvous) require.Equal(t, jsonLog.PeerID, getStatsResponse.PeerID) require.Equal(t, 1337, getStatsResponse.EthereumChainID) @@ -269,13 +293,13 @@ func TestOrdersSubscription(t *testing.T) { count := int(atomic.AddInt32(&nodeCount, 1)) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, logMessages) + startStandaloneNode(t, ctx, count, "", logMessages) }() // Wait for the rpc server to start and then start the rpc client. _, err := waitForLogSubstring(ctx, logMessages, "started RPC server") require.NoError(t, err, "RPC server didn't start") - client, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + client, err := rpc.NewClient(standaloneWSRPCEndpointPrefix + strconv.Itoa(wsRPCPort+count)) require.NoError(t, err) // Subscribe to order events through the rpc client and ensure that the subscription @@ -330,13 +354,13 @@ func TestHeartbeatSubscription(t *testing.T) { count := int(atomic.AddInt32(&nodeCount, 1)) go func() { defer wg.Done() - startStandaloneNode(t, ctx, count, logMessages) + startStandaloneNode(t, ctx, count, "", logMessages) }() // Wait for the rpc server to start and then start the rpc client _, err := waitForLogSubstring(ctx, logMessages, "started RPC server") require.NoError(t, err, "RPC server didn't start") - client, err := rpc.NewClient(standaloneRPCEndpointPrefix + strconv.Itoa(rpcPort+count)) + client, err := rpc.NewClient(standaloneWSRPCEndpointPrefix + strconv.Itoa(wsRPCPort+count)) require.NoError(t, err) // Send the "SubscribeToHeartbeat" request through the rpc client and assert diff --git a/integration-tests/utils.go b/integration-tests/utils.go index c29f626ba..def832fd7 100644 --- a/integration-tests/utils.go +++ b/integration-tests/utils.go @@ -15,7 +15,6 @@ import ( "testing" "github.com/0xProject/0x-mesh/common/types" - "github.com/0xProject/0x-mesh/constants" "github.com/0xProject/0x-mesh/ethereum" "github.com/0xProject/0x-mesh/zeroex" @@ -34,6 +33,7 @@ var nodeCount int32 func init() { flag.BoolVar(&browserIntegrationTestsEnabled, "enable-browser-integration-tests", false, "enable browser integration tests") + testing.Init() flag.Parse() } @@ -174,19 +174,23 @@ func startBootstrapNode(t *testing.T, ctx context.Context) { assert.NoError(t, err, "could not run bootstrap node: %s", string(output)) } -func startStandaloneNode(t *testing.T, ctx context.Context, nodeID int, logMessages chan<- string) { +func startStandaloneNode(t *testing.T, ctx context.Context, nodeID int, customOrderFilter string, logMessages chan<- string) { cmd := exec.CommandContext(ctx, "mesh") cmd.Env = append( os.Environ(), - "VERBOSITY=5", + "VERBOSITY=6", "DATA_DIR="+standaloneDataDirPrefix+strconv.Itoa(nodeID), "BOOTSTRAP_LIST="+bootstrapList, "ETHEREUM_RPC_URL="+ethereumRPCURL, "ETHEREUM_CHAIN_ID="+strconv.Itoa(ethereumChainID), - "RPC_ADDR="+standaloneRPCAddrPrefix+strconv.Itoa(rpcPort+nodeID), + "WS_RPC_ADDR="+standaloneRPCAddrPrefix+strconv.Itoa(wsRPCPort+nodeID), + "HTTP_RPC_ADDR="+standaloneRPCAddrPrefix+strconv.Itoa(httpRPCPort+nodeID), "BLOCK_POLLING_INTERVAL="+standaloneBlockPollingInterval, "ETHEREUM_RPC_MAX_REQUESTS_PER_24_HR_UTC="+standaloneEthereumRPCMaxRequestsPer24HrUtc, ) + if customOrderFilter != "" { + cmd.Env = append(cmd.Env, "CUSTOM_ORDER_FILTER="+customOrderFilter) + } // Pipe messages from stderr through the logMessages channel. stderr, err := cmd.StderrPipe() diff --git a/loghooks/peer_id_hook.go b/loghooks/peer_id_hook.go index 0537c7c3d..64e489277 100644 --- a/loghooks/peer_id_hook.go +++ b/loghooks/peer_id_hook.go @@ -1,7 +1,7 @@ package loghooks import ( - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" log "github.com/sirupsen/logrus" ) diff --git a/meshdb/meshdb.go b/meshdb/meshdb.go index da5c71053..1452e9e8e 100644 --- a/meshdb/meshdb.go +++ b/meshdb/meshdb.go @@ -9,6 +9,7 @@ import ( "github.com/0xProject/0x-mesh/constants" "github.com/0xProject/0x-mesh/db" + "github.com/0xProject/0x-mesh/ethereum" "github.com/0xProject/0x-mesh/ethereum/miniheader" "github.com/0xProject/0x-mesh/zeroex" "github.com/ethereum/go-ethereum/common" @@ -75,7 +76,7 @@ type OrdersCollection struct { MakerAddressMakerFeeAssetAddressTokenIDIndex *db.Index LastUpdatedIndex *db.Index IsRemovedIndex *db.Index - ExpirationTimeIndex *db.Index + ExpirationTimeIndex *db.Index } // MetadataCollection represents a DB collection used to store instance metadata @@ -136,7 +137,13 @@ func setupOrders(database *db.DB) (*OrdersCollection, error) { // here is compute time for storage space. makerAddressTokenAddressTokenIDIndex := col.AddMultiIndex("makerAddressTokenAddressTokenId", func(m db.Model) [][]byte { order := m.(*Order) - singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(order.SignedOrder.MakerAssetData) + contractAddresses, err := ethereum.GetContractAddressesForChainID(int(order.SignedOrder.ChainID.Int64())) + if err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + }).Panic("Failed to retrieve contractAddresses for chainID") + } + singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(order.SignedOrder.MakerAssetData, contractAddresses) if err != nil { log.WithFields(log.Fields{ "error": err.Error(), @@ -165,7 +172,14 @@ func setupOrders(database *db.DB) (*OrdersCollection, error) { } } - singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(order.SignedOrder.MakerFeeAssetData) + contractAddresses, err := ethereum.GetContractAddressesForChainID(int(order.SignedOrder.ChainID.Int64())) + if err != nil { + log.WithFields(log.Fields{ + "error": err.Error(), + }).Panic("Failed to retrieve contractAddresses for chainID") + } + + singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(order.SignedOrder.MakerFeeAssetData, contractAddresses) if err != nil { log.WithFields(log.Fields{ "error": err.Error(), @@ -211,7 +225,7 @@ func setupOrders(database *db.DB) (*OrdersCollection, error) { MakerAddressAndSaltIndex: makerAddressAndSaltIndex, LastUpdatedIndex: lastUpdatedIndex, IsRemovedIndex: isRemovedIndex, - ExpirationTimeIndex: expirationTimeIndex, + ExpirationTimeIndex: expirationTimeIndex, }, nil } @@ -459,7 +473,7 @@ type singleAssetData struct { TokenID *big.Int } -func parseContractAddressesAndTokenIdsFromAssetData(assetData []byte) ([]singleAssetData, error) { +func parseContractAddressesAndTokenIdsFromAssetData(assetData []byte, contractAddresses ethereum.ContractAddresses) ([]singleAssetData, error) { singleAssetDatas := []singleAssetData{} assetDataDecoder := zeroex.NewAssetDataDecoder() @@ -509,12 +523,29 @@ func parseContractAddressesAndTokenIdsFromAssetData(assetData []byte) ([]singleA return nil, err } for _, assetData := range decodedAssetData.NestedAssetData { - as, err := parseContractAddressesAndTokenIdsFromAssetData(assetData) + as, err := parseContractAddressesAndTokenIdsFromAssetData(assetData, contractAddresses) if err != nil { return nil, err } singleAssetDatas = append(singleAssetDatas, as...) } + case "ERC20Bridge": + var decodedAssetData zeroex.ERC20BridgeAssetData + err := assetDataDecoder.Decode(assetData, &decodedAssetData) + if err != nil { + return nil, err + } + tokenAddress := decodedAssetData.TokenAddress + // HACK(fabio): Despite Chai ERC20Bridge orders encoding the Dai address as + // the tokenAddress, we actually want to react to the Chai token's contract + // events, so we actually return it instead. + if decodedAssetData.BridgeAddress == contractAddresses.ChaiBridge { + tokenAddress = contractAddresses.ChaiToken + } + a := singleAssetData{ + Address: tokenAddress, + } + singleAssetDatas = append(singleAssetDatas, a) default: return nil, fmt.Errorf("unrecognized assetData type name found: %s", assetDataName) } diff --git a/meshdb/meshdb_test.go b/meshdb/meshdb_test.go index 7bc3a5ba6..7d0d512f4 100644 --- a/meshdb/meshdb_test.go +++ b/meshdb/meshdb_test.go @@ -99,9 +99,12 @@ func TestOrderCRUDOperations(t *testing.T) { } func TestParseContractAddressesAndTokenIdsFromAssetData(t *testing.T) { + contractAddresses, err := ethereum.GetContractAddressesForChainID(constants.TestChainID) + require.NoError(t, err) + // ERC20 AssetData erc20AssetData := common.Hex2Bytes("f47261b000000000000000000000000038ae374ecf4db50b0ff37125b591a04997106a32") - singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(erc20AssetData) + singleAssetDatas, err := parseContractAddressesAndTokenIdsFromAssetData(erc20AssetData, contractAddresses) require.NoError(t, err) assert.Len(t, singleAssetDatas, 1) expectedAddress := common.HexToAddress("0x38ae374ecf4db50b0ff37125b591a04997106a32") @@ -111,7 +114,7 @@ func TestParseContractAddressesAndTokenIdsFromAssetData(t *testing.T) { // ERC721 AssetData erc721AssetData := common.Hex2Bytes("025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c480000000000000000000000000000000000000000000000000000000000000001") - singleAssetDatas, err = parseContractAddressesAndTokenIdsFromAssetData(erc721AssetData) + singleAssetDatas, err = parseContractAddressesAndTokenIdsFromAssetData(erc721AssetData, contractAddresses) require.NoError(t, err) assert.Equal(t, 1, len(singleAssetDatas)) expectedAddress = common.HexToAddress("0x1dC4c1cEFEF38a777b15aA20260a54E584b16C48") @@ -121,7 +124,7 @@ func TestParseContractAddressesAndTokenIdsFromAssetData(t *testing.T) { // Multi AssetData multiAssetData := common.Hex2Bytes("94cfcdd7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000024f47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000x94cfcdd7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000024f47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044025717920000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000") - singleAssetDatas, err = parseContractAddressesAndTokenIdsFromAssetData(multiAssetData) + singleAssetDatas, err = parseContractAddressesAndTokenIdsFromAssetData(multiAssetData, contractAddresses) require.NoError(t, err) assert.Equal(t, 2, len(singleAssetDatas)) expectedSingleAssetDatas := []singleAssetData{ diff --git a/orderfilter/filter.go b/orderfilter/filter.go new file mode 100644 index 000000000..c37239adf --- /dev/null +++ b/orderfilter/filter.go @@ -0,0 +1,240 @@ +package orderfilter + +import ( + "context" + "encoding/base64" + "fmt" + "strings" + + "github.com/0xProject/0x-mesh/ethereum" + "github.com/0xProject/0x-mesh/zeroex" + canonicaljson "github.com/gibson042/canonicaljson-go" + peer "github.com/libp2p/go-libp2p-core/peer" + pubsub "github.com/libp2p/go-libp2p-pubsub" + log "github.com/sirupsen/logrus" + jsonschema "github.com/xeipuuv/gojsonschema" +) + +const ( + pubsubTopicVersion = 3 + topicVersionFormat = "/0x-orders/version/%d%s" + topicChainIDAndSchemaFormat = "/chain/%d/schema/%s" + fullTopicFormat = "/0x-orders/version/%d/chain/%d/schema/%s" +) + +type WrongTopicVersionError struct { + expectedVersion int + actualVersion int +} + +func (e WrongTopicVersionError) Error() string { + return fmt.Sprintf("wrong topic version: expected %d but got %d", e.expectedVersion, e.actualVersion) +} + +var ( + // Built-in schemas + addressSchemaLoader = jsonschema.NewStringLoader(`{"id":"/address","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}`) + wholeNumberSchemaLoader = jsonschema.NewStringLoader(`{"id":"/wholeNumber","anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"integer"}]}`) + hexSchemaLoader = jsonschema.NewStringLoader(`{"id":"/hex","type":"string","pattern":"^0x(([0-9a-fA-F][0-9a-fA-F])+)?$"}`) + orderSchemaLoader = jsonschema.NewStringLoader(`{"id":"/order","properties":{"makerAddress":{"$ref":"/address"},"takerAddress":{"$ref":"/address"},"makerFee":{"$ref":"/wholeNumber"},"takerFee":{"$ref":"/wholeNumber"},"senderAddress":{"$ref":"/address"},"makerAssetAmount":{"$ref":"/wholeNumber"},"takerAssetAmount":{"$ref":"/wholeNumber"},"makerAssetData":{"$ref":"/hex"},"takerAssetData":{"$ref":"/hex"},"makerFeeAssetData":{"$ref":"/hex"},"takerFeeAssetData":{"$ref":"/hex"},"salt":{"$ref":"/wholeNumber"},"feeRecipientAddress":{"$ref":"/address"},"expirationTimeSeconds":{"$ref":"/wholeNumber"},"exchangeAddress":{"$ref":"/exchangeAddress"},"chainId":{"$ref":"/chainId"}},"required":["makerAddress","takerAddress","makerFee","takerFee","senderAddress","makerAssetAmount","takerAssetAmount","makerAssetData","takerAssetData","makerFeeAssetData","takerFeeAssetData","salt","feeRecipientAddress","expirationTimeSeconds","exchangeAddress","chainId"],"type":"object"}`) + signedOrderSchemaLoader = jsonschema.NewStringLoader(`{"id":"/signedOrder","allOf":[{"$ref":"/order"},{"properties":{"signature":{"$ref":"/hex"}},"required":["signature"]}]}`) + + // Root schemas + rootOrderSchemaLoader = jsonschema.NewStringLoader(`{"id":"/rootOrder","allOf":[{"$ref":"/customOrder"},{"$ref":"/signedOrder"}]}`) + rootOrderMessageSchemaLoader = jsonschema.NewStringLoader(`{"id":"/rootOrderMessage","properties":{"messageType":{"type":"string","pattern":"order"},"order":{"$ref":"/rootOrder"},"topics":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["messageType","order","topics"]}`) +) + +const ( + // DefaultCustomOrderSchema is the default schema for /customOrder. It + // includes all 0x orders and doesn't add any additional requirements. + DefaultCustomOrderSchema = `{}` +) + +var builtInSchemas = []jsonschema.JSONLoader{ + addressSchemaLoader, + wholeNumberSchemaLoader, + hexSchemaLoader, + orderSchemaLoader, + signedOrderSchemaLoader, +} + +func GetDefaultFilter(chainID int) (*Filter, error) { + return New(chainID, DefaultCustomOrderSchema) +} + +func GetDefaultTopic(chainID int) (string, error) { + defaultFilter, err := GetDefaultFilter(chainID) + if err != nil { + return "", err + } + return defaultFilter.Topic(), nil +} + +type Filter struct { + topic string + version int + chainID int + rawCustomOrderSchema string + orderSchema *jsonschema.Schema + messageSchema *jsonschema.Schema +} + +func New(chainID int, customOrderSchema string) (*Filter, error) { + orderLoader, err := newLoader(chainID, customOrderSchema) + if err != nil { + return nil, err + } + rootOrderSchema, err := orderLoader.Compile(rootOrderSchemaLoader) + if err != nil { + return nil, err + } + + messageLoader, err := newLoader(chainID, customOrderSchema) + if err := messageLoader.AddSchemas(rootOrderSchemaLoader); err != nil { + return nil, err + } + rootOrderMessageSchema, err := messageLoader.Compile(rootOrderMessageSchemaLoader) + if err != nil { + return nil, err + } + return &Filter{ + chainID: chainID, + rawCustomOrderSchema: customOrderSchema, + orderSchema: rootOrderSchema, + messageSchema: rootOrderMessageSchema, + }, nil +} + +func loadExchangeAddress(loader *jsonschema.SchemaLoader, chainID int) error { + contractAddresses, err := ethereum.GetContractAddressesForChainID(chainID) + if err != nil { + return err + } + // Note that exchangeAddressSchema accepts both checksummed and + // non-checksummed (i.e. all lowercase) addresses. + exchangeAddressSchema := fmt.Sprintf(`{"enum":[%q,%q]}`, contractAddresses.Exchange.Hex(), strings.ToLower(contractAddresses.Exchange.Hex())) + return loader.AddSchema("/exchangeAddress", jsonschema.NewStringLoader(exchangeAddressSchema)) +} + +func loadChainID(loader *jsonschema.SchemaLoader, chainID int) error { + chainIDSchema := fmt.Sprintf(`{"const":%d}`, chainID) + return loader.AddSchema("/chainId", jsonschema.NewStringLoader(chainIDSchema)) +} + +func newLoader(chainID int, customOrderSchema string) (*jsonschema.SchemaLoader, error) { + loader := jsonschema.NewSchemaLoader() + if err := loadChainID(loader, chainID); err != nil { + return nil, err + } + if err := loadExchangeAddress(loader, chainID); err != nil { + return nil, err + } + if err := loader.AddSchemas(builtInSchemas...); err != nil { + return nil, err + } + if err := loader.AddSchema("/customOrder", jsonschema.NewStringLoader(customOrderSchema)); err != nil { + return nil, err + } + return loader, nil +} + +func NewFromTopic(topic string) (*Filter, error) { + // TODO(albrow): Use a cache for topic -> filter + var version int + var chainIDAndSchema string + if _, err := fmt.Sscanf(topic, topicVersionFormat, &version, &chainIDAndSchema); err != nil { + return nil, fmt.Errorf("could not parse topic version for topic: %q", topic) + } + if version != pubsubTopicVersion { + return nil, WrongTopicVersionError{ + expectedVersion: pubsubTopicVersion, + actualVersion: version, + } + } + var chainID int + var base64EncodedSchema string + if _, err := fmt.Sscanf(chainIDAndSchema, topicChainIDAndSchemaFormat, &chainID, &base64EncodedSchema); err != nil { + return nil, fmt.Errorf("could not parse chainID and schema from topic: %q", topic) + } + customOrderSchema, err := base64.URLEncoding.DecodeString(base64EncodedSchema) + if err != nil { + return nil, fmt.Errorf("could not base64-decode order schema: %q", base64EncodedSchema) + } + return New(chainID, string(customOrderSchema)) +} + +func (f *Filter) Topic() string { + if f.topic == "" { + f.topic = f.generateTopic() + } + return f.topic +} + +func (v *Filter) generateTopic() string { + // Note(albrow): We use canonicaljson to elminate any differences in spacing, + // formatting, and the order of field names. This ensures that two filters + // that are semantically the same JSON object always encode to exactly the + // same canonical topic string. + // + // So for example: + // + // { + // "foo": "bar", + // "biz": "baz" + // } + // + // Will encode to the same topic string as: + // + // { + // "biz":"baz", + // "foo":"bar" + // } + // + var holder interface{} = struct{}{} + _ = canonicaljson.Unmarshal([]byte(v.rawCustomOrderSchema), &holder) + canonicalOrderSchemaJSON, _ := canonicaljson.Marshal(holder) + base64EncodedSchema := base64.URLEncoding.EncodeToString(canonicalOrderSchemaJSON) + return fmt.Sprintf(fullTopicFormat, pubsubTopicVersion, v.chainID, base64EncodedSchema) +} + +// MatchOrder returns true if the order passes the filter. It only returns an +// error if there was a problem with validation. For details about +// orders that do not pass the filter, use ValidateOrder. +func (f *Filter) MatchOrder(order *zeroex.SignedOrder) (bool, error) { + result, err := f.ValidateOrder(order) + if err != nil { + return false, err + } + return result.Valid(), nil +} + +func (f *Filter) MatchOrderMessageJSON(messageJSON []byte) (bool, error) { + result, err := f.messageSchema.Validate(jsonschema.NewBytesLoader(messageJSON)) + if err != nil { + return false, err + } + return result.Valid(), nil +} + +func (f *Filter) ValidateOrderJSON(orderJSON []byte) (*jsonschema.Result, error) { + return f.orderSchema.Validate(jsonschema.NewBytesLoader(orderJSON)) +} + +func (f *Filter) ValidateOrder(order *zeroex.SignedOrder) (*jsonschema.Result, error) { + return f.orderSchema.Validate(jsonschema.NewGoLoader(order)) +} + +// Dummy declaration to ensure that ValidatePubSubMessage matches the expected +// signature for pubsub.Validator. +var _ pubsub.Validator = (&Filter{}).ValidatePubSubMessage + +// ValidatePubSubMessage is an implementation of pubsub.Validator and will +// return true if the contents of the message pass the message JSON Schema. +func (f *Filter) ValidatePubSubMessage(ctx context.Context, sender peer.ID, msg *pubsub.Message) bool { + isValid, err := f.MatchOrderMessageJSON(msg.Data) + if err != nil { + log.WithError(err).Error("MatchOrderMessageJSON returned an error") + return false + } + return isValid +} diff --git a/orderfilter/filter_test.go b/orderfilter/filter_test.go new file mode 100644 index 000000000..e778ea9e3 --- /dev/null +++ b/orderfilter/filter_test.go @@ -0,0 +1,387 @@ +package orderfilter + +import ( + "fmt" + "math/big" + "strings" + "testing" + + "github.com/0xProject/0x-mesh/constants" + "github.com/0xProject/0x-mesh/zeroex" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + standardValidOrderJSON = []byte(`{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`) + orderWithSpecificSenderAddressJSON = []byte(`{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x00000000000000000000000000000000ba5eba11","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`) +) + +func TestFilterValidateOrder(t *testing.T) { + t.Parallel() + + testCases := []struct { + note string + chainID int + customOrderSchema string + order *zeroex.Order + expectedErrors []string + }{ + { + note: "happy path", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + order: &zeroex.Order{ + ChainID: big.NewInt(constants.TestChainID), + MakerAddress: common.HexToAddress("0x5409ed021d9299bf6814279a6a1411a7e866a631"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: math.MustParseBig256("1000"), + MakerFee: math.MustParseBig256("0"), + TakerAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + TakerAssetData: common.FromHex("0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082"), + TakerAssetAmount: math.MustParseBig256("2000"), + TakerFee: math.MustParseBig256("0"), + SenderAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ExchangeAddress: common.HexToAddress("0x48bacb9266a570d521063ef5dd96e61686dbe788"), + FeeRecipientAddress: common.HexToAddress("0xa258b39954cef5cb142fd567a46cddb31a670124"), + ExpirationTimeSeconds: math.MustParseBig256("1574532801"), + Salt: math.MustParseBig256("1548619145450"), + }, + }, + { + note: "wrong exchangeAddress", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + expectedErrors: []string{ + "exchangeAddress must be one of the following", + }, + order: &zeroex.Order{ + ChainID: big.NewInt(constants.TestChainID), + MakerAddress: common.HexToAddress("0x5409ed021d9299bf6814279a6a1411a7e866a631"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: math.MustParseBig256("1000"), + MakerFee: math.MustParseBig256("0"), + TakerAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + TakerAssetData: common.FromHex("0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082"), + TakerAssetAmount: math.MustParseBig256("2000"), + TakerFee: math.MustParseBig256("0"), + SenderAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ExchangeAddress: common.HexToAddress("0xdeadfa11"), + FeeRecipientAddress: common.HexToAddress("0xa258b39954cef5cb142fd567a46cddb31a670124"), + ExpirationTimeSeconds: math.MustParseBig256("1574532801"), + Salt: math.MustParseBig256("1548619145450"), + }, + }, + { + note: "wrong chainID", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + expectedErrors: []string{ + "chainId does not match", + }, + order: &zeroex.Order{ + ChainID: big.NewInt(42), + MakerAddress: common.HexToAddress("0x5409ed021d9299bf6814279a6a1411a7e866a631"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: math.MustParseBig256("1000"), + MakerFee: math.MustParseBig256("0"), + TakerAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + TakerAssetData: common.FromHex("0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082"), + TakerAssetAmount: math.MustParseBig256("2000"), + TakerFee: math.MustParseBig256("0"), + SenderAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + ExchangeAddress: common.HexToAddress("0x48bacb9266a570d521063ef5dd96e61686dbe788"), + FeeRecipientAddress: common.HexToAddress("0xa258b39954cef5cb142fd567a46cddb31a670124"), + ExpirationTimeSeconds: math.MustParseBig256("1574532801"), + Salt: math.MustParseBig256("1548619145450"), + }, + }, + { + note: "happy path w/ custom sender address", + chainID: constants.TestChainID, + customOrderSchema: `{"properties":{"senderAddress":{"const":"0x00000000000000000000000000000000ba5eba11"}}}`, + order: &zeroex.Order{ + ChainID: big.NewInt(constants.TestChainID), + MakerAddress: common.HexToAddress("0x5409ed021d9299bf6814279a6a1411a7e866a631"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: math.MustParseBig256("1000"), + MakerFee: math.MustParseBig256("0"), + TakerAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + TakerAssetData: common.FromHex("0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082"), + TakerAssetAmount: math.MustParseBig256("2000"), + TakerFee: math.MustParseBig256("0"), + SenderAddress: common.HexToAddress("0x00000000000000000000000000000000ba5eba11"), + ExchangeAddress: common.HexToAddress("0x48bacb9266a570d521063ef5dd96e61686dbe788"), + FeeRecipientAddress: common.HexToAddress("0xa258b39954cef5cb142fd567a46cddb31a670124"), + ExpirationTimeSeconds: math.MustParseBig256("1574532801"), + Salt: math.MustParseBig256("1548619145450"), + }, + }, + { + note: "wrong custom sender address", + chainID: constants.TestChainID, + customOrderSchema: `{"properties":{"senderAddress":{"const":"0x00000000000000000000000000000000ba5eba11"}}}`, + expectedErrors: []string{ + "senderAddress does not match", + }, + order: &zeroex.Order{ + ChainID: big.NewInt(constants.TestChainID), + MakerAddress: common.HexToAddress("0x5409ed021d9299bf6814279a6a1411a7e866a631"), + MakerAssetData: common.FromHex("0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"), + MakerAssetAmount: math.MustParseBig256("1000"), + MakerFee: math.MustParseBig256("0"), + TakerAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + TakerAssetData: common.FromHex("0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082"), + TakerAssetAmount: math.MustParseBig256("2000"), + TakerFee: math.MustParseBig256("0"), + SenderAddress: common.HexToAddress("0x00000000000000000000000000000000defea7ed"), + ExchangeAddress: common.HexToAddress("0x48bacb9266a570d521063ef5dd96e61686dbe788"), + FeeRecipientAddress: common.HexToAddress("0xa258b39954cef5cb142fd567a46cddb31a670124"), + ExpirationTimeSeconds: math.MustParseBig256("1574532801"), + Salt: math.MustParseBig256("1548619145450"), + }, + }, + } + + for i, tc := range testCases { + tcInfo := fmt.Sprintf("test case %d\nchainID: %d\nschema: %s", i, tc.chainID, tc.customOrderSchema) + filter, err := New(tc.chainID, tc.customOrderSchema) + require.NoError(t, err, tcInfo) + signedOrder, err := zeroex.SignTestOrder(tc.order) + require.NoError(t, err) + actualResult, err := filter.ValidateOrder(signedOrder) + require.NoError(t, err, tc.customOrderSchema) + if len(tc.expectedErrors) == 0 { + assert.Len(t, actualResult.Errors(), 0, "expected no errors but received %d: %+v", len(actualResult.Errors()), actualResult.Errors()) + } else { + loop: + for _, expectedErr := range tc.expectedErrors { + for _, actualErr := range actualResult.Errors() { + if strings.Contains(actualErr.String(), expectedErr) { + continue loop + } + } + assert.Fail(t, fmt.Sprintf("missing expected error: %q\ngot errors: %v", expectedErr, actualResult.Errors()), tcInfo) + } + } + } +} + +func TestFilterValidateOrderJSON(t *testing.T) { + t.Parallel() + + testCases := []struct { + note string + chainID int + customOrderSchema string + orderJSON []byte + expectedErrors []string + }{ + { + note: "happy path", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: standardValidOrderJSON, + }, + { + note: "order with mispelled makerAddress", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: []byte(`{"makerAdddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`), + expectedErrors: []string{ + "makerAddress is required", + }, + }, + { + note: "order with missing makerAddress", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: []byte(`{"takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`), + expectedErrors: []string{ + "makerAddress is required", + }, + }, + { + note: "order with invalid taker address", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: []byte(`{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"hi","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`), + expectedErrors: []string{ + "takerAddress: Does not match pattern '^0x[0-9a-fA-F]{40}$'", + }, + }, + { + note: "order with wrong exchange address", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: []byte(`{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e6168deadbeef","chainId":1337,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`), + expectedErrors: []string{ + "exchangeAddress must be one of the following", + }, + }, + { + note: "order with wrong chain ID", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: []byte(`{"makerAddress":"0xa3ece5d5b6319fa785efc10d3112769a46c6e149","takerAddress":"0x0000000000000000000000000000000000000000","makerAssetAmount":"100000000000000000000","takerAssetAmount":"100000000000000000000000","expirationTimeSeconds":"1559856615025","makerFee":"0","takerFee":"0","feeRecipientAddress":"0x0000000000000000000000000000000000000000","senderAddress":"0x0000000000000000000000000000000000000000","salt":"46108882540880341679561755865076495033942060608820537332859096815711589201849","makerAssetData":"0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498","takerAssetData":"0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","makerFeeAssetData":"0x","takerFeeAssetData":"0x","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","chainId":42,"signature":"0x1c52f75daa4bd2ad9e6e8a7c35adbd089d709e48ae86463f2abfafa3578747fafc264a04d02fa26227e90476d57bca94e24af32f1cc8da444bba21092ca56cd85603"}`), + expectedErrors: []string{ + "chainId does not match", + }, + }, + } + + for i, tc := range testCases { + tcInfo := fmt.Sprintf("test case %d\nchainID: %d\nschema: %s\nnote: %s", i, tc.chainID, tc.customOrderSchema, tc.note) + filter, err := New(tc.chainID, tc.customOrderSchema) + require.NoError(t, err) + actualResult, err := filter.ValidateOrderJSON(tc.orderJSON) + require.NoError(t, err, tc.customOrderSchema) + if len(tc.expectedErrors) == 0 { + assert.Len(t, actualResult.Errors(), 0, "expected no errors but received %d: %+v", len(actualResult.Errors()), actualResult.Errors()) + } else { + loop: + for _, expectedErr := range tc.expectedErrors { + for _, actualErr := range actualResult.Errors() { + if strings.Contains(actualErr.String(), expectedErr) { + continue loop + } + } + assert.Fail(t, fmt.Sprintf("missing expected error: %q\ngot errors: %s", expectedErr, actualResult.Errors()), tcInfo) + } + } + } +} + +func TestFilterMatchOrderMessageJSON(t *testing.T) { + t.Parallel() + + testCases := []struct { + note string + chainID int + customOrderSchema string + orderMessageJSON []byte + expectedResult bool + }{ + { + note: "happy path", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: true, + }, + { + note: "missing topics", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"}}`), + expectedResult: false, + }, + { + note: "empty topics", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":[]}`), + expectedResult: false, + }, + { + note: "missing message type", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: false, + }, + { + note: "wrong message type", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"wrong","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: false, + }, + { + note: "missing order", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: false, + }, + { + note: "order with wrong exchange address", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x0000000000000000000000000000000000000000","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainId":1337,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: false, + }, + { + note: "order with wrong chain ID", + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderMessageJSON: []byte(`{"messageType":"order","order":{"makerAddress":"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb","makerAssetData":"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c","makerAssetAmount":"100000000000000000000","makerFee":"0","takerAddress":"0x0000000000000000000000000000000000000000","takerAssetData":"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082","takerAssetAmount":"50000000000000000000","takerFee":"0","senderAddress":"0x0000000000000000000000000000000000000000","exchangeAddress":"0x48bacb9266a570d521063ef5dd96e61686dbe788","feeRecipientAddress":"0xa258b39954cef5cb142fd567a46cddb31a670124","expirationTimeSeconds":"1575499721","salt":"1548619145450","makerFeeAssetData":"0x","takerFeeAssetData":"0x","chainID":42,"signature":"0x1b0d147219c5c92262f0902727a8d72b09ea5165ac2ede14bccbfbf6559343d8305978e22516dc1ea75e10af2c8954cd45da562ec907ce5723a62728272c566a3f02"},"topics":["/0x-orders/version/3/chain/1337/schema/e30="]}`), + expectedResult: false, + }, + } + + for i, tc := range testCases { + tcInfo := fmt.Sprintf("test case %d\nchainID: %d\nschema: %s\nnote: %s", i, tc.chainID, tc.customOrderSchema, tc.note) + filter, err := New(tc.chainID, tc.customOrderSchema) + require.NoError(t, err) + actualResult, err := filter.MatchOrderMessageJSON(tc.orderMessageJSON) + require.NoError(t, err, tc.customOrderSchema) + assert.Equal(t, tc.expectedResult, actualResult, tcInfo) + } +} + +func TestFilterTopic(t *testing.T) { + testCases := []struct { + chainID int + customOrderSchema string + // orderJSON must be valid according to the filter + orderJSON []byte + expectedTopic string + }{ + { + chainID: constants.TestChainID, + customOrderSchema: DefaultCustomOrderSchema, + orderJSON: standardValidOrderJSON, + expectedTopic: "/0x-orders/version/3/chain/1337/schema/e30=", + }, + { + chainID: constants.TestChainID, + customOrderSchema: `{"properties":{"senderAddress":{"type":"string","pattern":"0x00000000000000000000000000000000ba5eba11"}}}`, + orderJSON: orderWithSpecificSenderAddressJSON, + expectedTopic: "/0x-orders/version/3/chain/1337/schema/eyJwcm9wZXJ0aWVzIjp7InNlbmRlckFkZHJlc3MiOnsicGF0dGVybiI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBiYTVlYmExMSIsInR5cGUiOiJzdHJpbmcifX19", + }, + { + // Same as above but the JSON schema has extra whitespace and some + // properties are in a different order. + chainID: constants.TestChainID, + customOrderSchema: `{"properties": {"senderAddress": {"pattern": "0x00000000000000000000000000000000ba5eba11", "type": "string"}}}`, + orderJSON: orderWithSpecificSenderAddressJSON, + expectedTopic: "/0x-orders/version/3/chain/1337/schema/eyJwcm9wZXJ0aWVzIjp7InNlbmRlckFkZHJlc3MiOnsicGF0dGVybiI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBiYTVlYmExMSIsInR5cGUiOiJzdHJpbmcifX19", + }, + } + + for i, tc := range testCases { + tcInfo := fmt.Sprintf("test case %d\nchainID: %d\nschema: %s", i, tc.chainID, tc.customOrderSchema) + originalFilter, err := New(tc.chainID, tc.customOrderSchema) + require.NoError(t, err, tcInfo) + result, err := originalFilter.ValidateOrderJSON(tc.orderJSON) + require.NoError(t, err, tcInfo) + assert.Empty(t, result.Errors(), "original filter should validate the given order\n"+tcInfo) + assert.Equal(t, tc.expectedTopic, originalFilter.Topic(), tcInfo) + newFilter, err := NewFromTopic(originalFilter.Topic()) + require.NoError(t, err, tcInfo) + assert.Equal(t, tc.expectedTopic, newFilter.Topic(), tcInfo) + result, err = newFilter.ValidateOrderJSON(tc.orderJSON) + require.NoError(t, err, tcInfo) + assert.Empty(t, result.Errors(), "filter generated from topic should validate the same order\n"+tcInfo) + } +} + +func TestDefaultOrderSchemaTopic(t *testing.T) { + defaultTopic, err := GetDefaultTopic(1337) + require.NoError(t, err) + expectedTopic := "/0x-orders/version/3/chain/1337/schema/e30=" + assert.Equal(t, expectedTopic, defaultTopic, "the topic for the default filter should not change") +} diff --git a/p2p/bootstrap.go b/p2p/bootstrap.go index 5e9a13d06..8099996c9 100644 --- a/p2p/bootstrap.go +++ b/p2p/bootstrap.go @@ -17,18 +17,33 @@ const DHTProtocolID = protocol.ID("/0x-mesh-dht/version/1") // DefaultBootstrapList is a list of addresses to use by default for // bootstrapping the DHT. var DefaultBootstrapList = []string{ + // bootstrap nodes "/ip4/3.214.190.67/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF", "/ip4/3.214.190.67/tcp/60559/ws/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF", "/dns4/bootstrap-0.mesh.0x.org/tcp/60558/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF", "/dns4/bootstrap-0.mesh.0x.org/tcp/60559/ws/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF", + "/dns4/bootstrap-0.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAmGx8Z6gdq5T5AQE54GMtqDhDFhizywTy1o28NJbAMMumF", "/ip4/18.200.96.60/tcp/60558/ipfs/16Uiu2HAkwsDZk4LzXy2rnWANRsyBjB4fhjnsNeJmjgsBqxPGTL32", "/ip4/18.200.96.60/tcp/60559/ws/ipfs/16Uiu2HAkwsDZk4LzXy2rnWANRsyBjB4fhjnsNeJmjgsBqxPGTL32", "/dns4/bootstrap-1.mesh.0x.org/tcp/60558/ipfs/16Uiu2HAkwsDZk4LzXy2rnWANRsyBjB4fhjnsNeJmjgsBqxPGTL32", "/dns4/bootstrap-1.mesh.0x.org/tcp/60559/ws/ipfs/16Uiu2HAkwsDZk4LzXy2rnWANRsyBjB4fhjnsNeJmjgsBqxPGTL32", + "/dns4/bootstrap-1.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAkwsDZk4LzXy2rnWANRsyBjB4fhjnsNeJmjgsBqxPGTL32", "/ip4/13.232.193.142/tcp/60558/ipfs/16Uiu2HAkykwoBxwyvoEbaEkuKMeKrmJDPZ2uKFPUKtqd2JbGHUNH", "/ip4/13.232.193.142/tcp/60559/ws/ipfs/16Uiu2HAkykwoBxwyvoEbaEkuKMeKrmJDPZ2uKFPUKtqd2JbGHUNH", "/dns4/bootstrap-2.mesh.0x.org/tcp/60558/ipfs/16Uiu2HAkykwoBxwyvoEbaEkuKMeKrmJDPZ2uKFPUKtqd2JbGHUNH", "/dns4/bootstrap-2.mesh.0x.org/tcp/60559/ws/ipfs/16Uiu2HAkykwoBxwyvoEbaEkuKMeKrmJDPZ2uKFPUKtqd2JbGHUNH", + "/dns4/bootstrap-2.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAkykwoBxwyvoEbaEkuKMeKrmJDPZ2uKFPUKtqd2JbGHUNH", + + // relay nodes + // We could consider hard-coding these at the circuit-relay level. See + // https://github.com/libp2p/go-libp2p/pull/705. Hard-coding them in the + // bootstrap list is likely good enough for now. + "/ip4/167.172.201.142/tcp/60558/ipfs/16Uiu2HAkzuS8DfyZ2CPzZbxGCXLSHvvbvh8nvGCHjY6wEXe2jhAm", + "/dns4/fra1.relayer.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAkzuS8DfyZ2CPzZbxGCXLSHvvbvh8nvGCHjY6wEXe2jhAm", + "/ip4/167.172.201.142/tcp/60558/ipfs/16Uiu2HAmM1dkXwZK5HsnknGFxzPBLuCw4EboiC2sdwKrPJZ6kcio", + "/dns4/sfo2.relayer.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAmM1dkXwZK5HsnknGFxzPBLuCw4EboiC2sdwKrPJZ6kcio", + "/ip4/159.65.4.82/tcp/60558/ipfs/16Uiu2HAm9brLYhoM1wCTRtGRR7ZqXhk8kfEt6a2rSFSZpeV8eB7L", + "/dns4/sgp1.relayer.mesh.0x.org/tcp/443/wss/ipfs/16Uiu2HAm9brLYhoM1wCTRtGRR7ZqXhk8kfEt6a2rSFSZpeV8eB7L", // These nodes are provided by the libp2p community on a best-effort basis. // We're using them as a backup for increased redundancy. diff --git a/p2p/message.go b/p2p/message.go index 34013d8e6..074b193cb 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -20,6 +20,4 @@ type MessageHandler interface { // return an error if there was a problem handling the messages. It should not // return an error for invalid or duplicate messages. HandleMessages(context.Context, []*Message) error - // GetMessagesToShare returns up to max messages to be shared with peers. - GetMessagesToShare(max int) ([][]byte, error) } diff --git a/p2p/node.go b/p2p/node.go index 5b07c49d7..322aef917 100644 --- a/p2p/node.go +++ b/p2p/node.go @@ -15,13 +15,17 @@ import ( "github.com/0xProject/0x-mesh/constants" "github.com/0xProject/0x-mesh/p2p/banner" "github.com/0xProject/0x-mesh/p2p/ratevalidator" + "github.com/0xProject/0x-mesh/p2p/validatorset" + "github.com/albrow/stringset" lru "github.com/hashicorp/golang-lru" libp2p "github.com/libp2p/go-libp2p" connmgr "github.com/libp2p/go-libp2p-connmgr" p2pcrypto "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/host" metrics "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" "github.com/libp2p/go-libp2p-core/routing" discovery "github.com/libp2p/go-libp2p-discovery" dht "github.com/libp2p/go-libp2p-kad-dht" @@ -96,9 +100,13 @@ type Node struct { // Config contains configuration options for a Node. type Config struct { - // Topic is a unique string representing the pubsub topic. Only Nodes which - // have the same topic will share messages with one another. - Topic string + // SubscribeTopic is the topic to subscribe to for new messages. Only messages + // that are published on this topic will be received and processed. + SubscribeTopic string + // PublishTopics are the topics to publish messages to. Messages may be + // published to more than one topic (e.g. a topic for all orders and a topic + // for orders with a specific asset). + PublishTopics []string // TCPPort is the port on which to listen for incoming TCP connections. TCPPort int // WebSocketsPort is the port on which to listen for incoming WebSockets @@ -144,6 +152,11 @@ type Config struct { // is allowed to send at once through the GossipSub network. Any additional // messages will be dropped. PerPeerPubSubMessageBurst int + // CustomMessageValidator is a custom validator for GossipSub messages. All + // incoming and outgoing messages will be dropped unless they are valid + // according to this custom validator, which will be run in addition to the + // default validators. + CustomMessageValidator pubsub.Validator } func getPeerstoreDir(datadir string) string { @@ -240,18 +253,7 @@ func New(ctx context.Context, config Config) (*Node, error) { if err != nil { return nil, err } - rateValidator, err := ratevalidator.New(ctx, ratevalidator.Config{ - MyPeerID: basicHost.ID(), - GlobalLimit: config.GlobalPubSubMessageLimit, - GlobalBurst: config.GlobalPubSubMessageBurst, - PerPeerLimit: config.PerPeerPubSubMessageLimit, - PerPeerBurst: config.PerPeerPubSubMessageBurst, - MaxMessageSize: constants.MaxMessageSizeInBytes, - }) - if err != nil { - return nil, err - } - if err := ps.RegisterTopicValidator(config.Topic, rateValidator.Validate, pubsub.WithValidatorInline(true)); err != nil { + if err := registerValidators(ctx, basicHost, config, ps); err != nil { return nil, err } @@ -280,6 +282,53 @@ func New(ctx context.Context, config Config) (*Node, error) { return node, nil } +// registerValidators registers all the validators we use for incoming and +// outgoing GossipSub messages. +func registerValidators(ctx context.Context, basicHost host.Host, config Config, ps *pubsub.PubSub) error { + validators := validatorset.New() + + // Add the rate limiting validator. + rateValidator, err := ratevalidator.New(ctx, ratevalidator.Config{ + MyPeerID: basicHost.ID(), + GlobalLimit: config.GlobalPubSubMessageLimit, + GlobalBurst: config.GlobalPubSubMessageBurst, + PerPeerLimit: config.PerPeerPubSubMessageLimit, + PerPeerBurst: config.PerPeerPubSubMessageBurst, + MaxMessageSize: constants.MaxOrderSizeInBytes, + }) + if err != nil { + return err + } + validators.Add("message rate limiting", rateValidator.Validate) + + // Add the custom validator if there is one. + if config.CustomMessageValidator != nil { + validators.Add("custom", config.CustomMessageValidator) + } + + // Register the set of validators for all topics that we publish and/or + // subscribe to. + // + // Note(albrow) In some cases we will technically be doing some + // redundant work to validate messages again, since they were already + // validated in core.App.AddOrders. Luckily, using JSON Schemas in an inline + // validator has little to no performance impact. + // + // The reason we add the validators to publish topics as well as the subscribe + // topic is that not every order that we will share through GossipSub went + // through core.App.AddOrders. For example, there could be some older orders + // in the database that don't match the current filter. In most cases, the + // subscribe topic will be one of the publish topics so it doesn't matter much + // in practice in the current implementation. + allTopics := stringset.NewFromSlice(append(config.PublishTopics, config.SubscribeTopic)) + for topic := range allTopics { + if err := ps.RegisterTopicValidator(topic, validators.Validate, pubsub.WithValidatorInline(true)); err != nil { + return err + } + } + return nil +} + func getPrivateKey(path string) (p2pcrypto.PrivKey, error) { if path == "" { // If path is empty, generate a new key. @@ -374,6 +423,21 @@ func (n *Node) GetNumPeers() int { return n.connManager.GetInfo().ConnCount } +// SetStreamHandler registers a handler for a custom protocol. +func (n *Node) SetStreamHandler(pid protocol.ID, handler network.StreamHandler) { + n.host.SetStreamHandler(pid, handler) +} + +func (n *Node) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error) { + return n.host.NewStream(ctx, p, pids...) +} + +// Neighbors returns a list of peer IDs that this node is currently connected +// to. +func (n *Node) Neighbors() []peer.ID { + return n.host.Network().Peers() +} + // Connect ensures there is a connection between this host and the peer with // given peerInfo. If there is not an active connection, Connect will dial the // peer, and block until a connection is open, timeout is exceeded, or an error @@ -421,10 +485,6 @@ func (n *Node) runOnce() error { n.banner.CheckBandwidthUsage() } - // Send up to maxSendBatch messages. - if err := n.shareBatch(); err != nil { - return err - } return nil } @@ -530,25 +590,19 @@ func (n *Node) receiveBatch() ([]*Message, error) { } } -// shareBatch shares up to maxShareBatch messages (selected via the -// MessageHandler) with all connected peers. -func (n *Node) shareBatch() error { - // TODO(albrow): This will need to change when we switch to WeijieSub. - outgoing, err := n.messageHandler.GetMessagesToShare(maxShareBatch) - if err != nil { - return err - } - for _, data := range outgoing { - if err := n.Send(data); err != nil { - return err - } - } - return nil -} - // Send sends a message continaing the given data to all connected peers. func (n *Node) Send(data []byte) error { - return n.pubsub.Publish(n.config.Topic, data) + // Note: If there is an error, we still try to publish to any remaining + // topics. We always return the first error that was encountered (if any), + // which is assigned to firstErr. + var firstErr error + for _, topic := range n.config.PublishTopics { + err := n.pubsub.Publish(topic, data) + if err != nil && firstErr == nil { + firstErr = err + } + } + return firstErr } // receive returns the next pending message. It blocks if no messages are @@ -556,7 +610,7 @@ func (n *Node) Send(data []byte) error { func (n *Node) receive(ctx context.Context) (*Message, error) { if n.sub == nil { var err error - n.sub, err = n.pubsub.Subscribe(n.config.Topic) + n.sub, err = n.pubsub.Subscribe(n.config.SubscribeTopic) if err != nil { return nil, err } diff --git a/p2p/node_test.go b/p2p/node_test.go index da85b2c85..aa4981c9e 100644 --- a/p2p/node_test.go +++ b/p2p/node_test.go @@ -40,10 +40,6 @@ func (*dummyMessageHandler) HandleMessages(ctx context.Context, messages []*Mess return nil } -func (*dummyMessageHandler) GetMessagesToShare(max int) ([][]byte, error) { - return nil, nil -} - // testNotifee can be used to listen for new connections and new streams. type testNotifee struct { conns chan p2pnet.Conn @@ -84,7 +80,8 @@ func newTestNode(t *testing.T, ctx context.Context, notifee p2pnet.Notifiee) *No privKey, _, err := p2pcrypto.GenerateSecp256k1Key(rand.Reader) require.NoError(t, err) config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, PrivateKey: privKey, MessageHandler: &dummyMessageHandler{}, RendezvousString: testRendezvousString, @@ -189,21 +186,6 @@ func (mh *inMemoryMessageHandler) store(messages []*Message) error { return nil } -func (mh *inMemoryMessageHandler) GetMessagesToShare(max int) ([][]byte, error) { - // Always just return the first messages up to max. - var toShare []*Message - if max > len(mh.messages) { - toShare = mh.messages - } else { - toShare = mh.messages[:max] - } - data := make([][]byte, len(toShare)) - for i, msg := range toShare { - data[i] = msg.Data - } - return data, nil -} - func TestPingPong(t *testing.T) { t.Parallel() @@ -262,108 +244,6 @@ func expectMessage(t *testing.T, node *Node, expected *Message, timeout time.Dur } } -func TestMessagesAreShared(t *testing.T) { - t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - node0 := newTestNode(t, ctx, nil) - node1 := newTestNode(t, ctx, nil) - connectTestNodes(t, node0, node1) - - // Set up special MessageHandlers for testing purposes. - // oddMessageHandler only considers messages valid if the first byte is odd. - oddMessageHandler := newInMemoryMessageHandler(func(msg *Message) (bool, error) { - if len(msg.Data) < 1 { - return false, nil - } - isFirstByteOdd := msg.Data[0]%2 != 0 - return isFirstByteOdd, nil - }) - oddMessageHandler.messages = []*Message{ - { - From: node0.host.ID(), - Data: []byte{1, 2, 3, 4}, - }, - { - From: node0.host.ID(), - Data: []byte{3, 4, 5, 6}, - }, - } - node0.messageHandler = oddMessageHandler - - // allMessageHandler considers all messages valid. - allMessageHandler := newInMemoryMessageHandler(func(msg *Message) (bool, error) { - return true, nil - }) - allMessageHandler.messages = []*Message{ - { - From: node1.host.ID(), - Data: []byte{0, 1, 2, 3}, - }, - { - From: node1.host.ID(), - Data: []byte{1, 2, 3, 4}, - }, - { - From: node1.host.ID(), - Data: []byte{2, 3, 4, 5}, - }, - { - From: node1.host.ID(), - Data: []byte{5, 6, 7, 8}, - }, - } - node1.messageHandler = allMessageHandler - - // Call runOnce to cause each node to share and receive messages. - require.NoError(t, node0.runOnce()) - require.NoError(t, node1.runOnce()) - require.NoError(t, node0.runOnce()) - require.NoError(t, node1.runOnce()) - - // We expect that all the odd messages have been collected by node0. - expectedOddMessages := []*Message{ - { - From: node0.host.ID(), - Data: []byte{1, 2, 3, 4}, - }, - { - From: node0.host.ID(), - Data: []byte{3, 4, 5, 6}, - }, - { - From: node1.host.ID(), - Data: []byte{5, 6, 7, 8}, - }, - } - assert.Equal(t, expectedOddMessages, node0.messageHandler.(*inMemoryMessageHandler).messages, "node0 should be storing all odd messages") - - // We expect that all messages have been collected by node1. - expectedAllMessages := []*Message{ - { - From: node1.host.ID(), - Data: []byte{0, 1, 2, 3}, - }, - { - From: node1.host.ID(), - Data: []byte{1, 2, 3, 4}, - }, - { - From: node1.host.ID(), - Data: []byte{2, 3, 4, 5}, - }, - { - From: node0.host.ID(), - Data: []byte{3, 4, 5, 6}, - }, - { - From: node1.host.ID(), - Data: []byte{5, 6, 7, 8}, - }, - } - assert.Equal(t, expectedAllMessages, node1.messageHandler.(*inMemoryMessageHandler).messages, "node1 should be storing all messages") -} - func TestPeerDiscovery(t *testing.T) { t.Parallel() // Create a test notifee which will be used to detect new connections. @@ -519,7 +399,8 @@ func TestRateValidatorGlobal(t *testing.T) { } node0Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), @@ -530,7 +411,8 @@ func TestRateValidatorGlobal(t *testing.T) { GlobalPubSubMessageBurst: 5, } node1Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), @@ -541,7 +423,8 @@ func TestRateValidatorGlobal(t *testing.T) { GlobalPubSubMessageBurst: 5, } node2Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), @@ -603,7 +486,8 @@ func TestRateValidatorPerPeer(t *testing.T) { } node0Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), @@ -614,7 +498,8 @@ func TestRateValidatorPerPeer(t *testing.T) { PerPeerPubSubMessageBurst: 5, } node1Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), @@ -625,7 +510,8 @@ func TestRateValidatorPerPeer(t *testing.T) { PerPeerPubSubMessageBurst: 5, } node2Config := Config{ - Topic: testTopic, + SubscribeTopic: testTopic, + PublishTopics: []string{testTopic}, MessageHandler: newInMemoryMessageHandler(func(*Message) (bool, error) { return true, nil }), diff --git a/p2p/opts.go b/p2p/opts.go index 49dd24ef0..5a274f997 100644 --- a/p2p/opts.go +++ b/p2p/opts.go @@ -4,6 +4,7 @@ package p2p import ( "context" + "crypto/tls" "fmt" "io/ioutil" "net/http" @@ -15,6 +16,8 @@ import ( dhtopts "github.com/libp2p/go-libp2p-kad-dht/opts" "github.com/libp2p/go-libp2p-peerstore/pstoreds" pubsub "github.com/libp2p/go-libp2p-pubsub" + tcp "github.com/libp2p/go-tcp-transport" + ws "github.com/libp2p/go-ws-transport" ma "github.com/multiformats/go-multiaddr" ) @@ -69,7 +72,17 @@ func getHostOptions(ctx context.Context, config Config) ([]libp2p.Option, error) if err != nil { return nil, err } + + // Set up the WebSocket transport to ignore TLS verification. We use secio so + // it is not necessary. + tlsConfig := &tls.Config{ + InsecureSkipVerify: true, + } + newWebsocketTransport := ws.NewWithOptions(ws.TLSClientConfig(tlsConfig)) + return []libp2p.Option{ + libp2p.Transport(tcp.NewTCPTransport), + libp2p.Transport(newWebsocketTransport), libp2p.ListenAddrs(tcpBindAddr, wsBindAddr), libp2p.AddrsFactory(newAddrsFactory(advertiseAddrs)), libp2p.Peerstore(pstore), diff --git a/p2p/ratevalidator/validator.go b/p2p/ratevalidator/validator.go index d2e28d929..2935c53ec 100644 --- a/p2p/ratevalidator/validator.go +++ b/p2p/ratevalidator/validator.go @@ -6,7 +6,7 @@ import ( "time" "github.com/karlseguin/ccache" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" log "github.com/sirupsen/logrus" "golang.org/x/time/rate" diff --git a/p2p/validatorset/set.go b/p2p/validatorset/set.go new file mode 100644 index 000000000..f15d19d69 --- /dev/null +++ b/p2p/validatorset/set.go @@ -0,0 +1,67 @@ +// Package validatorset offers a way to combine a set of libp2p.Validators into +// a single validator. The combined validator set only passes if *all* of its +// constituent validators pass. +package validatorset + +import ( + "context" + "sync" + + peer "github.com/libp2p/go-libp2p-core/peer" + pubsub "github.com/libp2p/go-libp2p-pubsub" + log "github.com/sirupsen/logrus" +) + +// Set is a set of libp2p.Validators. +type Set struct { + mu sync.RWMutex + validators []*namedValidator +} + +type namedValidator struct { + name string + validator pubsub.Validator +} + +// New creates a new validator set +func New() *Set { + return &Set{} +} + +// Add adds a new validator to the set with the given name. The name is used +// in error messages. +func (s *Set) Add(name string, validator pubsub.Validator) { + s.mu.Lock() + defer s.mu.Unlock() + named := &namedValidator{ + name: name, + validator: validator, + } + s.validators = append(s.validators, named) +} + +// Validate validates the message. It returns true if all of the constituent +// validators in the set also return true. If one or more of them return false, +// Validate returns false. +func (s *Set) Validate(ctx context.Context, sender peer.ID, msg *pubsub.Message) bool { + s.mu.RLock() + defer s.mu.RUnlock() + for _, validator := range s.validators { + // If the context is done return immediately. + select { + case <-ctx.Done(): + return false + default: + } + + // Otherwise continue by running this validator. + isValid := validator.validator(ctx, sender, msg) + if !isValid { + // TODO(albrow): Should we reduce a peer's score as a penalty for invalid + // messages? + log.WithField("validatorName", validator.name).Trace("pubsub message validation failed") + return false + } + } + return true +} diff --git a/p2p/validatorset/set_test.go b/p2p/validatorset/set_test.go new file mode 100644 index 000000000..17c40f687 --- /dev/null +++ b/p2p/validatorset/set_test.go @@ -0,0 +1,84 @@ +package validatorset + +import ( + "context" + "crypto/rand" + "fmt" + "testing" + "time" + + p2pcrypto "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// alwaysFalseValidator is a pubsub.Validator that always returns false. +func alwaysFalseValidator(ctx context.Context, sender peer.ID, msg *pubsub.Message) bool { + return false +} + +// alwaysTrueValidator is a pubsub.Validator that always returns true. +func alwaysTrueValidator(ctx context.Context, sender peer.ID, msg *pubsub.Message) bool { + return true +} + +func TestValidatorSet(t *testing.T) { + t.Parallel() + + // For each test case, we construct a new validator set with the given + // validators. Then we check that the actual results of set.Validate matches + // the expected result. + testCases := []struct { + validators []pubsub.Validator + expectedResult bool + }{ + { + validators: []pubsub.Validator{alwaysTrueValidator}, + expectedResult: true, + }, + { + validators: []pubsub.Validator{alwaysFalseValidator}, + expectedResult: false, + }, + { + validators: []pubsub.Validator{alwaysTrueValidator, alwaysTrueValidator}, + expectedResult: true, + }, + { + validators: []pubsub.Validator{alwaysFalseValidator, alwaysFalseValidator}, + expectedResult: false, + }, + { + validators: []pubsub.Validator{alwaysTrueValidator, alwaysFalseValidator}, + expectedResult: false, + }, + { + validators: []pubsub.Validator{alwaysTrueValidator, alwaysFalseValidator, alwaysTrueValidator}, + expectedResult: false, + }, + } + + for i, testCase := range testCases { + testCaseName := fmt.Sprintf("validatorset test case %d", i) + t.Run(testCaseName, func(t *testing.T) { + set := New() + for j, validator := range testCase.validators { + set.Add(fmt.Sprintf("validator %d", j), validator) + } + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + actualResult := set.Validate(ctx, getRandomPeerID(t), &pubsub.Message{}) + assert.Equal(t, testCase.expectedResult, actualResult) + }) + } +} + +func getRandomPeerID(t *testing.T) peer.ID { + privKey, _, err := p2pcrypto.GenerateSecp256k1Key(rand.Reader) + require.NoError(t, err) + id, err := peer.IDFromPrivateKey(privKey) + require.NoError(t, err) + return id +} diff --git a/rpc/client.go b/rpc/client.go index d9d924d6b..c81cb8fe3 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -10,7 +10,7 @@ import ( "github.com/0xProject/0x-mesh/zeroex" "github.com/0xProject/0x-mesh/zeroex/ordervalidator" "github.com/ethereum/go-ethereum/rpc" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" peerstore "github.com/libp2p/go-libp2p-peerstore" ) diff --git a/rpc/clients/typescript/package.json b/rpc/clients/typescript/package.json index 928e2c886..28b5aa302 100644 --- a/rpc/clients/typescript/package.json +++ b/rpc/clients/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@0x/mesh-rpc-client", - "version": "8.2.0", + "version": "9.0.0", "engines": { "node": ">=6.12" }, diff --git a/rpc/clients/typescript/src/ws_client.ts b/rpc/clients/typescript/src/ws_client.ts index 925705f84..082f1d94c 100644 --- a/rpc/clients/typescript/src/ws_client.ts +++ b/rpc/clients/typescript/src/ws_client.ts @@ -306,36 +306,50 @@ export class WSClient { /** * Get all 0x signed orders currently stored in the Mesh node * @param perPage number of signedOrders to fetch per paginated request - * @returns all orders, their hash and their fillableTakerAssetAmount + * @returns the snapshotID, snapshotTimestamp and all orders, their hashes and fillableTakerAssetAmounts */ public async getOrdersAsync(perPage: number = 200): Promise { let snapshotID = ''; // New snapshot let page = 0; - const rawGetOrdersResponse: RawGetOrdersResponse = await this._wsProvider.send('mesh_getOrders', [ - page, - perPage, - snapshotID, - ]); - let getOrdersResponse = WSClient._convertRawGetOrdersResponse(rawGetOrdersResponse); - snapshotID = rawGetOrdersResponse.snapshotID; - let rawOrdersInfos = rawGetOrdersResponse.ordersInfos; + let getOrdersResponse = await this.getOrdersForPageAsync(page, perPage, snapshotID); + snapshotID = getOrdersResponse.snapshotID; + let ordersInfos = getOrdersResponse.ordersInfos; + + let allOrderInfos: OrderInfo[] = []; - let allRawOrderInfos: RawOrderInfo[] = []; do { - allRawOrderInfos = [...allRawOrderInfos, ...rawOrdersInfos]; + allOrderInfos = [...allOrderInfos, ...ordersInfos]; page++; - rawOrdersInfos = (await this._wsProvider.send('mesh_getOrders', [page, perPage, snapshotID])).ordersInfos; - } while (rawOrdersInfos.length > 0); + getOrdersResponse = await this.getOrdersForPageAsync(page, perPage, snapshotID); + ordersInfos = getOrdersResponse.ordersInfos; + } while (ordersInfos.length > 0); - const orderInfos = WSClient._convertRawOrderInfos(allRawOrderInfos); getOrdersResponse = { snapshotID, snapshotTimestamp: getOrdersResponse.snapshotTimestamp, - ordersInfos: orderInfos, + ordersInfos: allOrderInfos, }; return getOrdersResponse; } + /** + * Get page of 0x signed orders stored on the Mesh node at the specified snapshot + * @param page Page index at which to retrieve orders + * @param perPage number of signedOrders to fetch per paginated request + * @param snapshotID The DB snapshot at which to fetch orders. If omitted, a new snapshot is created + * @returns the snapshotID, snapshotTimestamp and all orders, their hashes and fillableTakerAssetAmounts + */ + public async getOrdersForPageAsync(page: number, perPage: number = 200, snapshotID?: string): Promise { + const finalSnapshotID = snapshotID === undefined ? '' : snapshotID; + + const rawGetOrdersResponse: RawGetOrdersResponse = await this._wsProvider.send('mesh_getOrders', [ + page, + perPage, + finalSnapshotID, + ]); + const getOrdersResponse = WSClient._convertRawGetOrdersResponse(rawGetOrdersResponse); + return getOrdersResponse; + } /** * Subscribe to the 'orders' topic and receive order events from Mesh. This method returns a * subscriptionId that can be used to `unsubscribe()` from this subscription. diff --git a/rpc/clients/typescript/test/utils/ws_server.ts b/rpc/clients/typescript/test/utils/ws_server.ts index f5b828ff0..303da29a8 100644 --- a/rpc/clients/typescript/test/utils/ws_server.ts +++ b/rpc/clients/typescript/test/utils/ws_server.ts @@ -1,13 +1,13 @@ -import {ChildProcessWithoutNullStreams, spawn} from 'child_process'; +import { ChildProcessWithoutNullStreams, spawn } from 'child_process'; import * as jsonstream from 'jsonstream'; -import {join} from 'path'; +import { join } from 'path'; import * as rimraf from 'rimraf'; -import {WSClient} from '../../src'; +import { WSClient } from '../../src'; async function buildBinaryAsync(): Promise { const cwd = join(__dirname, '../../../../../../').normalize(); - const build = spawn('make', ['mesh'], {cwd}); + const build = spawn('make', ['mesh'], { cwd }); await new Promise((resolve, reject) => { build.on('close', code => { code === 0 ? resolve() : reject(new Error('Failed to build 0x-mesh')); @@ -47,7 +47,7 @@ export async function startServerAndClientAsync(): Promise { const mesh = new MeshHarness(); const log = await mesh.waitForPatternAsync(/started RPC server/); const peerID = JSON.parse(log.toString()).myPeerID; - const client = new WSClient(`ws://localhost:${mesh.port}`); + const client = new WSClient(`ws://localhost:${mesh.wsPort}`); return { client, mesh, @@ -59,7 +59,7 @@ export class MeshHarness { public static readonly DEFAULT_TIMEOUT = 1000; protected static _serverPort = 64321; - public readonly port: number; + public readonly wsPort: number; private readonly _mesh: ChildProcessWithoutNullStreams; private _killed = false; @@ -95,12 +95,12 @@ export class MeshHarness { public constructor() { const env = Object.create(process.env); - this.port = MeshHarness._serverPort++; + this.wsPort = MeshHarness._serverPort++; env.ETHEREUM_RPC_URL = 'http://localhost:8545'; env.ETHEREUM_CHAIN_ID = '1337'; env.VERBOSITY = '5'; - env.RPC_ADDR = `localhost:${this.port}`; - this._mesh = spawn('mesh', [], {env}); + env.WS_RPC_ADDR = `localhost:${this.wsPort}`; + this._mesh = spawn('mesh', [], { env }); this._mesh.stderr.on('error', error => { throw new Error(`${error.name} - ${error.message}`); }); diff --git a/rpc/clients/typescript/test/ws_client_test.ts b/rpc/clients/typescript/test/ws_client_test.ts index eef6d9d7b..f0a6c2e47 100644 --- a/rpc/clients/typescript/test/ws_client_test.ts +++ b/rpc/clients/typescript/test/ws_client_test.ts @@ -1,21 +1,21 @@ -import {getContractAddressesForChainOrThrow} from '@0x/contract-addresses'; -import {DummyERC20TokenContract} from '@0x/contracts-erc20'; -import {ExchangeContract} from '@0x/contracts-exchange'; -import {blockchainTests, constants, expect, OrderFactory, orderHashUtils} from '@0x/contracts-test-utils'; -import {callbackErrorReporter, Web3Config, web3Factory} from '@0x/dev-utils'; -import {assetDataUtils} from '@0x/order-utils'; -import {Web3ProviderEngine} from '@0x/subproviders'; -import {DoneCallback, SignedOrder} from '@0x/types'; -import {BigNumber, hexUtils} from '@0x/utils'; +import { getContractAddressesForChainOrThrow } from '@0x/contract-addresses'; +import { DummyERC20TokenContract } from '@0x/contracts-erc20'; +import { ExchangeContract } from '@0x/contracts-exchange'; +import { blockchainTests, constants, expect, OrderFactory, orderHashUtils } from '@0x/contracts-test-utils'; +import { callbackErrorReporter, Web3Config, web3Factory } from '@0x/dev-utils'; +import { assetDataUtils } from '@0x/order-utils'; +import { Web3ProviderEngine } from '@0x/subproviders'; +import { DoneCallback, SignedOrder } from '@0x/types'; +import { BigNumber, hexUtils } from '@0x/utils'; import 'mocha'; import * as uuidValidate from 'uuid-validate'; import * as WebSocket from 'websocket'; -import {OrderEvent, OrderEventEndState, WSClient} from '../src/index'; -import {ContractEventKind, ExchangeCancelEvent, RejectedKind, WSMessage} from '../src/types'; +import { OrderEvent, OrderEventEndState, WSClient } from '../src/index'; +import { ContractEventKind, ExchangeCancelEvent, OrderInfo, RejectedKind, WSMessage } from '../src/types'; -import {SERVER_PORT, setupServerAsync, stopServer} from './utils/mock_ws_server'; -import {MeshDeployment, startServerAndClientAsync} from './utils/ws_server'; +import { SERVER_PORT, setupServerAsync, stopServer } from './utils/mock_ws_server'; +import { MeshDeployment, startServerAndClientAsync } from './utils/ws_server'; blockchainTests.resets('WSClient', env => { describe('integration tests', () => { @@ -62,10 +62,10 @@ blockchainTests.resets('WSClient', env => { await feeToken.mint(mintAmount).awaitTransactionSuccessAsync({from: makerAddress}); await makerToken .approve(erc20ProxyAddress, new BigNumber('100e18')) - .awaitTransactionSuccessAsync({from: makerAddress}); + .awaitTransactionSuccessAsync({ from: makerAddress }); await feeToken .approve(erc20ProxyAddress, new BigNumber('100e18')) - .awaitTransactionSuccessAsync({from: makerAddress}); + .awaitTransactionSuccessAsync({ from: makerAddress }); orderFactory = new OrderFactory(constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)], { ...constants.STATIC_ORDER_PARAMS, feeRecipientAddress: constants.NULL_ADDRESS, @@ -140,7 +140,7 @@ blockchainTests.resets('WSClient', env => { )}-${leftPad(now.getUTCDate())}T00:00:00Z`; const expectedStats = { version: '', - pubSubTopic: '/0x-orders/network/1337/version/2', + pubSubTopic: '/0x-orders/version/3/chain/1337/schema/e30=', rendezvous: '/0x-mesh/network/1337/version/2', peerID: deployment.peerID, ethereumChainID: 1337, @@ -177,25 +177,54 @@ blockchainTests.resets('WSClient', env => { // timestamp is approximately equal (within 1 second) because the server // will receive the request slightly after it is sent. const now = new Date(Date.now()).getTime(); - const perPage = 10; + const perPage = ordersLength / 2; const response = await deployment.client.getOrdersAsync(perPage); assertRoughlyEquals(now, response.snapshotTimestamp * secondsToMs(1), secondsToMs(2)); + // Verify that snapshot ID in the response meets the expected schema. + expect(uuidValidate(response.snapshotID)).to.be.true(); // Verify that all of the orders that were added to the mesh node - // were returned in the `getOrders` rpc response, and that the - // ganache snapshot ID in the response meets the expected schema. - expect(uuidValidate(response.snapshotID)).to.be.true(); - for (const order of orders) { - let hasSeenMatch = false; - for (const responseOrder of response.ordersInfos) { - if (orderHashUtils.getOrderHashHex(order) === responseOrder.orderHash) { - hasSeenMatch = true; - expect(order).to.be.deep.eq(responseOrder.signedOrder); - break; - } - } - expect(hasSeenMatch).to.be.true(); + // were returned in the `getOrders` rpc response + expectContainsOrders(orders, response.ordersInfos); + }); + }); + + describe('#getOrdersForPageAsync', async () => { + it('properly makes paginated request and returns signedOrders', async () => { + const ordersLength = 10; + const orders = []; + for (let i = 0; i < ordersLength; i++) { + orders[i] = await orderFactory.newSignedOrderAsync({}); } + const validationResults = await deployment.client.addOrdersAsync(orders); + expect(validationResults.accepted.length).to.be.eq(ordersLength); + + // NOTE(jalextowle): The time returned by Date uses milliseconds, but + // the mesh timestamp only uses second. Multiplying the seconds timestamp + // by 1000 gives us a comparable value. We only try to ensure that this + // timestamp is approximately equal (within 1 second) because the server + // will receive the request slightly after it is sent. + const now = new Date(Date.now()).getTime(); + let page = 0; + const perPage = 5; + // First request for page index 0 + let response = await deployment.client.getOrdersForPageAsync(page, perPage); + assertRoughlyEquals(now, response.snapshotTimestamp * secondsToMs(1), secondsToMs(2)); + expect(uuidValidate(response.snapshotID)).to.be.true(); + + let responseOrders = response.ordersInfos; + + // Second request for page index 1 + page = 1; + response = await deployment.client.getOrdersForPageAsync(page, perPage, response.snapshotID); + expect(uuidValidate(response.snapshotID)).to.be.true(); + + // Combine orders found in first and second paginated requests + responseOrders = [...responseOrders, ...response.ordersInfos]; + + // Verify that all of the orders that were added to the mesh node + // were returned in the two `getOrders` rpc response + expectContainsOrders(orders, responseOrders); }); }); @@ -203,11 +232,12 @@ blockchainTests.resets('WSClient', env => { it('should receive subscription updates', (done: DoneCallback) => { (async () => { const expectToBeCalledOnce = true; - const callback = callbackErrorReporter.reportNoErrorCallbackErrors(done, expectToBeCalledOnce)( - async (ack: string) => { - expect(ack).to.be.equal('tick'); - }, - ); + const callback = callbackErrorReporter.reportNoErrorCallbackErrors( + done, + expectToBeCalledOnce, + )(async (ack: string) => { + expect(ack).to.be.equal('tick'); + }); await (deployment.client as any)._subscribeToHeartbeatAsync(callback); })().catch(done); }); @@ -383,7 +413,7 @@ blockchainTests.resets('WSClient', env => { }) as any); }); - const client = new WSClient(`ws://localhost:${SERVER_PORT}`, {reconnectDelay: 100}); + const client = new WSClient(`ws://localhost:${SERVER_PORT}`, { reconnectDelay: 100 }); client.onReconnected(async () => { // We need to add a sleep here so that we leave time for the client // to get connected before destroying it. @@ -401,12 +431,11 @@ blockchainTests.resets('WSClient', env => { // tslint:disable-next-line:no-floating-promises (async () => { const wsServer = await setupServerAsync(); - let numMessages = 0; + let hasReceivedUnsubscribeMessage = false; wsServer.on('connect', ((connection: WebSocket.connection) => { connection.on('message', (async (message: WSMessage) => { const jsonRpcRequest = JSON.parse(message.utf8Data); - if (numMessages === 0) { - expect(jsonRpcRequest.method).to.be.equal('mesh_subscribe'); + if (jsonRpcRequest.method === 'mesh_subscribe') { const response = ` { "id": "${jsonRpcRequest.id}", @@ -415,16 +444,15 @@ blockchainTests.resets('WSClient', env => { } `; connection.sendUTF(response); - numMessages++; - return; + } else if (jsonRpcRequest.method === 'mesh_unsubscribe') { + hasReceivedUnsubscribeMessage = true; } - numMessages++; }) as any); }) as any); const client = new WSClient(`ws://localhost:${SERVER_PORT}`); client.onClose(() => { - expect(numMessages).to.be.equal(2); + expect(hasReceivedUnsubscribeMessage).to.be.equal(true); done(); }); // We need to add a sleep here so that we leave time for the client @@ -454,4 +482,20 @@ function secondsToMs(seconds: number): number { async function sleepAsync(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } + +// Verify that all of the orders that were added to the mesh node +// were returned in the `getOrders` rpc response +function expectContainsOrders(expectedOrders: SignedOrder[], ordersInfos: OrderInfo[]): void { + for (const order of expectedOrders) { + let hasSeenMatch = false; + for (const responseOrder of ordersInfos) { + if (orderHashUtils.getOrderHashHex(order) === responseOrder.orderHash) { + hasSeenMatch = true; + expect(order).to.be.deep.eq(responseOrder.signedOrder); + break; + } + } + expect(hasSeenMatch).to.be.true(); + } +} // tslint:disable-line:max-file-line-count diff --git a/rpc/server.go b/rpc/server.go index 9a2424870..a845a9f40 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -4,6 +4,7 @@ package rpc import ( "context" + "fmt" "net" "net/http" "strings" @@ -34,10 +35,19 @@ func NewServer(addr string, rpcHandler RPCHandler) (*Server, error) { }, nil } -// Listen causes the server to listen for new connections. You can call Close to +// HandlerType represents the type of handler to attach to the server +type HandlerType uint8 + +// HandlerType values +const ( + HTTPHandler HandlerType = iota + WSHandler +) + +// Listen causes the server to listen for new WS connections. You can call Close to // stop listening. Listen blocks until there is an error or the given context is // canceled. -func (s *Server) Listen(ctx context.Context) error { +func (s *Server) Listen(ctx context.Context, handlerType HandlerType) error { s.mut.Lock() rpcService := &rpcService{ @@ -64,7 +74,17 @@ func (s *Server) Listen(ctx context.Context) error { _ = s.listener.Close() }() - if err := http.Serve(s.listener, s.rpcServer.WebsocketHandler([]string{"*"})); err != nil { + var handler http.Handler + switch handlerType { + case HTTPHandler: + handler = s.rpcServer + case WSHandler: + handler = s.rpcServer.WebsocketHandler([]string{"*"}) + default: + return fmt.Errorf("Unrecognized HandlerType: %d", handlerType) + } + + if err := http.Serve(s.listener, handler); err != nil { // HACK(albrow): http.Serve doesn't accept a context. This means that // everytime we close the context for our rpc.Server, we see a "use of // closed network connection" error. diff --git a/rpc/service.go b/rpc/service.go index 8dd9e6bd1..98f7dac44 100644 --- a/rpc/service.go +++ b/rpc/service.go @@ -14,7 +14,7 @@ import ( "github.com/0xProject/0x-mesh/zeroex/ordervalidator" "github.com/ethereum/go-ethereum/rpc" ethrpc "github.com/ethereum/go-ethereum/rpc" - peer "github.com/libp2p/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-core/peer" peerstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" log "github.com/sirupsen/logrus" diff --git a/test-wasm/go_js_wasm_exec b/test-wasm/go_js_wasm_exec index d1b01e3a9..c15f43ad3 100755 --- a/test-wasm/go_js_wasm_exec +++ b/test-wasm/go_js_wasm_exec @@ -11,13 +11,5 @@ then exit 1 fi -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - # We changed this line to require our node_shim.js. exec node --require=$ZEROEX_MESH_ROOT_DIR/test-wasm/node_shim.js "$(go env GOROOT)/misc/wasm/wasm_exec.js" "$@" diff --git a/zeroex/asset_data_decoder.go b/zeroex/asset_data_decoder.go index 3131a2af0..74b158fd6 100644 --- a/zeroex/asset_data_decoder.go +++ b/zeroex/asset_data_decoder.go @@ -23,10 +23,14 @@ const ERC1155AssetDataID = "a7cb5fb7" // MultiAssetDataID is the assetDataId for multiAsset tokens const MultiAssetDataID = "94cfcdd7" +// ERC20BridgeAssetDataID is the assetDataId for ERC20Bridge assets +const ERC20BridgeAssetDataID = "dc1600f3" + const erc20AssetDataAbi = "[{\"inputs\":[{\"name\":\"address\",\"type\":\"address\"}],\"name\":\"ERC20Token\",\"type\":\"function\"}]" const erc721AssetDataAbi = "[{\"inputs\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721Token\",\"type\":\"function\"}]" const erc1155AssetDataAbi = "[{\"constant\":false,\"inputs\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"},{\"name\":\"values\",\"type\":\"uint256[]\"},{\"name\":\"callbackData\",\"type\":\"bytes\"}],\"name\":\"ERC1155Assets\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" const multiAssetDataAbi = "[{\"inputs\":[{\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"name\":\"nestedAssetData\",\"type\":\"bytes[]\"}],\"name\":\"MultiAsset\",\"type\":\"function\"}]" +const erc20BridgeAssetDataAbi = "[{\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\"},{\"name\":\"bridgeAddress\",\"type\":\"address\"},{\"name\":\"calldata\",\"type\":\"bytes\"}],\"name\":\"ERC20Bridge\",\"type\":\"function\"}]" // ERC20AssetData represents an ERC20 assetData type ERC20AssetData struct { @@ -47,6 +51,13 @@ type ERC1155AssetData struct { CallbackData []byte } +// ERC20BridgeAssetData represents an ERC20 Bridge assetData +type ERC20BridgeAssetData struct { + TokenAddress common.Address + BridgeAddress common.Address + Calldata []byte +} + // MultiAssetData represents an MultiAssetData type MultiAssetData struct { Amounts []*big.Int @@ -79,7 +90,11 @@ func NewAssetDataDecoder() *AssetDataDecoder { } multiAssetDataABI, err := abi.JSON(strings.NewReader(multiAssetDataAbi)) if err != nil { - log.WithField("erc20AssetDataAbi", erc20AssetDataAbi).Panic("erc20AssetDataAbi should be ABI parsable") + log.WithField("multiAssetDataAbi", multiAssetDataAbi).Panic("multiAssetDataAbi should be ABI parsable") + } + erc20BridgeAssetDataABI, err := abi.JSON(strings.NewReader(erc20BridgeAssetDataAbi)) + if err != nil { + log.WithField("erc20BridgeAssetDataABI", erc20BridgeAssetDataAbi).Panic("erc20BridgeAssetDataABI should be ABI parsable") } idToAssetDataInfo := map[string]assetDataInfo{ ERC20AssetDataID: assetDataInfo{ @@ -98,6 +113,10 @@ func NewAssetDataDecoder() *AssetDataDecoder { name: "MultiAsset", abi: multiAssetDataABI, }, + ERC20BridgeAssetDataID: assetDataInfo{ + name: "ERC20Bridge", + abi: erc20BridgeAssetDataABI, + }, } decoder := &AssetDataDecoder{ idToAssetDataInfo: idToAssetDataInfo, @@ -135,5 +154,6 @@ func (a *AssetDataDecoder) Decode(assetData []byte, decodedAssetData interface{} if err != nil { return err } + return nil } diff --git a/zeroex/asset_data_decoder_test.go b/zeroex/asset_data_decoder_test.go index edc819e9b..5b30ee303 100644 --- a/zeroex/asset_data_decoder_test.go +++ b/zeroex/asset_data_decoder_test.go @@ -77,3 +77,37 @@ func TestDecodeERC1155AssetData(t *testing.T) { } assert.Equal(t, expectedDecodedAssetData, actualDecodedAssetData, "ERC1155 Asset Data properly decoded") } + +func TestDecodeERC20BridgeChaiAssetData(t *testing.T) { + assetData := common.Hex2Bytes("dc1600f30000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000077c31eba23043b9a72d13470f3a3a311344d743800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000") + + d := NewAssetDataDecoder() + + var actualDecodedAssetData ERC20BridgeAssetData + err := d.Decode(assetData, &actualDecodedAssetData) + require.NoError(t, err) + + expectedDecodedAssetData := ERC20BridgeAssetData{ + TokenAddress: common.HexToAddress("0x6b175474e89094c44da98b954eedeac495271d0f"), + BridgeAddress: common.HexToAddress("0x77c31eba23043b9a72d13470f3a3a311344d7438"), + Calldata: common.Hex2Bytes(""), + } + assert.Equal(t, expectedDecodedAssetData, actualDecodedAssetData, "ERC20Bridge Asset Data properly decoded") +} + +func TestDecodeERC20BridgeEth2DaiAssetData(t *testing.T) { + assetData := common.Hex2Bytes("dc1600f30000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000e97ea901d034ba2e018155264f77c417ce7717f900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2") + + d := NewAssetDataDecoder() + + var actualDecodedAssetData ERC20BridgeAssetData + err := d.Decode(assetData, &actualDecodedAssetData) + require.NoError(t, err) + + expectedDecodedAssetData := ERC20BridgeAssetData{ + TokenAddress: common.HexToAddress("0x6b175474e89094c44da98b954eedeac495271d0f"), + BridgeAddress: common.HexToAddress("0xe97ea901d034ba2e018155264f77c417ce7717f9"), + Calldata: common.Hex2Bytes("000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + } + assert.Equal(t, expectedDecodedAssetData, actualDecodedAssetData, "ERC20Bridge Asset Data properly decoded") +} diff --git a/zeroex/order_js.go b/zeroex/order_js.go index d7d24d2a1..53374fbba 100644 --- a/zeroex/order_js.go +++ b/zeroex/order_js.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" "syscall/js" + "time" "github.com/ethereum/go-ethereum/common" ) @@ -16,7 +17,7 @@ func (o OrderEvent) JSValue() js.Value { contractEventsJS[i] = contractEvent.JSValue() } return js.ValueOf(map[string]interface{}{ - "timestamp": o.Timestamp.String(), + "timestamp": o.Timestamp.Format(time.RFC3339), "orderHash": o.OrderHash.Hex(), "signedOrder": o.SignedOrder.JSValue(), "endState": string(o.EndState), diff --git a/zeroex/ordervalidator/order_validator.go b/zeroex/ordervalidator/order_validator.go index 327ce1bb4..64a6d0d8d 100644 --- a/zeroex/ordervalidator/order_validator.go +++ b/zeroex/ordervalidator/order_validator.go @@ -675,7 +675,12 @@ func (o *OrderValidator) BatchOffchainValidation(signedOrders []*zeroex.SignedOr continue } - isMakerAssetDataSupported := o.isSupportedAssetData(signedOrder.MakerAssetData) + contractAddresses, err := ethereum.GetContractAddressesForChainID(o.chainID) + if err != nil { + log.WithError(err).WithField("chainID", o.chainID).Panic("Couldn't find contract addresses for chainID") + } + + isMakerAssetDataSupported := o.isSupportedAssetData(signedOrder.MakerAssetData, contractAddresses) if !isMakerAssetDataSupported { rejectedOrderInfos = append(rejectedOrderInfos, &RejectedOrderInfo{ OrderHash: orderHash, @@ -685,7 +690,7 @@ func (o *OrderValidator) BatchOffchainValidation(signedOrders []*zeroex.SignedOr }) continue } - isTakerAssetDataSupported := o.isSupportedAssetData(signedOrder.TakerAssetData) + isTakerAssetDataSupported := o.isSupportedAssetData(signedOrder.TakerAssetData, contractAddresses) if !isTakerAssetDataSupported { rejectedOrderInfos = append(rejectedOrderInfos, &RejectedOrderInfo{ OrderHash: orderHash, @@ -697,7 +702,7 @@ func (o *OrderValidator) BatchOffchainValidation(signedOrders []*zeroex.SignedOr } if len(signedOrder.MakerFeeAssetData) != 0 { - isMakerFeeAssetDataSupported := o.isSupportedAssetData(signedOrder.MakerFeeAssetData) + isMakerFeeAssetDataSupported := o.isSupportedAssetData(signedOrder.MakerFeeAssetData, contractAddresses) if !isMakerFeeAssetDataSupported { rejectedOrderInfos = append(rejectedOrderInfos, &RejectedOrderInfo{ OrderHash: orderHash, @@ -709,7 +714,7 @@ func (o *OrderValidator) BatchOffchainValidation(signedOrders []*zeroex.SignedOr } } if len(signedOrder.TakerFeeAssetData) != 0 { - isTakerFeeAssetDataSupported := o.isSupportedAssetData(signedOrder.TakerFeeAssetData) + isTakerFeeAssetDataSupported := o.isSupportedAssetData(signedOrder.TakerFeeAssetData, contractAddresses) if !isTakerFeeAssetDataSupported { rejectedOrderInfos = append(rejectedOrderInfos, &RejectedOrderInfo{ OrderHash: orderHash, @@ -738,7 +743,7 @@ func (o *OrderValidator) BatchOffchainValidation(signedOrders []*zeroex.SignedOr return offchainValidSignedOrders, rejectedOrderInfos } -func (o *OrderValidator) isSupportedAssetData(assetData []byte) bool { +func (o *OrderValidator) isSupportedAssetData(assetData []byte, contractAddresses ethereum.ContractAddresses) bool { assetDataName, err := o.assetDataDecoder.GetName(assetData) if err != nil { return false @@ -768,6 +773,18 @@ func (o *OrderValidator) isSupportedAssetData(assetData []byte) bool { if err != nil { return false } + case "ERC20Bridge": + var decodedAssetData zeroex.ERC20BridgeAssetData + err := o.assetDataDecoder.Decode(assetData, &decodedAssetData) + if err != nil { + return false + } + // We currently restrict ERC20Bridge orders to those referencing the + // Chai bridge. If the ChaiBridge is not deployed on the selected network + // we also reject the ERC20Bridge asset. + if contractAddresses.ChaiBridge == constants.NullAddress || decodedAssetData.BridgeAddress != contractAddresses.ChaiBridge { + return false + } default: return false } diff --git a/zeroex/ordervalidator/order_validator_js.go b/zeroex/ordervalidator/order_validator_js.go new file mode 100644 index 000000000..8e1373845 --- /dev/null +++ b/zeroex/ordervalidator/order_validator_js.go @@ -0,0 +1,45 @@ +// +build js, wasm + +package ordervalidator + +import "syscall/js" + +func (v ValidationResults) JSValue() js.Value { + accepted := make([]interface{}, len(v.Accepted)) + for i, info := range v.Accepted { + accepted[i] = info + } + rejected := make([]interface{}, len(v.Rejected)) + for i, info := range v.Rejected { + rejected[i] = info + } + return js.ValueOf(map[string]interface{}{ + "accepted": accepted, + "rejected": rejected, + }) +} + +func (a AcceptedOrderInfo) JSValue() js.Value { + return js.ValueOf(map[string]interface{}{ + "orderHash": a.OrderHash.Hex(), + "signedOrder": a.SignedOrder.JSValue(), + "fillableTakerAssetAmount": a.FillableTakerAssetAmount.String(), + "isNew": a.IsNew, + }) +} + +func (r RejectedOrderInfo) JSValue() js.Value { + return js.ValueOf(map[string]interface{}{ + "orderHash": r.OrderHash.String(), + "signedOrder": r.SignedOrder.JSValue(), + "kind": string(r.Kind), + "status": r.Status.JSValue(), + }) +} + +func (s RejectedOrderStatus) JSValue() js.Value { + return js.ValueOf(map[string]interface{}{ + "code": s.Code, + "message": s.Message, + }) +} diff --git a/zeroex/ordervalidator/order_validator_test.go b/zeroex/ordervalidator/order_validator_test.go index cab82927a..3fb8ce3aa 100644 --- a/zeroex/ordervalidator/order_validator_test.go +++ b/zeroex/ordervalidator/order_validator_test.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" ethrpc "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -59,6 +60,7 @@ var serialTestsEnabled bool func init() { flag.BoolVar(&serialTestsEnabled, "serial", false, "enable serial tests") + testing.Init() flag.Parse() } @@ -150,7 +152,9 @@ func TestBatchValidateOffChainCases(t *testing.T) { for _, testCase := range testCases { rateLimiter := ratelimit.NewUnlimited() - ethClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) signedOrders := []*zeroex.SignedOrder{ @@ -185,7 +189,9 @@ func TestBatchValidateAValidOrder(t *testing.T) { } rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) orderValidator, err := New(ethRPCClient, constants.TestChainID, constants.TestMaxContentLength) @@ -215,7 +221,9 @@ func TestBatchValidateSignatureInvalid(t *testing.T) { } rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) orderValidator, err := New(ethRPCClient, constants.TestChainID, constants.TestMaxContentLength) @@ -246,7 +254,9 @@ func TestBatchValidateUnregisteredCoordinatorSoftCancels(t *testing.T) { } rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) orderValidator, err := New(ethRPCClient, constants.TestChainID, constants.TestMaxContentLength) @@ -280,7 +290,9 @@ func TestBatchValidateCoordinatorSoftCancels(t *testing.T) { } rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) orderValidator, err := New(ethRPCClient, constants.TestChainID, constants.TestMaxContentLength) @@ -334,7 +346,9 @@ func TestComputeOptimalChunkSizesMaxContentLengthTooLow(t *testing.T) { require.NoError(t, err) rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) maxContentLength := singleOrderPayloadSize - 10 @@ -352,7 +366,9 @@ func TestComputeOptimalChunkSizes(t *testing.T) { require.NoError(t, err) rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) maxContentLength := singleOrderPayloadSize * 3 @@ -393,7 +409,9 @@ func TestComputeOptimalChunkSizesMultiAssetOrder(t *testing.T) { require.NoError(t, err) rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err := ethrpcclient.New(constants.GanacheEndpoint, defaultEthRPCTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + require.NoError(t, err) + ethRPCClient, err := ethrpcclient.New(rpcClient, defaultEthRPCTimeout, rateLimiter) require.NoError(t, err) maxContentLength := singleOrderPayloadSize * 3 diff --git a/zeroex/orderwatch/order_watcher.go b/zeroex/orderwatch/order_watcher.go index f4969d680..0263f5365 100644 --- a/zeroex/orderwatch/order_watcher.go +++ b/zeroex/orderwatch/order_watcher.go @@ -2,6 +2,7 @@ package orderwatch import ( "context" + "encoding/json" "errors" "fmt" "math/big" @@ -10,7 +11,6 @@ import ( "github.com/0xProject/0x-mesh/constants" "github.com/0xProject/0x-mesh/db" - "github.com/0xProject/0x-mesh/encoding" "github.com/0xProject/0x-mesh/ethereum" "github.com/0xProject/0x-mesh/ethereum/blockwatch" "github.com/0xProject/0x-mesh/ethereum/miniheader" @@ -62,6 +62,10 @@ const ( // increase the max expiration time. maxExpirationTimeCheckInterval = 30 * time.Second + // maxBlockEventsToHandle is the max number of block events we want to process in a single + // call to `handleBlockEvents` + maxBlockEventsToHandle = 500 + // configuration options for the SlowCounter used for increasing max // expiration time. Effectively, we will increase every 5 minutes as long as // there is enough space in the database for orders. The first increase will @@ -91,7 +95,7 @@ type Watcher struct { maxExpirationTime *big.Int maxExpirationCounter *slowcounter.SlowCounter maxOrders int - handleBlockEventsMu sync.Mutex + handleBlockEventsMu sync.RWMutex // atLeastOneBlockProcessed is closed to signal that the BlockWatcher has processed at least one // block. Validation of orders should block until this has completed atLeastOneBlockProcessed chan struct{} @@ -278,6 +282,10 @@ func (w *Watcher) mainLoop(ctx context.Context) error { "error": err.Error(), }).Error("block subscription error encountered") case events := <-w.blockEventsChan: + // Instead of simply processing the first array of events in the blockEventsChan, + // we might as well process _all_ events in the channel. + drainedEvents := drainBlockEventsChan(w.blockEventsChan, maxBlockEventsToHandle) + events = append(events, drainedEvents...) w.handleBlockEventsMu.Lock() if err := w.handleBlockEvents(ctx, events); err != nil { w.handleBlockEventsMu.Unlock() @@ -288,19 +296,36 @@ func (w *Watcher) mainLoop(ctx context.Context) error { } } +func drainBlockEventsChan(blockEventsChan chan []*blockwatch.Event, max int) []*blockwatch.Event { + allEvents := []*blockwatch.Event{} +Loop: + for { + select { + case moreEvents := <-blockEventsChan: + allEvents = append(allEvents, moreEvents...) + if len(allEvents) >= max { + break Loop + } + default: + break Loop + } + } + return allEvents +} + func (w *Watcher) cleanupLoop(ctx context.Context) error { start := time.Now() for { select { case <-ctx.Done(): return nil - default: + case <-time.After(minCleanupInterval - time.Since(start)): + // Wait minCleanupInterval before calling cleanup again. Since + // we only start sleeping _after_ cleanup completes, we will never + // have multiple calls to cleanup running in parallel + break } - // Wait minCleanupInterval before calling cleanup again. Since - // we only start sleeping _after_ cleanup completes, we will never - // have multiple calls to cleanup running in parallel - time.Sleep(minCleanupInterval - time.Since(start)) start = time.Now() if err := w.Cleanup(ctx, defaultLastUpdatedBuffer); err != nil { return err @@ -798,8 +823,8 @@ func (w *Watcher) handleBlockEvents( // `lastUpdatedBuffer` time to make sure all orders are still up-to-date func (w *Watcher) Cleanup(ctx context.Context, lastUpdatedBuffer time.Duration) error { // Pause block event processing until we finished cleaning up at current block height - w.handleBlockEventsMu.Lock() - defer w.handleBlockEventsMu.Unlock() + w.handleBlockEventsMu.RLock() + defer w.handleBlockEventsMu.RUnlock() ordersColTxn := w.meshDB.Orders.OpenTransaction() defer func() { @@ -1353,8 +1378,8 @@ func (w *Watcher) ValidateAndStoreValidOrders(ctx context.Context, orders []*zer } // Lock down the processing of additional block events until we've validated and added these new orders - w.handleBlockEventsMu.Lock() - defer w.handleBlockEventsMu.Unlock() + w.handleBlockEventsMu.RLock() + defer w.handleBlockEventsMu.RUnlock() validationBlock, zeroexResults, err := w.onchainOrderValidation(ctx, validMeshOrders) if err != nil { @@ -1392,7 +1417,22 @@ func (w *Watcher) ValidateAndStoreValidOrders(ctx context.Context, orders []*zer allOrderEvents = append(allOrderEvents, orderEvents...) } - w.orderFeed.Send(allOrderEvents) + if len(allOrderEvents) > 0 { + // NOTE(albrow): Send can block if the subscriber(s) are slow. Blocking here can cause problems when Mesh is + // shutting down, so to prevent that, we call Send in a goroutine and return immediately if the context + // is done. + done := make(chan interface{}) + go func() { + w.orderFeed.Send(allOrderEvents) + done <- struct{}{} + }() + select { + case <-done: + return results, nil + case <-ctx.Done(): + return results, nil + } + } return results, nil } @@ -1480,6 +1520,7 @@ func (w *Watcher) meshSpecificOrderValidation(orders []*zeroex.SignedOrder, chai continue } } + if err := validateOrderSize(order); err != nil { if err == constants.ErrMaxOrderSize { results.Rejected = append(results.Rejected, &ordervalidator.RejectedOrderInfo{ @@ -1540,7 +1581,7 @@ func (w *Watcher) meshSpecificOrderValidation(orders []*zeroex.SignedOrder, chai } func validateOrderSize(order *zeroex.SignedOrder) error { - encoded, err := encoding.OrderToRawMessage(order) + encoded, err := json.Marshal(order) if err != nil { return err } diff --git a/zeroex/orderwatch/order_watcher_test.go b/zeroex/orderwatch/order_watcher_test.go index 6e87a8a75..3ceb81cbc 100644 --- a/zeroex/orderwatch/order_watcher_test.go +++ b/zeroex/orderwatch/order_watcher_test.go @@ -25,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" ethrpc "github.com/ethereum/go-ethereum/rpc" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -68,6 +69,7 @@ var serialTestsEnabled bool func init() { flag.BoolVar(&serialTestsEnabled, "serial", false, "enable serial tests") + testing.Init() flag.Parse() } @@ -78,7 +80,11 @@ func init() { panic(err) } rateLimiter := ratelimit.NewUnlimited() - ethRPCClient, err = ethrpcclient.New(constants.GanacheEndpoint, ethereumRPCRequestTimeout, rateLimiter) + rpcClient, err := rpc.Dial(constants.GanacheEndpoint) + if err != nil { + panic(err) + } + ethRPCClient, err = ethrpcclient.New(rpcClient, ethereumRPCRequestTimeout, rateLimiter) if err != nil { panic(err) } @@ -1443,6 +1449,51 @@ func TestConvertValidationResultsIntoOrderEventsUnexpired(t *testing.T) { assert.Equal(t, false, orderTwo.IsRemoved) } +func TestDrainAllBlockEventsChan(t *testing.T) { + blockEventsChan := make(chan []*blockwatch.Event, 100) + ts := time.Now().Add(1 * time.Hour) + blockEventsOne := []*blockwatch.Event{ + &blockwatch.Event{ + Type: blockwatch.Added, + BlockHeader: &miniheader.MiniHeader{ + Parent: common.HexToHash("0x0"), + Hash: common.HexToHash("0x1"), + Number: big.NewInt(1), + Timestamp: ts, + }, + }, + } + blockEventsChan <- blockEventsOne + + blockEventsTwo := []*blockwatch.Event{ + &blockwatch.Event{ + Type: blockwatch.Added, + BlockHeader: &miniheader.MiniHeader{ + Parent: common.HexToHash("0x1"), + Hash: common.HexToHash("0x2"), + Number: big.NewInt(2), + Timestamp: ts.Add(1 * time.Second), + }, + }, + } + blockEventsChan <- blockEventsTwo + + max := 2 // enough + allEvents := drainBlockEventsChan(blockEventsChan, max) + assert.Len(t, allEvents, 2, "Two events should be drained from the channel") + require.Equal(t, allEvents[0], blockEventsOne[0]) + require.Equal(t, allEvents[1], blockEventsTwo[0]) + + // Test case where more than max events in channel + blockEventsChan <- blockEventsOne + blockEventsChan <- blockEventsTwo + + max = 1 + allEvents = drainBlockEventsChan(blockEventsChan, max) + assert.Len(t, allEvents, 1, "Only max number of events should be drained from the channel, even if more than max events are present") + require.Equal(t, allEvents[0], blockEventsOne[0]) +} + func setupOrderWatcherScenario(ctx context.Context, t *testing.T, ethClient *ethclient.Client, meshDB *meshdb.MeshDB, signedOrder *zeroex.SignedOrder) (*blockwatch.Watcher, chan []*zeroex.OrderEvent) { blockWatcher, orderWatcher := setupOrderWatcher(ctx, t, ethRPCClient, meshDB)