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/Makefile b/Makefile index 17cd7dc84..550b33efb 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,6 @@ test-go-parallel: 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 diff --git a/browser/conversion-tests/conversion_test.ts b/browser/conversion-tests/conversion_test.ts new file mode 100644 index 000000000..a58d71f59 --- /dev/null +++ b/browser/conversion-tests/conversion_test.ts @@ -0,0 +1,1016 @@ +import { BigNumber, hexUtils, logUtils } from '@0x/utils'; + +import { + ContractEvent, + ERC1155ApprovalForAllEvent, + ERC1155TransferBatchEvent, + ERC1155TransferSingleEvent, + ERC20ApprovalEvent, + ERC20TransferEvent, + ERC721ApprovalEvent, + ERC721ApprovalForAllEvent, + ERC721TransferEvent, + ExchangeCancelEvent, + ExchangeCancelUpToEvent, + ExchangeFillEvent, + WethDepositEvent, + WethWithdrawalEvent, + 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[]; + 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 of 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 () => { + await waitForLoadAsync(); + 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); + + // 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 => { + throw 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/conversion-test/conversion_test.go b/browser/go/conversion-test/conversion_test.go new file mode 100644 index 000000000..3bfaca697 --- /dev/null +++ b/browser/go/conversion-test/conversion_test.go @@ -0,0 +1,461 @@ +// +build !js + +package main + +import ( + "context" + "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 + +// 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) { + // Declare a context that will be used for all child processes, servers, and + // other goroutines. + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + ctx, _ = chromedp.NewContext(ctx, chromedp.WithErrorf(t.Errorf)) + defer cancel() + + buildForTests(t, ctx) + + // Register the 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) + + // 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 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 { + t.Errorf("Unexpected test results: %s", 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..34ed5a015 --- /dev/null +++ b/browser/go/conversion-test/main.go @@ -0,0 +1,663 @@ +// +build js, wasm + +package main + +import ( + "math/big" + "syscall/js" + "time" + + "github.com/0xProject/0x-mesh/common/types" + "github.com/0xProject/0x-mesh/constants" + "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, + }, + }, + }, + } + }), + } + js.Global().Set("conversionTestCases", conversionTestCases) +} + +// 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/main.go b/browser/go/mesh-browser/main.go similarity index 100% rename from browser/go/main.go rename to browser/go/mesh-browser/main.go diff --git a/browser/package.json b/browser/package.json index 4586a1416..7d802aedb 100644 --- a/browser/package.json +++ b/browser/package.json @@ -5,10 +5,14 @@ "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 ." }, @@ -19,8 +23,13 @@ "@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", 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 771f19374..28df58689 100644 --- a/browser/ts/index.ts +++ b/browser/ts/index.ts @@ -1,7 +1,5 @@ import { SignedOrder } from '@0x/order-utils'; -import { BigNumber, providerUtils } from '@0x/utils'; import * as BrowserFS from 'browserfs'; -import { SupportedProvider, ZeroExProvider } from 'ethereum-types'; import { wasmBuffer } from './generated/wasm_buffer'; import './wasm_exec'; @@ -10,6 +8,83 @@ 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. declare global { @@ -48,647 +123,6 @@ BrowserFS.configure( // The interval (in milliseconds) to check whether Wasm is done loading. const wasmLoadCheckIntervalMs = 100; -/** - * 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 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: string; - ordersInfos: WrapperOrderInfo[]; -} - -export interface GetOrdersResponse { - snapshotID: string; - snapshotTimestamp: Date; - 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 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. -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; - protocolFeePaid: BigNumber; - orderHash: string; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; -} - -interface WrapperExchangeFillEvent { - makerAddress: string; - takerAddress: string; - senderAddress: string; - feeRecipientAddress: string; - makerAssetFilledAmount: string; - takerAssetFilledAmount: string; - makerFeePaid: string; - takerFeePaid: string; - protocolFeePaid: BigNumber; - 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; -} - -interface WrapperExchangeCancelUpToEvent { - makerAddress: string; - orderSenderAddress: 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: boolean; - 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: 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', -} - -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'; @@ -900,256 +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); - 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, - }; -} - -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), - protocolFeePaid: new BigNumber(exchangeFillEvent.protocolFeePaid), - orderHash: exchangeFillEvent.orderHash, - makerAssetData: exchangeFillEvent.makerAssetData, - takerAssetData: exchangeFillEvent.takerAssetData, - makerFeeAssetData: exchangeFillEvent.makerFeeAssetData, - takerFeeAssetData: exchangeFillEvent.takerFeeAssetData, - }; - 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; -} - -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, - snapshotTimestamp: new Date(wrapperGetOrdersResponse.snapshotTimestamp), - 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/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..80d321015 --- /dev/null +++ b/browser/webpack.config.js @@ -0,0 +1,26 @@ +const path = require('path'); + +module.exports = { + entry: './conversion-tests/conversion_test.ts', + 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..c32f3e70a 100644 --- a/browser/yarn.lock +++ b/browser/yarn.lock @@ -254,6 +254,162 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@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" @@ -280,11 +436,36 @@ abstract-leveldown@~2.7.1: dependencies: xtend "~4.0.0" +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= +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" + 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 +476,36 @@ 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" +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" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -314,6 +513,53 @@ 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-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +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" + +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-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" @@ -333,6 +579,11 @@ async@^2.0.1, async@^2.1.2, async@^2.1.4, async@^2.4.0, async@^2.6.1: dependencies: lodash "^4.17.14" +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== + babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -359,6 +610,29 @@ base64-arraybuffer@^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" + +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@~8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137" @@ -369,6 +643,11 @@ bignumber.js@~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: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -383,7 +662,12 @@ 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: +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.0.0, bn.js@^4.1.0, bn.js@^4.1.1, 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: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== @@ -396,6 +680,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 +716,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,6 +728,33 @@ browserify-aes@^1.0.6: inherits "^2.0.1" safe-buffer "^5.0.1" +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + 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" @@ -429,6 +763,26 @@ 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" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -439,16 +793,80 @@ buffer-xor@^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" + 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= + +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" + 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== + +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 +878,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 +885,37 @@ checkpoint-store@^1.1.0: dependencies: functional-red-black-tree "^1.0.1" +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 +924,16 @@ 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@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -493,11 +943,28 @@ 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" + 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= +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,16 +977,63 @@ 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: +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== +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: + 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== + +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= + +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= + 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" @@ -530,6 +1044,14 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +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.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -541,7 +1063,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 +1075,17 @@ create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +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 +1095,50 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +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= + +debug@^2.2.0, debug@^2.3.3: + 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" + +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= + 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 +1161,41 @@ 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" + +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" + +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-node@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -604,6 +1206,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 +1223,11 @@ doctrine@0.7.2: esutils "^1.1.6" isarray "0.0.1" +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== + 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 +1237,17 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -elliptic@6.5.2, elliptic@^6.5.2: +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" + +elliptic@6.5.2, elliptic@^6.0.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,6 +1260,16 @@ elliptic@6.5.2, elliptic@^6.5.2: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.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= + encoding-down@~5.0.0: version "5.0.4" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" @@ -652,7 +1288,32 @@ 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: + 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== @@ -690,11 +1351,31 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^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" @@ -883,7 +1564,12 @@ 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: +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 +1590,68 @@ 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-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" + +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" + +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" + 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 +1659,52 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.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-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== + +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-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" + +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@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -923,11 +1712,56 @@ 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: + 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" + 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= +flush-write-stream@^1.0.0: + 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: + inherits "^2.0.3" + readable-stream "^2.3.6" + +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= + +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" + +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-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -937,11 +1771,29 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +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= +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: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -957,11 +1809,36 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + 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@^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= +get-stream@^4.0.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-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= + +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@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -974,10 +1851,46 @@ 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: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +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" + +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== handlebars@^4.5.3: version "4.5.3" @@ -1007,6 +1920,37 @@ has-symbols@^1.0.0, has-symbols@^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-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: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1054,6 +1998,18 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^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" + +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.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1061,6 +2017,21 @@ iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +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 +2042,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" @@ -1084,7 +2073,22 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, 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: + 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: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -1094,16 +2098,96 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +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-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.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-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,11 +2200,44 @@ 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-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-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@^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-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: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" @@ -1140,12 +2257,22 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +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,6 +2282,18 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +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" @@ -1196,6 +2335,23 @@ js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +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-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== + +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" @@ -1236,6 +2392,30 @@ keccakjs@^0.2.0: browserify-sha3 "^0.0.4" sha3 "^1.2.2" +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: + 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== + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -1243,6 +2423,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + level-codec@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247" @@ -1340,6 +2527,20 @@ levelup@^3.0.0: level-iterator-stream "~3.0.0" xtend "~4.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" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -1348,6 +2549,14 @@ 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" @@ -1383,6 +2592,38 @@ lunr@^2.3.8: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== +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" + +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.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" @@ -1404,6 +2645,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,6 +2678,22 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +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" + 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" @@ -1442,6 +2708,33 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" +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" @@ -1455,6 +2748,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + 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,26 +2770,106 @@ 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: + 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= +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@^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" + +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= + 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.12.1, 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: +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" + +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== +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-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -1500,6 +2878,47 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +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" + +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== + 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" @@ -1512,6 +2931,20 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +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: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" @@ -1527,6 +2960,13 @@ object-keys@~0.4.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" @@ -1545,7 +2985,14 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -once@^1.3.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" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1560,6 +3007,11 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +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-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -1569,11 +3021,30 @@ 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" + +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 +3052,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,16 +3066,69 @@ 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-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-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= + +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@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -1608,7 +3139,7 @@ path-is-absolute@^1.0.0: 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= @@ -1618,21 +3149,69 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +pbkdf2@^3.0.3: + 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" + +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@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +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= + +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== + 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= + 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= + 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" @@ -1650,6 +3229,96 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +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" + +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: + 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@^1.2.4: + 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== + +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= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +"readable-stream@1 || 2", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, 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" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -1683,6 +3352,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" @@ -1695,6 +3373,29 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +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" + +remove-trailing-separator@^1.0.1: + 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= + 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 +3406,36 @@ 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-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 +3443,12 @@ resolve@^1.1.6, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -rimraf@^2.6.3: +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,12 +3470,19 @@ 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: +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== @@ -1749,11 +3492,27 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +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": 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.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" @@ -1778,26 +3537,51 @@ semaphore@>=1.0.1, semaphore@^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@^5.3.0, 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: + 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== +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== + 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-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: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + 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 +3623,52 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +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.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" @@ -1847,16 +3677,88 @@ source-map-support@0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" +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: + 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== +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= +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" + +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" + +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-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== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -1874,6 +3776,15 @@ 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.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 +3801,13 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string_decoder@^1.0.0: + 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 +3834,13 @@ 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-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -1928,6 +3853,13 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +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 +3872,104 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +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== + +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@^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" + +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" + +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-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-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" + +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 +4029,16 @@ 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= + +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" @@ -2058,11 +4092,73 @@ underscore@>=1.8.3, underscore@^1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +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" + 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== +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@^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" + +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== + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -2076,6 +4172,20 @@ 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" + uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" @@ -2091,11 +4201,84 @@ uuid@^3.3.2: 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== + 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= +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" + +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" + whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" @@ -2106,7 +4289,7 @@ which-module@^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@^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== @@ -2118,6 +4301,13 @@ wordwrap@~0.0.2: 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,6 +4316,15 @@ 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" @@ -2136,7 +4335,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.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,6 +4352,11 @@ 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== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -2163,6 +4367,14 @@ yallist@^3.0.2: 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@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" @@ -2170,6 +4382,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" 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/go.sum b/go.sum index c07bbbba5..97111b945 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/0xProject/go-ws-transport v0.1.1-0.20200201000210-2db3396fec39/go.mod 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-20200128001316-0d09a9c4c5f6 h1:YRtx4GLs2OSuJNeOEnO+6dSm1HwvUh+5XVaGAH+xaRo= -github.com/0xProject/sql-datastore v0.0.0-20200128001316-0d09a9c4c5f6/go.mod h1:7icquWqYm+GkgQsUyBs0C0N1SyCHXQYBnoHaazVYDQ0= 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= diff --git a/integration-tests/browser/src/index.ts b/integration-tests/browser/src/index.ts index aba0cbe43..73859f625 100644 --- a/integration-tests/browser/src/index.ts +++ b/integration-tests/browser/src/index.ts @@ -104,10 +104,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); diff --git a/integration-tests/utils.go b/integration-tests/utils.go index 495a4ba0a..fc35dac8f 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" 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, + }) +}